1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/rss, test/rss, sample/rss: backported from CVS HEAD.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
kou 2004-12-08 12:58:36 +00:00
parent 67c5b057e6
commit bcf72db844
30 changed files with 1967 additions and 990 deletions

View file

@ -1,3 +1,7 @@
Wed Dec 8 21:56:31 2004 Kouhei Sutou <kou@cozmixng.org>
* lib/rss, test/rss, sample/rss: backported from CVS HEAD.
Wed Dec 8 14:31:36 2004 Yukihiro Matsumoto <matz@ruby-lang.org> Wed Dec 8 14:31:36 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
* io.c (io_fwrite): change dereference for cosmetic reason. * io.c (io_fwrite): change dereference for cosmetic reason.

View file

@ -60,17 +60,14 @@ module RSS
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent, ns_declarations) do |next_indent|
rv = <<-EOR [
#{xmldecl} channel_element(false, next_indent),
#{xml_stylesheet_pi} other_element(false, next_indent),
#{indent}<rss version="#{@rss_version}"#{ns_declaration(next_indent)}> ]
#{channel_element(false, next_indent)} end
#{other_element(false, next_indent)}
#{indent}</rss>
EOR
rv = @converter.convert(rv) if convert and @converter rv = @converter.convert(rv) if convert and @converter
remove_empty_newline(rv) rv
end end
private private
@ -86,7 +83,7 @@ EOR
def _attrs def _attrs
[ [
["version", true], ["version", true, "rss_version"],
] ]
end end
@ -104,8 +101,6 @@ EOR
["webMaster", "?"], ["webMaster", "?"],
["rating", "?"], ["rating", "?"],
["docs", "?"], ["docs", "?"],
["skipDays", "?"],
["skipHours", "?"],
].each do |x, occurs| ].each do |x, occurs|
install_text_element(x) install_text_element(x)
install_model(x, occurs) install_model(x, occurs)
@ -120,6 +115,8 @@ EOR
end end
[ [
["skipDays", "?"],
["skipHours", "?"],
["image", nil], ["image", nil],
["textInput", "?"], ["textInput", "?"],
].each do |x, occurs| ].each do |x, occurs|
@ -146,35 +143,35 @@ EOR
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent) do |next_indent|
rv = <<-EOT [
#{indent}<channel> title_element(false, next_indent),
#{title_element(false, next_indent)} link_element(false, next_indent),
#{link_element(false, next_indent)} description_element(false, next_indent),
#{description_element(false, next_indent)} language_element(false, next_indent),
#{language_element(false, next_indent)} copyright_element(false, next_indent),
#{copyright_element(false, next_indent)} managingEditor_element(false, next_indent),
#{managingEditor_element(false, next_indent)} webMaster_element(false, next_indent),
#{webMaster_element(false, next_indent)} rating_element(false, next_indent),
#{rating_element(false, next_indent)} pubDate_element(false, next_indent),
#{pubDate_element(false, next_indent)} lastBuildDate_element(false, next_indent),
#{lastBuildDate_element(false, next_indent)} docs_element(false, next_indent),
#{docs_element(false, next_indent)} cloud_element(false, next_indent),
#{skipDays_element(false, next_indent)} skipDays_element(false, next_indent),
#{skipHours_element(false, next_indent)} skipHours_element(false, next_indent),
#{image_element(false, next_indent)} image_element(false, next_indent),
#{item_elements(false, next_indent)} item_elements(false, next_indent),
#{textInput_element(false, next_indent)} textInput_element(false, next_indent),
#{other_element(false, next_indent)} other_element(false, next_indent),
#{indent}</channel> ]
EOT end
rv = @converter.convert(rv) if convert and @converter rv = @converter.convert(rv) if convert and @converter
rv rv
end end
private private
def children def children
[@image, @textInput, @cloud, *@item] [@skipDays, @skipHours, @image, @textInput, @cloud, *@item]
end end
def _tags def _tags
@ -206,6 +203,121 @@ EOT
rv rv
end end
def maker_target(maker)
maker.channel
end
def setup_maker_elements(channel)
super
[
[skipDays, "day"],
[skipHours, "hour"],
].each do |skip, key|
if skip
skip.__send__("#{key}s").each do |val|
target_skips = channel.__send__("skip#{key.capitalize}s")
new_target = target_skips.__send__("new_#{key}")
new_target.content = val.content
end
end
end
end
class SkipDays < Element
include RSS09
[
["day", "*"]
].each do |x, occurs|
install_have_children_element(x)
install_model(x, occurs)
end
def to_s(convert=true, indent=calc_indent)
rv = tag(indent) do |next_indent|
[
day_elements(false, next_indent)
]
end
rv = @converter.convert(rv) if convert and @converter
rv
end
private
def children
@day
end
def _tags
@day.compact.collect do
[nil, "day"]
end
end
class Day < Element
include RSS09
content_setup
def initialize(content=nil)
super()
@content = content
end
end
end
class SkipHours < Element
include RSS09
[
["hour", "*"]
].each do |x, occurs|
install_have_children_element(x)
install_model(x, occurs)
end
def to_s(convert=true, indent=calc_indent)
rv = tag(indent) do |next_indent|
[
hour_elements(false, next_indent)
]
end
rv = @converter.convert(rv) if convert and @converter
rv
end
private
def children
@hour
end
def _tags
@hour.compact.collect do
[nil, "hour"]
end
end
class Hour < Element
include RSS09
content_setup
def initialize(content=nil)
super()
@content = content
end
remove_method :content=
def content=(value)
@content = value.to_i
end
end
end
class Image < Element class Image < Element
include RSS09 include RSS09
@ -220,19 +332,18 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent) do |next_indent|
rv = <<-EOT [
#{indent}<image> url_element(false, next_indent),
#{url_element(false, next_indent)} title_element(false, next_indent),
#{title_element(false, next_indent)} link_element(false, next_indent),
#{link_element(false, next_indent)} width_element(false, next_indent),
#{width_element(false, next_indent)} height_element(false, next_indent),
#{height_element(false, next_indent)} description_element(false, next_indent),
#{description_element(false, next_indent)} other_element(false, next_indent),
#{other_element(false, next_indent)} ]
#{indent}</image> end
EOT rv = @converter.convert(rv) if convert and @converter
rv = @converter.convert(rv) if convert and @converter
rv rv
end end
@ -244,8 +355,12 @@ EOT
[nil, elem] [nil, elem]
end end
end end
def maker_target(maker)
maker.image
end
end end
class Cloud < Element class Cloud < Element
include RSS09 include RSS09
@ -270,16 +385,8 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent)
rv = <<-EOT rv = @converter.convert(rv) if convert and @converter
#{indent}<cloud
#{next_indent}domain="#{h @domain}"
#{next_indent}port="#{h @port}"
#{next_indent}path="#{h @path}"
#{next_indent}registerProcedure="#{h @registerProcedure}"
#{next_indent}protocol="#{h @protocol}"/>
EOT
rv = @converter.convert(rv) if convert and @converter
rv rv
end end
@ -300,15 +407,21 @@ EOT
install_text_element(x) install_text_element(x)
end end
%w(category source enclosure).each do |x| %w(source enclosure).each do |x|
install_have_child_element(x) install_have_child_element(x)
end end
[
%w(category categories),
].each do |name, plural_name|
install_have_children_element(name, plural_name)
end
[ [
["title", '?'], ["title", '?'],
["link", '?'], ["link", '?'],
["description", '?'], ["description", '?'],
["category", '?'], ["category", '*'],
["source", '?'], ["source", '?'],
["enclosure", '?'], ["enclosure", '?'],
].each do |tag, occurs| ].each do |tag, occurs|
@ -316,36 +429,51 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent) do |next_indent|
rv = <<-EOT [
#{indent}<item> title_element(false, next_indent),
#{title_element(false, next_indent)} link_element(false, next_indent),
#{link_element(false, next_indent)} description_element(false, next_indent),
#{description_element(false, next_indent)} category_elements(false, next_indent),
#{category_element(false, next_indent)} source_element(false, next_indent),
#{source_element(false, next_indent)} enclosure_element(false, next_indent),
#{enclosure_element(false, next_indent)} other_element(false, next_indent),
#{other_element(false, next_indent)} ]
#{indent}</item> end
EOT rv = @converter.convert(rv) if convert and @converter
rv = @converter.convert(rv) if convert and @converter
rv rv
end end
private private
def children def children
[@category, @source, @enclosure,].compact [@source, @enclosure, *@category].compact
end end
def _tags def _tags
%w(title link description author comments category rv = %w(title link description author comments
source enclosure).delete_if do |x| source enclosure).delete_if do |x|
send(x).nil? send(x).nil?
end.collect do |x| end.collect do |x|
[nil, x] [nil, x]
end end
@category.each do
rv << [nil, "category"]
end
rv
end end
def maker_target(maker)
maker.items.new_item
end
def setup_maker_element(item)
super
@enclosure.setup_maker(item) if @enclosure
@source.setup_maker(item) if @source
end
class Source < Element class Source < Element
include RSS09 include RSS09
@ -364,17 +492,6 @@ EOT
@content = content @content = content
end end
def to_s(convert=true, indent=calc_indent)
if @url
rv = %Q! <source url="#{@url}">!
rv << %Q!#{@content}</source>!
rv = @converter.convert(rv) if convert and @converter
rv
else
''
end
end
private private
def _tags def _tags
[] []
@ -386,6 +503,15 @@ EOT
] ]
end end
def maker_target(item)
item.source
end
def setup_maker_attributes(source)
source.url = url
source.content = content
end
end end
class Enclosure < Element class Enclosure < Element
@ -408,14 +534,9 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
if @url and @length and @type rv = tag(indent)
rv = %Q!<enclosure url="#{h @url}" ! rv = @converter.convert(rv) if convert and @converter
rv << %Q!length="#{h @length}" type="#{h @type}"/>! rv
rv = @converter.convert(rv) if convert and @converter
rv
else
''
end
end end
private private
@ -427,6 +548,15 @@ EOT
] ]
end end
def maker_target(item)
item.enclosure
end
def setup_maker_attributes(enclosure)
enclosure.url = url
enclosure.length = length
enclosure.type = type
end
end end
class Category < Element class Category < Element
@ -447,17 +577,6 @@ EOT
@content = content @content = content
end end
def to_s(convert=true, indent=calc_indent)
if @domain
rv = %Q!<category domain="#{h @domain}">!
rv << %Q!#{h @content}</category>!
rv = @converter.convert(rv) if convert and @converter
rv
else
''
end
end
private private
def _attrs def _attrs
[ [
@ -465,12 +584,21 @@ EOT
] ]
end end
def maker_target(item)
item.new_category
end
def setup_maker_attributes(category)
category.domain = domain
category.content = content
end
end end
end end
class TextInput < Element class TextInput < Element
include RSS09 include RSS09
%w(title description name link).each do |x| %w(title description name link).each do |x|
@ -479,16 +607,15 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent) do |next_indent|
rv = <<-EOT [
#{indent}<textInput> title_element(false, next_indent),
#{title_element(false, next_indent)} description_element(false, next_indent),
#{description_element(false, next_indent)} name_element(false, next_indent),
#{name_element(false, next_indent)} link_element(false, next_indent),
#{link_element(false, next_indent)} other_element(false, next_indent),
#{other_element(false, next_indent)} ]
#{indent}</textInput> end
EOT
rv = @converter.convert(rv) if convert and @converter rv = @converter.convert(rv) if convert and @converter
rv rv
end end
@ -501,6 +628,10 @@ EOT
[nil, elem] [nil, elem]
end end
end end
def maker_target(maker)
maker.textinput
end
end end
end end

View file

@ -18,7 +18,6 @@ module RSS
include RSS10 include RSS10
include RootElementMixin include RootElementMixin
include XMLStyleSheetMixin
class << self class << self
@ -57,21 +56,22 @@ module RSS
super('1.0', version, encoding, standalone) super('1.0', version, encoding, standalone)
end end
def full_name
tag_name_with_prefix(PREFIX)
end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent, ns_declarations) do |next_indent|
rv = <<-EORDF [
#{xmldecl} channel_element(false, next_indent),
#{xml_stylesheet_pi} image_element(false, next_indent),
#{indent}<#{PREFIX}:RDF#{ns_declaration(next_indent)}> item_elements(false, next_indent),
#{channel_element(false, next_indent)} textinput_element(false, next_indent),
#{image_element(false, next_indent)} other_element(false, next_indent),
#{item_elements(false, next_indent)} ]
#{textinput_element(false, next_indent)} end
#{other_element(false, next_indent)}
#{indent}</#{PREFIX}:RDF>
EORDF
rv = @converter.convert(rv) if convert and @converter rv = @converter.convert(rv) if convert and @converter
remove_empty_newline(rv) rv
end end
private private
@ -119,16 +119,19 @@ EORDF
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT tag(indent) do |next_indent|
<<-EOT [
#{indent}<#{PREFIX}:Seq> li_elements(convert, next_indent),
#{li_elements(convert, next_indent)} other_element(convert, next_indent),
#{other_element(convert, next_indent)} ]
#{indent}</#{PREFIX}:Seq> end
EOT
end end
private def full_name
tag_name_with_prefix(PREFIX)
end
private
def children def children
@li @li
end end
@ -169,15 +172,15 @@ EOT
super() super()
@resource = resource @resource = resource
end end
def full_name
tag_name_with_prefix(PREFIX)
end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
if @resource rv = tag(indent)
rv = %Q!#{indent}<#{PREFIX}:li resource="#{h @resource}" />\n! rv = @converter.convert(rv) if convert and @converter
rv = @converter.convert(rv) if convert and @converter rv
rv
else
''
end
end end
private private
@ -232,20 +235,17 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent) do |next_indent|
about = '' [
about << %Q!#{PREFIX}:about="#{h @about}"! if @about title_element(false, next_indent),
rv = <<-EOT link_element(false, next_indent),
#{indent}<channel #{about}> description_element(false, next_indent),
#{title_element(false, next_indent)} image_element(false, next_indent),
#{link_element(false, next_indent)} items_element(false, next_indent),
#{description_element(false, next_indent)} textinput_element(false, next_indent),
#{image_element(false, next_indent)} other_element(false, next_indent),
#{items_element(false, next_indent)} ]
#{textinput_element(false, next_indent)} end
#{other_element(false, next_indent)}
#{indent}</channel>
EOT
rv = @converter.convert(rv) if convert and @converter rv = @converter.convert(rv) if convert and @converter
rv rv
end end
@ -270,10 +270,18 @@ EOT
def _attrs def _attrs
[ [
["about", true] ["#{PREFIX}:about", true, "about"]
] ]
end end
def maker_target(maker)
maker.channel
end
def setup_maker_attributes(channel)
channel.about = self.about
end
class Image < Element class Image < Element
include RSS10 include RSS10
@ -298,22 +306,17 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
if @resource rv = tag(indent)
rv = %Q!#{indent}<image #{PREFIX}:resource="#{h @resource}" />! rv = @converter.convert(rv) if convert and @converter
rv = @converter.convert(rv) if convert and @converter rv
rv
else
''
end
end end
private private
def _attrs def _attrs
[ [
["resource", true] ["#{PREFIX}:resource", true, "resource"]
] ]
end end
end end
class Textinput < Element class Textinput < Element
@ -340,22 +343,17 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
if @resource rv = tag(indent)
rv = %Q|#{indent}<textinput #{PREFIX}:resource="#{h @resource}" />| rv = @converter.convert(rv) if convert and @converter
rv = @converter.convert(rv) if convert and @converter rv
rv
else
''
end
end end
private private
def _attrs def _attrs
[ [
["resource", true], ["#{PREFIX}:resource", true, "resource"]
] ]
end end
end end
class Items < Element class Items < Element
@ -387,13 +385,12 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent) do |next_indent|
<<-EOT [
#{indent}<items> Seq_element(convert, next_indent),
#{Seq_element(convert, next_indent)} other_element(convert, next_indent),
#{other_element(convert, next_indent)} ]
#{indent}</items> end
EOT
end end
private private
@ -452,17 +449,14 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent) do |next_indent|
about = '' [
about << %Q!#{PREFIX}:about="#{h @about}"! if @about title_element(false, next_indent),
rv = <<-EOT url_element(false, next_indent),
#{indent}<image #{about}> link_element(false, next_indent),
#{title_element(false, next_indent)} other_element(false, next_indent),
#{url_element(false, next_indent)} ]
#{link_element(false, next_indent)} end
#{other_element(false, next_indent)}
#{indent}</image>
EOT
rv = @converter.convert(rv) if convert and @converter rv = @converter.convert(rv) if convert and @converter
rv rv
end end
@ -480,10 +474,13 @@ EOT
def _attrs def _attrs
[ [
["about", true], ["#{PREFIX}:about", true, "about"]
] ]
end end
def maker_target(maker)
maker.image
end
end end
class Item < Element class Item < Element
@ -522,17 +519,14 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent) do |next_indent|
about = '' [
about << %Q!#{PREFIX}:about="#{h @about}"! if @about title_element(false, next_indent),
rv = <<-EOT link_element(false, next_indent),
#{indent}<item #{about}> description_element(false, next_indent),
#{title_element(false, next_indent)} other_element(false, next_indent),
#{link_element(false, next_indent)} ]
#{description_element(false, next_indent)} end
#{other_element(false, next_indent)}
#{indent}</item>
EOT
rv = @converter.convert(rv) if convert and @converter rv = @converter.convert(rv) if convert and @converter
rv rv
end end
@ -550,10 +544,13 @@ EOT
def _attrs def _attrs
[ [
["about", true], ["#{PREFIX}:about", true, "about"]
] ]
end end
def maker_target(maker)
maker.items.new_item
end
end end
class Textinput < Element class Textinput < Element
@ -593,18 +590,15 @@ EOT
end end
def to_s(convert=true, indent=calc_indent) def to_s(convert=true, indent=calc_indent)
next_indent = indent + INDENT rv = tag(indent) do |next_indent|
about = '' [
about << %Q!#{PREFIX}:about="#{h @about}"! if @about title_element(false, next_indent),
rv = <<-EOT description_element(false, next_indent),
#{indent}<textinput #{about}> name_element(false, next_indent),
#{title_element(false, next_indent)} link_element(false, next_indent),
#{description_element(false, next_indent)} other_element(false, next_indent),
#{name_element(false, next_indent)} ]
#{link_element(false, next_indent)} end
#{other_element(false, next_indent)}
#{indent}</textinput>
EOT
rv = @converter.convert(rv) if convert and @converter rv = @converter.convert(rv) if convert and @converter
rv rv
end end
@ -623,10 +617,13 @@ EOT
def _attrs def _attrs
[ [
["about", true], ["#{PREFIX}:about", true, "about"]
] ]
end end
def maker_target(maker)
maker.textinput
end
end end
end end

View file

@ -11,11 +11,18 @@ module RSS
install_model(x, '?') install_model(x, '?')
end end
%w(category).each do |x| remove_method :ttl=
install_have_child_element(x) def ttl=(value)
install_model(x, '?') @ttl = value.to_i
end end
[
%w(category categories),
].each do |name, plural_name|
install_have_children_element(name, plural_name)
install_model(name, '*')
end
[ [
["image", "?"], ["image", "?"],
["language", "?"], ["language", "?"],
@ -25,7 +32,7 @@ module RSS
def other_element(convert, indent) def other_element(convert, indent)
rv = <<-EOT rv = <<-EOT
#{category_element(convert, indent)} #{category_elements(convert, indent)}
#{generator_element(convert, indent)} #{generator_element(convert, indent)}
#{ttl_element(convert, indent)} #{ttl_element(convert, indent)}
EOT EOT
@ -35,16 +42,22 @@ EOT
private private
alias children09 children alias children09 children
def children def children
children09 + [@category].compact children09 + @category.compact
end end
alias _tags09 _tags alias _tags09 _tags
def _tags def _tags
%w(generator ttl category).delete_if do |x| rv = %w(generator ttl).delete_if do |x|
send(x).nil? send(x).nil?
end.collect do |elem| end.collect do |elem|
[nil, elem] [nil, elem]
end + _tags09 end + _tags09
@category.each do
rv << [nil, "category"]
end
rv
end end
Category = Item::Category Category = Item::Category
@ -74,13 +87,15 @@ EOT
end end
def other_element(convert, indent) def other_element(convert, indent)
rv = <<-EOT rv = [
#{author_element(false, indent)} super,
#{comments_element(false, indent)} *%w(author comments pubDate guid).collect do |name|
#{pubDate_element(false, indent)} __send__("#{name}_element", false, indent)
#{guid_element(false, indent)} end
EOT ].reject do |value|
rv << super /\A\s*\z/.match(value)
end
rv.join("\n")
end end
private private
@ -98,6 +113,12 @@ EOT
end + _tags09 end + _tags09
end end
alias _setup_maker_element setup_maker_element
def setup_maker_element(item)
_setup_maker_element(item)
@guid.setup_maker(item) if @guid
end
class Guid < Element class Guid < Element
include RSS09 include RSS09
@ -116,18 +137,6 @@ EOT
@content = content @content = content
end end
def to_s(convert=true, indent=calc_indent)
if @content
rv = %Q!<guid!
rv << %Q! isPermaLink="#{h @isPermaLink}"! if @isPermaLink
rv << %Q!>#{h @content}</guid>!
rv = @converter.convert(rv) if convert and @converter
rv
else
''
end
end
private private
def _attrs def _attrs
[ [
@ -135,6 +144,14 @@ EOT
] ]
end end
def maker_target(item)
item.guid
end
def setup_maker_attributes(guid)
guid.isPermaLink = isPermaLink
guid.content = content
end
end end
end end

View file

@ -7,12 +7,7 @@ module RSS
MAKERS = {} MAKERS = {}
class << self class << self
def make(version, modules=[], &block) def make(version, &block)
prefix = "rss/maker"
require "#{prefix}/#{version}"
modules.each do |mod|
require "#{prefix}/#{mod}"
end
maker(version).make(&block) maker(version).make(&block)
end end
@ -31,3 +26,10 @@ module RSS
end end
end end
require "rss/maker/1.0"
require "rss/maker/2.0"
require "rss/maker/content"
require "rss/maker/dublincore"
require "rss/maker/syndication"
require "rss/maker/trackback"

View file

@ -11,23 +11,15 @@ module RSS
super super
end end
def to_rss
rss = Rss.new(@rss_version, @version, @encoding, @standalone)
setup_xml_stylesheets(rss)
setup_channel(rss)
setup_other_elements(rss)
if rss.channel
rss
else
nil
end
end
private private
def setup_channel(rss) def make_rss
@channel.to_rss(rss) Rss.new(@rss_version, @version, @encoding, @standalone)
end end
def setup_elements(rss)
setup_channel(rss)
end
class Channel < ChannelBase class Channel < ChannelBase
def to_rss(rss) def to_rss(rss)
@ -44,12 +36,13 @@ module RSS
else else
nil nil
end end
elsif variable_is_set?
raise NotSetError.new("maker.channel", not_set_required_variables)
end end
end end
def have_required_values? def have_required_values?
@title and @link and @description and @language and @title and @link and @description and @language
@maker.image.have_required_values?
end end
private private
@ -69,9 +62,76 @@ module RSS
super + ["pubDate"] super + ["pubDate"]
end end
def required_variable_names
%w(title link description language)
end
class SkipDays < SkipDaysBase
def to_rss(rss, channel)
unless @days.empty?
skipDays = Rss::Channel::SkipDays.new
channel.skipDays = skipDays
@days.each do |day|
day.to_rss(rss, skipDays.days)
end
end
end
class Day < DayBase
def to_rss(rss, days)
day = Rss::Channel::SkipDays::Day.new
set = setup_values(day)
if set
days << day
setup_other_elements(rss)
end
end
def have_required_values?
@content
end
end
end
class SkipHours < SkipHoursBase
def to_rss(rss, channel)
unless @hours.empty?
skipHours = Rss::Channel::SkipHours.new
channel.skipHours = skipHours
@hours.each do |hour|
hour.to_rss(rss, skipHours.hours)
end
end
end
class Hour < HourBase
def to_rss(rss, hours)
hour = Rss::Channel::SkipHours::Hour.new
set = setup_values(hour)
if set
hours << hour
setup_other_elements(rss)
end
end
def have_required_values?
@content
end
end
end
class Cloud < CloudBase class Cloud < CloudBase
def to_rss(*args)
end
end end
class Categories < CategoriesBase
def to_rss(*args)
end
class Category < CategoryBase
end
end
end end
class Image < ImageBase class Image < ImageBase
@ -130,9 +190,12 @@ module RSS
end end
end end
class Category < CategoryBase class Categories < CategoriesBase
def to_rss(*args) def to_rss(*args)
end end
class Category < CategoryBase
end
end end
end end
@ -156,5 +219,6 @@ module RSS
end end
add_maker(filename_to_version(__FILE__), RSS09) add_maker(filename_to_version(__FILE__), RSS09)
add_maker(filename_to_version(__FILE__) + "1", RSS09)
end end
end end

View file

@ -11,41 +11,22 @@ module RSS
super("1.0") super("1.0")
end end
def to_rss private
rss = RDF.new(@version, @encoding, @standalone) def make_rss
setup_xml_stylesheets(rss) RDF.new(@version, @encoding, @standalone)
end
def setup_elements(rss)
setup_channel(rss) setup_channel(rss)
setup_image(rss) setup_image(rss)
setup_items(rss) setup_items(rss)
setup_textinput(rss) setup_textinput(rss)
setup_other_elements(rss)
if rss.channel
rss
else
nil
end
end
private
def setup_channel(rss)
@channel.to_rss(rss)
end
def setup_image(rss)
@image.to_rss(rss)
end
def setup_items(rss)
@items.to_rss(rss)
end
def setup_textinput(rss)
@textinput.to_rss(rss)
end end
class Channel < ChannelBase class Channel < ChannelBase
def to_rss(rss) def to_rss(rss)
set = false
if @about if @about
channel = RDF::Channel.new(@about) channel = RDF::Channel.new(@about)
set = setup_values(channel) set = setup_values(channel)
@ -57,12 +38,16 @@ module RSS
setup_other_elements(rss) setup_other_elements(rss)
end end
end end
if (!@about or !set) and variable_is_set?
raise NotSetError.new("maker.channel", not_set_required_variables)
end
end end
def have_required_values? def have_required_values?
@about and @title and @link and @description @about and @title and @link and @description
end end
private private
def setup_items(rss) def setup_items(rss)
items = RDF::Channel::Items.new items = RDF::Channel::Items.new
@ -86,7 +71,37 @@ module RSS
end end
end end
def required_variable_names
%w(about title link description)
end
class SkipDays < SkipDaysBase
def to_rss(*args)
end
class Day < DayBase
end
end
class SkipHours < SkipHoursBase
def to_rss(*args)
end
class Hour < HourBase
end
end
class Cloud < CloudBase class Cloud < CloudBase
def to_rss(*args)
end
end
class Categories < CategoriesBase
def to_rss(*args)
end
class Category < CategoryBase
end
end end
end end
@ -153,9 +168,12 @@ module RSS
end end
end end
class Category < CategoryBase class Categories < CategoriesBase
def to_rss(*args) def to_rss(*args)
end end
class Category < CategoryBase
end
end end
end end
end end

View file

@ -13,23 +13,30 @@ module RSS
class Channel < RSS09::Channel class Channel < RSS09::Channel
add_other_element("cloud")
def have_required_values? def have_required_values?
@title and @link and @description @title and @link and @description
end end
private def required_variable_names
def setup_cloud(rss, current) %w(title link description)
@maker.channel.cloud.to_rss(rss)
end end
class SkipDays < RSS09::Channel::SkipDays
class Day < RSS09::Channel::SkipDays::Day
end
end
class SkipHours < RSS09::Channel::SkipHours
class Hour < RSS09::Channel::SkipHours::Hour
end
end
class Cloud < RSS09::Channel::Cloud class Cloud < RSS09::Channel::Cloud
def to_rss(rss) def to_rss(rss, channel)
cloud = Rss::Channel::Cloud.new cloud = Rss::Channel::Cloud.new
set = setup_values(cloud) set = setup_values(cloud)
if set if set
rss.channel.cloud = cloud channel.cloud = cloud
setup_other_elements(rss) setup_other_elements(rss)
end end
end end
@ -39,6 +46,30 @@ module RSS
@registerProcedure and @protocol @registerProcedure and @protocol
end end
end end
class Categories < RSS09::Channel::Categories
def to_rss(rss, channel)
@categories.each do |category|
category.to_rss(rss, channel)
end
end
class Category < RSS09::Channel::Categories::Category
def to_rss(rss, channel)
category = Rss::Channel::Category.new
set = setup_values(category)
if set
channel.categories << category
setup_other_elements(rss)
end
end
def have_required_values?
@content
end
end
end
end end
class Image < RSS09::Image class Image < RSS09::Image
@ -102,18 +133,26 @@ module RSS
end end
end end
class Category < RSS09::Items::Item::Category class Categories < RSS09::Items::Item::Categories
def to_rss(rss, item) def to_rss(rss, item)
category = Rss::Channel::Item::Category.new @categories.each do |category|
set = setup_values(category) category.to_rss(rss, item)
if set
item.category = category
setup_other_elements(rss)
end end
end end
def have_required_values? class Category < RSS09::Items::Item::Categories::Category
@content def to_rss(rss, item)
category = Rss::Channel::Item::Category.new
set = setup_values(category)
if set
item.categories << category
setup_other_elements(rss)
end
end
def have_required_values?
@content
end
end end
end end
end end

View file

@ -38,13 +38,24 @@ module RSS
OTHER_ELEMENTS OTHER_ELEMENTS
end end
def self.add_need_initialize_variable(variable_name) def self.add_need_initialize_variable(variable_name, init_value="nil")
const_get("NEED_INITIALIZE_VARIABLES") << variable_name const_get("NEED_INITIALIZE_VARIABLES") << [variable_name, init_value]
end end
def self.need_initialize_variables def self.need_initialize_variables
NEED_INITIALIZE_VARIABLES NEED_INITIALIZE_VARIABLES
end end
def self.def_array_element(name)
include Enumerable
extend Forwardable
def_delegators("@\#{name}", :<<, :[], :[]=, :first, :last)
def_delegators("@\#{name}", :push, :pop, :shift, :unshift)
def_delegators("@\#{name}", :each)
add_need_initialize_variable(name, "[]")
end
EOC EOC
end end
@ -59,8 +70,8 @@ module RSS
private private
def initialize_variables def initialize_variables
self.class.need_initialize_variables.each do |variable_name| self.class.need_initialize_variables.each do |variable_name, init_value|
instance_eval("@#{variable_name} = nil", __FILE__, __LINE__) instance_eval("@#{variable_name} = #{init_value}", __FILE__, __LINE__)
end end
end end
@ -88,7 +99,28 @@ module RSS
end end
def variables def variables
self.class.need_initialize_variables self.class.need_initialize_variables.find_all do |name, init|
"nil" == init
end.collect do |name, init|
name
end
end
def variable_is_set?
variables.find {|var| !__send__(var).nil?}
end
def not_set_required_variables
required_variable_names.find_all do |var|
__send__(var).nil?
end
end
def required_variables_are_set?
required_variable_names.each do |var|
return false if __send__(var).nil?
end
true
end end
end end
@ -102,9 +134,22 @@ module RSS
end end
end end
attr_reader :rss_version, :xml_stylesheets %w(xml_stylesheets channel image items textinput).each do |element|
attr_reader :channel, :image, :items, :textinput attr_reader element
add_need_initialize_variable(element, "make_#{element}")
module_eval(<<-EOC, __FILE__, __LINE__)
private
def setup_#{element}(rss)
@#{element}.to_rss(rss)
end
def make_#{element}
self.class::#{element[0,1].upcase}#{element[1..-1]}.new(self)
end
EOC
end
attr_reader :rss_version
attr_accessor :version, :encoding, :standalone attr_accessor :version, :encoding, :standalone
def initialize(rss_version) def initialize(rss_version)
@ -113,63 +158,45 @@ module RSS
@version = "1.0" @version = "1.0"
@encoding = "UTF-8" @encoding = "UTF-8"
@standalone = nil @standalone = nil
@xml_stylesheets = make_xml_stylesheets
@channel = make_channel
@image = make_image
@items = make_items
@textinput = make_textinput
end end
def make(&block) def make
block.call(self) if block if block_given?
to_rss yield(self)
to_rss
else
nil
end
end end
def to_rss
rss = make_rss
setup_xml_stylesheets(rss)
setup_elements(rss)
setup_other_elements(rss)
if rss.channel
rss
else
nil
end
end
def current_element(rss) def current_element(rss)
rss rss
end end
private private
remove_method :make_xml_stylesheets
def make_xml_stylesheets def make_xml_stylesheets
XMLStyleSheets.new(self) XMLStyleSheets.new(self)
end end
def make_channel
self.class::Channel.new(self)
end
def make_image
self.class::Image.new(self)
end
def make_items
self.class::Items.new(self)
end
def make_textinput
self.class::Textinput.new(self)
end
def setup_xml_stylesheets(rss)
@xml_stylesheets.to_rss(rss)
end
end end
class XMLStyleSheets class XMLStyleSheets
include Base include Base
include Enumerable def_array_element("xml_stylesheets")
extend Forwardable
def_delegators(:@xml_stylesheets, :<<, :[], :[]=, :first, :last)
def_delegators(:@xml_stylesheets, :push, :pop, :shift, :unshift)
def_delegators(:@xml_stylesheets, :each)
def initialize(maker)
super
@xml_stylesheets = []
end
def to_rss(rss) def to_rss(rss)
@xml_stylesheets.each do |xss| @xml_stylesheets.each do |xss|
@ -217,12 +244,25 @@ module RSS
class ChannelBase class ChannelBase
include Base include Base
attr_reader :cloud %w(cloud categories skipDays skipHours).each do |element|
attr_reader element
add_other_element(element)
add_need_initialize_variable(element, "make_#{element}")
module_eval(<<-EOC, __FILE__, __LINE__)
private
def setup_#{element}(rss, current)
@#{element}.to_rss(rss, current)
end
def make_#{element}
self.class::#{element[0,1].upcase}#{element[1..-1]}.new(@maker)
end
EOC
end
%w(about title link description language copyright %w(about title link description language copyright
managingEditor webMaster rating docs skipDays managingEditor webMaster rating docs date
skipHours date lastBuildDate category generator ttl lastBuildDate generator ttl).each do |element|
).each do |element|
attr_accessor element attr_accessor element
add_need_initialize_variable(element) add_need_initialize_variable(element)
end end
@ -230,18 +270,68 @@ module RSS
alias_method(:pubDate, :date) alias_method(:pubDate, :date)
alias_method(:pubDate=, :date=) alias_method(:pubDate=, :date=)
def initialize(maker)
super
@cloud = make_cloud
end
def current_element(rss) def current_element(rss)
rss.channel rss.channel
end end
private class SkipDaysBase
def make_cloud include Base
self.class::Cloud.new(@maker)
def_array_element("days")
def new_day
day = self.class::Day.new(@maker)
@days << day
day
end
def current_element(rss)
rss.channel.skipDays
end
class DayBase
include Base
%w(content).each do |element|
attr_accessor element
add_need_initialize_variable(element)
end
def current_element(rss)
rss.channel.skipDays.last
end
end
end
class SkipHoursBase
include Base
def_array_element("hours")
def new_hour
hour = self.class::Hour.new(@maker)
@hours << hour
hour
end
def current_element(rss)
rss.channel.skipHours
end
class HourBase
include Base
%w(content).each do |element|
attr_accessor element
add_need_initialize_variable(element)
end
def current_element(rss)
rss.channel.skipHours.last
end
end
end end
class CloudBase class CloudBase
@ -257,6 +347,27 @@ module RSS
end end
end end
class CategoriesBase
include Base
def_array_element("categories")
def new_category
category = self.class::Category.new(@maker)
@categories << category
category
end
class CategoryBase
include Base
%w(domain content).each do |element|
attr_accessor element
add_need_initialize_variable(element)
end
end
end
end end
class ImageBase class ImageBase
@ -279,23 +390,18 @@ module RSS
class ItemsBase class ItemsBase
include Base include Base
include Enumerable def_array_element("items")
extend Forwardable
def_delegators(:@items, :<<, :[], :[]=, :first, :last)
def_delegators(:@items, :push, :pop, :shift, :unshift)
def_delegators(:@items, :each)
attr_accessor :do_sort attr_accessor :do_sort, :max_size
def initialize(maker) def initialize(maker)
super super
@items = []
@do_sort = false @do_sort = false
@max_size = -1
end end
def normalize def normalize
sort_if_need sort_if_need[0..@max_size]
end end
def current_element(rss) def current_element(rss)
@ -326,9 +432,10 @@ module RSS
class ItemBase class ItemBase
include Base include Base
%w(guid enclosure source category).each do |element| %w(guid enclosure source categories).each do |element|
attr_reader element attr_reader element
add_other_element(element) add_other_element(element)
add_need_initialize_variable(element, "make_#{element}")
module_eval(<<-EOC, __FILE__, __LINE__) module_eval(<<-EOC, __FILE__, __LINE__)
private private
def setup_#{element}(rss, current) def setup_#{element}(rss, current)
@ -349,14 +456,6 @@ EOC
alias_method(:pubDate, :date) alias_method(:pubDate, :date)
alias_method(:pubDate=, :date=) alias_method(:pubDate=, :date=)
def initialize(maker)
super
@guid = make_guid
@enclosure = make_enclosure
@source = make_source
@category = make_category
end
def <=>(other) def <=>(other)
if @date and other.date if @date and other.date
@date <=> other.date @date <=> other.date
@ -400,14 +499,7 @@ EOC
end end
end end
class CategoryBase CategoriesBase = ChannelBase::CategoriesBase
include Base
%w(domain content).each do |element|
attr_accessor element
add_need_initialize_variable(element)
end
end
end end
end end

View file

@ -1,5 +1,6 @@
require 'rss/trackback' require 'rss/trackback'
require 'rss/maker/1.0' require 'rss/maker/1.0'
require 'rss/maker/2.0'
module RSS module RSS
module Maker module Maker
@ -7,18 +8,65 @@ module RSS
def self.append_features(klass) def self.append_features(klass)
super super
%w(ping about).each do |element| name = "#{RSS::TRACKBACK_PREFIX}_ping"
name = "#{RSS::TRACKBACK_PREFIX}_#{element}" klass.add_need_initialize_variable(name)
klass.add_need_initialize_variable(name) klass.add_other_element(name)
klass.add_other_element(name) klass.__send__(:attr_accessor, name)
klass.__send__(:attr_accessor, name) klass.module_eval(<<-EOC, __FILE__, __LINE__)
klass.module_eval(<<-EOC, __FILE__, __LINE__) def setup_#{name}(rss, current)
def setup_#{name}(rss, current) if #{name} and current.respond_to?(:#{name}=)
if #{name} and current.respond_to?(:#{name}=) current.#{name} = #{name}
current.#{name} = @#{name} if @#{name}
end
end end
EOC end
EOC
name = "#{RSS::TRACKBACK_PREFIX}_abouts"
klass.add_need_initialize_variable(name, "make_#{name}")
klass.add_other_element(name)
klass.__send__(:attr_accessor, name)
klass.module_eval(<<-EOC, __FILE__, __LINE__)
def make_#{name}
self.class::TrackBackAbouts.new(self)
end
def setup_#{name}(rss, current)
@#{name}.to_rss(rss, current)
end
EOC
end
class TrackBackAboutsBase
include Base
def_array_element("abouts")
def new_about
about = self.class::About.new(@maker)
@abouts << about
about
end
def to_rss(rss, current)
@abouts.each do |about|
about.to_rss(rss, current)
end
end
class AboutBase
include Base
attr_accessor :value
add_need_initialize_variable(:value)
alias_method(:resource, :value)
alias_method(:resource=, :value=)
alias_method(:content, :value)
alias_method(:content=, :value=)
def have_required_values?
@value
end
end end
end end
end end
@ -26,5 +74,53 @@ module RSS
class ItemsBase class ItemsBase
class ItemBase; include TrackBackModel; end class ItemBase; include TrackBackModel; end
end end
class RSS10
class Items
class Item
class TrackBackAbouts < TrackBackAboutsBase
class About < AboutBase
def to_rss(rss, current)
if resource
about = ::RSS::TrackBackModel10::About.new(resource)
current.trackback_abouts << about
end
end
end
end
end
end
end
class RSS09
class Items
class Item
class TrackBackAbouts < TrackBackAboutsBase
def to_rss(*args)
end
class About < AboutBase
end
end
end
end
end
class RSS20
class Items
class Item
class TrackBackAbouts < TrackBackAboutsBase
class About < AboutBase
def to_rss(rss, current)
if content
about = ::RSS::TrackBackModel20::About.new(content)
current.trackback_abouts << about
end
end
end
end
end
end
end
end end
end end

View file

@ -348,6 +348,13 @@ module RSS
end end
if @do_validate and required and val.nil? if @do_validate and required and val.nil?
unless a_uri.include?(nil)
for prefix, uri in ns
if a_uri.include?(uri)
a_name = "#{prefix}:#{a_name}"
end
end
end
raise MissingAttributeError.new(tag_name, a_name) raise MissingAttributeError.new(tag_name, a_name)
end end
@ -357,10 +364,9 @@ module RSS
previous = @last_element previous = @last_element
next_element = klass.send(:new, *args) next_element = klass.send(:new, *args)
next_element.do_validate = @do_validate next_element.do_validate = @do_validate
setter = "" prefix = ""
setter << "#{klass.required_prefix}_" if klass.required_prefix prefix << "#{klass.required_prefix}_" if klass.required_prefix
setter << "#{tag_name}=" previous.__send__(:set_next_element, prefix, tag_name, next_element)
@last_element.send(setter, next_element)
@last_element = next_element @last_element = next_element
@proc_stack.push Proc.new { |text, tags| @proc_stack.push Proc.new { |text, tags|
p(@last_element.class) if DEBUG p(@last_element.class) if DEBUG

View file

@ -36,7 +36,7 @@ module RSS
include ListenerMixin include ListenerMixin
def xmldecl(version, encoding, standalone) def xmldecl(version, encoding, standalone)
super super(version, encoding, standalone == "yes")
# Encoding is converted to UTF-8 when REXML parse XML. # Encoding is converted to UTF-8 when REXML parse XML.
@encoding = 'UTF-8' @encoding = 'UTF-8'
end end

View file

@ -58,7 +58,7 @@ require "rss/xml-stylesheet"
module RSS module RSS
VERSION = "0.1.0" VERSION = "0.1.2"
URI = "http://purl.org/rss/1.0/" URI = "http://purl.org/rss/1.0/"
@ -144,6 +144,15 @@ module RSS
end end
end end
class NotSetError < Error
attr_reader :name, :variables
def initialize(name, variables)
@name = name
@variables = variables
super("required variables of #{@name} are not set: #{@variables.join(', ')}")
end
end
module BaseModel module BaseModel
include Utils include Utils
@ -164,17 +173,20 @@ EOC
end end
alias_method(:install_have_attribute_element, :install_have_child_element) alias_method(:install_have_attribute_element, :install_have_child_element)
def install_have_children_element(name, postfix="s") def install_have_children_element(name, plural_name=nil)
add_have_children_element(name) plural_name ||= "#{name}s"
add_have_children_element(name, plural_name)
def_children_accessor(name, postfix) add_plural_form(name, plural_name)
install_element(name, postfix) do |n, elem_name|
def_children_accessor(name, plural_name)
install_element(name, "s") do |n, elem_name|
<<-EOC <<-EOC
rv = '' rv = []
@#{n}.each do |x| @#{n}.each do |x|
rv << "\#{x.to_s(convert, indent)}" value = "\#{x.to_s(convert, indent)}"
rv << value if /\\A\\s*\\z/ !~ value
end end
rv rv.join("\n")
EOC EOC
end end
end end
@ -289,9 +301,9 @@ EOC
end end
end end
def def_children_accessor(accessor_name, postfix="s") def def_children_accessor(accessor_name, plural_name)
module_eval(<<-EOC, *get_file_and_line_from_caller(2)) module_eval(<<-EOC, *get_file_and_line_from_caller(2))
def #{accessor_name}#{postfix} def #{plural_name}
@#{accessor_name} @#{accessor_name}
end end
@ -302,8 +314,12 @@ EOC
@#{accessor_name}.send("[]", *args) @#{accessor_name}.send("[]", *args)
end end
end end
def #{accessor_name}=(*args) def #{accessor_name}=(*args)
warn("Warning:\#{caller.first.sub(/:in `.*'\z/, '')}: " \
"Don't use `#{accessor_name} = XXX'/`set_#{accessor_name}(XXX)'. " \
"Those APIs are not sense of Ruby. " \
"Use `#{plural_name} << XXX' instead of them.")
if args.size == 1 if args.size == 1
@#{accessor_name}.push(args[0]) @#{accessor_name}.push(args[0])
else else
@ -314,6 +330,22 @@ EOC
EOC EOC
end end
def def_content_only_to_s
module_eval(<<-EOC, *get_file_and_line_from_caller(2))
def to_s(convert=true, indent=calc_indent)
if @content
rv = tag(indent) do |next_indent|
h(@content)
end
rv = @converter.convert(rv) if convert and @converter
rv
else
""
end
end
EOC
end
end end
class Element class Element
@ -329,7 +361,8 @@ EOC
klass.module_eval(<<-EOC) klass.module_eval(<<-EOC)
public public
@tag_name = name.split(/::/).last.downcase @tag_name = name.split(/::/).last
@tag_name[0,1] = @tag_name[0,1].downcase
@indent_size = name.split(/::/).size - 2 @indent_size = name.split(/::/).size - 2
@@must_call_validators = {} @@must_call_validators = {}
@ -373,6 +406,7 @@ EOC
def self.content_setup def self.content_setup
attr_writer :content attr_writer :content
convert_attr_reader :content convert_attr_reader :content
def_content_only_to_s
@@have_content = true @@have_content = true
end end
@ -386,8 +420,8 @@ EOC
@@have_children_elements @@have_children_elements
end end
def self.add_have_children_element(variable_name) def self.add_have_children_element(variable_name, plural_name)
@@have_children_elements << variable_name @@have_children_elements << [variable_name, plural_name]
end end
@@need_initialize_variables = [] @@need_initialize_variables = []
@ -400,6 +434,16 @@ EOC
@@need_initialize_variables @@need_initialize_variables
end end
@@plural_forms = {}
def self.add_plural_form(singular, plural)
@@plural_forms[singular] = plural
end
def self.plural_forms
@@plural_forms
end
EOC EOC
end end
@ -440,6 +484,14 @@ EOC
self.class.tag_name self.class.tag_name
end end
def full_name
tag_name
end
def indent_size
self.class.indent_size
end
def converter=(converter) def converter=(converter)
@converter = converter @converter = converter
children.each do |child| children.each do |child|
@ -457,6 +509,15 @@ EOC
__validate(tags, false) __validate(tags, false)
end end
def setup_maker(maker)
target = maker_target(maker)
unless target.nil?
setup_maker_attributes(target)
setup_maker_element(target)
setup_maker_elements(target)
end
end
private private
def initialize_variables def initialize_variables
self.class.need_initialize_variables.each do |variable_name| self.class.need_initialize_variables.each do |variable_name|
@ -467,11 +528,111 @@ EOC
end end
def initialize_have_children_elements def initialize_have_children_elements
self.class.have_children_elements.each do |variable_name| self.class.have_children_elements.each do |variable_name, plural_name|
instance_eval("@#{variable_name} = []") instance_eval("@#{variable_name} = []")
end end
end end
def tag(indent, additional_attrs=[], &block)
next_indent = indent + INDENT
attrs = collect_attrs
return "" if attrs.nil?
attrs += additional_attrs
start_tag = make_start_tag(indent, next_indent, attrs)
if block
content = block.call(next_indent)
else
content = []
end
if content.is_a?(String)
content = [content]
start_tag << ">"
end_tag = "</#{full_name}>"
else
content = content.reject{|x| x.empty?}
if content.empty?
end_tag = "/>"
else
start_tag << ">\n"
end_tag = "\n#{indent}</#{full_name}>"
end
end
start_tag + content.join("\n") + end_tag
end
def make_start_tag(indent, next_indent, attrs)
start_tag = ["#{indent}<#{full_name}"]
unless attrs.empty?
start_tag << attrs.collect do |key, value|
%Q[#{h key}="#{h value}"]
end.join("\n#{next_indent}")
end
start_tag.join(" ")
end
def collect_attrs
_attrs.collect do |name, required, alias_name|
value = __send__(alias_name || name)
return nil if required and value.nil?
[name, value]
end.reject do |name, value|
value.nil?
end
end
def tag_name_with_prefix(prefix)
"#{prefix}:#{tag_name}"
end
def calc_indent
INDENT * (self.class.indent_size)
end
def maker_target(maker)
nil
end
def setup_maker_attributes(target)
end
def setup_maker_element(target)
self.class.need_initialize_variables.each do |var|
setter = "#{var}="
if target.respond_to?(setter)
target.__send__(setter, __send__(var))
end
end
end
def setup_maker_elements(parent)
self.class.have_children_elements.each do |name, plural_name|
real_name = name.sub(/^[^_]+_/, '')
if parent.respond_to?(plural_name)
target = parent.__send__(plural_name)
__send__(plural_name).each do |elem|
elem.__send__("setup_maker", target)
end
end
end
end
def set_next_element(prefix, tag_name, next_element)
klass = next_element.class
prefix = ""
prefix << "#{klass.required_prefix}_" if klass.required_prefix
if self.class.plural_forms.has_key?(tag_name)
ary = __send__("#{prefix}#{self.class.plural_forms[tag_name]}")
ary << next_element
else
__send__("#{prefix}#{tag_name}=", next_element)
end
end
# not String class children. # not String class children.
def children def children
[] []
@ -507,23 +668,23 @@ EOC
end end
def validate_attribute def validate_attribute
_attrs.each do |a_name, required| _attrs.each do |a_name, required, alias_name|
if required and send(a_name).nil? if required and __send__(alias_name || a_name).nil?
raise MissingAttributeError.new(self.class.tag_name, a_name) raise MissingAttributeError.new(tag_name, a_name)
end end
end end
end end
def other_element(convert, indent='') def other_element(convert, indent='')
rv = '' rv = []
private_methods.each do |meth| private_methods.each do |meth|
if /\A([^_]+)_[^_]+_elements?\z/ =~ meth and if /\A([^_]+)_[^_]+_elements?\z/ =~ meth and
self.class::NSPOOL.has_key?($1) self.class::NSPOOL.has_key?($1)
res = send(meth, convert) res = __send__(meth, convert)
rv << "#{indent}#{res}\n" if /\A\s*\z/ !~ res rv << "#{indent}#{res}" if /\A\s*\z/ !~ res
end end
end end
rv rv.join("\n")
end end
def _validate(tags, model=self.class.model) def _validate(tags, model=self.class.model)
@ -626,19 +787,12 @@ EOC
rv rv
end end
private
def calc_indent
INDENT * (self.class.indent_size)
end
def remove_empty_newline(string)
string.gsub(/^\s*$(?:\r?\n?)/, '')
end
end end
module RootElementMixin module RootElementMixin
include XMLStyleSheetMixin
attr_reader :output_encoding attr_reader :output_encoding
def initialize(rss_version, version=nil, encoding=nil, standalone=nil) def initialize(rss_version, version=nil, encoding=nil, standalone=nil)
@ -655,26 +809,50 @@ EOC
self.converter = Converter.new(@output_encoding, @encoding) self.converter = Converter.new(@output_encoding, @encoding)
end end
def setup_maker(maker)
maker.version = version
maker.encoding = encoding
maker.standalone = standalone
xml_stylesheets.each do |xss|
xss.setup_maker(maker)
end
setup_maker_elements(maker)
end
private private
def tag(indent, attrs, &block)
rv = xmldecl + xml_stylesheet_pi
rv << super(indent, attrs, &block)
rv
end
def xmldecl def xmldecl
rv = %Q[<?xml version="#{@version}"] rv = %Q[<?xml version="#{@version}"]
if @output_encoding or @encoding if @output_encoding or @encoding
rv << %Q[ encoding="#{@output_encoding or @encoding}"] rv << %Q[ encoding="#{@output_encoding or @encoding}"]
end end
rv << %Q[ standalone="#{@standalone}"] if @standalone rv << %Q[ standalone="yes"] if @standalone
rv << '?>' rv << "?>\n"
rv rv
end end
def ns_declaration(indent) def ns_declarations
rv = '' self.class::NSPOOL.collect do |prefix, uri|
self.class::NSPOOL.each do |prefix, uri|
prefix = ":#{prefix}" unless prefix.empty? prefix = ":#{prefix}" unless prefix.empty?
rv << %Q|\n#{indent}xmlns#{prefix}="#{html_escape(uri)}"| ["xmlns#{prefix}", uri]
end end
rv
end end
def setup_maker_elements(maker)
channel.setup_maker(maker) if channel
image.setup_maker(maker) if image
textinput.setup_maker(maker) if textinput
items.each do |item|
item.setup_maker(maker)
end
end
end end
end end

View file

@ -9,7 +9,16 @@ module RSS
RDF.install_ns(TRACKBACK_PREFIX, TRACKBACK_URI) RDF.install_ns(TRACKBACK_PREFIX, TRACKBACK_URI)
Rss.install_ns(TRACKBACK_PREFIX, TRACKBACK_URI) Rss.install_ns(TRACKBACK_PREFIX, TRACKBACK_URI)
module BaseTrackBackModel module TrackBackUtils
private
def new_with_value_if_need(klass, value)
if value.is_a?(klass)
value
else
klass.new(value)
end
end
def trackback_validate(tags) def trackback_validate(tags)
counter = {} counter = {}
%w(ping about).each do |x| %w(ping about).each do |x|
@ -31,179 +40,64 @@ module RSS
end end
end end
end end
module TrackBackModel10 module BaseTrackBackModel
extend BaseModel def append_features(klass)
include BaseTrackBackModel
def self.append_features(klass)
super super
unless klass.class == Module unless klass.class == Module
%w(ping).each do |x| klass.__send__(:include, TrackBackUtils)
klass.install_have_child_element("#{TRACKBACK_PREFIX}_#{x}")
end
%w(about).each do |x|
klass.install_have_children_element("#{TRACKBACK_PREFIX}_#{x}")
end
end
end
class Ping < Element
include RSS10
class << self
def required_prefix
TRACKBACK_PREFIX
end
def required_uri
TRACKBACK_URI
end
end
[
["resource", ::RSS::RDF::URI, true]
].each do |name, uri, required|
install_get_attribute(name, uri, required)
end
def initialize(resource=nil)
super()
@resource = resource
end
def to_s(convert=true, indent=calc_indent)
if @resource
rv = %Q[#{indent}<#{TRACKBACK_PREFIX}:ping ]
rv << %Q[#{::RSS::RDF::PREFIX}:resource="#{h @resource}"/>]
rv = @converter.convert(rv) if convert and @converter
rv
else
''
end
end
private
def _attrs
[
["resource", true],
]
end
end
class About < Element
include RSS10
class << self
def required_prefix
TRACKBACK_PREFIX
end
def required_uri
TRACKBACK_URI
end
end
[
["resource", ::RSS::RDF::URI, true]
].each do |name, uri, required|
install_get_attribute(name, uri, required)
end
def initialize(resource=nil)
super()
@resource = resource
end
def to_s(convert=true, indent=calc_indent)
if @resource
rv = %Q[#{indent}<#{TRACKBACK_PREFIX}:about ]
rv << %Q[#{::RSS::RDF::PREFIX}:resource="#{h @resource}"/>]
rv = @converter.convert(rv) if convert and @converter
rv
else
''
end
end
private
def _attrs
[
["resource", true],
]
end
end
end
module TrackBackModel20
include BaseTrackBackModel
extend BaseModel
def self.append_features(klass)
super
unless klass.class == Module
%w(ping).each do |x| %w(ping).each do |x|
var_name = "#{TRACKBACK_PREFIX}_#{x}" var_name = "#{TRACKBACK_PREFIX}_#{x}"
klass_name = x.capitalize
klass.install_have_child_element(var_name) klass.install_have_child_element(var_name)
klass.module_eval(<<-EOC) klass.module_eval(<<-EOC, __FILE__, __LINE__)
alias _#{var_name} #{var_name} remove_method :#{var_name}
def #{var_name} def #{var_name}
@#{var_name} and @#{var_name}.content @#{var_name} and @#{var_name}.value
end end
alias _#{var_name}= #{var_name}= remove_method :#{var_name}=
def #{var_name}=(content) def #{var_name}=(value)
@#{var_name} = new_with_content_if_need(#{x.capitalize}, content) @#{var_name} = new_with_value_if_need(#{klass_name}, value)
end end
EOC EOC
end end
[%w(about s)].each do |x, postfix| [%w(about s)].each do |name, postfix|
var_name = "#{TRACKBACK_PREFIX}_#{x}" var_name = "#{TRACKBACK_PREFIX}_#{name}"
klass_name = name.capitalize
klass.install_have_children_element(var_name) klass.install_have_children_element(var_name)
klass.module_eval(<<-EOC) klass.module_eval(<<-EOC, __FILE__, __LINE__)
alias _#{var_name}#{postfix} #{var_name}#{postfix} remove_method :#{var_name}
def #{var_name}#{postfix}
@#{var_name}.collect {|x| x.content}
end
alias _#{var_name} #{var_name}
def #{var_name}(*args) def #{var_name}(*args)
if args.empty? if args.empty?
@#{var_name}.first and @#{var_name}.first.content @#{var_name}.first and @#{var_name}.first.value
else else
ret = @#{var_name}.send("[]", *args) ret = @#{var_name}.send("[]", *args)
if ret.is_a?(Array) if ret.is_a?(Array)
ret.collect {|x| x.content} ret.collect {|x| x.value}
else else
ret.content ret.value
end end
end end
end end
alias _#{var_name}= #{var_name}= remove_method :#{var_name}=
alias _set_#{var_name} set_#{var_name} remove_method :set_#{var_name}
def #{var_name}=(*args) def #{var_name}=(*args)
if args.size == 1 if args.size == 1
item = new_with_content_if_need(#{x.capitalize}, args[0]) item = new_with_value_if_need(#{klass_name}, args[0])
@#{var_name}.push(item) @#{var_name}.push(item)
else else
new_val = args.last new_val = args.last
if new_val.is_a?(Array) if new_val.is_a?(Array)
new_val = new_value.collect do |val| new_val = new_value.collect do |val|
new_with_content_if_need(#{x.capitalize}, val) new_with_value_if_need(#{klass_name}, val)
end end
else else
new_val = new_with_content_if_need(#{x.capitalize}, new_val) new_val = new_with_value_if_need(#{klass_name}, new_val)
end end
@#{var_name}.send("[]=", *(args[0..-2] + [new_val])) @#{var_name}.send("[]=", *(args[0..-2] + [new_val]))
end end
@ -213,22 +107,120 @@ module RSS
end end
end end
end end
end
private module TrackBackModel10
def new_with_content(klass, content) extend BaseModel
obj = klass.new extend BaseTrackBackModel
obj.content = content
obj class Ping < Element
end include RSS10
class << self
def required_prefix
TRACKBACK_PREFIX
end
def required_uri
TRACKBACK_URI
end
def new_with_content_if_need(klass, content)
if content.is_a?(klass)
content
else
new_with_content(klass, content)
end end
[
["resource", ::RSS::RDF::URI, true]
].each do |name, uri, required|
install_get_attribute(name, uri, required)
end
alias_method(:value, :resource)
alias_method(:value=, :resource=)
def initialize(resource=nil)
super()
@resource = resource
end
def full_name
tag_name_with_prefix(TRACKBACK_PREFIX)
end
def to_s(convert=true, indent=calc_indent)
rv = tag(indent)
rv = @converter.convert(rv) if convert and @converter
rv
end
private
def _attrs
[
["#{::RSS::RDF::PREFIX}:resource", true, "resource"],
]
end
end end
class About < Element
include RSS10
class << self
def required_prefix
TRACKBACK_PREFIX
end
def required_uri
TRACKBACK_URI
end
end
[
["resource", ::RSS::RDF::URI, true]
].each do |name, uri, required|
install_get_attribute(name, uri, required)
end
alias_method(:value, :resource)
alias_method(:value=, :resource=)
def initialize(resource=nil)
super()
@resource = resource
end
def full_name
tag_name_with_prefix(TRACKBACK_PREFIX)
end
def to_s(convert=true, indent=calc_indent)
rv = tag(indent)
rv = @converter.convert(rv) if convert and @converter
rv
end
private
def _attrs
[
["#{::RSS::RDF::PREFIX}:resource", true, "resource"],
]
end
def maker_target(abouts)
abouts.new_about
end
def setup_maker_attributes(about)
about.resource = self.resource
end
end
end
module TrackBackModel20
extend BaseModel
extend BaseTrackBackModel
class Ping < Element class Ping < Element
include RSS09 include RSS09
@ -247,18 +239,18 @@ module RSS
end end
def to_s(convert=true, indent=calc_indent) alias_method(:value, :content)
if @content alias_method(:value=, :content=)
rv = %Q[#{indent}<#{TRACKBACK_PREFIX}:ping>]
rv << h(@content)
rv << %Q[</#{TRACKBACK_PREFIX}:ping>]
rv = @converter.convert(rv) if convert and @converter
rv
else
''
end
end
def initialize(content=nil)
super()
@content = content
end
def full_name
tag_name_with_prefix(TRACKBACK_PREFIX)
end
end end
class About < Element class About < Element
@ -277,19 +269,19 @@ module RSS
end end
end end
def to_s(convert=true, indent=calc_indent)
if @content
rv = %Q[#{indent}<#{TRACKBACK_PREFIX}:about>]
rv << h(@content)
rv << %Q[</#{TRACKBACK_PREFIX}:about>]
rv = @converter.convert(rv) if convert and @converter
rv
else
''
end
end
alias_method(:value, :content)
alias_method(:value=, :content=)
def initialize(content=nil)
super()
@content = content
end
def full_name
tag_name_with_prefix(TRACKBACK_PREFIX)
end
end end
end end

View file

@ -84,6 +84,13 @@ module RSS
@alternate @alternate
end end
def setup_maker(maker)
xss = maker.xml_stylesheets.new_xml_stylesheet
ATTRIBUTES.each do |attr|
xss.__send__("#{attr}=", __send__(attr))
end
end
private private
def guess_type(filename) def guess_type(filename)
/\.([^.]+)$/ =~ filename /\.([^.]+)$/ =~ filename

View file

@ -45,7 +45,7 @@ module RSS
end end
def on_xmldecl_end def on_xmldecl_end
xmldecl(@version, @encoding, @standalone) xmldecl(@version, @encoding, @standalone == "yes")
end end
alias_method(:on_pi, :instruction) alias_method(:on_pi, :instruction)

View file

@ -2,12 +2,12 @@
require "nkf" require "nkf"
class String class String
# From tdiary.rb # From tdiary.rb
def shorten( len = 120 ) def shorten( len = 120 )
lines = NKF::nkf( "-e -m0 -f#{len}", self.gsub( /\n/, ' ' ) ).split( /\n/ ) lines = NKF::nkf( "-e -m0 -f#{len}", self.gsub( /\n/, ' ' ) ).split( /\n/ )
lines[0].concat( '...' ) if lines[0] and lines[1] lines[0].concat( '...' ) if lines[0] and lines[1]
lines[0] lines[0]
end end
end end
require "rss/1.0" require "rss/1.0"
@ -18,66 +18,66 @@ channels = {}
verbose = false verbose = false
def error(exception) def error(exception)
mark = "=" * 20 mark = "=" * 20
mark = "#{mark} error #{mark}" mark = "#{mark} error #{mark}"
puts mark puts mark
puts exception.class puts exception.class
puts exception.message puts exception.message
puts exception.backtrace puts exception.backtrace
puts mark puts mark
end end
before_time = Time.now before_time = Time.now
ARGV.each do |fname| ARGV.each do |fname|
if fname == '-v' if fname == '-v'
verbose = true verbose = true
next next
end end
rss = nil rss = nil
f = File.new(fname).read f = File.new(fname).read
begin begin
## do validate parse ## do validate parse
rss = RSS::Parser.parse(f) rss = RSS::Parser.parse(f)
rescue RSS::InvalidRSSError rescue RSS::InvalidRSSError
error($!) if verbose error($!) if verbose
## do non validate parse for invalid RSS 1.0 ## do non validate parse for invalid RSS 1.0
begin begin
rss = RSS::Parser.parse(f, false) rss = RSS::Parser.parse(f, false)
rescue RSS::Error rescue RSS::Error
## invalid RSS. ## invalid RSS.
error($!) if verbose error($!) if verbose
end end
rescue RSS::Error rescue RSS::Error
error($!) if verbose error($!) if verbose
end end
if rss.nil? if rss.nil?
puts "#{fname} does not include RSS 1.0 or 0.9x/2.0" puts "#{fname} does not include RSS 1.0 or 0.9x/2.0"
else else
begin begin
rss.output_encoding = "euc-jp" rss.output_encoding = "euc-jp"
rescue RSS::UnknownConversionMethodError rescue RSS::UnknownConversionMethodError
error($!) if verbose error($!) if verbose
end end
rss.channel.title ||= "Unknown" rss.channel.title ||= "Unknown"
rss.items.each do |item| rss.items.each do |item|
item.title ||= "Unknown" item.title ||= "Unknown"
channels[rss.channel.title] ||= [] channels[rss.channel.title] ||= []
channels[rss.channel.title] << item if item.description channels[rss.channel.title] << item if item.description
end end
end end
end end
processing_time = Time.now - before_time processing_time = Time.now - before_time
channels.sort do |x, y| channels.sort do |x, y|
x[0] <=> y[0] x[0] <=> y[0]
end[0..20].each do |title, items| end[0..20].each do |title, items|
puts "Channel: #{title}" unless items.empty? puts "Channel: #{title}" unless items.empty?
items.sort do |x, y| items.sort do |x, y|
x.title <=> y.title x.title <=> y.title
end[0..10].each do |item| end[0..10].each do |item|
puts " Item: #{item.title.shorten(50)}" puts " Item: #{item.title.shorten(50)}"
puts " Description: #{item.description.shorten(50)}" puts " Description: #{item.description.shorten(50)}"
end end
end end
puts "Used XML parser: #{RSS::Parser.default_parser}" puts "Used XML parser: #{RSS::Parser.default_parser}"

View file

@ -2,12 +2,12 @@
require "nkf" require "nkf"
class String class String
# From tdiary.rb # From tdiary.rb
def shorten( len = 120 ) def shorten( len = 120 )
lines = NKF::nkf( "-e -m0 -f#{len}", self.gsub( /\n/, ' ' ) ).split( /\n/ ) lines = NKF::nkf( "-e -m0 -f#{len}", self.gsub( /\n/, ' ' ) ).split( /\n/ )
lines[0].concat( '...' ) if lines[0] and lines[1] lines[0].concat( '...' ) if lines[0] and lines[1]
lines[0] lines[0]
end end
end end
require "rss/1.0" require "rss/1.0"
@ -18,65 +18,65 @@ items = []
verbose = false verbose = false
def error(exception) def error(exception)
mark = "=" * 20 mark = "=" * 20
mark = "#{mark} error #{mark}" mark = "#{mark} error #{mark}"
puts mark puts mark
puts exception.class puts exception.class
puts exception.message puts exception.message
puts exception.backtrace puts exception.backtrace
puts mark puts mark
end end
before_time = Time.now before_time = Time.now
ARGV.each do |fname| ARGV.each do |fname|
if fname == '-v' if fname == '-v'
verbose = true verbose = true
next next
end end
rss = nil rss = nil
f = File.new(fname).read f = File.new(fname).read
begin begin
## do validate parse ## do validate parse
rss = RSS::Parser.parse(f) rss = RSS::Parser.parse(f)
rescue RSS::InvalidRSSError rescue RSS::InvalidRSSError
error($!) if verbose error($!) if verbose
## do non validate parse for invalid RSS 1.0 ## do non validate parse for invalid RSS 1.0
begin begin
rss = RSS::Parser.parse(f, false) rss = RSS::Parser.parse(f, false)
rescue RSS::Error rescue RSS::Error
## invalid RSS. ## invalid RSS.
error($!) if verbose error($!) if verbose
end end
rescue RSS::Error rescue RSS::Error
error($!) if verbose error($!) if verbose
end end
if rss.nil? if rss.nil?
puts "#{fname} does not include RSS 1.0 or 0.9x/2.0" puts "#{fname} does not include RSS 1.0 or 0.9x/2.0"
else else
begin begin
rss.output_encoding = "euc-jp" rss.output_encoding = "euc-jp"
rescue RSS::UnknownConversionMethodError rescue RSS::UnknownConversionMethodError
error($!) if verbose error($!) if verbose
end end
rss.items.each do |item| rss.items.each do |item|
if item.respond_to?(:pubDate) and item.pubDate if item.respond_to?(:pubDate) and item.pubDate
class << item class << item
alias_method(:dc_date, :pubDate) alias_method(:dc_date, :pubDate)
end end
end end
if item.respond_to?(:dc_date) and item.dc_date if item.respond_to?(:dc_date) and item.dc_date
items << [rss.channel, item] items << [rss.channel, item]
end end
end end
end end
end end
processing_time = Time.now - before_time processing_time = Time.now - before_time
items.sort do |x, y| items.sort do |x, y|
y[1].dc_date <=> x[1].dc_date y[1].dc_date <=> x[1].dc_date
end[0..20].each do |channel, item| end[0..20].each do |channel, item|
puts "#{item.dc_date.localtime.iso8601}: " << puts "#{item.dc_date.localtime.iso8601}: " <<
"#{channel.title}: #{item.title}" "#{channel.title}: #{item.title}"
puts " Description: #{item.description.shorten(50)}" if item.description puts " Description: #{item.description.shorten(50)}" if item.description
end end
puts "Used XML parser: #{RSS::Parser.default_parser}" puts "Used XML parser: #{RSS::Parser.default_parser}"

View file

@ -94,27 +94,44 @@ module RSS
end end
end end
end end
def assert_xml_stylesheet_attrs(xsl, attrs) def assert_not_set_error(name, variables)
_wrap_assertion do _wrap_assertion do
normalized_attrs = {} begin
attrs.each do |name, value| yield
normalized_attrs[name.to_s] = value flunk("Not raise NotSetError")
end rescue ::RSS::NotSetError => e
::RSS::XMLStyleSheet::ATTRIBUTES.each do |name| assert_equal(name, e.name)
assert_equal(normalized_attrs[name], xsl.send(name)) assert_equal(variables.sort, e.variables.sort)
end end
end end
end end
def assert_xml_stylesheet(target, xsl, attrs) def assert_xml_declaration(version, encoding, standalone, rss)
_wrap_assertion do
assert_equal(version, rss.version)
assert_equal(encoding, rss.encoding)
assert_equal(standalone, rss.standalone)
end
end
def assert_xml_stylesheet_attrs(attrs, xsl)
_wrap_assertion do
n_attrs = normalized_attrs(attrs)
::RSS::XMLStyleSheet::ATTRIBUTES.each do |name|
assert_equal(n_attrs[name], xsl.send(name))
end
end
end
def assert_xml_stylesheet(target, attrs, xsl)
_wrap_assertion do _wrap_assertion do
if attrs.has_key?(:href) if attrs.has_key?(:href)
if !attrs.has_key?(:type) and attrs.has_key?(:guess_type) if !attrs.has_key?(:type) and attrs.has_key?(:guess_type)
attrs[:type] = attrs[:guess_type] attrs[:type] = attrs[:guess_type]
end end
assert_equal("xml-stylesheet", target) assert_equal("xml-stylesheet", target)
assert_xml_stylesheet_attrs(xsl, attrs) assert_xml_stylesheet_attrs(attrs, xsl)
else else
assert_nil(target) assert_nil(target)
assert_equal("", xsl.to_s) assert_equal("", xsl.to_s)
@ -123,40 +140,314 @@ module RSS
end end
def assert_xml_stylesheet_pis(attrs_ary) def assert_xml_stylesheet_pis(attrs_ary)
rdf = ::RSS::RDF.new() _wrap_assertion do
xss_strs = [] rdf = ::RSS::RDF.new()
attrs_ary.each do |attrs| xss_strs = []
xss = ::RSS::XMLStyleSheet.new(*attrs) attrs_ary.each do |attrs|
xss_strs.push(xss.to_s) xss = ::RSS::XMLStyleSheet.new(*attrs)
rdf.xml_stylesheets.push(xss) xss_strs.push(xss.to_s)
rdf.xml_stylesheets.push(xss)
end
pi_str = rdf.to_s.gsub(/<\?xml .*\n/, "").gsub(/\s*<rdf:RDF.*\z/m, "")
assert_equal(xss_strs.join("\n"), pi_str)
end end
pi_str = rdf.to_s.gsub(/<\?xml .*\n/, "").gsub(/\s*<rdf:RDF.*\z/m, "")
assert_equal(xss_strs.join("\n"), pi_str)
end end
def assert_xml_stylesheets(attrs, xss)
_wrap_assertion do
xss.each_with_index do |xs, i|
assert_xml_stylesheet_attrs(attrs[i], xs)
end
end
end
def assert_channel10(attrs, channel)
_wrap_assertion do
n_attrs = normalized_attrs(attrs)
names = %w(about title link description)
assert_attributes(attrs, names, channel)
%w(image items textinput).each do |name|
value = n_attrs[name]
if value
target = channel.__send__(name)
__send__("assert_channel10_#{name}", value, target)
end
end
end
end
def assert_channel10_image(attrs, image)
_wrap_assertion do
assert_attributes(attrs, %w(resource), image)
end
end
def assert_channel10_textinput(attrs, textinput)
_wrap_assertion do
assert_attributes(attrs, %w(resource), textinput)
end
end
def assert_channel10_items(attrs, items)
_wrap_assertion do
items.Seq.lis.each_with_index do |li, i|
assert_attributes(attrs[i], %w(resource), li)
end
end
end
def assert_image10(attrs, image)
_wrap_assertion do
names = %w(about title url link)
assert_attributes(attrs, names, image)
end
end
def assert_items10(attrs, items)
_wrap_assertion do
names = %w(about title link description)
items.each_with_index do |item, i|
assert_attributes(attrs[i], names, item)
end
end
end
def assert_textinput10(attrs, textinput)
_wrap_assertion do
names = %w(about title description name link)
assert_attributes(attrs, names, textinput)
end
end
def assert_channel09(attrs, channel)
_wrap_assertion do
n_attrs = normalized_attrs(attrs)
names = %w(title description link language rating
copyright pubDate lastBuildDate docs
managingEditor webMaster)
assert_attributes(attrs, names, channel)
%w(skipHours skipDays).each do |name|
value = n_attrs[name]
if value
target = channel.__send__(name)
__send__("assert_channel09_#{name}", value, target)
end
end
end
end
def assert_channel09_skipDays(contents, skipDays)
_wrap_assertion do
days = skipDays.days
contents.each_with_index do |content, i|
assert_equal(content, days[i].content)
end
end
end
def assert_channel09_skipHours(contents, skipHours)
_wrap_assertion do
hours = skipHours.hours
contents.each_with_index do |content, i|
assert_equal(content, hours[i].content)
end
end
end
def assert_image09(attrs, image)
_wrap_assertion do
names = %w(url link title description width height)
assert_attributes(attrs, names, image)
end
end
def assert_items09(attrs, items)
_wrap_assertion do
names = %w(title link description)
items.each_with_index do |item, i|
assert_attributes(attrs[i], names, item)
end
end
end
def assert_textinput09(attrs, textinput)
_wrap_assertion do
names = %w(title description name link)
assert_attributes(attrs, names, textinput)
end
end
def assert_channel20(attrs, channel)
_wrap_assertion do
n_attrs = normalized_attrs(attrs)
names = %w(title link description language copyright
managingEditor webMaster pubDate
lastBuildDate generator docs ttl rating)
assert_attributes(attrs, names, channel)
%w(cloud categories skipHours skipDays).each do |name|
value = n_attrs[name]
if value
target = channel.__send__(name)
__send__("assert_channel20_#{name}", value, target)
end
end
end
end
def assert_channel20_skipDays(contents, skipDays)
assert_channel09_skipDays(contents, skipDays)
end
def assert_channel20_skipHours(contents, skipHours)
assert_channel09_skipHours(contents, skipHours)
end
def assert_channel20_cloud(attrs, cloud)
_wrap_assertion do
names = %w(domain port path registerProcedure protocol)
assert_attributes(attrs, names, cloud)
end
end
def assert_channel20_categories(attrs, categories)
_wrap_assertion do
names = %w(domain content)
categories.each_with_index do |category, i|
assert_attributes(attrs[i], names, category)
end
end
end
def assert_image20(attrs, image)
_wrap_assertion do
names = %w(url link title description width height)
assert_attributes(attrs, names, image)
end
end
def assert_items20(attrs, items)
_wrap_assertion do
names = %w(about title link description)
items.each_with_index do |item, i|
assert_attributes(attrs[i], names, item)
n_attrs = normalized_attrs(attrs[i])
%w(source enclosure categories guid).each do |name|
value = n_attrs[name]
if value
target = item.__send__(name)
__send__("assert_items20_#{name}", value, target)
end
end
end
end
end
def assert_items20_source(attrs, source)
_wrap_assertion do
assert_attributes(attrs, %w(url content), source)
end
end
def assert_items20_enclosure(attrs, enclosure)
_wrap_assertion do
names = %w(url length type)
assert_attributes(attrs, names, enclosure)
end
end
def assert_items20_categories(attrs, categories)
_wrap_assertion do
assert_channel20_categories(attrs, categories)
end
end
def assert_items20_guid(attrs, guid)
_wrap_assertion do
assert_attributes(attrs, %w(isPermaLink content), guid)
end
end
def assert_textinput20(attrs, textinput)
_wrap_assertion do
names = %w(title description name link)
assert_attributes(attrs, names, textinput)
end
end
def assert_dublin_core(elems, target) def assert_dublin_core(elems, target)
elems.each do |name, value| _wrap_assertion do
assert_equal(value, target.__send__("dc_#{name}")) elems.each do |name, value|
assert_equal(value, target.__send__("dc_#{name}"))
end
end end
end end
def assert_syndication(elems, target) def assert_syndication(elems, target)
elems.each do |name, value| _wrap_assertion do
assert_equal(value, target.__send__("sy_#{name}")) elems.each do |name, value|
assert_equal(value, target.__send__("sy_#{name}"))
end
end end
end end
def assert_content(elems, target) def assert_content(elems, target)
elems.each do |name, value| _wrap_assertion do
assert_equal(value, target.__send__("content_#{name}")) elems.each do |name, value|
assert_equal(value, target.__send__("content_#{name}"))
end
end end
end end
def assert_trackback(elems, target) def assert_trackback(attrs, target)
elems.each do |name, value| _wrap_assertion do
assert_equal(value, target.__send__("trackback_#{name}")) n_attrs = normalized_attrs(attrs)
if n_attrs["ping"]
assert_equal(n_attrs["ping"], target.trackback_ping)
end
if n_attrs["abouts"]
n_attrs["abouts"].each_with_index do |about, i|
assert_equal(about, target.trackback_abouts[i].value)
end
end
end end
end end
def assert_attributes(attrs, names, target)
_wrap_assertion do
n_attrs = normalized_attrs(attrs)
names.each do |name|
value = n_attrs[name]
if value.is_a?(Time)
actual = target.__send__(name)
assert_instance_of(Time, actual)
assert_equal(value.to_i, actual.to_i)
elsif value
assert_equal(value, target.__send__(name))
end
end
end
end
def normalized_attrs(attrs)
n_attrs = {}
attrs.each do |name, value|
n_attrs[name.to_s] = value
end
n_attrs
end
end end
end end

View file

@ -19,7 +19,7 @@ module RSS
version = "1.0" version = "1.0"
encoding = "UTF-8" encoding = "UTF-8"
standalone = "no" standalone = false
rdf = RDF.new(version, encoding, standalone) rdf = RDF.new(version, encoding, standalone)
@ -27,9 +27,10 @@ module RSS
xmldecl = doc.xml_decl xmldecl = doc.xml_decl
%w(version encoding standalone).each do |x| %w(version encoding).each do |x|
assert_equal(instance_eval(x), xmldecl.send(x)) assert_equal(instance_eval(x), xmldecl.send(x))
end end
assert_equal(standalone, !xmldecl.standalone.nil?)
assert_equal(@rdf_uri, doc.root.namespace) assert_equal(@rdf_uri, doc.root.namespace)

View file

@ -6,36 +6,38 @@ module RSS
class TestMaker09 < TestCase class TestMaker09 < TestCase
def test_rss def test_rss
rss = RSS::Maker.make("0.9") rss = RSS::Maker.make("0.91")
assert_nil(rss) assert_nil(rss)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.9") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
end end
assert_equal("0.91", rss.rss_version) assert_equal("0.91", rss.rss_version)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker)
end
assert_equal("0.91", rss.rss_version)
rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
maker.encoding = "EUC-JP" maker.encoding = "EUC-JP"
end end
assert_equal("0.91", rss.rss_version) assert_equal("0.91", rss.rss_version)
assert_equal("EUC-JP", rss.encoding) assert_equal("EUC-JP", rss.encoding)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
maker.standalone = "yes" maker.standalone = "yes"
end end
assert_equal("0.91", rss.rss_version) assert_equal("0.91", rss.rss_version)
assert_equal("yes", rss.standalone) assert_equal("yes", rss.standalone)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
maker.encoding = "EUC-JP" maker.encoding = "EUC-JP"
maker.standalone = "yes" maker.standalone = "yes"
@ -55,12 +57,18 @@ module RSS
webMaster = "web master" webMaster = "web master"
rating = "6" rating = "6"
docs = "http://foo.com/doc" docs = "http://foo.com/doc"
skipDays = "Sunday" skipDays = [
skipHours = "13" "Sunday",
"Monday",
]
skipHours = [
0,
13,
]
pubDate = Time.now pubDate = Time.now
lastBuildDate = Time.now lastBuildDate = Time.now
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
maker.channel.title = title maker.channel.title = title
maker.channel.link = link maker.channel.link = link
maker.channel.description = description maker.channel.description = description
@ -70,12 +78,17 @@ module RSS
maker.channel.webMaster = webMaster maker.channel.webMaster = webMaster
maker.channel.rating = rating maker.channel.rating = rating
maker.channel.docs = docs maker.channel.docs = docs
maker.channel.skipDays = skipDays
maker.channel.skipHours = skipHours
maker.channel.pubDate = pubDate maker.channel.pubDate = pubDate
maker.channel.lastBuildDate = lastBuildDate maker.channel.lastBuildDate = lastBuildDate
setup_dummy_image(maker) skipDays.each do |day|
new_day = maker.channel.skipDays.new_day
new_day.content = day
end
skipHours.each do |hour|
new_hour = maker.channel.skipHours.new_hour
new_hour.content = hour
end
end end
channel = rss.channel channel = rss.channel
@ -88,13 +101,18 @@ module RSS
assert_equal(webMaster, channel.webMaster) assert_equal(webMaster, channel.webMaster)
assert_equal(rating, channel.rating) assert_equal(rating, channel.rating)
assert_equal(docs, channel.docs) assert_equal(docs, channel.docs)
assert_equal(skipDays, channel.skipDays)
assert_equal(skipHours, channel.skipHours)
assert_equal(pubDate, channel.pubDate) assert_equal(pubDate, channel.pubDate)
assert_equal(lastBuildDate, channel.lastBuildDate) assert_equal(lastBuildDate, channel.lastBuildDate)
skipDays.each_with_index do |day, i|
assert_equal(day, channel.skipDays.days[i].content)
end
skipHours.each_with_index do |hour, i|
assert_equal(hour, channel.skipHours.hours[i].content)
end
assert(channel.items.empty?) assert(channel.items.empty?)
assert_not_nil(channel.image) assert_nil(channel.image)
assert_nil(channel.textInput) assert_nil(channel.textInput)
end end
@ -103,57 +121,43 @@ module RSS
link = "http://hoge.com" link = "http://hoge.com"
description = "fugafugafugafuga" description = "fugafugafugafuga"
language = "ja" language = "ja"
rss = RSS::Maker.make("0.9") do |maker|
# setup_dummy_image(maker)
maker.channel.title = title
maker.channel.link = link
maker.channel.description = description
maker.channel.language = language
end
assert_nil(rss)
rss = RSS::Maker.make("0.9") do |maker| assert_not_set_error("maker.channel", %w(title)) do
setup_dummy_image(maker) RSS::Maker.make("0.91") do |maker|
# maker.channel.title = title
# maker.channel.title = title maker.channel.link = link
maker.channel.link = link maker.channel.description = description
maker.channel.description = description maker.channel.language = language
maker.channel.language = language end
end end
assert_nil(rss)
rss = RSS::Maker.make("0.9") do |maker| assert_not_set_error("maker.channel", %w(link)) do
setup_dummy_image(maker) RSS::Maker.make("0.91") do |maker|
maker.channel.title = title
maker.channel.title = title # maker.channel.link = link
# maker.channel.link = link maker.channel.link = nil
maker.channel.link = nil maker.channel.description = description
maker.channel.description = description maker.channel.language = language
maker.channel.language = language end
end end
assert_nil(rss)
rss = RSS::Maker.make("0.9") do |maker| assert_not_set_error("maker.channel", %w(description)) do
setup_dummy_image(maker) RSS::Maker.make("0.91") do |maker|
maker.channel.title = title
maker.channel.title = title maker.channel.link = link
maker.channel.link = link # maker.channel.description = description
# maker.channel.description = description maker.channel.language = language
maker.channel.language = language end
end end
assert_nil(rss)
rss = RSS::Maker.make("0.9") do |maker| assert_not_set_error("maker.channel", %w(language)) do
setup_dummy_image(maker) RSS::Maker.make("0.91") do |maker|
maker.channel.title = title
maker.channel.title = title maker.channel.link = link
maker.channel.link = link maker.channel.description = description
maker.channel.description = description # maker.channel.language = language
# maker.channel.language = language end
end end
assert_nil(rss)
end end
def test_image def test_image
@ -164,7 +168,7 @@ module RSS
height = 400 height = 400
description = "an image" description = "an image"
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
maker.channel.link = link maker.channel.link = link
@ -182,17 +186,18 @@ module RSS
assert_equal(height, image.height) assert_equal(height, image.height)
assert_equal(description, image.description) assert_equal(description, image.description)
rss = RSS::Maker.make("0.9") do |maker| assert_not_set_error("maker.channel", %w(description title language)) do
# setup_dummy_channel(maker) RSS::Maker.make("0.91") do |maker|
maker.channel.link = link # setup_dummy_channel(maker)
maker.channel.link = link
maker.image.title = title maker.image.title = title
maker.image.url = url maker.image.url = url
maker.image.width = width maker.image.width = width
maker.image.height = height maker.image.height = height
maker.image.description = description maker.image.description = description
end
end end
assert_nil(rss)
end end
def test_not_valid_image def test_not_valid_image
@ -203,7 +208,7 @@ module RSS
height = 400 height = 400
description = "an image" description = "an image"
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
maker.channel.link = link maker.channel.link = link
@ -213,22 +218,23 @@ module RSS
maker.image.height = height maker.image.height = height
maker.image.description = description maker.image.description = description
end end
assert_nil(rss) assert_nil(rss.channel.image)
rss = RSS::Maker.make("0.9") do |maker| assert_not_set_error("maker.channel", %w(link)) do
setup_dummy_channel(maker) RSS::Maker.make("0.91") do |maker|
# maker.channel.link = link setup_dummy_channel(maker)
maker.channel.link = nil # maker.channel.link = link
maker.channel.link = nil
maker.image.title = title maker.image.title = title
maker.image.url = url maker.image.url = url
maker.image.width = width maker.image.width = width
maker.image.height = height maker.image.height = height
maker.image.description = description maker.image.description = description
end
end end
assert_nil(rss)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
maker.channel.link = link maker.channel.link = link
@ -238,7 +244,7 @@ module RSS
maker.image.height = height maker.image.height = height
maker.image.description = description maker.image.description = description
end end
assert_nil(rss) assert_nil(rss.channel.image)
end end
def test_items def test_items
@ -246,15 +252,13 @@ module RSS
link = "http://hoge.com/" link = "http://hoge.com/"
description = "text hoge fuga" description = "text hoge fuga"
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
end end
assert(rss.channel.items.empty?) assert(rss.channel.items.empty?)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
item = maker.items.new_item item = maker.items.new_item
item.title = title item.title = title
@ -269,9 +273,8 @@ module RSS
item_size = 5 item_size = 5
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
item_size.times do |i| item_size.times do |i|
item = maker.items.new_item item = maker.items.new_item
@ -288,9 +291,8 @@ module RSS
assert_equal("#{description}#{i}", item.description) assert_equal("#{description}#{i}", item.description)
end end
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
item_size.times do |i| item_size.times do |i|
item = maker.items.new_item item = maker.items.new_item
@ -316,9 +318,8 @@ module RSS
name = "hoge" name = "hoge"
link = "http://hoge.com" link = "http://hoge.com"
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
maker.textinput.title = title maker.textinput.title = title
maker.textinput.description = description maker.textinput.description = description
@ -331,9 +332,8 @@ module RSS
assert_equal(name, textInput.name) assert_equal(name, textInput.name)
assert_equal(link, textInput.link) assert_equal(link, textInput.link)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
# setup_dummy_channel(maker) # setup_dummy_channel(maker)
setup_dummy_image(maker)
maker.textinput.title = title maker.textinput.title = title
maker.textinput.description = description maker.textinput.description = description
@ -349,9 +349,8 @@ module RSS
name = "hoge" name = "hoge"
link = "http://hoge.com" link = "http://hoge.com"
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
# maker.textinput.title = title # maker.textinput.title = title
maker.textinput.description = description maker.textinput.description = description
@ -360,9 +359,8 @@ module RSS
end end
assert_nil(rss.channel.textInput) assert_nil(rss.channel.textInput)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
maker.textinput.title = title maker.textinput.title = title
# maker.textinput.description = description # maker.textinput.description = description
@ -371,9 +369,8 @@ module RSS
end end
assert_nil(rss.channel.textInput) assert_nil(rss.channel.textInput)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
maker.textinput.title = title maker.textinput.title = title
maker.textinput.description = description maker.textinput.description = description
@ -382,9 +379,8 @@ module RSS
end end
assert_nil(rss.channel.textInput) assert_nil(rss.channel.textInput)
rss = RSS::Maker.make("0.9") do |maker| rss = RSS::Maker.make("0.91") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_image(maker)
maker.textinput.title = title maker.textinput.title = title
maker.textinput.description = description maker.textinput.description = description

View file

@ -85,37 +85,41 @@ module RSS
link = "http://hoge.com" link = "http://hoge.com"
description = "fugafugafugafuga" description = "fugafugafugafuga"
rss = RSS::Maker.make("1.0") do |maker| assert_not_set_error("maker.channel", %w(about)) do
# maker.channel.about = about RSS::Maker.make("1.0") do |maker|
maker.channel.title = title # maker.channel.about = about
maker.channel.link = link maker.channel.title = title
maker.channel.description = description maker.channel.link = link
maker.channel.description = description
end
end end
assert_nil(rss)
rss = RSS::Maker.make("1.0") do |maker| assert_not_set_error("maker.channel", %w(title)) do
maker.channel.about = about RSS::Maker.make("1.0") do |maker|
# maker.channel.title = title maker.channel.about = about
maker.channel.link = link # maker.channel.title = title
maker.channel.description = description maker.channel.link = link
maker.channel.description = description
end
end end
assert_nil(rss)
rss = RSS::Maker.make("1.0") do |maker| assert_not_set_error("maker.channel", %w(link)) do
maker.channel.about = about RSS::Maker.make("1.0") do |maker|
maker.channel.title = title maker.channel.about = about
# maker.channel.link = link maker.channel.title = title
maker.channel.description = description # maker.channel.link = link
maker.channel.description = description
end
end end
assert_nil(rss)
rss = RSS::Maker.make("1.0") do |maker| assert_not_set_error("maker.channel", %w(description)) do
maker.channel.about = about RSS::Maker.make("1.0") do |maker|
maker.channel.title = title maker.channel.about = about
maker.channel.link = link maker.channel.title = title
# maker.channel.description = description maker.channel.link = link
# maker.channel.description = description
end
end end
assert_nil(rss)
end end
@ -138,14 +142,15 @@ module RSS
assert_equal(link, image.link) assert_equal(link, image.link)
assert_equal(url, image.url) assert_equal(url, image.url)
rss = RSS::Maker.make("1.0") do |maker| assert_not_set_error("maker.channel", %w(about title description)) do
# setup_dummy_channel(maker) RSS::Maker.make("1.0") do |maker|
maker.channel.link = link # setup_dummy_channel(maker)
maker.channel.link = link
maker.image.title = title
maker.image.url = url maker.image.title = title
maker.image.url = url
end
end end
assert_nil(rss)
end end
def test_not_valid_image def test_not_valid_image
@ -173,15 +178,16 @@ module RSS
assert_nil(rss.channel.image) assert_nil(rss.channel.image)
assert_nil(rss.image) assert_nil(rss.image)
rss = RSS::Maker.make("1.0") do |maker| assert_not_set_error("maker.channel", %w(link)) do
setup_dummy_channel(maker) RSS::Maker.make("1.0") do |maker|
# maker.channel.link = link setup_dummy_channel(maker)
maker.channel.link = nil # maker.channel.link = link
maker.channel.link = nil
maker.image.url = url
maker.image.title = title maker.image.url = url
maker.image.title = title
end
end end
assert_nil(rss)
end end
def test_items def test_items

View file

@ -51,11 +51,20 @@ module RSS
webMaster = "web master" webMaster = "web master"
rating = "6" rating = "6"
docs = "http://foo.com/doc" docs = "http://foo.com/doc"
skipDays = "Sunday" skipDays = [
skipHours = "13" "Sunday",
"Monday",
]
skipHours = [
0,
13,
]
pubDate = Time.now pubDate = Time.now
lastBuildDate = Time.now lastBuildDate = Time.now
category = "Nespapers" categories = [
"Nespapers",
"misc",
]
generator = "RSS Maker" generator = "RSS Maker"
ttl = 60 ttl = 60
@ -69,11 +78,23 @@ module RSS
maker.channel.webMaster = webMaster maker.channel.webMaster = webMaster
maker.channel.rating = rating maker.channel.rating = rating
maker.channel.docs = docs maker.channel.docs = docs
maker.channel.skipDays = skipDays
maker.channel.skipHours = skipHours
maker.channel.pubDate = pubDate maker.channel.pubDate = pubDate
maker.channel.lastBuildDate = lastBuildDate maker.channel.lastBuildDate = lastBuildDate
maker.channel.category = category
skipDays.each do |day|
new_day = maker.channel.skipDays.new_day
new_day.content = day
end
skipHours.each do |hour|
new_hour = maker.channel.skipHours.new_hour
new_hour.content = hour
end
categories.each do |category|
new_category = maker.channel.categories.new_category
new_category.content = category
end
maker.channel.generator = generator maker.channel.generator = generator
maker.channel.ttl = ttl maker.channel.ttl = ttl
end end
@ -88,11 +109,20 @@ module RSS
assert_equal(webMaster, channel.webMaster) assert_equal(webMaster, channel.webMaster)
assert_equal(rating, channel.rating) assert_equal(rating, channel.rating)
assert_equal(docs, channel.docs) assert_equal(docs, channel.docs)
assert_equal(skipDays, channel.skipDays)
assert_equal(skipHours, channel.skipHours)
assert_equal(pubDate, channel.pubDate) assert_equal(pubDate, channel.pubDate)
assert_equal(lastBuildDate, channel.lastBuildDate) assert_equal(lastBuildDate, channel.lastBuildDate)
assert_equal(category, channel.category)
skipDays.each_with_index do |day, i|
assert_equal(day, channel.skipDays.days[i].content)
end
skipHours.each_with_index do |hour, i|
assert_equal(hour, channel.skipHours.hours[i].content)
end
channel.categories.each_with_index do |category, i|
assert_equal(categories[i], category.content)
end
assert_equal(generator, channel.generator) assert_equal(generator, channel.generator)
assert_equal(ttl, channel.ttl) assert_equal(ttl, channel.ttl)
@ -107,29 +137,32 @@ module RSS
description = "fugafugafugafuga" description = "fugafugafugafuga"
language = "ja" language = "ja"
rss = RSS::Maker.make("2.0") do |maker| assert_not_set_error("maker.channel", %w(title)) do
# maker.channel.title = title RSS::Maker.make("2.0") do |maker|
maker.channel.link = link # maker.channel.title = title
maker.channel.description = description maker.channel.link = link
maker.channel.language = language maker.channel.description = description
maker.channel.language = language
end
end end
assert_nil(rss)
rss = RSS::Maker.make("2.0") do |maker| assert_not_set_error("maker.channel", %w(link)) do
maker.channel.title = title RSS::Maker.make("2.0") do |maker|
# maker.channel.link = link maker.channel.title = title
maker.channel.description = description # maker.channel.link = link
maker.channel.language = language maker.channel.description = description
maker.channel.language = language
end
end end
assert_nil(rss)
rss = RSS::Maker.make("2.0") do |maker| assert_not_set_error("maker.channel", %w(description)) do
maker.channel.title = title RSS::Maker.make("2.0") do |maker|
maker.channel.link = link maker.channel.title = title
# maker.channel.description = description maker.channel.link = link
maker.channel.language = language # maker.channel.description = description
maker.channel.language = language
end
end end
assert_nil(rss)
rss = RSS::Maker.make("2.0") do |maker| rss = RSS::Maker.make("2.0") do |maker|
maker.channel.title = title maker.channel.title = title
@ -255,17 +288,18 @@ module RSS
assert_equal(height, image.height) assert_equal(height, image.height)
assert_equal(description, image.description) assert_equal(description, image.description)
rss = RSS::Maker.make("2.0") do |maker| assert_not_set_error("maker.channel", %w(title description)) do
# setup_dummy_channel(maker) RSS::Maker.make("2.0") do |maker|
maker.channel.link = link # setup_dummy_channel(maker)
maker.channel.link = link
maker.image.title = title maker.image.title = title
maker.image.url = url maker.image.url = url
maker.image.width = width maker.image.width = width
maker.image.height = height maker.image.height = height
maker.image.description = description maker.image.description = description
end
end end
assert_nil(rss)
end end
def test_not_valid_image def test_not_valid_image
@ -288,18 +322,19 @@ module RSS
end end
assert_nil(rss.image) assert_nil(rss.image)
rss = RSS::Maker.make("2.0") do |maker| assert_not_set_error("maker.channel", %w(link)) do
setup_dummy_channel(maker) RSS::Maker.make("2.0") do |maker|
# maker.channel.link = link setup_dummy_channel(maker)
maker.channel.link = nil # maker.channel.link = link
maker.channel.link = nil
maker.image.title = title maker.image.title = title
maker.image.url = url maker.image.url = url
maker.image.width = width maker.image.width = width
maker.image.height = height maker.image.height = height
maker.image.description = description maker.image.description = description
end
end end
assert_nil(rss)
rss = RSS::Maker.make("2.0") do |maker| rss = RSS::Maker.make("2.0") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
@ -519,11 +554,11 @@ module RSS
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_item(maker) setup_dummy_item(maker)
category = maker.items.last.category category = maker.items.last.categories.new_category
category.domain = domain category.domain = domain
category.content = content category.content = content
end end
category = rss.channel.items.last.category category = rss.channel.items.last.categories.last
assert_equal(domain, category.domain) assert_equal(domain, category.domain)
assert_equal(content, category.content) assert_equal(content, category.content)
end end
@ -535,10 +570,10 @@ module RSS
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_item(maker) setup_dummy_item(maker)
category = maker.items.last.category category = maker.items.last.categories.new_category
# category.content = content # category.content = content
end end
assert_nil(rss.channel.items.last.category) assert(rss.channel.items.last.categories.empty?)
end end
def test_textInput def test_textInput

View file

@ -14,7 +14,7 @@ module RSS
end end
def test_rss10 def test_rss10
rss = RSS::Maker.make("1.0", ["content"]) do |maker| rss = RSS::Maker.make("1.0") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_item(maker) setup_dummy_item(maker)

View file

@ -34,7 +34,7 @@ module RSS
end end
def test_rss10 def test_rss10
rss = RSS::Maker.make("1.0", ["dublincore"]) do |maker| rss = RSS::Maker.make("1.0") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
set_elements(maker.channel) set_elements(maker.channel)

View file

@ -21,7 +21,7 @@ module RSS
end end
def test_rss10 def test_rss10
rss = RSS::Maker.make("1.0", ["syndication"]) do |maker| rss = RSS::Maker.make("1.0") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
set_elements(maker.channel) set_elements(maker.channel)
end end

View file

@ -10,18 +10,23 @@ module RSS
@elements = { @elements = {
:ping => "http://bar.com/tb.cgi?tb_id=rssplustrackback", :ping => "http://bar.com/tb.cgi?tb_id=rssplustrackback",
:about => "http://foo.com/trackback/tb.cgi?tb_id=20020923", :abouts => [
"http://foo.com/trackback/tb.cgi?tb_id=20020923",
"http://bar.com/trackback/tb.cgi?tb_id=20041114",
],
} }
end end
def test_rss10 def test_rss10
rss = RSS::Maker.make("1.0", ["trackback"]) do |maker| rss = RSS::Maker.make("1.0") do |maker|
setup_dummy_channel(maker) setup_dummy_channel(maker)
setup_dummy_item(maker) setup_dummy_item(maker)
item = maker.items.last item = maker.items.last
@elements.each do |name, value| item.trackback_ping = @elements[:ping]
item.__send__("#{accessor_name(name)}=", value) @elements[:abouts].each do |about|
new_about = item.trackback_abouts.new_about
new_about.value = about
end end
end end
assert_trackback(@elements, rss.items.last) assert_trackback(@elements, rss.items.last)

View file

@ -116,7 +116,7 @@ EOR
def test_channel def test_channel
assert_parse(make_RDF(<<-EOR), :missing_attribute, "channel", "about") assert_parse(make_RDF(<<-EOR), :missing_attribute, "channel", "rdf:about")
<channel /> <channel />
EOR EOR
@ -145,7 +145,7 @@ EOR
</channel> </channel>
EOR EOR
assert_parse(make_RDF(<<-EOR), :missing_attribute, "image", "resource") assert_parse(make_RDF(<<-EOR), :missing_attribute, "image", "rdf:resource")
<channel rdf:about="http://example.com/"> <channel rdf:about="http://example.com/">
<title>hoge</title> <title>hoge</title>
<link>http://example.com/</link> <link>http://example.com/</link>
@ -194,7 +194,7 @@ EOR
</channel> </channel>
EOR EOR
assert_parse(make_RDF(<<-EOR), :missing_attribute, "textinput", "resource") assert_parse(make_RDF(<<-EOR), :missing_attribute, "textinput", "rdf:resource")
<channel rdf:about="http://example.com/"> <channel rdf:about="http://example.com/">
<title>hoge</title> <title>hoge</title>
<link>http://example.com/</link> <link>http://example.com/</link>
@ -257,7 +257,7 @@ EOR
def test_image def test_image
assert_parse(make_RDF(<<-EOR), :missing_attribute, "image", "about") assert_parse(make_RDF(<<-EOR), :missing_attribute, "image", "rdf:about")
#{make_channel} #{make_channel}
<image> <image>
</image> </image>
@ -314,7 +314,7 @@ EOR
def test_item def test_item
assert_parse(make_RDF(<<-EOR), :missing_attribute, "item", "about") assert_parse(make_RDF(<<-EOR), :missing_attribute, "item", "rdf:about")
#{make_channel} #{make_channel}
#{make_image} #{make_image}
<item> <item>
@ -371,7 +371,7 @@ EOR
def test_textinput def test_textinput
assert_parse(make_RDF(<<-EOR), :missing_attribute, "textinput", "about") assert_parse(make_RDF(<<-EOR), :missing_attribute, "textinput", "rdf:about")
#{make_channel} #{make_channel}
#{make_image} #{make_image}
#{make_item} #{make_item}

View file

@ -88,19 +88,19 @@ EOR
@elems.each do |name, value| @elems.each do |name, value|
@parents.each do |parent| @parents.each do |parent|
accessor = "#{RSS::TRACKBACK_PREFIX}_#{name}" accessor = "#{RSS::TRACKBACK_PREFIX}_#{name}"
target_accessor = "resource" target = @rss.send(parent)
target = @rss.send(parent).send(accessor)
target20 = @rss20.channel.send(parent, -1) target20 = @rss20.channel.send(parent, -1)
assert_equal(value, target.send(target_accessor)) assert_equal(value, target.send(accessor))
assert_equal(value, target20.send(accessor)) assert_equal(value, target20.send(accessor))
target.send("#{target_accessor}=", new_value[name].to_s)
if name == :about if name == :about
# abount is zero or more # abount is zero or more
target.send("#{accessor}=", 0, new_value[name].to_s)
target20.send("#{accessor}=", 0, new_value[name].to_s) target20.send("#{accessor}=", 0, new_value[name].to_s)
else else
target.send("#{accessor}=", new_value[name].to_s)
target20.send("#{accessor}=", new_value[name].to_s) target20.send("#{accessor}=", new_value[name].to_s)
end end
assert_equal(new_value[name], target.send(target_accessor)) assert_equal(new_value[name], target.send(accessor))
assert_equal(new_value[name], target20.send(accessor)) assert_equal(new_value[name], target20.send(accessor))
end end
end end

View file

@ -14,7 +14,7 @@ module RSS
{:media => "print", :title => "FOO"}, {:media => "print", :title => "FOO"},
{:charset => "UTF-8", :alternate => "yes"}, {:charset => "UTF-8", :alternate => "yes"},
].each do |attrs| ].each do |attrs|
assert_xml_stylesheet_attrs(XMLStyleSheet.new(*attrs), attrs) assert_xml_stylesheet_attrs(attrs, XMLStyleSheet.new(*attrs))
end end
end end
@ -36,7 +36,7 @@ module RSS
:alternate => "yes"}, :alternate => "yes"},
].each do |attrs| ].each do |attrs|
target, contents = parse_pi(XMLStyleSheet.new(*attrs).to_s) target, contents = parse_pi(XMLStyleSheet.new(*attrs).to_s)
assert_xml_stylesheet(target, XMLStyleSheet.new(*contents), attrs) assert_xml_stylesheet(target, attrs, XMLStyleSheet.new(*contents))
end end
end end
@ -88,7 +88,7 @@ module RSS
assert_equal(have_href_xsss.size, rss.xml_stylesheets.size) assert_equal(have_href_xsss.size, rss.xml_stylesheets.size)
rss.xml_stylesheets.each_with_index do |stylesheet, i| rss.xml_stylesheets.each_with_index do |stylesheet, i|
target, = parse_pi(stylesheet.to_s) target, = parse_pi(stylesheet.to_s)
assert_xml_stylesheet(target, stylesheet, have_href_xsss[i]) assert_xml_stylesheet(target, have_href_xsss[i], stylesheet)
end end
end end
end end