Class: FetchUtil::Searcher

Inherits:
Object
  • Object
show all
Defined in:
lib/fetch_util/searcher.rb,
lib/fetch_util/searcher/result_filtering.rb

Constant Summary collapse

DEFAULT_SOURCES =
%w[brave bing].freeze

Instance Method Summary collapse

Constructor Details

#initialize(transport: nil, request_log: RequestLog.new, sources: nil, limit: nil, verbose: false, timeout: SearchTransport::DEFAULT_TIMEOUT) ⇒ Searcher

Returns a new instance of Searcher.

Raises:

  • (ArgumentError)


14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/fetch_util/searcher.rb', line 14

def initialize(transport: nil, request_log: RequestLog.new, sources: nil, limit: nil, verbose: false,
               timeout: SearchTransport::DEFAULT_TIMEOUT)
  @request_log = request_log
  @sources = Array(sources || DEFAULT_SOURCES).map(&:to_s).uniq
  unknown = @sources - SearchTransport::SOURCES.keys
  raise ArgumentError, "unsupported search source: #{unknown.first}" if unknown.any?

  validate_limit!(limit)
  @limit = limit
  @verbose = verbose
  @transport = transport || SearchTransport.new(sources: @sources, timeout: timeout)
end

Instance Method Details

#search(query) ⇒ Object

Raises:

  • (ArgumentError)


27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/fetch_util/searcher.rb', line 27

def search(query)
  encoded_query = query.to_s.strip
  raise ArgumentError, "query must not be empty" if encoded_query.empty?

  @request_log.append(search_request_uri(encoded_query))
  responses = @transport.search(encoded_query)

  payload = {
    query: encoded_query,
    results: formatted_results(apply_limit(aggregate(responses)))
  }
  payload[:diagnostics] = diagnostics(responses) if @verbose
  payload
end