Class: Html2rss::Item
- Inherits:
-
Object
- Object
- Html2rss::Item
- Defined in:
- lib/html2rss/item.rb
Overview
Takes the selected Nokogiri::HTML and responds to accessor names defined in the feed config.
Instances can only be created via ‘.from_url` and each represents an internally used “RSS item”. Such an item provides dynamically defined attributes as methods.
Defined Under Namespace
Class Method Summary collapse
-
.from_url(url, config) ⇒ Array<Html2rss::Item>
Fetches items from a given URL using configuration settings.
Instance Method Summary collapse
-
#categories ⇒ Array<String>
Retrieves categories for the item based on configured category selectors.
-
#enclosure ⇒ Enclosure
Retrieves enclosure details for the item.
-
#enclosure? ⇒ true, false
Checks if the item has an enclosure based on configuration.
-
#extract(tag) ⇒ String
Selects and processes data according to the selector name.
-
#guid ⇒ String
SHA1 hashed GUID.
-
#initialize(xml, config) ⇒ Item
constructor
A new instance of Item.
-
#method_missing(method_name, *_args) ⇒ String
Dynamically extracts data based on the method name.
-
#respond_to_missing?(method_name, _include_private = false) ⇒ true, false
Checks if the object responds to a method dynamically based on the configuration.
-
#title_or_description ⇒ String?
Returns either the title or the description, preferring title if available.
-
#valid? ⇒ true, false
Checks if the item is valid accordin to RSS 2.0 spec, by ensuring it has at least a title or a description.
Constructor Details
permalink #initialize(xml, config) ⇒ Item
Returns a new instance of Item.
40 41 42 43 |
# File 'lib/html2rss/item.rb', line 40 def initialize(xml, config) @xml = xml @config = config end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
permalink #method_missing(method_name, *_args) ⇒ String
Dynamically extracts data based on the method name.
64 65 66 67 68 |
# File 'lib/html2rss/item.rb', line 64 def method_missing(method_name, *_args) return super unless respond_to_missing?(method_name) extract(method_name) end |
Class Method Details
permalink .from_url(url, config) ⇒ Array<Html2rss::Item>
Fetches items from a given URL using configuration settings.
25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/html2rss/item.rb', line 25 def self.from_url(url, config) ctx = RequestService::Context.new(url:, headers: config.headers) body = RequestService.execute(ctx, strategy: config.strategy).body body = ObjectToXmlConverter.new(JSON.parse(body)).call if config.json? Nokogiri.HTML(body) .css(config.selector_string(Config::Selectors::ITEMS_SELECTOR_NAME)) .map { |xml| new(xml, config) } .select(&:valid?) end |
Instance Method Details
permalink #categories ⇒ Array<String>
Retrieves categories for the item based on configured category selectors.
116 117 118 119 120 121 122 |
# File 'lib/html2rss/item.rb', line 116 def categories config.category_selector_names .filter_map do |method_name| category = public_send(method_name) category.strip unless category.to_s.empty? end.uniq end |
permalink #enclosure ⇒ Enclosure
Retrieves enclosure details for the item.
136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/html2rss/item.rb', line 136 def enclosure url = enclosure_url raise 'An item.enclosure requires an absolute URL' unless url&.absolute? type = config.selector_attributes_with_channel(:enclosure)[:content_type] || Html2rss::Utils.guess_content_type_from_url(url) Enclosure.new( type:, bits_length: 0, url: url.to_s ) end |
permalink #enclosure? ⇒ true, false
Checks if the item has an enclosure based on configuration.
128 129 130 |
# File 'lib/html2rss/item.rb', line 128 def enclosure? config.selector?(:enclosure) end |
permalink #extract(tag) ⇒ String
Selects and processes data according to the selector name.
75 76 77 78 79 80 81 82 |
# File 'lib/html2rss/item.rb', line 75 def extract(tag) = config.selector_attributes_with_channel(tag.to_sym) post_process( ItemExtractors.item_extractor_factory(, xml).get, .fetch(:post_process, false) ) end |
permalink #guid ⇒ String
Returns SHA1 hashed GUID.
106 107 108 109 110 |
# File 'lib/html2rss/item.rb', line 106 def guid content = config.guid_selector_names.flat_map { |method_name| public_send(method_name) }.join Digest::SHA1.hexdigest(content) end |
permalink #respond_to_missing?(method_name, _include_private = false) ⇒ true, false
Checks if the object responds to a method dynamically based on the configuration.
:reek:BooleanParameter { enabled: false }
54 55 56 |
# File 'lib/html2rss/item.rb', line 54 def respond_to_missing?(method_name, _include_private = false) config.selector?(method_name) || super end |
permalink #title_or_description ⇒ String?
Returns either the title or the description, preferring title if available.
97 98 99 100 101 |
# File 'lib/html2rss/item.rb', line 97 def title_or_description return title if config.selector?(:title) description if config.selector?(:description) end |
permalink #valid? ⇒ true, false
Checks if the item is valid accordin to RSS 2.0 spec, by ensuring it has at least a title or a description.
89 90 91 |
# File 'lib/html2rss/item.rb', line 89 def valid? title_or_description.to_s != '' end |