[前][次][番号順一覧][スレッド一覧]

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

[前][次][番号順一覧][スレッド一覧]