diff --git a/ChangeLog b/ChangeLog index 7b4db6b74b..37bae634f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Sun Jun 29 18:09:00 2008 Kouhei Sutou + + * NEWS: add an entry for rss. + + * lib/rss/, test/rss/: merge from trunk. + - 0.2.4 -> 0.2.5. + - RSS::Maker.make raise an exception not returns nil for invalid + feed making. + - RSS::Maker.make requires block. + - don't use instance_variable to initialize variables. (speed up) + Sun Jun 29 10:59:12 2008 Tanaka Akira * math.c (domain_check): fix preprocess condition. diff --git a/NEWS b/NEWS index 492f02339c..2a3ba7bffa 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,14 @@ with all sufficient information, see the ChangeLog file. Return an enumerator if no block is given. +* rss + + * 0.2.4 -> 0.2.5 + + * RSS::Maker.make + * raise an exception not returns nil for invalid feed making. + * requires block. + == Changes since the 1.8.6 release === Configuration changes diff --git a/lib/rss/atom.rb b/lib/rss/atom.rb index 7cba934feb..10282a8743 100644 --- a/lib/rss/atom.rb +++ b/lib/rss/atom.rb @@ -1,4 +1,3 @@ -require 'base64' require 'rss/parser' module RSS diff --git a/lib/rss/maker/base.rb b/lib/rss/maker/base.rb index 56bf04657e..2262a764ec 100644 --- a/lib/rss/maker/base.rb +++ b/lib/rss/maker/base.rb @@ -31,7 +31,9 @@ module RSS self::OTHER_ELEMENTS << variable_name end - def add_need_initialize_variable(variable_name, init_value="nil") + def add_need_initialize_variable(variable_name, init_value=nil, + &init_block) + init_value ||= init_block self::NEED_INITIALIZE_VARIABLES << [variable_name, init_value] end @@ -45,7 +47,7 @@ module RSS def_delegators("@#{plural}", :push, :pop, :shift, :unshift) def_delegators("@#{plural}", :each, :size, :empty?, :clear) - add_need_initialize_variable(plural, "[]") + add_need_initialize_variable(plural) {[]} module_eval(<<-EOC, __FILE__, __LINE__ + 1) def new_#{name} @@ -74,7 +76,9 @@ module RSS def def_classed_element_without_accessor(name, class_name=nil) class_name ||= Utils.to_class_name(name) add_other_element(name) - add_need_initialize_variable(name, "make_#{name}") + add_need_initialize_variable(name) do |object| + object.send("make_#{name}") + end module_eval(<<-EOC, __FILE__, __LINE__ + 1) private def setup_#{name}(feed, current) @@ -185,7 +189,19 @@ module RSS private def initialize_variables self.class.need_initialize_variables.each do |variable_name, init_value| - instance_eval("@#{variable_name} = #{init_value}", __FILE__, __LINE__) + if init_value.nil? + value = nil + else + if init_value.respond_to?(:call) + value = init_value.call(self) + elsif init_value.is_a?(String) + # just for backward compatibility + value = instance_eval(init_value, __FILE__, __LINE__) + else + value = init_value + end + end + instance_variable_set("@#{variable_name}", value) end end @@ -238,7 +254,8 @@ module RSS def variables self.class.need_initialize_variables.find_all do |name, init| - "nil" == init + # init == "nil" is just for backward compatibility + init.nil? or init == "nil" end.collect do |name, init| name end @@ -364,7 +381,9 @@ module RSS %w(xml_stylesheets channel image items textinput).each do |element| attr_reader element - add_need_initialize_variable(element, "make_#{element}") + add_need_initialize_variable(element) do |object| + object.send("make_#{element}") + end module_eval(<<-EOC, __FILE__, __LINE__) private def setup_#{element}(feed) @@ -392,12 +411,8 @@ module RSS end def make - if block_given? - yield(self) - to_feed - else - nil - end + yield(self) + to_feed end def to_feed @@ -405,11 +420,8 @@ module RSS setup_xml_stylesheets(feed) setup_elements(feed) setup_other_elements(feed) - if feed.valid? - feed - else - nil - end + feed.validate + feed end private diff --git a/lib/rss/maker/itunes.rb b/lib/rss/maker/itunes.rb index 7c5049129d..8b7420da3c 100644 --- a/lib/rss/maker/itunes.rb +++ b/lib/rss/maker/itunes.rb @@ -176,7 +176,7 @@ module RSS %w(hour minute second).each do |name| attr_reader(name) - add_need_initialize_variable(name, '0') + add_need_initialize_variable(name, 0) end def content=(content) diff --git a/lib/rss/parser.rb b/lib/rss/parser.rb index 9e4919223c..9b28f0fa8a 100644 --- a/lib/rss/parser.rb +++ b/lib/rss/parser.rb @@ -34,8 +34,8 @@ module RSS class NotValidXMLParser < Error def initialize(parser) super("#{parser} is not an available XML parser. " << - "Available XML parser"<< - (AVAILABLE_PARSERS.size > 1 ? "s are ": " is ") << + "Available XML parser" << + (AVAILABLE_PARSERS.size > 1 ? "s are " : " is ") << "#{AVAILABLE_PARSERS.inspect}.") end end @@ -113,7 +113,7 @@ module RSS source.is_a?(String) and / target.length, } end + + if feed_readers.first == "entries" + parent = "entry" + else + parent = feed_type + end invalid_feed_checker = Proc.new do |targets| infos = {} - invalid = false + invalid_exception = nil targets.each do |target| key = [target.hreflang, target.type] if infos.has_key?(key) - invalid = true + invalid_exception = RSS::TooMuchTagError.new("link", parent) break end infos[key] = true if target.rel.nil? or target.rel == "alternate" end - invalid + invalid_exception end invalid_feed_checker = nil if allow_duplication _assert_maker_atom_elements(feed_type, maker_readers, feed_readers, diff --git a/test/rss/test_atom.rb b/test/rss/test_atom.rb index c442c753b2..1f65008fa0 100644 --- a/test/rss/test_atom.rb +++ b/test/rss/test_atom.rb @@ -658,7 +658,7 @@ module RSS content.content = original_content xml = REXML::Document.new(content.to_s).root assert_rexml_element([], {"type" => type}, - Base64.encode64(original_content), xml) + [original_content].pack("m").delete("\n"), xml) end end diff --git a/test/rss/test_maker_0.9.rb b/test/rss/test_maker_0.9.rb index c211bf605b..815f9e3952 100644 --- a/test/rss/test_maker_0.9.rb +++ b/test/rss/test_maker_0.9.rb @@ -6,8 +6,9 @@ module RSS class TestMaker09 < TestCase def test_rss - rss = RSS::Maker.make("0.91") - assert_nil(rss) + assert_raise(LocalJumpError) do + RSS::Maker.make("0.91") + end rss = RSS::Maker.make("0.9") do |maker| setup_dummy_channel(maker) diff --git a/test/rss/test_maker_1.0.rb b/test/rss/test_maker_1.0.rb index 60cc3708a7..49d506bf6f 100644 --- a/test/rss/test_maker_1.0.rb +++ b/test/rss/test_maker_1.0.rb @@ -6,6 +6,10 @@ module RSS class TestMaker10 < TestCase def test_rdf + assert_raise(LocalJumpError) do + RSS::Maker.make("1.0") + end + rss = RSS::Maker.make("1.0") do |maker| setup_dummy_channel(maker) setup_dummy_item(maker) @@ -48,9 +52,6 @@ module RSS link = "http://hoge.com" description = "fugafugafugafuga" - rss = RSS::Maker.make("1.0") - assert_nil(rss) - rss = RSS::Maker.make("1.0") do |maker| maker.channel.about = about maker.channel.title = title diff --git a/test/rss/test_maker_2.0.rb b/test/rss/test_maker_2.0.rb index c338e343a3..f6d4a11dc3 100644 --- a/test/rss/test_maker_2.0.rb +++ b/test/rss/test_maker_2.0.rb @@ -6,8 +6,9 @@ module RSS class TestMaker20 < TestCase def test_rss - rss = RSS::Maker.make("2.0") - assert_nil(rss) + assert_raise(LocalJumpError) do + RSS::Maker.make("2.0") + end rss = RSS::Maker.make("2.0") do |maker| setup_dummy_channel(maker) diff --git a/test/rss/test_maker_dc.rb b/test/rss/test_maker_dc.rb index c9df36a1ce..72a967231a 100644 --- a/test/rss/test_maker_dc.rb +++ b/test/rss/test_maker_dc.rb @@ -86,9 +86,8 @@ module RSS elems.each do |name, values, plural| dc_elems = item.__send__("dc_#{plural}") values.each do |value| - dc_elems.__send__("new_#{name}") do |elem| - elem.value = value - end + elem = dc_elems.__send__("new_#{name}") + elem.value = value end end diff --git a/test/rss/test_maker_itunes.rb b/test/rss/test_maker_itunes.rb index 1d4e323057..21a4dd1f29 100644 --- a/test/rss/test_maker_itunes.rb +++ b/test/rss/test_maker_itunes.rb @@ -462,7 +462,7 @@ module RSS "all of your answers here.", maker_readers, feed_readers) _assert_maker_itunes_summary("This week we talk about surviving in a " + - "Red state if you’re a Blue person. Or " + + "Red state if you're a Blue person. Or " + "vice versa.", maker_readers, feed_readers) end diff --git a/test/rss/test_parser_1.0.rb b/test/rss/test_parser_1.0.rb index 819ce286a5..216881b767 100644 --- a/test/rss/test_parser_1.0.rb +++ b/test/rss/test_parser_1.0.rb @@ -509,3 +509,4 @@ EOR end end end + diff --git a/test/rss/test_version.rb b/test/rss/test_version.rb index 64f6f0482e..fefdb1e0f0 100644 --- a/test/rss/test_version.rb +++ b/test/rss/test_version.rb @@ -3,7 +3,7 @@ require "rss-testcase" module RSS class TestVersion < TestCase def test_version - assert_equal("0.2.4", ::RSS::VERSION) + assert_equal("0.2.5", ::RSS::VERSION) end end end