Module: SourceMonitor::Events

Defined in:
lib/source_monitor/events.rb

Defined Under Namespace

Classes: FetchCompletedEvent, ItemCreatedEvent, ItemProcessorContext, ItemScrapedEvent

Class Method Summary collapse

Class Method Details

.after_fetch_completed(source:, result:) ⇒ Object



53
54
55
56
57
58
59
60
61
62
# File 'lib/source_monitor/events.rb', line 53

def after_fetch_completed(source:, result:)
  event = FetchCompletedEvent.new(
    source: source,
    result: result,
    status: result&.status,
    occurred_at: Time.current
  )

  dispatch(:after_fetch_completed, event)
end

.after_item_created(item:, source:, entry:, result:) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/source_monitor/events.rb', line 25

def after_item_created(item:, source:, entry:, result:)
  event = ItemCreatedEvent.new(
    item: item,
    source: source,
    entry: entry,
    result: result,
    status: result&.status,
    occurred_at: Time.current
  )

  dispatch(:after_item_created, event)
end

.after_item_scraped(result) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/source_monitor/events.rb', line 38

def after_item_scraped(result)
  item = result&.item
  source = item&.source
  event = ItemScrapedEvent.new(
    item: item,
    source: source,
    result: result,
    log: result&.log,
    status: result&.status,
    occurred_at: Time.current
  )

  dispatch(:after_item_scraped, event)
end

.dispatch(event_name, event) ⇒ Object



82
83
84
85
86
87
88
# File 'lib/source_monitor/events.rb', line 82

def dispatch(event_name, event)
  SourceMonitor.config.events.callbacks_for(event_name).each do |callback|
    invoke(callback, event)
  rescue StandardError => error
    log_handler_error(event_name, callback, error)
  end
end

.invoke(callable, event) ⇒ Object



90
91
92
93
94
95
96
# File 'lib/source_monitor/events.rb', line 90

def invoke(callable, event)
  if callable.respond_to?(:arity) && callable.arity.zero?
    callable.call
  else
    callable.call(event)
  end
end

.log_handler_error(kind, handler, error) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
# File 'lib/source_monitor/events.rb', line 98

def log_handler_error(kind, handler, error)
  message = "[SourceMonitor] #{kind} handler #{handler.inspect} failed: #{error.class}: #{error.message}"

  if defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger
    Rails.logger.error(message)
  else
    warn(message)
  end
rescue StandardError
  warn(message)
end

.run_item_processors(source:, entry:, result:) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/source_monitor/events.rb', line 64

def run_item_processors(source:, entry:, result:)
  item = result&.item
  context = ItemProcessorContext.new(
    item: item,
    source: source,
    entry: entry,
    result: result,
    status: result&.status,
    occurred_at: Time.current
  )

  SourceMonitor.config.events.item_processors.each do |processor|
    invoke(processor, context)
  rescue StandardError => error
    log_handler_error(:item_processor, processor, error)
  end
end