ductwork 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec9b8299086fb8f1f51c449000ba0c4b4fb7db17f4712525d8216db7c8f082ea
4
- data.tar.gz: 997008b013d1a752e28237a7b6f0dab563a3e8beda7e6a2799f54013f89be661
3
+ metadata.gz: a3a59fb73965f325d3e23243f59e7e973419f3683d2de741cf5bbf115bccad8d
4
+ data.tar.gz: d66a5c291d197b7a8e679d23e9c68b6575d2e35100b06f7c412c97e5bc515ec3
5
5
  SHA512:
6
- metadata.gz: c0687a091dd17926ea4cff0443d9b4cb593a448a26ca6e8f86a2ea629ff4c776e087bab52972d868a22dc5316bba4631123458e7a8202fceb3661c28f5d133cb
7
- data.tar.gz: f5770989f81963fcedc318a11c038e81e4d4a5a211c22b428dccc6b60713da883d31dac2fe4994b3a122dab8fa75738ec766f48a50c31ea6a72c36530de5f8e0
6
+ metadata.gz: de5ca4b1c9dff4478992234183ae84d810cec930eede8d97dc7511959efad9521acb201ec5f39a2d96d430383ee3f240d3a3395bc55fc19ce272603000eb92a2
7
+ data.tar.gz: b86ea8a91f912ae55e509f2c059fc8db8d4ccff0055fe96db77593a98ce188255b2bbcb395709a0b672ded6b8df1a1537001fc56cfb3de7244a5dda9a4e48192
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Ductwork Changelog
2
2
 
3
+ ## [0.7.2]
4
+
5
+ - chore: small DRY refactor in pipeline advancement
6
+
7
+ ## [0.7.1]
8
+
9
+ - chore: isolate on halt execution in `Ductwork::Job#execution_failed!`
10
+ - chore: add pipeline definition metadata to `DefinitionBuilder` initializer
11
+
3
12
  ## [0.7.0]
4
13
 
5
14
  - feat: set `Pipeline` and `Step` models status to "in-progress" when claiming latest job
@@ -9,6 +9,7 @@ module Ductwork
9
9
 
10
10
  def initialize
11
11
  @definition = {
12
+ metadata: {},
12
13
  nodes: [],
13
14
  edges: {},
14
15
  }
@@ -102,9 +103,7 @@ module Ductwork
102
103
  def on_halt(klass)
103
104
  validate_classes!(klass)
104
105
 
105
- definition[:metadata] ||= {}
106
- definition[:metadata][:on_halt] = {}
107
- definition[:metadata][:on_halt][:klass] = klass.name
106
+ definition[:metadata][:on_halt] = { klass: klass.name }
108
107
 
109
108
  self
110
109
  end
@@ -195,11 +195,17 @@ module Ductwork
195
195
  # NOTE: perform lifecycle hook execution outside of the transaction as
196
196
  # to not unnecessarily hold it open
197
197
  if halted
198
- klass = JSON.parse(pipeline.definition).dig("metadata", "on_halt", "klass")
198
+ execute_on_halt(pipeline, error)
199
+ end
200
+ end
199
201
 
200
- if klass.present?
201
- Object.const_get(klass).new(error).execute
202
- end
202
+ def execute_on_halt(pipeline, error)
203
+ klass = JSON
204
+ .parse(pipeline.definition)
205
+ .dig("metadata", "on_halt", "klass")
206
+
207
+ if klass.present?
208
+ Object.const_get(klass).new(error).execute
203
209
  end
204
210
  end
205
211
  end
@@ -113,9 +113,14 @@ module Ductwork
113
113
 
114
114
  private
115
115
 
116
- def create_step_and_enqueue_job(klass:, step_type:, input_arg:)
116
+ def create_step_and_enqueue_job(edge:, input_arg:, klass: nil)
117
117
  status = :in_progress
118
118
  started_at = Time.current
119
+ # NOTE: "chain" is used by ActiveRecord so we have to call
120
+ # this enum value "default" :sad:
121
+ step_type = edge[:type] == "chain" ? "default" : edge[:type]
122
+ klass ||= edge.fetch(:to).sole
123
+
119
124
  next_step = steps.create!(klass:, status:, step_type:, started_at:)
120
125
  Ductwork::Job.enqueue(next_step, input_arg)
121
126
  end
@@ -157,11 +162,8 @@ module Ductwork
157
162
  else
158
163
  edges.each do |step_klass, step_edges|
159
164
  edge = step_edges[-1]
160
- # NOTE: "chain" is used by ActiveRecord so we have to call
161
- # this enum value "default" :sad:
162
- step_type = edge[:type] == "chain" ? "default" : edge[:type]
163
165
 
164
- if step_type == "collapse"
166
+ if edge[:type] == "collapse"
165
167
  conditionally_collapse_next_steps(step_klass, edge, advancing_ids)
166
168
  else
167
169
  advance_non_merging_steps(step_klass, edge, advancing_ids)
@@ -172,15 +174,13 @@ module Ductwork
172
174
  end
173
175
 
174
176
  def advance_non_merging_steps(step_klass, edge, advancing_ids)
175
- # NOTE: "chain" is used by ActiveRecord so we have to call
176
- # this enum value "default" :sad:
177
- step_type = edge[:type] == "chain" ? "default" : edge[:type]
177
+ step_type = edge[:type]
178
178
 
179
179
  steps.where(id: advancing_ids, klass: step_klass).find_each do |step|
180
- if step_type.in?(%w[default divide])
181
- advance_to_next_steps(step_type, step.id, edge)
180
+ if step_type.in?(%w[chain divide])
181
+ advance_to_next_steps(step.id, edge)
182
182
  elsif step_type == "expand"
183
- expand_to_next_steps(step_type, step.id, edge)
183
+ expand_to_next_steps(step.id, edge)
184
184
  else
185
185
  Ductwork.logger.error(
186
186
  msg: "Invalid step type",
@@ -192,7 +192,7 @@ module Ductwork
192
192
  end
193
193
  end
194
194
 
195
- def advance_to_next_steps(step_type, step_id, edge)
195
+ def advance_to_next_steps(step_id, edge)
196
196
  too_many = edge[:to].tally.any? do |to_klass, count|
197
197
  depth = Ductwork
198
198
  .configuration
@@ -204,15 +204,9 @@ module Ductwork
204
204
  if too_many
205
205
  halted!
206
206
  else
207
- edge[:to].each do |to_klass|
208
- next_step = steps.create!(
209
- klass: to_klass,
210
- status: :in_progress,
211
- step_type: step_type,
212
- started_at: Time.current
213
- )
214
- return_value = Ductwork::Job.find_by(step_id:).return_value
215
- Ductwork::Job.enqueue(next_step, return_value)
207
+ edge[:to].each do |klass|
208
+ input_arg = Ductwork::Job.find_by(step_id:).return_value
209
+ create_step_and_enqueue_job(edge:, input_arg:, klass:)
216
210
  end
217
211
  end
218
212
  end
@@ -230,8 +224,7 @@ module Ductwork
230
224
  end
231
225
 
232
226
  def combine_next_steps(edges, advancing_ids)
233
- klass = edges.values.sample.dig(-1, :to).sole
234
- step_type = "combine"
227
+ edge = edges.values.sample[-1]
235
228
  groups = steps
236
229
  .where(id: advancing_ids)
237
230
  .group(:klass)
@@ -243,11 +236,11 @@ module Ductwork
243
236
  input_arg = Ductwork::Job
244
237
  .where(step_id: group.map(&:id))
245
238
  .map(&:return_value)
246
- create_step_and_enqueue_job(klass:, step_type:, input_arg:)
239
+ create_step_and_enqueue_job(edge:, input_arg:)
247
240
  end
248
241
  end
249
242
 
250
- def expand_to_next_steps(step_type, step_id, edge)
243
+ def expand_to_next_steps(step_id, edge)
251
244
  next_klass = edge[:to].sole
252
245
  return_value = Ductwork::Job
253
246
  .find_by(step_id:)
@@ -258,18 +251,14 @@ module Ductwork
258
251
  halted!
259
252
  else
260
253
  Array(return_value).each do |input_arg|
261
- create_step_and_enqueue_job(
262
- klass: next_klass,
263
- step_type: step_type,
264
- input_arg: input_arg
265
- )
254
+ create_step_and_enqueue_job(edge:, input_arg:)
266
255
  end
267
256
  end
268
257
  end
269
258
 
270
259
  def conditionally_collapse_next_steps(step_klass, edge, advancing_ids)
271
260
  if steps.where(status: %w[pending in_progress], klass: step_klass).none?
272
- collapse_next_steps(edge[:to].sole, advancing_ids)
261
+ collapse_next_steps(edge, advancing_ids)
273
262
  else
274
263
  Ductwork.logger.debug(
275
264
  msg: "Not all expanded steps have completed; not collapsing",
@@ -279,15 +268,14 @@ module Ductwork
279
268
  end
280
269
  end
281
270
 
282
- def collapse_next_steps(klass, advancing_ids)
283
- step_type = "collapse"
271
+ def collapse_next_steps(edge, advancing_ids)
284
272
  input_arg = []
285
273
 
286
274
  Ductwork::Job.where(step_id: advancing_ids).find_each do |job|
287
275
  input_arg << job.return_value
288
276
  end
289
277
 
290
- create_step_and_enqueue_job(klass:, step_type:, input_arg:)
278
+ create_step_and_enqueue_job(edge:, input_arg:)
291
279
  end
292
280
 
293
281
  def log_pipeline_advanced(edges)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ductwork
4
- VERSION = "0.7.0"
4
+ VERSION = "0.7.2"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ductwork
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Ewing