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