Class: SourceMonitor::Scraping::ItemScraper

Inherits:
Object
  • Object
show all
Defined in:
lib/source_monitor/scraping/item_scraper.rb,
lib/source_monitor/scraping/item_scraper/persistence.rb,
lib/source_monitor/scraping/item_scraper/adapter_resolver.rb

Overview

Orchestrates execution of the configured scraper adapter for an item, updating the item record and recording a ScrapeLog entry detailing the outcome. The service is intentionally small so future adapters or scheduling mechanisms can reuse it for both manual and automated flows.

Defined Under Namespace

Classes: AdapterResolver, Persistence, Result

Constant Summary collapse

UnknownAdapterError =
Class.new(StandardError)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(item:, source: nil, adapter_name: nil, settings: nil, http: SourceMonitor::HTTP) ⇒ ItemScraper

Returns a new instance of ItemScraper.



27
28
29
30
31
32
33
34
35
# File 'lib/source_monitor/scraping/item_scraper.rb', line 27

def initialize(item:, source: nil, adapter_name: nil, settings: nil, http: SourceMonitor::HTTP)
  @item = item
  @source = source || item&.source
  @adapter_name = (adapter_name || @source&.scraper_adapter).to_s
  @settings = settings
  @http = http
  @adapter_resolver = SourceMonitor::Scraping::ItemScraper::AdapterResolver.new(name: @adapter_name, source: @source)
  @persistence = SourceMonitor::Scraping::ItemScraper::Persistence.new(item: @item, source: @source, adapter_name: @adapter_name)
end

Instance Attribute Details

#adapter_nameObject (readonly)

Returns the value of attribute adapter_name.



25
26
27
# File 'lib/source_monitor/scraping/item_scraper.rb', line 25

def adapter_name
  @adapter_name
end

#adapter_resolverObject (readonly)

Returns the value of attribute adapter_resolver.



25
26
27
# File 'lib/source_monitor/scraping/item_scraper.rb', line 25

def adapter_resolver
  @adapter_resolver
end

#httpObject (readonly)

Returns the value of attribute http.



25
26
27
# File 'lib/source_monitor/scraping/item_scraper.rb', line 25

def http
  @http
end

#itemObject (readonly)

Returns the value of attribute item.



25
26
27
# File 'lib/source_monitor/scraping/item_scraper.rb', line 25

def item
  @item
end

#persistenceObject (readonly)

Returns the value of attribute persistence.



25
26
27
# File 'lib/source_monitor/scraping/item_scraper.rb', line 25

def persistence
  @persistence
end

#settingsObject (readonly)

Returns the value of attribute settings.



25
26
27
# File 'lib/source_monitor/scraping/item_scraper.rb', line 25

def settings
  @settings
end

#sourceObject (readonly)

Returns the value of attribute source.



25
26
27
# File 'lib/source_monitor/scraping/item_scraper.rb', line 25

def source
  @source
end

Instance Method Details

#callObject



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/source_monitor/scraping/item_scraper.rb', line 37

def call
  started_at = Time.current
  log("scraper:start", started_at:, item:, source:)
  raise ArgumentError, "Item does not belong to a source" unless source
  adapter = adapter_resolver.resolve!
  adapter_result = adapter.call(item:, source:, settings:, http:)

  result = persistence.persist_success(adapter_result:, started_at:)
  finalize_result(result)
rescue UnknownAdapterError => error
  log("scraper:unknown_adapter", error: error.message)
  result = persistence.persist_failure(error:, started_at:, message_override: error.message)
  finalize_result(result)
rescue StandardError => error
  log("scraper:exception", error: error.message)
  result = persistence.persist_failure(error:, started_at:)
  finalize_result(result)
end