Module: Html2rss::AutoSource::Scraper::JsonState::ValueFinder

Defined in:
lib/html2rss/auto_source/scraper/json_state/value_finder.rb

Overview

Retrieves values from heterogeneous objects by probing multiple keys.

Class Method Summary collapse

Class Method Details

.fetch(object, keys) ⇒ Object?

Returns first matching value.

Parameters:

  • object (Hash, Array)

    candidate container traversed during key lookup

  • keys (Array<Symbol>)

    keys to probe in order

Returns:

  • (Object, nil)

    first matching value



14
15
16
17
18
19
# File 'lib/html2rss/auto_source/scraper/json_state/value_finder.rb', line 14

def fetch(object, keys)
  case object
  when Hash then fetch_from_hash(object, keys)
  when Array then fetch_from_array(object, keys)
  end
end

.fetch_from_array(array, keys) ⇒ Object?

Returns first matching value from array entries.

Parameters:

  • array (Array)

    array whose entries may contain target keys

  • keys (Array<Symbol>)

    keys to probe in order

Returns:

  • (Object, nil)

    first matching value from array entries



36
37
38
39
40
41
42
43
# File 'lib/html2rss/auto_source/scraper/json_state/value_finder.rb', line 36

def fetch_from_array(array, keys)
  array.each do |entry|
    result = fetch(entry, keys)
    return result if result
  end

  nil
end

.fetch_from_hash(hash, keys) ⇒ Object?

Returns first matching value from hash or nested metadata.

Parameters:

  • hash (Hash)

    hash candidate traversed during key lookup

  • keys (Array<Symbol>)

    keys to probe in order

Returns:

  • (Object, nil)

    first matching value from hash or nested metadata



24
25
26
27
28
29
30
31
# File 'lib/html2rss/auto_source/scraper/json_state/value_finder.rb', line 24

def fetch_from_hash(hash, keys)
  keys.each do |key|
    return hash[key] if hash.key?(key)
  end

  fetch_nested(hash[:attributes], keys) ||
    fetch_nested(hash[:data], keys)
end

.fetch_nested(value, keys) ⇒ Object?

Returns matching nested value.

Parameters:

  • value (Hash, Array, nil)

    nested value to recurse into

  • keys (Array<Symbol>)

    keys to probe in order

Returns:

  • (Object, nil)

    matching nested value



48
49
50
# File 'lib/html2rss/auto_source/scraper/json_state/value_finder.rb', line 48

def fetch_nested(value, keys)
  fetch(value, keys) if value
end