35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
# File 'lib/prdigest/runner.rb', line 35
def call
mode = @date ? "explicit_date_replay" : "scheduled"
requested = []
settled = []
skipped = []
chunks = []
failed_date = nil
delivery = nil
state = nil
skip_audit = nil
if @dry_run || @date
requested = [@date || @clock.yesterday]
else
state = @state_factory.call
yesterday = @clock.yesterday
record = state.read(yesterday: yesterday)
skip_audit = record.last_skip
skipped.concat(expand_skip(skip_audit)) if skip_audit && skip_audit[:notice_pending]
schedule = Schedule.new(
yesterday: yesterday,
last_digested_date: record.last_digested_date,
max_catchup_days: @config.max_catchup_days
).call
requested = schedule.requested_days
unless schedule.skipped_days.empty?
skip_audit = merge_skip_audit(skip_audit, schedule.skipped_days)
state.write(last_digested_date: schedule.skipped_days.last, last_skip: skip_audit)
skipped |= schedule.skipped_days
end
end
telegram = nil
requested.each do |date|
failed_date = date
digest = @collector.call(date: date)
rendered = @renderer.render(digest)
if @dry_run
chunks.concat(rendered.chunks)
next
end
unless rendered.chunks.empty?
telegram ||= @telegram_factory.call
delivery = telegram.deliver(
rendered.chunks,
digest_date: date,
checkpoint_store: @delivery_checkpoint_store_factory.call,
scope: @repositories
)
end
if state
if skip_audit
skip_audit = skip_audit.merge(notice_pending: false)
end
state.write(last_digested_date: date, last_skip: skip_audit)
end
settled << date
failed_date = nil
end
Result.new(
status: @dry_run ? "dry_run" : "success",
mode: mode,
requested_days: requested,
settled_days: settled,
skipped_days: skipped,
chunks: chunks,
delivery: delivery
)
rescue StandardError => e
Result.failure(
mode: mode || (@date ? "explicit_date_replay" : "scheduled"),
error_kind: error_kind(e),
message: safe_message(e),
requested_days: requested || [],
settled_days: settled || [],
skipped_days: skipped || [],
failed_date: failed_date,
remaining_days: remaining_days(requested || [], failed_date),
chunks: chunks || [],
delivery: e.is_a?(SendError) ? e.delivery : delivery
)
end
|