lib/feedjira/feed.rb in feedjira-2.2.0 vs lib/feedjira/feed.rb in feedjira-3.0.0.beta1

- old
+ new

@@ -1,113 +1,43 @@ # rubocop:disable Style/Documentation # rubocop:disable Style/DocumentationMethod module Feedjira class Feed class << self - def parse_with(parser, xml, &block) - parser.parse xml, &block - end - - def parse(xml, &block) - parser = determine_feed_parser_for_xml(xml) - raise NoParserAvailable, 'No valid parser for XML.' unless parser - parse_with parser, xml, &block - end - - def determine_feed_parser_for_xml(xml) - start_of_doc = xml.slice(0, 2000) - feed_classes.detect { |klass| klass.able_to_parse?(start_of_doc) } - end - - def add_feed_class(klass) - feed_classes.unshift klass - end - - def feed_classes - @feed_classes ||= Feedjira.parsers - end - - def reset_parsers! - @feed_classes = nil - end - def add_common_feed_element(element_tag, options = {}) - feed_classes.each do |k| - k.element element_tag, options + Feedjira.parsers.each do |k| + k.element(element_tag, options) end end def add_common_feed_elements(element_tag, options = {}) - feed_classes.each do |k| - k.elements element_tag, options + Feedjira.parsers.each do |k| + k.elements(element_tag, options) end end def add_common_feed_entry_element(element_tag, options = {}) - call_on_each_feed_entry :element, element_tag, options + call_on_each_feed_entry(:element, element_tag, options) end def add_common_feed_entry_elements(element_tag, options = {}) - call_on_each_feed_entry :elements, element_tag, options + call_on_each_feed_entry(:elements, element_tag, options) end + private + def call_on_each_feed_entry(method, *parameters) - feed_classes.each do |klass| + Feedjira.parsers.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 + 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 fetch_and_parse(url) - response = connection(url).get - 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.delete '"' - - feed.last_modified = parse_last_modified(response) - feed - end - - # rubocop:disable LineLength - def connection(url) - Faraday.new(url: url, headers: headers, request: request_options) do |conn| - conn.use FaradayMiddleware::FollowRedirects, limit: Feedjira.follow_redirect_limit - conn.adapter(*Faraday.default_adapter) - end - end - # rubocop:enable LineLength - - private - - def headers - { - user_agent: Feedjira.user_agent - } - end - - def request_options - { - timeout: Feedjira.request_timeout - } - end - - def parse_last_modified(response) - lm = response.headers['last-modified'] - DateTime.parse(lm).to_time - rescue StandardError => e - Feedjira.logger.warn { "Failed to parse last modified '#{lm}'" } - Feedjira.logger.debug(e) - nil end end end end