dwf 0.1.7 → 0.1.8
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/CHANGELOG.md +42 -0
- data/README.md +33 -0
- data/dwf.gemspec +1 -2
- data/lib/dwf/item.rb +40 -14
- data/lib/dwf/version.rb +1 -1
- data/lib/dwf/worker.rb +1 -1
- data/spec/dwf/item_spec.rb +36 -0
- data/spec/dwf/worker_spec.rb +32 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 395f410168239441a56db548cccc50d729433bedcc9fd0d4c3ae15fea09c1019
|
4
|
+
data.tar.gz: 5a944cc497760afe6b92f38772d594d56f15837ab51495609dba24f7578af309
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0123f65c0242c905c93e0998365a43b4193432c6e5b74af4a33422e7b489424294a70c68cf4e42feb627ecc038429e0dba6dc54af80acd1dc7628c2b56ff532c
|
7
|
+
data.tar.gz: 674a7144dc944d878cfddb549254985dc0a136fd84069df184a44c8a375f6ccc47e9be3d6b445f6bfcc83af8f52ed6b23fa9687f23714e49b30e24a6bbdea1de
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,47 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
|
+
## 0.1.8
|
4
|
+
### Added
|
5
|
+
- add pinlining feature
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
class SendOutput < Dwf::Item
|
9
|
+
def perform
|
10
|
+
output('it works')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
```
|
15
|
+
|
16
|
+
`output` method used to output data from the job to add outgoing jobs
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
class ReceiveOutput < Dwf::Item
|
20
|
+
def perform
|
21
|
+
message = payloads.first[:output] # it works
|
22
|
+
end
|
23
|
+
end
|
24
|
+
```
|
25
|
+
|
26
|
+
`payloads` is an array that containing outputs from incoming jobs
|
27
|
+
|
28
|
+
```
|
29
|
+
[
|
30
|
+
{
|
31
|
+
id: "SendOutput|1849a3f9-5fce-401e-a73a-91fc1048356",
|
32
|
+
class: "SendOutput",
|
33
|
+
output: 'it works'
|
34
|
+
}
|
35
|
+
]
|
36
|
+
```
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
Dwf.config do |config|
|
40
|
+
config.opts = { url 'redis://127.0.0.1:6379' }
|
41
|
+
config.namespace = 'dwf'
|
42
|
+
end
|
43
|
+
```
|
44
|
+
|
3
45
|
## 0.1.7
|
4
46
|
### Added
|
5
47
|
- Allow to config redis and queue
|
data/README.md
CHANGED
@@ -83,6 +83,39 @@ Dwf.config do |config|
|
|
83
83
|
end
|
84
84
|
```
|
85
85
|
|
86
|
+
# Pinelining
|
87
|
+
You can pass jobs result to next nodes
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
class SendOutput < Dwf::Item
|
91
|
+
def perform
|
92
|
+
output('it works')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
```
|
97
|
+
|
98
|
+
`output` method used to output data from the job to add outgoing jobs
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
class ReceiveOutput < Dwf::Item
|
102
|
+
def perform
|
103
|
+
message = payloads.first[:output] # it works
|
104
|
+
end
|
105
|
+
end
|
106
|
+
```
|
107
|
+
|
108
|
+
`payloads` is an array that containing outputs from incoming jobs
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
[
|
112
|
+
{
|
113
|
+
id: "SendOutput|1849a3f9-5fce-401e-a73a-91fc1048356",
|
114
|
+
class: "SendOutput",
|
115
|
+
output: 'it works'
|
116
|
+
}
|
117
|
+
]
|
118
|
+
```
|
86
119
|
|
87
120
|
# Todo
|
88
121
|
- [x] Make it work
|
data/dwf.gemspec
CHANGED
@@ -3,11 +3,10 @@
|
|
3
3
|
|
4
4
|
lib = File.expand_path('../lib', __FILE__)
|
5
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
|
-
require_relative 'lib/dwf/version'
|
7
6
|
|
8
7
|
Gem::Specification.new do |spec|
|
9
8
|
spec.name = "dwf"
|
10
|
-
spec.version =
|
9
|
+
spec.version = '0.1.8'
|
11
10
|
spec.authors = ["dthtien"]
|
12
11
|
spec.email = ["tiendt2311@gmail.com"]
|
13
12
|
|
data/lib/dwf/item.rb
CHANGED
@@ -5,22 +5,11 @@ require_relative 'client'
|
|
5
5
|
module Dwf
|
6
6
|
class Item
|
7
7
|
attr_reader :workflow_id, :id, :params, :queue, :klass, :started_at,
|
8
|
-
:enqueued_at, :finished_at, :failed_at, :callback_type
|
8
|
+
:enqueued_at, :finished_at, :failed_at, :callback_type, :output_payload
|
9
9
|
attr_accessor :incoming, :outgoing
|
10
10
|
|
11
11
|
def initialize(options = {})
|
12
|
-
|
13
|
-
@id = options[:id]
|
14
|
-
@params = options[:params]
|
15
|
-
@queue = options[:queue]
|
16
|
-
@incoming = options[:incoming] || []
|
17
|
-
@outgoing = options[:outgoing] || []
|
18
|
-
@klass = options[:klass] || self.class
|
19
|
-
@failed_at = options[:failed_at]
|
20
|
-
@finished_at = options[:finished_at]
|
21
|
-
@enqueued_at = options[:enqueued_at]
|
22
|
-
@started_at = options[:started_at]
|
23
|
-
@callback_type = options[:callback_type]
|
12
|
+
assign_attributes(options)
|
24
13
|
end
|
25
14
|
|
26
15
|
def self.from_hash(hash)
|
@@ -39,6 +28,11 @@ module Dwf
|
|
39
28
|
callback_type == Dwf::Workflow::BUILD_IN
|
40
29
|
end
|
41
30
|
|
31
|
+
def reload
|
32
|
+
item = client.find_job(workflow_id, name)
|
33
|
+
assign_attributes(item.to_hash)
|
34
|
+
end
|
35
|
+
|
42
36
|
def perform_async
|
43
37
|
Dwf::Worker.set(queue: queue || client.config.namespace)
|
44
38
|
.perform_async(workflow_id, name)
|
@@ -48,6 +42,10 @@ module Dwf
|
|
48
42
|
@name ||= "#{klass}|#{id}"
|
49
43
|
end
|
50
44
|
|
45
|
+
def output(data)
|
46
|
+
@output_payload = data
|
47
|
+
end
|
48
|
+
|
51
49
|
def no_dependencies?
|
52
50
|
incoming.empty?
|
53
51
|
end
|
@@ -58,6 +56,17 @@ module Dwf
|
|
58
56
|
end
|
59
57
|
end
|
60
58
|
|
59
|
+
def payloads
|
60
|
+
incoming.map do |job_name|
|
61
|
+
job = client.find_job(workflow_id, job_name)
|
62
|
+
{
|
63
|
+
id: job.name,
|
64
|
+
class: job.klass.to_s,
|
65
|
+
output: job.output_payload
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
61
70
|
def enqueue!
|
62
71
|
@enqueued_at = current_timestamp
|
63
72
|
@started_at = nil
|
@@ -142,7 +151,8 @@ module Dwf
|
|
142
151
|
failed_at: failed_at,
|
143
152
|
params: params,
|
144
153
|
workflow_id: workflow_id,
|
145
|
-
callback_type: callback_type
|
154
|
+
callback_type: callback_type,
|
155
|
+
output_payload: output_payload
|
146
156
|
}
|
147
157
|
end
|
148
158
|
|
@@ -159,5 +169,21 @@ module Dwf
|
|
159
169
|
def client
|
160
170
|
@client ||= Dwf::Client.new
|
161
171
|
end
|
172
|
+
|
173
|
+
def assign_attributes(options)
|
174
|
+
@workflow_id = options[:workflow_id]
|
175
|
+
@id = options[:id]
|
176
|
+
@params = options[:params]
|
177
|
+
@queue = options[:queue]
|
178
|
+
@incoming = options[:incoming] || []
|
179
|
+
@outgoing = options[:outgoing] || []
|
180
|
+
@klass = options[:klass] || self.class
|
181
|
+
@failed_at = options[:failed_at]
|
182
|
+
@finished_at = options[:finished_at]
|
183
|
+
@enqueued_at = options[:enqueued_at]
|
184
|
+
@started_at = options[:started_at]
|
185
|
+
@callback_type = options[:callback_type]
|
186
|
+
@output_payload = options[:output_payload]
|
187
|
+
end
|
162
188
|
end
|
163
189
|
end
|
data/lib/dwf/version.rb
CHANGED
data/lib/dwf/worker.rb
CHANGED
data/spec/dwf/item_spec.rb
CHANGED
@@ -181,4 +181,40 @@ describe Dwf::Item, item: true do
|
|
181
181
|
it { expect(a_item).not_to have_received(:persist_and_perform_async!) }
|
182
182
|
end
|
183
183
|
end
|
184
|
+
|
185
|
+
describe '#output' do
|
186
|
+
before { item.output(1) }
|
187
|
+
|
188
|
+
it { expect(item.output_payload).to eq 1 }
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#payloads' do
|
192
|
+
let(:incoming) { ["A|#{SecureRandom.uuid}"] }
|
193
|
+
let(:client_double) { double(find_job: nil) }
|
194
|
+
let!(:a_item) do
|
195
|
+
described_class.new(
|
196
|
+
workflow_id: SecureRandom.uuid,
|
197
|
+
id: SecureRandom.uuid,
|
198
|
+
finished_at: finished_at,
|
199
|
+
output_payload: 1
|
200
|
+
)
|
201
|
+
end
|
202
|
+
|
203
|
+
before do
|
204
|
+
allow(Dwf::Client).to receive(:new).and_return client_double
|
205
|
+
allow(client_double)
|
206
|
+
.to receive(:find_job).and_return a_item
|
207
|
+
end
|
208
|
+
|
209
|
+
it do
|
210
|
+
expected_payload = [
|
211
|
+
{
|
212
|
+
class: a_item.class.name,
|
213
|
+
id: a_item.name,
|
214
|
+
output: 1
|
215
|
+
}
|
216
|
+
]
|
217
|
+
expect(item.payloads).to eq expected_payload
|
218
|
+
end
|
219
|
+
end
|
184
220
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'mock_redis'
|
5
|
+
require 'sidekiq/testing'
|
6
|
+
|
7
|
+
describe Dwf::Worker, client: true do
|
8
|
+
let(:workflow_id) { SecureRandom.uuid }
|
9
|
+
let(:id) { SecureRandom.uuid }
|
10
|
+
let(:redis) { Redis.new }
|
11
|
+
let(:worker) { described_class.perform_async(workflow_id, job.name) }
|
12
|
+
before do
|
13
|
+
redis_instance = MockRedis.new
|
14
|
+
allow(Redis).to receive(:new).and_return redis_instance
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#find_job' do
|
18
|
+
let!(:job) do
|
19
|
+
j = Dwf::Item.new(workflow_id: workflow_id, id: id)
|
20
|
+
j.persist!
|
21
|
+
j
|
22
|
+
end
|
23
|
+
|
24
|
+
before do
|
25
|
+
worker
|
26
|
+
Sidekiq::Worker.drain_all
|
27
|
+
job.reload
|
28
|
+
end
|
29
|
+
|
30
|
+
it { expect(job.finished?).to be_truthy }
|
31
|
+
end
|
32
|
+
end
|
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.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dthtien
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|
@@ -110,6 +110,7 @@ files:
|
|
110
110
|
- spec/dwf/configuration_spec.rb
|
111
111
|
- spec/dwf/item_spec.rb
|
112
112
|
- spec/dwf/utils_spec.rb
|
113
|
+
- spec/dwf/worker_spec.rb
|
113
114
|
- spec/spec_helper.rb
|
114
115
|
homepage: https://github.com/dthtien/wf
|
115
116
|
licenses:
|
@@ -140,4 +141,5 @@ test_files:
|
|
140
141
|
- spec/dwf/configuration_spec.rb
|
141
142
|
- spec/dwf/item_spec.rb
|
142
143
|
- spec/dwf/utils_spec.rb
|
144
|
+
- spec/dwf/worker_spec.rb
|
143
145
|
- spec/spec_helper.rb
|