lib/feedjira/feed.rb in feedjira-2.0.0 vs lib/feedjira/feed.rb in feedjira-2.1.0

- old
+ new

@@ -3,30 +3,29 @@ def self.parse_with(parser, xml, &block) parser.parse xml, &block end def self.parse(xml, &block) - if parser = determine_feed_parser_for_xml(xml) - parse_with parser, xml, &block - else - raise NoParserAvailable.new("No valid parser for XML.") - end + parser = determine_feed_parser_for_xml(xml) + raise NoParserAvailable, 'No valid parser for XML.' unless parser + parse_with parser, xml, &block end def self.determine_feed_parser_for_xml(xml) start_of_doc = xml.slice(0, 2000) - feed_classes.detect {|klass| klass.able_to_parse?(start_of_doc)} + feed_classes.detect { |klass| klass.able_to_parse?(start_of_doc) } end def self.add_feed_class(klass) feed_classes.unshift klass end def self.feed_classes @feed_classes ||= [ Feedjira::Parser::RSSFeedBurner, Feedjira::Parser::GoogleDocsAtom, + Feedjira::Parser::AtomYoutube, Feedjira::Parser::AtomFeedBurner, Feedjira::Parser::Atom, Feedjira::Parser::ITunesRSS, Feedjira::Parser::RSS ] @@ -51,36 +50,46 @@ def self.add_common_feed_entry_elements(element_tag, options = {}) call_on_each_feed_entry :elements, element_tag, options end def self.call_on_each_feed_entry(method, *parameters) - feed_classes.each do |k| - k.sax_config.collection_elements.each_value do |vl| - vl.find_all{|v| (v.accessor == 'entries') && (v.data_class.class == Class)}.each do |v| - v.data_class.send(method, *parameters) + feed_classes.each do |klass| + klass.sax_config.collection_elements.each_value do |value| + collection_configs = value.select do |v| + v.accessor == 'entries' && v.data_class.class == Class end + + collection_configs.each do |config| + config.data_class.send(method, *parameters) + end end end end def self.fetch_and_parse(url) response = connection(url).get - raise FetchFailure.new("Fetch failed - #{response.status}") unless response.success? - xml = response.body - parser_klass = determine_feed_parser_for_xml xml - raise NoParserAvailable.new("No valid parser for XML.") unless parser_klass - - feed = parse_with parser_klass, xml + unless response.success? + raise FetchFailure, "Fetch failed - #{response.status}" + end + feed = parse response.body feed.feed_url = url - feed.etag = response.headers['etag'].to_s.gsub(/"/, '') - feed.last_modified = response.headers['last-modified'] + feed.etag = response.headers['etag'].to_s.delete '"' + + feed.last_modified = parse_last_modified(response) feed end def self.connection(url) Faraday.new(url: url) do |conn| conn.use FaradayMiddleware::FollowRedirects, limit: 3 conn.adapter :net_http end end + + def self.parse_last_modified(response) + DateTime.parse(response.headers['last-modified']).to_time + rescue + nil + end + private_class_method :parse_last_modified end end