gush 0.3.3 → 0.4
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 +1 -1
- data/Gemfile +1 -0
- data/gush.gemspec +1 -1
- data/lib/gush/client.rb +26 -52
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6742c4a3bbcd13c0045c12c8733dae7e7b2fd2a2
|
|
4
|
+
data.tar.gz: 43293c3a05639fc46e3d39b87e750358a3ed4c60
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 36263afadc504f4051a93613b27ab18f77b79b24c7e25927d11fc92322b5c42c4054fcd3d8dc2335843dc59224a1aab699a848459ce879b31920b5393d16c0f4
|
|
7
|
+
data.tar.gz: b4447f6c90b7ef427624eb6bdd3f2b1eb36a954b92f1c578dec3a446cbe7e7ea909d02957050e3779902db88e9cb4a12695bc5dc0f08432813d8925d37b7f92a
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/gush.gemspec
CHANGED
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = "gush"
|
|
7
|
-
spec.version = "0.
|
|
7
|
+
spec.version = "0.4"
|
|
8
8
|
spec.authors = ["Piotrek Okoński"]
|
|
9
9
|
spec.email = ["piotrek@okonski.org"]
|
|
10
10
|
spec.summary = "Fast and distributed workflow runner using only Sidekiq and Redis"
|
data/lib/gush/client.rb
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
module Gush
|
|
2
2
|
class Client
|
|
3
|
-
attr_reader :configuration
|
|
3
|
+
attr_reader :configuration
|
|
4
4
|
|
|
5
5
|
def initialize(config = Gush.configuration)
|
|
6
6
|
@configuration = config
|
|
7
7
|
@sidekiq = build_sidekiq
|
|
8
|
+
@redis = build_redis
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
def configure
|
|
11
12
|
yield configuration
|
|
12
13
|
@sidekiq = build_sidekiq
|
|
14
|
+
@redis = build_redis
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
def create_workflow(name)
|
|
@@ -47,11 +49,7 @@ module Gush
|
|
|
47
49
|
loop do
|
|
48
50
|
id = SecureRandom.uuid
|
|
49
51
|
job_identifier = "#{job_klass}-#{id}"
|
|
50
|
-
|
|
51
|
-
!redis.exists("gush.jobs.#{workflow_id}.#{job_identifier}")
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
break if available
|
|
52
|
+
break if !redis.exists("gush.jobs.#{workflow_id}.#{job_identifier}")
|
|
55
53
|
end
|
|
56
54
|
|
|
57
55
|
job_identifier
|
|
@@ -61,54 +59,40 @@ module Gush
|
|
|
61
59
|
id = nil
|
|
62
60
|
loop do
|
|
63
61
|
id = SecureRandom.uuid
|
|
64
|
-
|
|
65
|
-
!redis.exists("gush.workflow.#{id}")
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
break if available
|
|
62
|
+
break if !redis.exists("gush.workflow.#{id}")
|
|
69
63
|
end
|
|
70
64
|
|
|
71
65
|
id
|
|
72
66
|
end
|
|
73
67
|
|
|
74
68
|
def all_workflows
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
find_workflow(id)
|
|
79
|
-
end
|
|
69
|
+
redis.keys("gush.workflows.*").map do |key|
|
|
70
|
+
id = key.sub("gush.workflows.", "")
|
|
71
|
+
find_workflow(id)
|
|
80
72
|
end
|
|
81
73
|
end
|
|
82
74
|
|
|
83
75
|
def find_workflow(id)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
else
|
|
93
|
-
raise WorkflowNotFound.new("Workflow with given id doesn't exist")
|
|
94
|
-
end
|
|
76
|
+
data = redis.get("gush.workflows.#{id}")
|
|
77
|
+
unless data.nil?
|
|
78
|
+
hash = Gush::JSON.decode(data, symbolize_keys: true)
|
|
79
|
+
keys = redis.keys("gush.jobs.#{id}.*")
|
|
80
|
+
nodes = redis.mget(*keys).map { |json| Gush::JSON.decode(json, symbolize_keys: true) }
|
|
81
|
+
workflow_from_hash(hash, nodes)
|
|
82
|
+
else
|
|
83
|
+
raise WorkflowNotFound.new("Workflow with given id doesn't exist")
|
|
95
84
|
end
|
|
96
85
|
end
|
|
97
86
|
|
|
98
87
|
def persist_workflow(workflow)
|
|
99
|
-
|
|
100
|
-
redis.set("gush.workflows.#{workflow.id}", workflow.to_json)
|
|
101
|
-
end
|
|
102
|
-
|
|
88
|
+
redis.set("gush.workflows.#{workflow.id}", workflow.to_json)
|
|
103
89
|
workflow.jobs.each {|job| persist_job(workflow.id, job) }
|
|
104
90
|
workflow.mark_as_persisted
|
|
105
91
|
true
|
|
106
92
|
end
|
|
107
93
|
|
|
108
94
|
def persist_job(workflow_id, job)
|
|
109
|
-
|
|
110
|
-
redis.set("gush.jobs.#{workflow_id}.#{job.name}", job.to_json)
|
|
111
|
-
end
|
|
95
|
+
redis.set("gush.jobs.#{workflow_id}.#{job.name}", job.to_json)
|
|
112
96
|
end
|
|
113
97
|
|
|
114
98
|
def load_job(workflow_id, job_id)
|
|
@@ -116,16 +100,10 @@ module Gush
|
|
|
116
100
|
job_name_match = /(?<klass>\w*[^-])-(?<identifier>.*)/.match(job_id)
|
|
117
101
|
hypen = '-' if job_name_match.nil?
|
|
118
102
|
|
|
119
|
-
keys =
|
|
120
|
-
redis.keys("gush.jobs.#{workflow_id}.#{job_id}#{hypen}*")
|
|
121
|
-
end
|
|
122
|
-
|
|
103
|
+
keys = redis.keys("gush.jobs.#{workflow_id}.#{job_id}#{hypen}*")
|
|
123
104
|
return nil if keys.nil?
|
|
124
105
|
|
|
125
|
-
data =
|
|
126
|
-
redis.get(keys.first)
|
|
127
|
-
end
|
|
128
|
-
|
|
106
|
+
data = redis.get(keys.first)
|
|
129
107
|
return nil if data.nil?
|
|
130
108
|
|
|
131
109
|
data = Gush::JSON.decode(data, symbolize_keys: true)
|
|
@@ -133,16 +111,12 @@ module Gush
|
|
|
133
111
|
end
|
|
134
112
|
|
|
135
113
|
def destroy_workflow(workflow)
|
|
136
|
-
|
|
137
|
-
redis.del("gush.workflows.#{workflow.id}")
|
|
138
|
-
end
|
|
114
|
+
redis.del("gush.workflows.#{workflow.id}")
|
|
139
115
|
workflow.jobs.each {|job| destroy_job(workflow.id, job) }
|
|
140
116
|
end
|
|
141
117
|
|
|
142
118
|
def destroy_job(workflow_id, job)
|
|
143
|
-
|
|
144
|
-
redis.del("gush.jobs.#{workflow_id}.#{job.name}")
|
|
145
|
-
end
|
|
119
|
+
redis.del("gush.jobs.#{workflow_id}.#{job.name}")
|
|
146
120
|
end
|
|
147
121
|
|
|
148
122
|
def worker_report(message)
|
|
@@ -166,6 +140,8 @@ module Gush
|
|
|
166
140
|
|
|
167
141
|
private
|
|
168
142
|
|
|
143
|
+
attr_reader :sidekiq, :redis
|
|
144
|
+
|
|
169
145
|
def workflow_from_hash(hash, nodes = nil)
|
|
170
146
|
flow = hash[:klass].constantize.new *hash[:arguments]
|
|
171
147
|
flow.jobs = []
|
|
@@ -180,9 +156,7 @@ module Gush
|
|
|
180
156
|
end
|
|
181
157
|
|
|
182
158
|
def report(key, message)
|
|
183
|
-
|
|
184
|
-
redis.publish(key, Gush::JSON.encode(message))
|
|
185
|
-
end
|
|
159
|
+
redis.publish(key, Gush::JSON.encode(message))
|
|
186
160
|
end
|
|
187
161
|
|
|
188
162
|
|
|
@@ -195,7 +169,7 @@ module Gush
|
|
|
195
169
|
end
|
|
196
170
|
|
|
197
171
|
def connection_pool
|
|
198
|
-
|
|
172
|
+
ConnectionPool.new(size: configuration.concurrency, timeout: 1) { build_redis }
|
|
199
173
|
end
|
|
200
174
|
end
|
|
201
175
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gush
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: '0.4'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Piotrek Okoński
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-03-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: sidekiq
|
|
@@ -268,7 +268,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
268
268
|
version: '0'
|
|
269
269
|
requirements: []
|
|
270
270
|
rubyforge_project:
|
|
271
|
-
rubygems_version: 2.4.
|
|
271
|
+
rubygems_version: 2.4.5.1
|
|
272
272
|
signing_key:
|
|
273
273
|
specification_version: 4
|
|
274
274
|
summary: Fast and distributed workflow runner using only Sidekiq and Redis
|