From 4a396a8b7a1d806b9f3893ffd065536695245b1c Mon Sep 17 00:00:00 2001 From: kou Date: Sat, 17 Jun 2006 00:26:41 +0000 Subject: * lib/rss, test/rss: backported from trunk. (2005-11-16 - now) * lib/rss/maker/taxonomy.rb: implemented taxonomy module for RSS Maker. * lib/rss/taxonomy.rb: supported RSS Maker. * lib/rss/maker.rb: added taxonomy module support. * lib/rss/rss.rb: adjusted to other element API. * lib/rss/1.0.rb: adjusted to other element API but backward compatibility is reserved. * lib/rss/0.9.rb: ditto. * test/rss/test_maker_taxo.rb: added test case for taxonomy module for RSS Maker. * test/rss/test_setup_maker_1.0.rb: added tests for taxo:topic. * test/rss/test_setup_maker_1.0.rb: added backward compatibility test. * test/rss/test_setup_maker_0.9.rb: ditto. * test/rss/test_setup_maker_2.0.rb: ditto. * test/rss/rss-testcase.rb: added convenience method for setting up taxo:topic. * test/rss/rss-assertions.rb: added assertion for taxo:topic. * sample/rss/blend.rb: followed new API. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@10291 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rss/0.9.rb | 8 +- lib/rss/1.0.rb | 20 +++- lib/rss/maker.rb | 1 + lib/rss/maker/taxonomy.rb | 50 ++++----- lib/rss/rss.rb | 5 +- lib/rss/taxonomy.rb | 10 +- sample/rss/blend.rb | 2 +- test/rss/rss-assertions.rb | 19 ++++ test/rss/rss-testcase.rb | 19 ++++ test/rss/test_setup_maker_0.9.rb | 12 ++- test/rss/test_setup_maker_1.0.rb | 214 +++++++++++++++++++++++++++++++++++++-- test/rss/test_setup_maker_2.0.rb | 12 ++- 12 files changed, 326 insertions(+), 46 deletions(-) diff --git a/lib/rss/0.9.rb b/lib/rss/0.9.rb index 3bbf67be05..41b8fced73 100644 --- a/lib/rss/0.9.rb +++ b/lib/rss/0.9.rb @@ -472,8 +472,12 @@ module RSS rv end - def maker_target(maker) - maker.items.new_item + def maker_target(items) + if items.respond_to?("items") + # For backward compatibility + items = items.items + end + items.new_item end def setup_maker_element(item) diff --git a/lib/rss/1.0.rb b/lib/rss/1.0.rb index 5c7e3f5e62..00d8c3abdb 100644 --- a/lib/rss/1.0.rb +++ b/lib/rss/1.0.rb @@ -170,6 +170,12 @@ module RSS tag_name_with_prefix(PREFIX) end + def setup_maker(target) + lis.each do |li| + target << li.resource + end + end + private def children @li @@ -224,6 +230,12 @@ module RSS tag_name_with_prefix(PREFIX) end + def setup_maker(target) + lis.each do |li| + target << li.resource + end + end + private def children @li @@ -600,8 +612,12 @@ module RSS ] end - def maker_target(maker) - maker.items.new_item + def maker_target(items) + if items.respond_to?("items") + # For backward compatibility + items = items.items + end + items.new_item end end diff --git a/lib/rss/maker.rb b/lib/rss/maker.rb index d248711aa2..9ed799ac7f 100644 --- a/lib/rss/maker.rb +++ b/lib/rss/maker.rb @@ -32,5 +32,6 @@ require "rss/maker/2.0" require "rss/maker/content" require "rss/maker/dublincore" require "rss/maker/syndication" +require "rss/maker/taxonomy" require "rss/maker/trackback" require "rss/maker/image" diff --git a/lib/rss/maker/taxonomy.rb b/lib/rss/maker/taxonomy.rb index 2e54ea66eb..0249afc2f2 100644 --- a/lib/rss/maker/taxonomy.rb +++ b/lib/rss/maker/taxonomy.rb @@ -4,7 +4,7 @@ require 'rss/maker/dublincore' module RSS module Maker - module TaxonomyTopicsModel + module TaxoTopicsModel def self.append_features(klass) super @@ -13,7 +13,7 @@ module RSS klass.module_eval(<<-EOC, __FILE__, __LINE__ + 1) attr_reader :taxo_topics def make_taxo_topics - self.class::TaxonomyTopics.new(@maker) + self.class::TaxoTopics.new(@maker) end def setup_taxo_topics(rss, current) @@ -24,10 +24,10 @@ EOC def self.install_taxo_topics(klass) klass.module_eval(<<-EOC, *Utils.get_file_and_line_from_caller(1)) - class TaxonomyTopics < TaxonomyTopicsBase + class TaxoTopics < TaxoTopicsBase def to_rss(rss, current) if current.respond_to?(:taxo_topics) - topics = current.class::TaxonomyTopics.new + topics = current.class::TaxoTopics.new bag = topics.Bag @resources.each do |resource| bag.lis << RDF::Bag::Li.new(resource) @@ -39,7 +39,7 @@ EOC EOC end - class TaxonomyTopicsBase + class TaxoTopicsBase include Base attr_reader :resources @@ -47,7 +47,7 @@ EOC end end - module TaxonomyTopicModel + module TaxoTopicModel def self.append_features(klass) super @@ -56,7 +56,7 @@ EOC klass.module_eval(<<-EOC, __FILE__, __LINE__ + 1) attr_reader :taxo_topics def make_taxo_topics - self.class::TaxonomyTopics.new(@maker) + self.class::TaxoTopics.new(@maker) end def setup_taxo_topics(rss, current) @@ -68,7 +68,7 @@ EOC end def taxo_topic=(new_value) - @taxo_topic[0] = self.class::TaxonomyTopic.new(self) + @taxo_topic[0] = self.class::TaxoTopic.new(self) @taxo_topic[0].value = new_value end EOC @@ -76,14 +76,14 @@ EOC def self.install_taxo_topic(klass) klass.module_eval(<<-EOC, *Utils.get_file_and_line_from_caller(1)) - class TaxonomyTopics < TaxonomyTopicsBase - class TaxonomyTopic < TaxonomyTopicBase + class TaxoTopics < TaxoTopicsBase + class TaxoTopic < TaxoTopicBase DublinCoreModel.install_dublin_core(self) - TaxonomyTopicsModel.install_taxo_topics(self) + TaxoTopicsModel.install_taxo_topics(self) def to_rss(rss, current) if current.respond_to?(:taxo_topics) - topic = current.class::TaxonomyTopic.new(value) + topic = current.class::TaxoTopic.new(value) topic.taxo_link = value taxo_topics.to_rss(rss, topic) if taxo_topics current.taxo_topics << topic @@ -99,13 +99,13 @@ EOC EOC end - class TaxonomyTopicsBase + class TaxoTopicsBase include Base def_array_element("taxo_topics") def new_taxo_topic - taxo_topic = self.class::TaxonomyTopic.new(self) + taxo_topic = self.class::TaxoTopic.new(self) @taxo_topics << taxo_topic taxo_topic end @@ -116,10 +116,10 @@ EOC end end - class TaxonomyTopicBase + class TaxoTopicBase include Base include DublinCoreModel - include TaxonomyTopicsModel + include TaxoTopicsModel attr_accessor :value add_need_initialize_variable("value") @@ -134,43 +134,43 @@ EOC end class RSSBase - include TaxonomyTopicModel + include TaxoTopicModel end class ChannelBase - include TaxonomyTopicsModel + include TaxoTopicsModel end class ItemsBase class ItemBase - include TaxonomyTopicsModel + include TaxoTopicsModel end end class RSS10 - TaxonomyTopicModel.install_taxo_topic(self) + TaxoTopicModel.install_taxo_topic(self) class Channel - TaxonomyTopicsModel.install_taxo_topics(self) + TaxoTopicsModel.install_taxo_topics(self) end class Items class Item - TaxonomyTopicsModel.install_taxo_topics(self) + TaxoTopicsModel.install_taxo_topics(self) end end end class RSS09 - TaxonomyTopicModel.install_taxo_topic(self) + TaxoTopicModel.install_taxo_topic(self) class Channel - TaxonomyTopicsModel.install_taxo_topics(self) + TaxoTopicsModel.install_taxo_topics(self) end class Items class Item - TaxonomyTopicsModel.install_taxo_topics(self) + TaxoTopicsModel.install_taxo_topics(self) end end end diff --git a/lib/rss/rss.rb b/lib/rss/rss.rb index 7ccf1aefa1..7acbef275d 100644 --- a/lib/rss/rss.rb +++ b/lib/rss/rss.rb @@ -655,7 +655,6 @@ EOC 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| @@ -894,9 +893,7 @@ EOC 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 + super(maker) end end diff --git a/lib/rss/taxonomy.rb b/lib/rss/taxonomy.rb index 3eb5b893aa..d2ab7df854 100644 --- a/lib/rss/taxonomy.rb +++ b/lib/rss/taxonomy.rb @@ -76,6 +76,10 @@ module RSS def full_name tag_name_with_prefix(TAXO_PREFIX) end + + def maker_target(target) + target.taxo_topics + end def to_s(need_convert=true, indent=calc_indent) rv = tag(indent) do |next_indent| @@ -95,7 +99,7 @@ module RSS [] end end - + private def children [@Bag] @@ -183,6 +187,10 @@ module RSS end end + def maker_target(target) + target.new_taxo_topic + end + private def children [@taxo_link, @taxo_topics] diff --git a/sample/rss/blend.rb b/sample/rss/blend.rb index e578f26a86..2fbd6efed6 100755 --- a/sample/rss/blend.rb +++ b/sample/rss/blend.rb @@ -61,7 +61,7 @@ rss = RSS::Maker.make("1.0") do |maker| feeds.each do |feed| feed.items.each do |item| - item.setup_maker(maker) + item.setup_maker(maker.items) end end maker.items.do_sort = true diff --git a/test/rss/rss-assertions.rb b/test/rss/rss-assertions.rb index f5e8c5ccaa..d8e597cd5a 100644 --- a/test/rss/rss-assertions.rb +++ b/test/rss/rss-assertions.rb @@ -435,6 +435,25 @@ module RSS end end + def assert_taxo_topic(topics, target) + _wrap_assertion do + topics.each_with_index do |topic, i| + taxo_topic = target.taxo_topics[i] + topic.each do |name, value| + case name + when :link + assert_equal(value, taxo_topic.about) + assert_equal(value, taxo_topic.taxo_link) + when :topics + assert_equal(value, taxo_topic.taxo_topics.resources) + else + assert_equal(value, taxo_topic.__send__("dc_#{name}")) + end + end + end + end + end + def assert_attributes(attrs, names, target) _wrap_assertion do diff --git a/test/rss/rss-testcase.rb b/test/rss/rss-testcase.rb index f3a2760fd2..0612abcccd 100644 --- a/test/rss/rss-testcase.rb +++ b/test/rss/rss-testcase.rb @@ -248,5 +248,24 @@ EOC item.link = link end + def setup_taxo_topic(target, topics) + topics.each do |topic| + taxo_topic = target.taxo_topics.new_taxo_topic + topic.each do |name, value| + case name + when :link + taxo_topic.taxo_link = value + when :topics + value.each do |t| + taxo_topic.taxo_topics << t + end + else + dc_elems = taxo_topic.__send__("dc_#{name}s") + dc_elem = dc_elems.__send__("new_#{name}") + dc_elem.value = value + end + end + end + end end end diff --git a/test/rss/test_setup_maker_0.9.rb b/test/rss/test_setup_maker_0.9.rb index e0f26d5593..217ea8bf63 100644 --- a/test/rss/test_setup_maker_0.9.rb +++ b/test/rss/test_setup_maker_0.9.rb @@ -138,7 +138,7 @@ module RSS assert_equal(link, textInput.link) end - def test_setup_maker_items + def test_setup_maker_items(for_backward_compatibility=false) title = "TITLE" link = "http://hoge.com/" description = "text hoge fuga" @@ -160,7 +160,11 @@ module RSS rss.channel.setup_maker(maker) rss.items.each do |item| - item.setup_maker(maker) + if for_backward_compatibility + item.setup_maker(maker) + else + item.setup_maker(maker.items) + end end end @@ -173,6 +177,10 @@ module RSS end + def test_setup_maker_items_backward_compatibility + test_setup_maker_items(true) + end + def test_setup_maker encoding = "EUC-JP" standalone = true diff --git a/test/rss/test_setup_maker_1.0.rb b/test/rss/test_setup_maker_1.0.rb index 244eee6114..cd0958afde 100644 --- a/test/rss/test_setup_maker_1.0.rb +++ b/test/rss/test_setup_maker_1.0.rb @@ -47,6 +47,25 @@ module RSS "http://foo.com/trackback/tb.cgi?tb_id=20021010", ], } + + @taxo_topic_elems = [ + { + :link => "http://meerkat.oreillynet.com/?c=cat23", + :title => "Data: XML", + :description => "A Meerkat channel", + }, + { + :link => "http://dmoz.org/Computers/Data_Formats/Markup_Languages/XML/", + :title => "XML", + :subject => "XML", + :description => "DMOZ category", + :topics => [ + "http://meerkat.oreillynet.com/?c=cat23", + "http://dmoz.org/Computers/Data_Formats/Markup_Languages/SGML/", + "http://dmoz.org/Computers/Programming/Internet/", + ] + }, + ] end def test_setup_maker_channel @@ -164,7 +183,7 @@ module RSS end end - def test_setup_maker_items + def test_setup_maker_items(for_backward_compatibility=false) title = "TITLE" link = "http://hoge.com/" description = "text hoge fuga" @@ -200,7 +219,11 @@ module RSS rss.channel.setup_maker(maker) rss.items.each do |item| - item.setup_maker(maker) + if for_backward_compatibility + item.setup_maker(maker) + else + item.setup_maker(maker.items) + end end end @@ -231,8 +254,8 @@ module RSS title = "TITLE" link = "http://hoge.com/" description = "text hoge fuga" - item_size = 5 + item_size = 5 rss = RSS::Maker.make("1.0") do |maker| setup_dummy_channel(maker) @@ -243,7 +266,7 @@ module RSS item.link = "#{link}#{i}" item.description = "#{description}#{i}" item.dc_date = Time.now + i * 60 - item.setup_maker(maker) + item.setup_maker(maker.items) end maker.items.do_sort = false end @@ -265,7 +288,7 @@ module RSS item.link = "#{link}#{i}" item.description = "#{description}#{i}" item.dc_date = Time.now + i * 60 - item.setup_maker(maker) + item.setup_maker(maker.items) end maker.items.do_sort = true end @@ -278,6 +301,10 @@ module RSS end end + def test_setup_maker_items_backward_compatibility + test_setup_maker_items(true) + end + def test_setup_maker encoding = "EUC-JP" standalone = true @@ -312,8 +339,8 @@ module RSS assert_equal(encoding, new_rss.encoding) assert_equal(standalone, new_rss.standalone) - xss = rss.xml_stylesheets.first - assert_equal(1, rss.xml_stylesheets.size) + xss = new_rss.xml_stylesheets.first + assert_equal(1, new_rss.xml_stylesheets.size) assert_equal(href, xss.href) assert_equal(type, xss.type) assert_equal(title, xss.title) @@ -321,6 +348,179 @@ module RSS assert_equal(charset, xss.charset) assert_equal(alternate, xss.alternate) end + + def test_setup_maker_full + encoding = "EUC-JP" + standalone = true + + href = 'a.xsl' + type = 'text/xsl' + title = 'sample' + media = 'printer' + charset = 'UTF-8' + alternate = 'yes' + + channel_about = "http://hoge.com" + channel_title = "fugafuga" + channel_link = "http://hoge.com" + channel_description = "fugafugafugafuga" + + image_title = "fugafuga" + image_url = "http://hoge.com/hoge.png" + + textinput_title = "fugafuga" + textinput_description = "text hoge fuga" + textinput_name = "hoge" + textinput_link = "http://hoge.com" + + item_title = "TITLE" + item_link = "http://hoge.com/" + item_description = "text hoge fuga" + + item_size = 5 + + rss = RSS::Maker.make("1.0") do |maker| + maker.encoding = encoding + maker.standalone = standalone + + xss = maker.xml_stylesheets.new_xml_stylesheet + xss.href = href + xss.type = type + xss.title = title + xss.media = media + xss.charset = charset + xss.alternate = alternate + + maker.channel.about = channel_about + maker.channel.title = channel_title + maker.channel.link = channel_link + maker.channel.description = channel_description + @dc_elems.each do |var, value| + maker.channel.__send__("dc_#{var}=", value) + end + @sy_elems.each do |var, value| + maker.channel.__send__("sy_#{var}=", value) + end + + maker.image.title = image_title + maker.image.url = image_url + @dc_elems.each do |var, value| + maker.image.__send__("dc_#{var}=", value) + end + + maker.textinput.link = textinput_link + maker.textinput.title = textinput_title + maker.textinput.description = textinput_description + maker.textinput.name = textinput_name + @dc_elems.each do |var, value| + maker.textinput.__send__("dc_#{var}=", value) + end + + item_size.times do |i| + item = maker.items.new_item + item.title = "#{item_title}#{i}" + item.link = "#{item_link}#{i}" + item.description = "#{item_description}#{i}" + + @dc_elems.each do |var, value| + item.__send__("dc_#{var}=", value) + end + + @content_elems.each do |var, value| + item.__send__("content_#{var}=", value) + end + + item.trackback_ping = @trackback_elems[:ping] + @trackback_elems[:about].each do |value| + new_about = item.trackback_abouts.new_about + new_about.value = value + end + end + + setup_taxo_topic(maker, @taxo_topic_elems) + end + + new_rss = RSS::Maker.make("1.0") do |maker| + rss.setup_maker(maker) + end + + assert_equal("1.0", new_rss.rss_version) + assert_equal(encoding, new_rss.encoding) + assert_equal(standalone, new_rss.standalone) + + xss = new_rss.xml_stylesheets.first + assert_equal(1, new_rss.xml_stylesheets.size) + assert_equal(href, xss.href) + assert_equal(type, xss.type) + assert_equal(title, xss.title) + assert_equal(media, xss.media) + assert_equal(charset, xss.charset) + assert_equal(alternate, xss.alternate) + + channel = new_rss.channel + assert_equal(channel_about, channel.about) + assert_equal(channel_title, channel.title) + assert_equal(channel_link, channel.link) + assert_equal(channel_description, channel.description) + item_resources = [] + item_size.times do |i| + item_resources << "#{item_link}#{i}" + end + assert_equal(item_resources, channel.items.resources) + assert_equal(image_url, channel.image.resource) + assert_equal(textinput_link, channel.textinput.resource) + @dc_elems.each do |var, value| + assert_equal(value, channel.__send__("dc_#{var}")) + end + @sy_elems.each do |var, value| + assert_equal(value, channel.__send__("sy_#{var}")) + end + + image = new_rss.image + assert_equal(image_url, image.about) + assert_equal(image_url, new_rss.channel.image.resource) + assert_equal(image_title, image.title) + assert_equal(channel_link, image.link) + assert_equal(image_url, image.url) + @dc_elems.each do |var, value| + assert_equal(image.__send__("dc_#{var}"), value) + end + + textinput = new_rss.textinput + assert_equal(textinput_link, textinput.about) + assert_equal(textinput_link, new_rss.channel.textinput.resource) + assert_equal(textinput_title, textinput.title) + assert_equal(textinput_name, textinput.name) + assert_equal(textinput_description, textinput.description) + assert_equal(textinput_link, textinput.link) + @dc_elems.each do |var, value| + assert_equal(textinput.__send__("dc_#{var}"), value) + end + + assert_equal(item_size, new_rss.items.size) + new_rss.items.each_with_index do |item, i| + assert_equal("#{item_link}#{i}", item.about) + assert_equal("#{item_title}#{i}", item.title) + assert_equal("#{item_link}#{i}", item.link) + assert_equal("#{item_description}#{i}", item.description) + + @dc_elems.each do |var, value| + assert_equal(item.__send__("dc_#{var}"), value) + end + + @content_elems.each do |var, value| + assert_equal(item.__send__("content_#{var}"), value) + end + + assert_equal(@trackback_elems[:ping], item.trackback_ping) + assert_equal(@trackback_elems[:about].size, item.trackback_abouts.size) + item.trackback_abouts.each_with_index do |about, i| + assert_equal(@trackback_elems[:about][i], about.value) + end + end + + assert_taxo_topic(@taxo_topic_elems, new_rss) + end end end diff --git a/test/rss/test_setup_maker_2.0.rb b/test/rss/test_setup_maker_2.0.rb index f28f837e43..6bf27d4682 100644 --- a/test/rss/test_setup_maker_2.0.rb +++ b/test/rss/test_setup_maker_2.0.rb @@ -162,7 +162,7 @@ module RSS assert_equal(link, textInput.link) end - def test_setup_maker_items + def test_setup_maker_items(for_backward_compatibility=false) title = "TITLE" link = "http://hoge.com/" description = "text hoge fuga" @@ -217,7 +217,11 @@ module RSS rss.channel.setup_maker(maker) rss.items.each do |item| - item.setup_maker(maker) + if for_backward_compatibility + item.setup_maker(maker) + else + item.setup_maker(maker.items) + end end end @@ -247,6 +251,10 @@ module RSS end + def test_setup_maker_items_backward_compatibility + test_setup_maker_items(true) + end + def test_setup_maker encoding = "EUC-JP" standalone = true -- cgit v1.2.3