ruby-changes:1955
From: ko1@a...
Date: 15 Sep 2007 13:41:44 +0900
Subject: [ruby-changes:1955] kou - Ruby:r13446 (trunk): * lib/rss.rb, lib/rss/, test/rss/:
kou 2007-09-15 13:41:28 +0900 (Sat, 15 Sep 2007) New Revision: 13446 Added files: trunk/lib/rss/maker/slash.rb trunk/lib/rss/slash.rb trunk/test/rss/test_maker_slash.rb trunk/test/rss/test_setup_maker_slash.rb trunk/test/rss/test_slash.rb Modified files: trunk/ChangeLog trunk/lib/rss/itunes.rb trunk/lib/rss/maker/base.rb trunk/lib/rss/maker/itunes.rb trunk/lib/rss/maker.rb trunk/lib/rss/parser.rb trunk/lib/rss/rss.rb trunk/lib/rss/utils.rb trunk/lib/rss.rb trunk/test/rss/rss-assertions.rb trunk/test/rss/test_parser.rb trunk/test/rss/test_parser_1.0.rb trunk/test/rss/test_version.rb trunk/version.h Log: * lib/rss.rb, lib/rss/, test/rss/: - 0.1.9 -> 0.2.0. - supported Slash module. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/rss/test_parser_1.0.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/version.h?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/rss/rss-assertions.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/rss/test_version.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss/maker/itunes.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/rss/test_maker_slash.rb?revision=13446&view=markup http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss/slash.rb?revision=13446&view=markup http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss/rss.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss/itunes.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss/utils.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss/maker/base.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/rss/test_setup_maker_slash.rb?revision=13446&view=markup http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/rss/test_parser.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss/maker.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss/parser.rb?r1=13446&r2=13445 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rss/maker/slash.rb?revision=13446&view=markup http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/rss/test_slash.rb?revision=13446&view=markup Index: ChangeLog =================================================================== --- ChangeLog (revision 13445) +++ ChangeLog (revision 13446) @@ -1,3 +1,9 @@ +Sat Sep 15 13:31:21 2007 Kouhei Sutou <kou@c...> + + * lib/rss.rb, lib/rss/, test/rss/: + - 0.1.9 -> 0.2.0. + - supported Slash module. + Fri Sep 14 22:20:01 2007 Masaki Suketa <masaki.suketa@n...> * ext/win32ole/win32ole.c (fev_unadvise): no needs to reset Index: lib/rss/parser.rb =================================================================== --- lib/rss/parser.rb (revision 13445) +++ lib/rss/parser.rb (revision 13446) @@ -365,7 +365,8 @@ def start_else_element(local, prefix, attrs, ns) class_name = self.class.class_name(_ns(ns, prefix), local) current_class = @last_element.class - if current_class.const_defined?(class_name) + if current_class.const_defined?(class_name, false) or + current_class.constants.include?(class_name.to_sym) next_class = current_class.const_get(class_name) start_have_something_element(local, prefix, attrs, ns, next_class) else Index: lib/rss/maker/itunes.rb =================================================================== --- lib/rss/maker/itunes.rb (revision 13445) +++ lib/rss/maker/itunes.rb (revision 13446) @@ -52,13 +52,7 @@ end def def_csv_accessor(klass, full_name) - klass.def_other_element_without_accessor(full_name) - klass.module_eval(<<-EOC, __FILE__, __LINE__ + 1) - attr_reader :#{full_name} - def #{full_name}=(value) - @#{full_name} = Utils::CSV.parse(value) - end - EOC + klass.def_csv_element(full_name) end def def_elements_class_accessor(klass, full_name, full_plural_name, Index: lib/rss/maker/base.rb =================================================================== --- lib/rss/maker/base.rb (revision 13445) +++ lib/rss/maker/base.rb (revision 13446) @@ -151,6 +151,20 @@ end EOC end + + def def_csv_element(name, type=nil) + def_other_element_without_accessor(name) + attr_reader(name) + converter = "" + if type == :integer + converter = "{|v| Integer(v)}" + end + module_eval(<<-EOC, __FILE__, __LINE__ + 1) + def #{name}=(value) + @#{name} = Utils::CSV.parse(value)#{converter} + end + EOC + end end attr_reader :maker Index: lib/rss/maker/slash.rb =================================================================== --- lib/rss/maker/slash.rb (revision 0) +++ lib/rss/maker/slash.rb (revision 13446) @@ -0,0 +1,33 @@ +require 'rss/slash' +require 'rss/maker/1.0' + +module RSS + module Maker + module SlashModel + def self.append_features(klass) + super + + ::RSS::SlashModel::ELEMENT_INFOS.each do |name, type| + full_name = "#{RSS::SLASH_PREFIX}_#{name}" + case type + when :csv_integer + klass.def_csv_element(full_name, :integer) + else + klass.def_other_element(full_name) + end + end + + klass.module_eval do + alias_method(:slash_hit_parades, :slash_hit_parade) + alias_method(:slash_hit_parades=, :slash_hit_parade=) + end + end + end + + class ItemsBase + class ItemBase + include SlashModel + end + end + end +end Index: lib/rss/maker.rb =================================================================== --- lib/rss/maker.rb (revision 13445) +++ lib/rss/maker.rb (revision 13446) @@ -36,6 +36,7 @@ require "rss/maker/entry" require "rss/maker/content" require "rss/maker/dublincore" +require "rss/maker/slash" require "rss/maker/syndication" require "rss/maker/taxonomy" require "rss/maker/trackback" Index: lib/rss/utils.rb =================================================================== --- lib/rss/utils.rb (revision 13445) +++ lib/rss/utils.rb (revision 13446) @@ -62,9 +62,11 @@ module CSV module_function - def parse(value) + def parse(value, &block) if value.is_a?(String) - value.strip.split(/\s*,\s*/) + value = value.strip.split(/\s*,\s*/) + value = value.collect(&block) if block_given? + value else value end Index: lib/rss/rss.rb =================================================================== --- lib/rss/rss.rb (revision 13445) +++ lib/rss/rss.rb (revision 13446) @@ -53,7 +53,7 @@ module RSS - VERSION = "0.1.9" + VERSION = "0.2.0" URI = "http://purl.org/rss/1.0/" @@ -361,6 +361,12 @@ end def csv_attr_reader(*attrs) + separator = nil + if attrs.last.is_a?(Hash) + options = attrs.pop + separator = options[:separator] + end + separator ||= ", " attrs.each do |attr| attr = attr.id2name if attr.kind_of?(Integer) module_eval(<<-EOC, __FILE__, __LINE__ + 1) @@ -369,7 +375,7 @@ if @#{attr}.nil? @#{attr} else - @#{attr}.join(", ") + @#{attr}.join(#{separator.dump}) end end EOC @@ -531,6 +537,14 @@ EOC end + def csv_integer_writer(name, disp_name=name) + module_eval(<<-EOC, __FILE__, __LINE__ + 1) + def #{name}=(new_value) + @#{name} = Utils::CSV.parse(new_value) {|v| Integer(v)} + end + EOC + end + def def_children_accessor(accessor_name, plural_name) module_eval(<<-EOC, *get_file_and_line_from_caller(2)) def #{plural_name} @@ -720,6 +734,8 @@ yes_other_writer name, disp_name when :csv csv_writer name + when :csv_integer + csv_integer_writer name else attr_writer name end @@ -737,6 +753,8 @@ yes_other_attr_reader name when :csv csv_attr_reader name + when :csv_integer + csv_attr_reader name, :separator => "," else convert_attr_reader name end Index: lib/rss/itunes.rb =================================================================== --- lib/rss/itunes.rb (revision 13445) +++ lib/rss/itunes.rb (revision 13446) @@ -398,9 +398,9 @@ element_infos = ITunesChannelModel::ELEMENT_INFOS + ITunesItemModel::ELEMENT_INFOS element_infos.each do |name, type| - class_name = Utils.to_class_name(name) case type when :element, :elements, :attribute + class_name = Utils.to_class_name(name) BaseListener.install_class_name(ITUNES_URI, name, "ITunes#{class_name}") else accessor_base = "#{ITUNES_PREFIX}_#{name.gsub(/-/, '_')}" Index: lib/rss/slash.rb =================================================================== --- lib/rss/slash.rb (revision 0) +++ lib/rss/slash.rb (revision 13446) @@ -0,0 +1,49 @@ +require 'rss/1.0' + +module RSS + SLASH_PREFIX = 'slash' + SLASH_URI = "http://purl.org/rss/1.0/modules/slash/" + + RDF.install_ns(SLASH_PREFIX, SLASH_URI) + + module SlashModel + extend BaseModel + + ELEMENT_INFOS = \ + [ + ["section"], + ["department"], + ["comments", :positive_integer], + ["hit_parade", :csv_integer], + ] + + class << self + def append_features(klass) + super + + return if klass.instance_of?(Module) + klass.install_must_call_validator(SLASH_PREFIX, SLASH_URI) + ELEMENT_INFOS.each do |name, type, *additional_infos| + full_name = "#{SLASH_PREFIX}_#{name}" + klass.install_text_element(full_name, SLASH_URI, "?", + full_name, type, name) + end + + klass.module_eval do + alias_method(:slash_hit_parades, :slash_hit_parade) + undef_method(:slash_hit_parade) + alias_method(:slash_hit_parade, :slash_hit_parade_content) + end + end + end + end + + class RDF + class Item; include SlashModel; end + end + + SlashModel::ELEMENT_INFOS.each do |name, type| + accessor_base = "#{SLASH_PREFIX}_#{name}" + BaseListener.install_get_text_element(SLASH_URI, name, accessor_base) + end +end Index: lib/rss.rb =================================================================== --- lib/rss.rb (revision 13445) +++ lib/rss.rb (revision 13446) @@ -11,6 +11,7 @@ require 'rss/dublincore' require 'rss/image' require 'rss/itunes' +require 'rss/slash' require 'rss/syndication' require 'rss/taxonomy' require 'rss/trackback' Index: version.h =================================================================== --- version.h (revision 13445) +++ version.h (revision 13446) @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2007-09-14" +#define RUBY_RELEASE_DATE "2007-09-15" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20070914 +#define RUBY_RELEASE_CODE 20070915 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2007 #define RUBY_RELEASE_MONTH 9 -#define RUBY_RELEASE_DAY 14 +#define RUBY_RELEASE_DAY 15 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; Index: test/rss/test_maker_slash.rb =================================================================== --- test/rss/test_maker_slash.rb (revision 0) +++ test/rss/test_maker_slash.rb (revision 13446) @@ -0,0 +1,37 @@ +require "rss-testcase" + +require "rss/maker" + +module RSS + class TestMakerSlash < TestCase + def setup + @elements = { + "section" => "articles", + "department" => "not-an-ocean-unless-there-are-lobsters", + "comments" => 177, + "hit_parades" => [177, 155, 105, 33, 6, 3, 0], + } + end + + def test_rss10 + rss = RSS::Maker.make("1.0") do |maker| + setup_dummy_channel(maker) + + setup_dummy_item(maker) + item = maker.items.last + @elements.each do |name, value| + item.send("slash_#{name}=", value) + end + end + + item = rss.items.last + assert_not_nil(item) + assert_slash_elements(item) + end + + private + def assert_slash_elements(target) + super(@elements, target) + end + end +end Index: test/rss/rss-assertions.rb =================================================================== --- test/rss/rss-assertions.rb (revision 13445) +++ test/rss/rss-assertions.rb (revision 13446) @@ -2018,6 +2018,18 @@ end end + def assert_slash_elements(expected, target) + assert_equal(expected, + { + "section" => target.slash_section, + "department" => target.slash_department, + "comments" => target.slash_comments, + "hit_parades" => target.slash_hit_parades, + }) + assert_equal(expected["hit_parades"].join(","), + target.slash_hit_parade) + end + def chain_reader(target, readers, &block) readers.inject(target) do |result, reader| return nil if result.nil? Index: test/rss/test_slash.rb =================================================================== --- test/rss/test_slash.rb (revision 0) +++ test/rss/test_slash.rb (revision 13446) @@ -0,0 +1,64 @@ +require "cgi" +require "rexml/document" + +require "rss-testcase" + +require "rss/1.0" +require "rss/slash" + +module RSS + class TestSlash < TestCase + def setup + @elements = { + "section" => "articles", + "department" => "not-an-ocean-unless-there-are-lobsters", + "comments" => 177, + "hit_parades" => [177, 155, 105, 33, 6, 3, 0], + } + + slash_nodes = @elements.collect do |name, value| + if name == "hit_parades" + name = "hit_parade" + value = value.join(",") + end + "<slash:#{name}>#{value}</slash:#{name}>" + end.join("\n") + + slash_ns = {"slash" => "http://purl.org/rss/1.0/modules/slash/"} + @source = make_RDF(<<-EOR, slash_ns) +#{make_channel} +#{make_image} +#{make_item(slash_nodes)} +#{make_textinput} +EOR + end + + def test_parser + rss = RSS::Parser.parse(@source) + + assert_not_nil(rss) + + item = rss.items[0] + assert_not_nil(item) + + assert_slash_elements(item) + end + + def test_to_s + rss = RSS::Parser.parse(@source) + rss = RSS::Parser.parse(rss.to_s) + + assert_not_nil(rss) + + item = rss.items[0] + assert_not_nil(item) + + assert_slash_elements(item) + end + + private + def assert_slash_elements(target) + super(@elements, target) + end + end +end Index: test/rss/test_version.rb =================================================================== --- test/rss/test_version.rb (revision 13445) +++ test/rss/test_version.rb (revision 13446) @@ -3,7 +3,7 @@ module RSS class TestVersion < TestCase def test_version - assert_equal("0.1.9", ::RSS::VERSION) + assert_equal("0.2.0", ::RSS::VERSION) end end end Index: test/rss/test_parser.rb =================================================================== --- test/rss/test_parser.rb (revision 13445) +++ test/rss/test_parser.rb (revision 13446) @@ -1,4 +1,4 @@ -require 'fileutils' +require "fileutils" require "rss-testcase" Index: test/rss/test_setup_maker_slash.rb =================================================================== --- test/rss/test_setup_maker_slash.rb (revision 0) +++ test/rss/test_setup_maker_slash.rb (revision 13446) @@ -0,0 +1,38 @@ +require "rss-testcase" + +require "rss/maker" + +module RSS + class TestSetupMakerSlash < TestCase + def test_setup_maker + elements = { + "section" => "articles", + "department" => "not-an-ocean-unless-there-are-lobsters", + "comments" => 177, + "hit_parades" => [177, 155, 105, 33, 6, 3, 0], + } + + rss = RSS::Maker.make("rss1.0") do |maker| + setup_dummy_channel(maker) + setup_dummy_item(maker) + + item = maker.items.last + item.slash_section = elements["section"] + item.slash_department = elements["department"] + item.slash_comments = elements["comments"] + item.slash_hit_parade = elements["hit_parades"].join(",") + end + assert_not_nil(rss) + + new_rss = RSS::Maker.make("rss1.0") do |maker| + rss.setup_maker(maker) + end + assert_not_nil(new_rss) + + item = new_rss.items.last + assert_not_nil(item) + + assert_slash_elements(elements, item) + end + end +end Index: test/rss/test_parser_1.0.rb =================================================================== --- test/rss/test_parser_1.0.rb (revision 13445) +++ test/rss/test_parser_1.0.rb (revision 13446) @@ -498,6 +498,14 @@ Parser.parse(rss, true, false) end end + + def test_unknown_duplicated_element + assert_parse(make_RDF(<<-EOR), :nothing_raised) + #{make_channel("<test:string/>")} + #{make_item} + #{make_image} + EOR + end end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml