class Planet::Parsers
Parsers
class - manager for the feed parsers
parser classes inherit from Planet::Parsers::BaseParser
and are added automatically to the list of available parsers. files located on planet/parsers are automatically loaded.
Public Class Methods
add_parser(parser)
click to toggle source
# File lib/planet/parsers.rb, line 14 def self.add_parser(parser) @@parsers << parser end
new()
click to toggle source
Parser instances keep indexes of the available parsers and check for duplicate definitions (need to use an instance because inherited gets called as soon as the class is seen but before it is fully defined).
# File lib/planet/parsers.rb, line 22 def initialize @types, @domains = {}, {} @@parsers.each do |parser| new_type, new_domains = parser.type, parser.domains fail("duplicate type") if new_type and @types.has_key? new_type fail("overlapping domains") unless (@domains.keys & new_domains).empty? @types[new_type] = parser if new_type new_domains.each do |new_domain| @domains[new_domain] = parser end end end
Public Instance Methods
get_parser(type)
click to toggle source
returns the appropiate parser based on the type
# File lib/planet/parsers.rb, line 39 def get_parser(type) begin return @types.fetch(type) rescue KeyError => e raise(ArgumentError, "No parser for type '#{ type }'", caller) end end
get_parser_for(feed)
click to toggle source
returns any parser that can handle this feeds’ domain, defaults to Feedjira if none available.
# File lib/planet/parsers.rb, line 49 def get_parser_for(feed) feed_domain = URI(feed).host @domains.each do |domain, parser| return parser if feed_domain.end_with? domain end return Feedjira::Feed # default generic parser end