class NewsScraper::Trainer::PresetSelector

Constants

PROVIDER_PHRASE

Public Class Methods

new(url:, payload:) click to toggle source
# File lib/news_scraper/trainer/preset_selector.rb, line 6
def initialize(url:, payload:)
  @url = url
  @payload = payload
end

Public Instance Methods

select(data_type) click to toggle source
# File lib/news_scraper/trainer/preset_selector.rb, line 11
def select(data_type)
  pattern_options = pattern_options(data_type)

  selected_option = CLI.prompt_with_options(
    "Select which preset to use for #{data_type}:",
    pattern_options.keys
  )

  if selected_option.start_with?(PROVIDER_PHRASE)
    pattern_type = pattern_options[selected_option]
    return {
      'method' => pattern_type,
      'pattern' => CLI.get_input("Provide the #{pattern_type} pattern:")
    }
  end
  return if selected_option == 'skip'

  selected_preset_code = pattern_options[selected_option]
  result = transform_results[data_type][selected_preset_code].merge(
    'variable' => [selected_preset_code, data_type].join('_')
  )
  result.delete('data')
  result
end

Private Instance Methods

pattern_options(data_type) click to toggle source
# File lib/news_scraper/trainer/preset_selector.rb, line 38
def pattern_options(data_type)
  # Add valid options from the transformed results
  options = transform_results[data_type].each_with_object({}) do |(option, details), valid_options|
    next unless details['data'] && !details['data'].empty?
    table_key = Terminal::Table.new do |t|
      t << ['method', details['method']]
      t << ['pattern', details['pattern']]
      t << ['data', details['data']]
    end
    valid_options["\n#{table_key}"] = option
  end

  # Add in options to customize the pattern
  %w(xpath css).each do |pattern_provider|
    options["#{PROVIDER_PHRASE} #{pattern_provider}"] = pattern_provider
  end

  # Add option in to skip
  options.merge('skip' => 'skip')
end
transform_results() click to toggle source
# File lib/news_scraper/trainer/preset_selector.rb, line 59
def transform_results
  @transform_results ||= Transformers::TrainerArticle.new(
    url: @url,
    payload: @payload
  ).transform
end