ruby-changes:6165
From: kou <ko1@a...>
Date: Sun, 29 Jun 2008 18:13:18 +0900 (JST)
Subject: [ruby-changes:6165] Ruby:r17677 (ruby_1_8): * NEWS: add an entry for rss.
kou 2008-06-29 18:12:56 +0900 (Sun, 29 Jun 2008)
New Revision: 17677
Modified files:
branches/ruby_1_8/ChangeLog
branches/ruby_1_8/NEWS
branches/ruby_1_8/lib/rss/atom.rb
branches/ruby_1_8/lib/rss/maker/base.rb
branches/ruby_1_8/lib/rss/maker/itunes.rb
branches/ruby_1_8/lib/rss/parser.rb
branches/ruby_1_8/lib/rss/rss.rb
branches/ruby_1_8/test/rss/rss-assertions.rb
branches/ruby_1_8/test/rss/test_atom.rb
branches/ruby_1_8/test/rss/test_maker_0.9.rb
branches/ruby_1_8/test/rss/test_maker_1.0.rb
branches/ruby_1_8/test/rss/test_maker_2.0.rb
branches/ruby_1_8/test/rss/test_maker_dc.rb
branches/ruby_1_8/test/rss/test_maker_itunes.rb
branches/ruby_1_8/test/rss/test_parser_1.0.rb
branches/ruby_1_8/test/rss/test_version.rb
Log:
* 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)
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/rss/test_maker_itunes.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/rss/test_parser_1.0.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/lib/rss/parser.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/rss/test_version.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/rss/test_maker_0.9.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/rss/test_maker_2.0.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/rss/rss-assertions.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/rss/test_maker_1.0.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/rss/test_atom.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/lib/rss/rss.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/lib/rss/maker/itunes.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/NEWS?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/lib/rss/maker/base.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/lib/rss/atom.rb?r1=17677&r2=17676&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/rss/test_maker_dc.rb?r1=17677&r2=17676&diff_format=u
Index: ruby_1_8/NEWS
===================================================================
--- ruby_1_8/NEWS (revision 17676)
+++ ruby_1_8/NEWS (revision 17677)
@@ -22,6 +22,14 @@
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
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog (revision 17676)
+++ ruby_1_8/ChangeLog (revision 17677)
@@ -1,3 +1,14 @@
+Sun Jun 29 18:09:00 2008 Kouhei Sutou <kou@c...>
+
+ * 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 <akr@f...>
* math.c (domain_check): fix preprocess condition.
Index: ruby_1_8/lib/rss/parser.rb
===================================================================
--- ruby_1_8/lib/rss/parser.rb (revision 17676)
+++ ruby_1_8/lib/rss/parser.rb (revision 17677)
@@ -34,8 +34,8 @@
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 @@
source.is_a?(String) and /</ =~ source
end
- # Attempt to convert rss to a URI, but just return it if
+ # Attempt to convert rss to a URI, but just return it if
# there's a ::URI::Error
def to_uri(rss)
return rss if rss.is_a?(::URI::Generic)
@@ -220,9 +220,7 @@
name = (@@class_names[uri] || {})[tag_name]
return name if name
- tag_name = tag_name.gsub(/[_\-]([a-z]?)/) do
- $1.upcase
- end
+ tag_name = tag_name.gsub(/[_\-]([a-z]?)/) {$1.upcase}
tag_name[0, 1].upcase + tag_name[1..-1]
end
@@ -389,9 +387,7 @@
def start_else_element(local, prefix, attrs, ns)
class_name = self.class.class_name(_ns(ns, prefix), local)
current_class = @last_element.class
- if class_name and
- (current_class.const_defined?(class_name) or
- current_class.constants.include?(class_name))
+ if known_class?(current_class, class_name)
next_class = current_class.const_get(class_name)
start_have_something_element(local, prefix, attrs, ns, next_class)
else
@@ -407,6 +403,20 @@
end
end
+ if Module.method(:const_defined?).arity == -1
+ def known_class?(target_class, class_name)
+ class_name and
+ (target_class.const_defined?(class_name, false) or
+ target_class.constants.include?(class_name.to_sym))
+ end
+ else
+ def known_class?(target_class, class_name)
+ class_name and
+ (target_class.const_defined?(class_name) or
+ target_class.constants.include?(class_name))
+ end
+ end
+
NAMESPLIT = /^(?:([\w:][-\w\d.]*):)?([\w:][-\w\d.]*)/
def split_name(name)
name =~ NAMESPLIT
@@ -504,7 +514,7 @@
else
if klass.have_content?
if @last_element.need_base64_encode?
- text = Base64.decode64(text.lstrip)
+ text = text.lstrip.unpack("m").first
end
@last_element.content = text
end
Index: ruby_1_8/lib/rss/maker/itunes.rb
===================================================================
--- ruby_1_8/lib/rss/maker/itunes.rb (revision 17676)
+++ ruby_1_8/lib/rss/maker/itunes.rb (revision 17677)
@@ -176,7 +176,7 @@
%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)
Index: ruby_1_8/lib/rss/maker/base.rb
===================================================================
--- ruby_1_8/lib/rss/maker/base.rb (revision 17676)
+++ ruby_1_8/lib/rss/maker/base.rb (revision 17677)
@@ -31,7 +31,9 @@
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 @@
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 @@
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 @@
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 @@
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 @@
%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 @@
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 @@
setup_xml_stylesheets(feed)
setup_elements(feed)
setup_other_elements(feed)
- if feed.valid?
- feed
- else
- nil
- end
+ feed.validate
+ feed
end
private
Index: ruby_1_8/lib/rss/atom.rb
===================================================================
--- ruby_1_8/lib/rss/atom.rb (revision 17676)
+++ ruby_1_8/lib/rss/atom.rb (revision 17677)
@@ -1,4 +1,3 @@
-require 'base64'
require 'rss/parser'
module RSS
Index: ruby_1_8/lib/rss/rss.rb
===================================================================
--- ruby_1_8/lib/rss/rss.rb (revision 17676)
+++ ruby_1_8/lib/rss/rss.rb (revision 17677)
@@ -45,6 +45,7 @@
end
end
+
require "English"
require "rss/utils"
require "rss/converter"
@@ -52,7 +53,7 @@
module RSS
- VERSION = "0.2.4"
+ VERSION = "0.2.5"
URI = "http://purl.org/rss/1.0/"
@@ -1200,7 +1201,7 @@
__send__(self.class.xml_getter).to_s
else
_content = content
- _content = Base64.encode64(_content) if need_base64_encode?
+ _content = [_content].pack("m").delete("\n") if need_base64_encode?
h(_content)
end
end
Index: ruby_1_8/test/rss/test_maker_2.0.rb
===================================================================
--- ruby_1_8/test/rss/test_maker_2.0.rb (revision 17676)
+++ ruby_1_8/test/rss/test_maker_2.0.rb (revision 17677)
@@ -6,8 +6,9 @@
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)
Index: ruby_1_8/test/rss/rss-assertions.rb
===================================================================
--- ruby_1_8/test/rss/rss-assertions.rb (revision 17676)
+++ ruby_1_8/test/rss/rss-assertions.rb (revision 17677)
@@ -570,7 +570,7 @@
text << char
char.succ!
end
- base64_content = Base64.encode64(Zlib::Deflate.deflate(text))
+ base64_content = [Zlib::Deflate.deflate(text)].pack("m").delete("\n")
[false, true].each do |with_space|
xml_content = base64_content
@@ -1272,22 +1272,32 @@
invalid_feed_checker=nil)
_wrap_assertion do
elements = []
- invalid_feed = false
- feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
- yield maker
- targets = chain_reader(maker, maker_readers)
- targets.each do |target|
- element = maker_extractor.call(target)
- elements << element if element
+ invalid_feed_exception = nil
+ feed = nil
+ begin
+ feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
+ yield maker
+ targets = chain_reader(maker, maker_readers)
+ targets.each do |target|
+ element = maker_extractor.call(target)
+ elements << element if element
+ end
+ if invalid_feed_checker
+ invalid_feed_exception = invalid_feed_checker.call(targets)
+ end
end
- if invalid_feed_checker
- invalid_feed = invalid_feed_checker.call(targets)
+ rescue RSS::Error
+ if invalid_feed_exception.is_a?(RSS::TooMuchTagError)
+ assert_too_much_tag(invalid_feed_exception.tag,
+ invalid_feed_exception.parent) do
+ raise
+ end
+ else
+ raise
end
end
- if invalid_feed
- assert_nil(feed)
- else
+ if invalid_feed_exception.nil?
actual_elements = chain_reader(feed, feed_readers) || []
actual_elements = actual_elements.collect do |target|
feed_extractor.call(target)
@@ -1542,18 +1552,24 @@
:length => 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,
Index: ruby_1_8/test/rss/test_maker_dc.rb
===================================================================
--- ruby_1_8/test/rss/test_maker_dc.rb (revision 17676)
+++ ruby_1_8/test/rss/test_maker_dc.rb (revision 17677)
@@ -86,9 +86,8 @@
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
Index: ruby_1_8/test/rss/test_maker_1.0.rb
===================================================================
--- ruby_1_8/test/rss/test_maker_1.0.rb (revision 17676)
+++ ruby_1_8/test/rss/test_maker_1.0.rb (revision 17677)
@@ -6,6 +6,10 @@
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 @@
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
Index: ruby_1_8/test/rss/test_maker_0.9.rb
===================================================================
--- ruby_1_8/test/rss/test_maker_0.9.rb (revision 17676)
+++ ruby_1_8/test/rss/test_maker_0.9.rb (revision 17677)
@@ -6,8 +6,9 @@
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)
Index: ruby_1_8/test/rss/test_version.rb
===================================================================
--- ruby_1_8/test/rss/test_version.rb (revision 17676)
+++ ruby_1_8/test/rss/test_version.rb (revision 17677)
@@ -3,7 +3,7 @@
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
Index: ruby_1_8/test/rss/test_maker_itunes.rb
===================================================================
--- ruby_1_8/test/rss/test_maker_itunes.rb (revision 17676)
+++ ruby_1_8/test/rss/test_maker_itunes.rb (revision 17677)
@@ -462,7 +462,7 @@
"all of your answers here.",
maker_readers, feed_readers)
_assert_maker_itunes_summary("This week we talk about surviving in a " +
- "Red state if youe a Blue person. Or " +
+ "Red state if you're a Blue person. Or " +
"vice versa.",
maker_readers, feed_readers)
end
Index: ruby_1_8/test/rss/test_atom.rb
===================================================================
--- ruby_1_8/test/rss/test_atom.rb (revision 17676)
+++ ruby_1_8/test/rss/test_atom.rb (revision 17677)
@@ -658,7 +658,7 @@
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
Index: ruby_1_8/test/rss/test_parser_1.0.rb
===================================================================
--- ruby_1_8/test/rss/test_parser_1.0.rb (revision 17676)
+++ ruby_1_8/test/rss/test_parser_1.0.rb (revision 17677)
@@ -509,3 +509,4 @@
end
end
end
+
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/