mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 cff37c6dcc
			
		
	
	
		cff37c6dcc
		
	
	
	
	
		
			
			* test/rss/test_version.rb (RSS::TestVersion#test_version): ditto. * lib/rss/0.9.rb (RSS::Rss::Channel::Item::Category): domain attribute of <category> is optional. Thanks to Chris Lee <clee@kde.org>. * test/rss/test_parser.rb (RSS::TestParser#test_category20): adjusted test case. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8734 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			669 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			669 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "rss/parser"
 | |
| 
 | |
| module RSS
 | |
| 
 | |
|   module RSS09
 | |
|     NSPOOL = {}
 | |
|     ELEMENTS = []
 | |
| 
 | |
|     def self.append_features(klass)
 | |
|       super
 | |
|       
 | |
|       klass.install_must_call_validator('', nil)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   class Rss < Element
 | |
| 
 | |
|     include RSS09
 | |
|     include RootElementMixin
 | |
|     include XMLStyleSheetMixin
 | |
| 
 | |
|     [
 | |
|       ["channel", nil],
 | |
|     ].each do |tag, occurs|
 | |
|       install_model(tag, occurs)
 | |
|     end
 | |
| 
 | |
|     %w(channel).each do |name|
 | |
|       install_have_child_element(name)
 | |
|     end
 | |
| 
 | |
|     attr_accessor :rss_version, :version, :encoding, :standalone
 | |
|     
 | |
|     def initialize(rss_version, version=nil, encoding=nil, standalone=nil)
 | |
|       super
 | |
|     end
 | |
| 
 | |
|     def items
 | |
|       if @channel
 | |
|         @channel.items
 | |
|       else
 | |
|         []
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def image
 | |
|       if @channel
 | |
|         @channel.image
 | |
|       else
 | |
|         nil
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def textinput
 | |
|       if @channel
 | |
|         @channel.textInput
 | |
|       else
 | |
|         nil
 | |
|       end
 | |
|     end
 | |
|     
 | |
|     def to_s(need_convert=true, indent=calc_indent)
 | |
|       rv = tag(indent, ns_declarations) do |next_indent|
 | |
|         [
 | |
|           channel_element(false, next_indent),
 | |
|           other_element(false, next_indent),
 | |
|         ]
 | |
|       end
 | |
|       rv = convert(rv) if need_convert
 | |
|       rv
 | |
|     end
 | |
| 
 | |
|     private
 | |
|     def children
 | |
|       [@channel]
 | |
|     end
 | |
| 
 | |
|     def _tags
 | |
|       [
 | |
|         [nil, 'channel'],
 | |
|       ].delete_if do |uri, name|
 | |
|         send(name).nil?
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def _attrs
 | |
|       [
 | |
|         ["version", true, "rss_version"],
 | |
|       ]
 | |
|     end
 | |
| 
 | |
|     class Channel < Element
 | |
| 
 | |
|       include RSS09
 | |
| 
 | |
|       [
 | |
|         ["title", nil],
 | |
|         ["link", nil],
 | |
|         ["description", nil],
 | |
|         ["language", nil],
 | |
|         ["copyright", "?"],
 | |
|         ["managingEditor", "?"],
 | |
|         ["webMaster", "?"],
 | |
|         ["rating", "?"],
 | |
|         ["docs", "?"],
 | |
|       ].each do |name, occurs|
 | |
|         install_text_element(name)
 | |
|         install_model(name, occurs)
 | |
|       end
 | |
| 
 | |
|       [
 | |
|         ["pubDate", "?"],
 | |
|         ["lastBuildDate", "?"],
 | |
|       ].each do |name, occurs|
 | |
|         install_date_element(name, 'rfc822')
 | |
|         install_model(name, occurs)
 | |
|       end
 | |
|       alias date pubDate
 | |
|       alias date= pubDate=
 | |
| 
 | |
|       [
 | |
|         ["skipDays", "?"],
 | |
|         ["skipHours", "?"],
 | |
|         ["image", nil],
 | |
|         ["textInput", "?"],
 | |
|       ].each do |name, occurs|
 | |
|         install_have_child_element(name)
 | |
|         install_model(name, occurs)
 | |
|       end
 | |
|       
 | |
|       [
 | |
|         ["cloud", "?"]
 | |
|       ].each do |name, occurs|
 | |
|         install_have_attribute_element(name)
 | |
|         install_model(name, occurs)
 | |
|       end
 | |
|       
 | |
|       [
 | |
|         ["item", "*"]
 | |
|       ].each do |name, occurs|
 | |
|         install_have_children_element(name)
 | |
|         install_model(name, occurs)
 | |
|       end
 | |
| 
 | |
|       def initialize()
 | |
|         super()
 | |
|       end
 | |
| 
 | |
|       def to_s(need_convert=true, indent=calc_indent)
 | |
|         rv = tag(indent) do |next_indent|
 | |
|           [
 | |
|             title_element(false, next_indent),
 | |
|             link_element(false, next_indent),
 | |
|             description_element(false, next_indent),
 | |
|             language_element(false, next_indent),
 | |
|             copyright_element(false, next_indent),
 | |
|             managingEditor_element(false, next_indent),
 | |
|             webMaster_element(false, next_indent),
 | |
|             rating_element(false, next_indent),
 | |
|             pubDate_element(false, next_indent),
 | |
|             lastBuildDate_element(false, next_indent),
 | |
|             docs_element(false, next_indent),
 | |
|             cloud_element(false, next_indent),
 | |
|             skipDays_element(false, next_indent),
 | |
|             skipHours_element(false, next_indent),
 | |
|             image_element(false, next_indent),
 | |
|             item_elements(false, next_indent),
 | |
|             textInput_element(false, next_indent),
 | |
|             other_element(false, next_indent),
 | |
|           ]
 | |
|         end
 | |
|         rv = convert(rv) if need_convert
 | |
|         rv
 | |
|       end
 | |
| 
 | |
|       private
 | |
|       def children
 | |
|         [@skipDays, @skipHours, @image, @textInput, @cloud, *@item]
 | |
|       end
 | |
| 
 | |
|       def _tags
 | |
|         rv = [
 | |
|           "title",
 | |
|           "link",
 | |
|           "description",
 | |
|           "language",
 | |
|           "copyright",
 | |
|           "managingEditor",
 | |
|           "webMaster",
 | |
|           "rating",
 | |
|           "docs",
 | |
|           "skipDays",
 | |
|           "skipHours",
 | |
|           "image",
 | |
|           "textInput",
 | |
|           "cloud",
 | |
|         ].delete_if do |name|
 | |
|           send(name).nil?
 | |
|         end.collect do |elem|
 | |
|           [nil, elem]
 | |
|         end
 | |
| 
 | |
|         @item.each do
 | |
|           rv << [nil, "item"]
 | |
|         end
 | |
| 
 | |
|         rv
 | |
|       end
 | |
| 
 | |
|       def maker_target(maker)
 | |
|         maker.channel
 | |
|       end
 | |
| 
 | |
|       def setup_maker_elements(channel)
 | |
|         super
 | |
|         [
 | |
|           [skipDays, "day"],
 | |
|           [skipHours, "hour"],
 | |
|         ].each do |skip, key|
 | |
|           if skip
 | |
|             skip.__send__("#{key}s").each do |val|
 | |
|               target_skips = channel.__send__("skip#{key.capitalize}s")
 | |
|               new_target = target_skips.__send__("new_#{key}")
 | |
|               new_target.content = val.content
 | |
|             end
 | |
|           end
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def not_need_to_call_setup_maker_variables
 | |
|         %w(image textInput)
 | |
|       end
 | |
|     
 | |
|       class SkipDays < Element
 | |
|         include RSS09
 | |
| 
 | |
|         [
 | |
|           ["day", "*"]
 | |
|         ].each do |name, occurs|
 | |
|           install_have_children_element(name)
 | |
|           install_model(name, occurs)
 | |
|         end
 | |
| 
 | |
|         def to_s(need_convert=true, indent=calc_indent)
 | |
|           rv = tag(indent) do |next_indent|
 | |
|             [
 | |
|               day_elements(false, next_indent)
 | |
|             ]
 | |
|           end
 | |
|           rv = convert(rv) if need_convert
 | |
|           rv
 | |
|         end
 | |
| 
 | |
|         private
 | |
|         def children
 | |
|           @day
 | |
|         end
 | |
| 
 | |
|         def _tags
 | |
|           @day.compact.collect do
 | |
|             [nil, "day"]
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         class Day < Element
 | |
|           include RSS09
 | |
| 
 | |
|           content_setup
 | |
| 
 | |
|           def initialize(content=nil)
 | |
|             super()
 | |
|             @content = content
 | |
|           end
 | |
|       
 | |
|         end
 | |
|         
 | |
|       end
 | |
|       
 | |
|       class SkipHours < Element
 | |
|         include RSS09
 | |
| 
 | |
|         [
 | |
|           ["hour", "*"]
 | |
|         ].each do |name, occurs|
 | |
|           install_have_children_element(name)
 | |
|           install_model(name, occurs)
 | |
|         end
 | |
| 
 | |
|         def to_s(need_convert=true, indent=calc_indent)
 | |
|           rv = tag(indent) do |next_indent|
 | |
|             [
 | |
|               hour_elements(false, next_indent)
 | |
|             ]
 | |
|           end
 | |
|           rv = convert(rv) if need_convert
 | |
|           rv
 | |
|         end
 | |
| 
 | |
|         private
 | |
|         def children
 | |
|           @hour
 | |
|         end
 | |
| 
 | |
|         def _tags
 | |
|           @hour.compact.collect do
 | |
|             [nil, "hour"]
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         class Hour < Element
 | |
|           include RSS09
 | |
| 
 | |
|           content_setup
 | |
| 
 | |
|           def initialize(content=nil)
 | |
|             super()
 | |
|             @content = content
 | |
|           end
 | |
| 
 | |
|           remove_method :content=
 | |
|           def content=(value)
 | |
|             @content = value.to_i
 | |
|           end
 | |
|           
 | |
|         end
 | |
|         
 | |
|       end
 | |
|       
 | |
|       class Image < Element
 | |
| 
 | |
|         include RSS09
 | |
|         
 | |
|         %w(url title link).each do |name|
 | |
|           install_text_element(name)
 | |
|           install_model(name, nil)
 | |
|         end
 | |
|         %w(width height description).each do |name|
 | |
|           install_text_element(name)
 | |
|           install_model(name, "?")
 | |
|         end
 | |
| 
 | |
|         def to_s(need_convert=true, indent=calc_indent)
 | |
|           rv = tag(indent) do |next_indent|
 | |
|             [
 | |
|               url_element(false, next_indent),
 | |
|               title_element(false, next_indent),
 | |
|               link_element(false, next_indent),
 | |
|               width_element(false, next_indent),
 | |
|               height_element(false, next_indent),
 | |
|               description_element(false, next_indent),
 | |
|               other_element(false, next_indent),
 | |
|             ]
 | |
|           end
 | |
|           rv = convert(rv) if need_convert
 | |
|           rv
 | |
|         end
 | |
| 
 | |
|         private
 | |
|         def _tags
 | |
|           %w(url title link width height description).delete_if do |name|
 | |
|             send(name).nil?
 | |
|           end.collect do |elem|
 | |
|             [nil, elem]
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         def maker_target(maker)
 | |
|           maker.image
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       class Cloud < Element
 | |
| 
 | |
|         include RSS09
 | |
|         
 | |
|         [
 | |
|           ["domain", nil, true],
 | |
|           ["port", nil, true],
 | |
|           ["path", nil, true],
 | |
|           ["registerProcedure", nil, true],
 | |
|           ["protocol", nil ,true],
 | |
|         ].each do |name, uri, required|
 | |
|           install_get_attribute(name, uri, required)
 | |
|         end
 | |
| 
 | |
|         def initialize(domain=nil, port=nil, path=nil, rp=nil, protocol=nil)
 | |
|           super()
 | |
|           @domain = domain
 | |
|           @port = port
 | |
|           @path = path
 | |
|           @registerProcedure = rp
 | |
|           @protocol = protocol
 | |
|         end
 | |
| 
 | |
|         def to_s(need_convert=true, indent=calc_indent)
 | |
|           rv = tag(indent)
 | |
|           rv = convert(rv) if need_convert
 | |
|           rv
 | |
|         end
 | |
| 
 | |
|         private
 | |
|         def _attrs
 | |
|           %w(domain port path registerProcedure protocol).collect do |attr|
 | |
|             [attr, true]
 | |
|           end
 | |
|         end
 | |
| 
 | |
|       end
 | |
|       
 | |
|       class Item < Element
 | |
|         
 | |
|         include RSS09
 | |
| 
 | |
|         %w(title link description).each do |name|
 | |
|           install_text_element(name)
 | |
|         end
 | |
| 
 | |
|         %w(source enclosure).each do |name|
 | |
|           install_have_child_element(name)
 | |
|         end
 | |
| 
 | |
|         [
 | |
|           %w(category categories),
 | |
|         ].each do |name, plural_name|
 | |
|           install_have_children_element(name, plural_name)
 | |
|         end
 | |
|         
 | |
|         [
 | |
|           ["title", '?'],
 | |
|           ["link", '?'],
 | |
|           ["description", '?'],
 | |
|           ["category", '*'],
 | |
|           ["source", '?'],
 | |
|           ["enclosure", '?'],
 | |
|         ].each do |tag, occurs|
 | |
|           install_model(tag, occurs)
 | |
|         end
 | |
| 
 | |
|         def to_s(need_convert=true, indent=calc_indent)
 | |
|           rv = tag(indent) do |next_indent|
 | |
|             [
 | |
|               title_element(false, next_indent),
 | |
|               link_element(false, next_indent),
 | |
|               description_element(false, next_indent),
 | |
|               category_elements(false, next_indent),
 | |
|               source_element(false, next_indent),
 | |
|               enclosure_element(false, next_indent),
 | |
|               other_element(false, next_indent),
 | |
|             ]
 | |
|           end
 | |
|           rv = convert(rv) if need_convert
 | |
|           rv
 | |
|         end
 | |
| 
 | |
|         private
 | |
|         def children
 | |
|           [@source, @enclosure, *@category].compact
 | |
|         end
 | |
| 
 | |
|         def _tags
 | |
|           rv = %w(title link description author comments
 | |
|             source enclosure).delete_if do |name|
 | |
|             send(name).nil?
 | |
|           end.collect do |name|
 | |
|             [nil, name]
 | |
|           end
 | |
| 
 | |
|           @category.each do
 | |
|             rv << [nil, "category"]
 | |
|           end
 | |
|           
 | |
|           rv
 | |
|         end
 | |
| 
 | |
|         def maker_target(maker)
 | |
|           maker.items.new_item
 | |
|         end
 | |
| 
 | |
|         def setup_maker_element(item)
 | |
|           super
 | |
|           @enclosure.setup_maker(item) if @enclosure
 | |
|           @source.setup_maker(item) if @source
 | |
|         end
 | |
|         
 | |
|         class Source < Element
 | |
| 
 | |
|           include RSS09
 | |
| 
 | |
|           [
 | |
|             ["url", nil, true]
 | |
|           ].each do |name, uri, required|
 | |
|             install_get_attribute(name, uri, required)
 | |
|           end
 | |
|           
 | |
|           content_setup
 | |
| 
 | |
|           def initialize(url=nil, content=nil)
 | |
|             super()
 | |
|             @url = url
 | |
|             @content = content
 | |
|           end
 | |
| 
 | |
|           private
 | |
|           def _tags
 | |
|             []
 | |
|           end
 | |
| 
 | |
|           def _attrs
 | |
|             [
 | |
|               ["url", true]
 | |
|             ]
 | |
|           end
 | |
| 
 | |
| 
 | |
|           def maker_target(item)
 | |
|             item.source
 | |
|           end
 | |
| 
 | |
|           def setup_maker_attributes(source)
 | |
|             source.url = url
 | |
|             source.content = content
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         class Enclosure < Element
 | |
| 
 | |
|           include RSS09
 | |
| 
 | |
|           [
 | |
|             ["url", nil, true],
 | |
|             ["length", nil, true],
 | |
|             ["type", nil, true],
 | |
|           ].each do |name, uri, required|
 | |
|             install_get_attribute(name, uri, required)
 | |
|           end
 | |
| 
 | |
|           def initialize(url=nil, length=nil, type=nil)
 | |
|             super()
 | |
|             @url = url
 | |
|             @length = length
 | |
|             @type = type
 | |
|           end
 | |
| 
 | |
|           def to_s(need_convert=true, indent=calc_indent)
 | |
|             rv = tag(indent)
 | |
|             rv = convert(rv) if need_convert
 | |
|             rv
 | |
|           end
 | |
| 
 | |
|           private
 | |
|           def _attrs
 | |
|             [
 | |
|               ["url", true],
 | |
|               ["length", true],
 | |
|               ["type", true],
 | |
|             ]
 | |
|           end
 | |
| 
 | |
|           def maker_target(item)
 | |
|             item.enclosure
 | |
|           end
 | |
| 
 | |
|           def setup_maker_attributes(enclosure)
 | |
|             enclosure.url = url
 | |
|             enclosure.length = length
 | |
|             enclosure.type = type
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         class Category < Element
 | |
| 
 | |
|           include RSS09
 | |
|           
 | |
|           [
 | |
|             ["domain", nil, false]
 | |
|           ].each do |name, uri, required|
 | |
|             install_get_attribute(name, uri, required)
 | |
|           end
 | |
| 
 | |
|           content_setup
 | |
| 
 | |
|           def initialize(domain=nil, content=nil)
 | |
|             super()
 | |
|             @domain = domain
 | |
|             @content = content
 | |
|           end
 | |
| 
 | |
|           private
 | |
|           def _attrs
 | |
|             [
 | |
|               ["domain", false]
 | |
|             ]
 | |
|           end
 | |
| 
 | |
|           def maker_target(item)
 | |
|             item.new_category
 | |
|           end
 | |
| 
 | |
|           def setup_maker_attributes(category)
 | |
|             category.domain = domain
 | |
|             category.content = content
 | |
|           end
 | |
|           
 | |
|         end
 | |
| 
 | |
|       end
 | |
|       
 | |
|       class TextInput < Element
 | |
| 
 | |
|         include RSS09
 | |
| 
 | |
|         %w(title description name link).each do |name|
 | |
|           install_text_element(name)
 | |
|           install_model(name, nil)
 | |
|         end
 | |
| 
 | |
|         def to_s(need_convert=true, indent=calc_indent)
 | |
|           rv = tag(indent) do |next_indent|
 | |
|             [
 | |
|               title_element(false, next_indent),
 | |
|               description_element(false, next_indent),
 | |
|               name_element(false, next_indent),
 | |
|               link_element(false, next_indent),
 | |
|               other_element(false, next_indent),
 | |
|             ]
 | |
|           end
 | |
|           rv = convert(rv) if need_convert
 | |
|           rv
 | |
|         end
 | |
| 
 | |
|         private
 | |
|         def _tags
 | |
|           %w(title description name link).each do |name|
 | |
|             send(name).nil?
 | |
|           end.collect do |elem|
 | |
|             [nil, elem]
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         def maker_target(maker)
 | |
|           maker.textinput
 | |
|         end
 | |
|       end
 | |
|       
 | |
|     end
 | |
|     
 | |
|   end
 | |
| 
 | |
|   RSS09::ELEMENTS.each do |name|
 | |
|     BaseListener.install_get_text_element(nil, name, "#{name}=")
 | |
|   end
 | |
| 
 | |
|   module ListenerMixin
 | |
|     private
 | |
|     def start_rss(tag_name, prefix, attrs, ns)
 | |
|       check_ns(tag_name, prefix, ns, nil)
 | |
|       
 | |
|       @rss = Rss.new(attrs['version'], @version, @encoding, @standalone)
 | |
|       @rss.do_validate = @do_validate
 | |
|       @rss.xml_stylesheets = @xml_stylesheets
 | |
|       @last_element = @rss
 | |
|       @proc_stack.push Proc.new { |text, tags|
 | |
|         @rss.validate_for_stream(tags) if @do_validate
 | |
|       }
 | |
|     end
 | |
|     
 | |
|   end
 | |
| 
 | |
| end
 |