From 1b56bcce22a069eba6afb7e36f654783e5b4fbbc Mon Sep 17 00:00:00 2001 From: kou Date: Sat, 15 Sep 2007 04:41:28 +0000 Subject: * lib/rss.rb, lib/rss/, test/rss/: - 0.1.9 -> 0.2.0. - supported Slash module. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13446 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rss/itunes.rb | 2 +- lib/rss/maker.rb | 1 + lib/rss/maker/base.rb | 14 ++++++++++++++ lib/rss/maker/itunes.rb | 8 +------- lib/rss/maker/slash.rb | 33 +++++++++++++++++++++++++++++++++ lib/rss/parser.rb | 3 ++- lib/rss/rss.rb | 22 ++++++++++++++++++++-- lib/rss/slash.rb | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/rss/utils.rb | 6 ++++-- 9 files changed, 125 insertions(+), 13 deletions(-) create mode 100644 lib/rss/maker/slash.rb create mode 100644 lib/rss/slash.rb (limited to 'lib/rss') diff --git a/lib/rss/itunes.rb b/lib/rss/itunes.rb index 7414bc511a..f95ca7aa2e 100644 --- a/lib/rss/itunes.rb +++ b/lib/rss/itunes.rb @@ -398,9 +398,9 @@ module RSS 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(/-/, '_')}" diff --git a/lib/rss/maker.rb b/lib/rss/maker.rb index e362e785fa..666dfa872d 100644 --- a/lib/rss/maker.rb +++ b/lib/rss/maker.rb @@ -36,6 +36,7 @@ require "rss/maker/feed" 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" diff --git a/lib/rss/maker/base.rb b/lib/rss/maker/base.rb index 752b2fa58f..fdb8946efc 100644 --- a/lib/rss/maker/base.rb +++ b/lib/rss/maker/base.rb @@ -151,6 +151,20 @@ module RSS 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 diff --git a/lib/rss/maker/itunes.rb b/lib/rss/maker/itunes.rb index 86f41e2fd7..f02db28824 100644 --- a/lib/rss/maker/itunes.rb +++ b/lib/rss/maker/itunes.rb @@ -52,13 +52,7 @@ module RSS 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, diff --git a/lib/rss/maker/slash.rb b/lib/rss/maker/slash.rb new file mode 100644 index 0000000000..27adef3832 --- /dev/null +++ b/lib/rss/maker/slash.rb @@ -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 diff --git a/lib/rss/parser.rb b/lib/rss/parser.rb index bf3b0b5d08..5856bddf29 100644 --- a/lib/rss/parser.rb +++ b/lib/rss/parser.rb @@ -365,7 +365,8 @@ module RSS 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 diff --git a/lib/rss/rss.rb b/lib/rss/rss.rb index db507f78c8..e381c85406 100644 --- a/lib/rss/rss.rb +++ b/lib/rss/rss.rb @@ -53,7 +53,7 @@ require "rss/xml-stylesheet" module RSS - VERSION = "0.1.9" + VERSION = "0.2.0" URI = "http://purl.org/rss/1.0/" @@ -361,6 +361,12 @@ EOC 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 @@ EOC if @#{attr}.nil? @#{attr} else - @#{attr}.join(", ") + @#{attr}.join(#{separator.dump}) end end EOC @@ -531,6 +537,14 @@ EOC 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 @@ EOC 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 @@ EOC 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 diff --git a/lib/rss/slash.rb b/lib/rss/slash.rb new file mode 100644 index 0000000000..f102413b46 --- /dev/null +++ b/lib/rss/slash.rb @@ -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 diff --git a/lib/rss/utils.rb b/lib/rss/utils.rb index 0b53a19d3b..a24fc173d6 100644 --- a/lib/rss/utils.rb +++ b/lib/rss/utils.rb @@ -62,9 +62,11 @@ module RSS 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 -- cgit v1.2.3