dwf 0.1.10 → 0.1.11
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 +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +67 -0
- data/README.md +117 -33
- data/dwf.gemspec +4 -2
- data/lib/dwf/callback.rb +13 -10
- data/lib/dwf/client.rb +50 -9
- data/lib/dwf/concerns/checkable.rb +29 -0
- data/lib/dwf/errors.rb +3 -1
- data/lib/dwf/item.rb +41 -33
- data/lib/dwf/utils.rb +6 -0
- data/lib/dwf/version.rb +1 -1
- data/lib/dwf/workflow.rb +119 -24
- data/spec/dwf/client_spec.rb +77 -3
- data/spec/dwf/item_spec.rb +49 -10
- data/spec/dwf/utils_spec.rb +9 -0
- data/spec/dwf/workflow_spec.rb +178 -13
- data/spec/spec_helper.rb +3 -0
- metadata +27 -12
data/spec/dwf/workflow_spec.rb
CHANGED
@@ -2,22 +2,23 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
require 'mock_redis'
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
class CItem < Dwf::Item; end
|
5
|
+
AItem = Class.new(Dwf::Item)
|
6
|
+
BItem = Class.new(Dwf::Item)
|
7
|
+
CItem = Class.new(Dwf::Item)
|
8
|
+
SWorkflow = Class.new(Dwf::Workflow)
|
10
9
|
|
11
10
|
describe Dwf::Workflow, workflow: true do
|
12
11
|
let(:workflow_id) { SecureRandom.uuid }
|
13
12
|
let(:item_id) { SecureRandom.uuid }
|
13
|
+
let(:item) { nil }
|
14
14
|
let(:client) do
|
15
15
|
double(
|
16
16
|
persist_workflow: nil,
|
17
17
|
persist_job: nil,
|
18
18
|
build_workflow_id: workflow_id,
|
19
19
|
build_job_id: item_id,
|
20
|
-
find_workflow: nil
|
20
|
+
find_workflow: nil,
|
21
|
+
find_node: item
|
21
22
|
)
|
22
23
|
end
|
23
24
|
before do
|
@@ -90,6 +91,7 @@ describe Dwf::Workflow, workflow: true do
|
|
90
91
|
|
91
92
|
before do
|
92
93
|
workflow.run AItem, after: BItem, before: CItem
|
94
|
+
workflow.run SWorkflow, after: AItem
|
93
95
|
end
|
94
96
|
|
95
97
|
it do
|
@@ -102,6 +104,10 @@ describe Dwf::Workflow, workflow: true do
|
|
102
104
|
{
|
103
105
|
from: "AItem|#{item_id}",
|
104
106
|
to: CItem.to_s
|
107
|
+
},
|
108
|
+
{
|
109
|
+
from: AItem.to_s,
|
110
|
+
to: "SWorkflow|#{workflow_id}"
|
105
111
|
}
|
106
112
|
]
|
107
113
|
expect(workflow.dependencies).to match_array expected
|
@@ -134,25 +140,26 @@ describe Dwf::Workflow, workflow: true do
|
|
134
140
|
before do
|
135
141
|
workflow.run AItem
|
136
142
|
workflow.run BItem, after: AItem
|
137
|
-
workflow.run
|
143
|
+
workflow.run SWorkflow, after: BItem
|
144
|
+
workflow.run CItem, after: SWorkflow
|
138
145
|
|
139
146
|
workflow.send(:setup)
|
140
147
|
end
|
141
148
|
|
142
149
|
it do
|
143
|
-
job_a = workflow.find_job(
|
150
|
+
job_a = workflow.find_job("AItem")
|
144
151
|
|
145
152
|
expect(job_a.incoming).to be_empty
|
146
153
|
expect(job_a.outgoing).to eq ["BItem|#{item_id}"]
|
147
154
|
|
148
155
|
job_b = workflow.find_job('BItem')
|
149
156
|
|
150
|
-
expect(job_b.incoming).to eq [
|
151
|
-
expect(job_b.outgoing).to eq ["
|
157
|
+
expect(job_b.incoming).to eq ["AItem|#{item_id}"]
|
158
|
+
expect(job_b.outgoing).to eq ["SWorkflow|#{workflow_id}"]
|
152
159
|
|
153
160
|
job_c = workflow.find_job('CItem')
|
154
161
|
|
155
|
-
expect(job_c.incoming).to eq [
|
162
|
+
expect(job_c.incoming).to eq ["SWorkflow|#{workflow_id}"]
|
156
163
|
expect(job_c.outgoing).to be_empty
|
157
164
|
end
|
158
165
|
end
|
@@ -160,11 +167,11 @@ describe Dwf::Workflow, workflow: true do
|
|
160
167
|
describe '#callback_type' do
|
161
168
|
let!(:workflow) { described_class.new }
|
162
169
|
|
163
|
-
it
|
170
|
+
it do
|
164
171
|
expect(workflow.callback_type).to eq described_class::BUILD_IN
|
165
172
|
workflow.callback_type = described_class::SK_BATCH
|
166
173
|
expect(workflow.callback_type).to eq described_class::SK_BATCH
|
167
|
-
|
174
|
+
end
|
168
175
|
end
|
169
176
|
|
170
177
|
describe '#reload' do
|
@@ -181,4 +188,162 @@ describe Dwf::Workflow, workflow: true do
|
|
181
188
|
|
182
189
|
it { expect(client).to have_received(:find_workflow).with(workflow_id) }
|
183
190
|
end
|
191
|
+
|
192
|
+
describe '#parents_succeeded?' do
|
193
|
+
let(:incoming) { ["A|#{SecureRandom.uuid}"] }
|
194
|
+
let!(:workflow) do
|
195
|
+
flow = described_class.new
|
196
|
+
flow.parent_id = SecureRandom.uuid
|
197
|
+
flow.incoming = incoming
|
198
|
+
flow
|
199
|
+
end
|
200
|
+
let(:item) do
|
201
|
+
Dwf::Item.new(
|
202
|
+
workflow_id: SecureRandom.uuid,
|
203
|
+
id: SecureRandom.uuid,
|
204
|
+
finished_at: finished_at
|
205
|
+
)
|
206
|
+
end
|
207
|
+
|
208
|
+
context 'parent jobs already finished' do
|
209
|
+
let(:finished_at) { Time.now.to_i }
|
210
|
+
|
211
|
+
it do
|
212
|
+
expect(workflow.parents_succeeded?).to be_truthy
|
213
|
+
expect(client).to have_received(:find_node)
|
214
|
+
.with(incoming.first, workflow.parent_id)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
context 'parent jobs havent finished yet' do
|
219
|
+
let(:finished_at) { nil }
|
220
|
+
|
221
|
+
it do
|
222
|
+
expect(workflow.parents_succeeded?).to be_falsy
|
223
|
+
expect(client)
|
224
|
+
.to have_received(:find_node)
|
225
|
+
.with(incoming.first, workflow.parent_id)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
describe '#sub_workflow?' do
|
231
|
+
let!(:workflow) { described_class.new }
|
232
|
+
let!(:sub_workflow) do
|
233
|
+
flow = described_class.new
|
234
|
+
flow.parent_id = workflow.id
|
235
|
+
flow
|
236
|
+
end
|
237
|
+
|
238
|
+
specify do
|
239
|
+
expect(workflow.sub_workflow?).to be_falsy
|
240
|
+
expect(sub_workflow.sub_workflow?).to be_truthy
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
describe '#payloads' do
|
245
|
+
let!(:item) do
|
246
|
+
Dwf::Item.new(
|
247
|
+
workflow_id: SecureRandom.uuid,
|
248
|
+
id: SecureRandom.uuid,
|
249
|
+
output_payload: 1
|
250
|
+
)
|
251
|
+
end
|
252
|
+
let(:workflow) { described_class.new }
|
253
|
+
|
254
|
+
context 'when workflow is main flow' do
|
255
|
+
it { expect(workflow.payloads).to be_nil }
|
256
|
+
end
|
257
|
+
|
258
|
+
context 'when workflow is sub flow' do
|
259
|
+
before do
|
260
|
+
workflow.incoming = incoming
|
261
|
+
workflow.parent_id = SecureRandom.uuid
|
262
|
+
end
|
263
|
+
|
264
|
+
context 'when incoming blank' do
|
265
|
+
let(:incoming) { [] }
|
266
|
+
it { expect(workflow.payloads).to be_nil }
|
267
|
+
end
|
268
|
+
|
269
|
+
context 'when incoming present' do
|
270
|
+
let(:incoming) { ["Dwf::Item|#{SecureRandom.uuid}", "Dwf::Workflow|#{workflow_id}"] }
|
271
|
+
it do
|
272
|
+
expected_payload = [
|
273
|
+
{
|
274
|
+
class: item.class.name,
|
275
|
+
id: item.name,
|
276
|
+
output: 1
|
277
|
+
}
|
278
|
+
]
|
279
|
+
expect(workflow.payloads).to eq expected_payload
|
280
|
+
expect(client).to have_received(:find_node).with(incoming.first, workflow.parent_id)
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
describe '#left?' do
|
287
|
+
let(:workflow) { described_class.new }
|
288
|
+
before { workflow.outgoing = outgoing }
|
289
|
+
|
290
|
+
context 'when item has outgoing item' do
|
291
|
+
let(:outgoing) { ["Dwf::Item|#{SecureRandom.uuid}"] }
|
292
|
+
it { expect(workflow.leaf?).to be_falsy }
|
293
|
+
end
|
294
|
+
|
295
|
+
context 'when item does not have outgoing item' do
|
296
|
+
let(:outgoing) { [] }
|
297
|
+
it { expect(workflow.leaf?).to be_truthy }
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
describe '#leaf_nodes' do
|
302
|
+
let!(:workflow) { described_class.new }
|
303
|
+
before do
|
304
|
+
workflow.run AItem
|
305
|
+
workflow.run BItem, after: AItem
|
306
|
+
workflow.run SWorkflow, after: BItem
|
307
|
+
workflow.run CItem, after: SWorkflow
|
308
|
+
|
309
|
+
workflow.send(:setup)
|
310
|
+
end
|
311
|
+
|
312
|
+
specify do
|
313
|
+
expect(workflow.leaf_nodes.count).to eq 1
|
314
|
+
expect(workflow.leaf_nodes.first).to be_kind_of CItem
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
describe '#output_payloads' do
|
319
|
+
let!(:workflow) { described_class.new }
|
320
|
+
before do
|
321
|
+
allow_any_instance_of(CItem).to receive(:output_payload).and_return 1
|
322
|
+
workflow.run AItem
|
323
|
+
workflow.run BItem, after: AItem
|
324
|
+
workflow.run SWorkflow, after: BItem
|
325
|
+
workflow.run CItem, after: SWorkflow
|
326
|
+
|
327
|
+
workflow.send(:setup)
|
328
|
+
end
|
329
|
+
|
330
|
+
it { expect(workflow.output_payload).to eq [1] }
|
331
|
+
end
|
332
|
+
|
333
|
+
describe '#callback_type=' do
|
334
|
+
let!(:workflow) { described_class.new }
|
335
|
+
before do
|
336
|
+
workflow.run AItem
|
337
|
+
workflow.run BItem, after: AItem
|
338
|
+
|
339
|
+
workflow.send(:setup)
|
340
|
+
workflow.callback_type = described_class::SK_BATCH
|
341
|
+
end
|
342
|
+
|
343
|
+
specify do
|
344
|
+
expect(workflow.callback_type).to eq described_class::SK_BATCH
|
345
|
+
job_callback_types = workflow.jobs.map(&:callback_type).uniq
|
346
|
+
expect(job_callback_types).to eq [described_class::SK_BATCH]
|
347
|
+
end
|
348
|
+
end
|
184
349
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
require 'dwf'
|
2
|
+
require 'simplecov'
|
3
|
+
|
4
|
+
SimpleCov.start
|
2
5
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
3
6
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
4
7
|
# The generated `.rspec` file contains `--require spec_helper` which will cause
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dwf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dthtien
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 11.1.3
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mock_redis
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.27.2
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.27.2
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: redis
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,33 +67,33 @@ dependencies:
|
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '3.2'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: sidekiq
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
62
|
-
type: :
|
75
|
+
version: 6.2.0
|
76
|
+
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
80
|
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
82
|
+
version: 6.2.0
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: simplecov
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- - "
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
76
|
-
type: :
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- - "
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
96
|
+
version: '0'
|
83
97
|
description: Workflow
|
84
98
|
email:
|
85
99
|
- tiendt2311@gmail.com
|
@@ -100,6 +114,7 @@ files:
|
|
100
114
|
- lib/dwf.rb
|
101
115
|
- lib/dwf/callback.rb
|
102
116
|
- lib/dwf/client.rb
|
117
|
+
- lib/dwf/concerns/checkable.rb
|
103
118
|
- lib/dwf/configuration.rb
|
104
119
|
- lib/dwf/errors.rb
|
105
120
|
- lib/dwf/item.rb
|