gush 0.4 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6742c4a3bbcd13c0045c12c8733dae7e7b2fd2a2
4
- data.tar.gz: 43293c3a05639fc46e3d39b87e750358a3ed4c60
3
+ metadata.gz: d6bc6665af4376d837c94695ebcd5d2076abd0a5
4
+ data.tar.gz: 2aaf48dc13f289a1a61d3d1afbd231dcc511cb16
5
5
  SHA512:
6
- metadata.gz: 36263afadc504f4051a93613b27ab18f77b79b24c7e25927d11fc92322b5c42c4054fcd3d8dc2335843dc59224a1aab699a848459ce879b31920b5393d16c0f4
7
- data.tar.gz: b4447f6c90b7ef427624eb6bdd3f2b1eb36a954b92f1c578dec3a446cbe7e7ea909d02957050e3779902db88e9cb4a12695bc5dc0f08432813d8925d37b7f92a
6
+ metadata.gz: 3ae3dafb868d3c48ee2468f0fbf88d94dcc25dcbb83827ce5c855832118dfb256db5ee7c05d8eee21930f46b04c20e775aa5057a0739212417f11d03d9666865
7
+ data.tar.gz: dcc89596cf05c6d5f96e6b4ec54879a774a6c1e476acd51ae159872494f180840f92757f58d5b1801117c6b1d3864a41132a60e9a3563ce92a780ce2570a0d6d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,3 @@
1
- # 0.5
1
+ # 0.4
2
2
 
3
3
  - remove hard dependency on Yajl, so Gush can work with non-MRI Rubies ([#31](https://github.com/chaps-io/gush/pull/31) by [Nick Rakochy](https://github.com/chaps-io/gush/pull/31))
data/Gemfile CHANGED
@@ -4,4 +4,3 @@ gemspec
4
4
  platforms :mri, :ruby do
5
5
  gem 'yajl-ruby'
6
6
  end
7
-
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.4"
7
+ spec.version = "0.4.1"
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,17 +1,15 @@
1
1
  module Gush
2
2
  class Client
3
- attr_reader :configuration
3
+ attr_reader :configuration, :sidekiq
4
4
 
5
5
  def initialize(config = Gush.configuration)
6
6
  @configuration = config
7
7
  @sidekiq = build_sidekiq
8
- @redis = build_redis
9
8
  end
10
9
 
11
10
  def configure
12
11
  yield configuration
13
12
  @sidekiq = build_sidekiq
14
- @redis = build_redis
15
13
  end
16
14
 
17
15
  def create_workflow(name)
@@ -49,7 +47,11 @@ module Gush
49
47
  loop do
50
48
  id = SecureRandom.uuid
51
49
  job_identifier = "#{job_klass}-#{id}"
52
- break if !redis.exists("gush.jobs.#{workflow_id}.#{job_identifier}")
50
+ available = connection_pool.with do |redis|
51
+ !redis.exists("gush.jobs.#{workflow_id}.#{job_identifier}")
52
+ end
53
+
54
+ break if available
53
55
  end
54
56
 
55
57
  job_identifier
@@ -59,40 +61,54 @@ module Gush
59
61
  id = nil
60
62
  loop do
61
63
  id = SecureRandom.uuid
62
- break if !redis.exists("gush.workflow.#{id}")
64
+ available = connection_pool.with do |redis|
65
+ !redis.exists("gush.workflow.#{id}")
66
+ end
67
+
68
+ break if available
63
69
  end
64
70
 
65
71
  id
66
72
  end
67
73
 
68
74
  def all_workflows
69
- redis.keys("gush.workflows.*").map do |key|
70
- id = key.sub("gush.workflows.", "")
71
- find_workflow(id)
75
+ connection_pool.with do |redis|
76
+ redis.keys("gush.workflows.*").map do |key|
77
+ id = key.sub("gush.workflows.", "")
78
+ find_workflow(id)
79
+ end
72
80
  end
73
81
  end
74
82
 
75
83
  def find_workflow(id)
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")
84
+ connection_pool.with do |redis|
85
+ data = redis.get("gush.workflows.#{id}")
86
+
87
+ unless data.nil?
88
+ hash = Gush::JSON.decode(data, symbolize_keys: true)
89
+ keys = redis.keys("gush.jobs.#{id}.*")
90
+ nodes = redis.mget(*keys).map { |json| Gush::JSON.decode(json, symbolize_keys: true) }
91
+ workflow_from_hash(hash, nodes)
92
+ else
93
+ raise WorkflowNotFound.new("Workflow with given id doesn't exist")
94
+ end
84
95
  end
85
96
  end
86
97
 
87
98
  def persist_workflow(workflow)
88
- redis.set("gush.workflows.#{workflow.id}", workflow.to_json)
99
+ connection_pool.with do |redis|
100
+ redis.set("gush.workflows.#{workflow.id}", workflow.to_json)
101
+ end
102
+
89
103
  workflow.jobs.each {|job| persist_job(workflow.id, job) }
90
104
  workflow.mark_as_persisted
91
105
  true
92
106
  end
93
107
 
94
108
  def persist_job(workflow_id, job)
95
- redis.set("gush.jobs.#{workflow_id}.#{job.name}", job.to_json)
109
+ connection_pool.with do |redis|
110
+ redis.set("gush.jobs.#{workflow_id}.#{job.name}", job.to_json)
111
+ end
96
112
  end
97
113
 
98
114
  def load_job(workflow_id, job_id)
@@ -100,10 +116,16 @@ module Gush
100
116
  job_name_match = /(?<klass>\w*[^-])-(?<identifier>.*)/.match(job_id)
101
117
  hypen = '-' if job_name_match.nil?
102
118
 
103
- keys = redis.keys("gush.jobs.#{workflow_id}.#{job_id}#{hypen}*")
119
+ keys = connection_pool.with do |redis|
120
+ redis.keys("gush.jobs.#{workflow_id}.#{job_id}#{hypen}*")
121
+ end
122
+
104
123
  return nil if keys.nil?
105
124
 
106
- data = redis.get(keys.first)
125
+ data = connection_pool.with do |redis|
126
+ redis.get(keys.first)
127
+ end
128
+
107
129
  return nil if data.nil?
108
130
 
109
131
  data = Gush::JSON.decode(data, symbolize_keys: true)
@@ -111,12 +133,16 @@ module Gush
111
133
  end
112
134
 
113
135
  def destroy_workflow(workflow)
114
- redis.del("gush.workflows.#{workflow.id}")
136
+ connection_pool.with do |redis|
137
+ redis.del("gush.workflows.#{workflow.id}")
138
+ end
115
139
  workflow.jobs.each {|job| destroy_job(workflow.id, job) }
116
140
  end
117
141
 
118
142
  def destroy_job(workflow_id, job)
119
- redis.del("gush.jobs.#{workflow_id}.#{job.name}")
143
+ connection_pool.with do |redis|
144
+ redis.del("gush.jobs.#{workflow_id}.#{job.name}")
145
+ end
120
146
  end
121
147
 
122
148
  def worker_report(message)
@@ -140,8 +166,6 @@ module Gush
140
166
 
141
167
  private
142
168
 
143
- attr_reader :sidekiq, :redis
144
-
145
169
  def workflow_from_hash(hash, nodes = nil)
146
170
  flow = hash[:klass].constantize.new *hash[:arguments]
147
171
  flow.jobs = []
@@ -156,7 +180,9 @@ module Gush
156
180
  end
157
181
 
158
182
  def report(key, message)
159
- redis.publish(key, Gush::JSON.encode(message))
183
+ connection_pool.with do |redis|
184
+ redis.publish(key, Gush::JSON.encode(message))
185
+ end
160
186
  end
161
187
 
162
188
 
@@ -169,7 +195,7 @@ module Gush
169
195
  end
170
196
 
171
197
  def connection_pool
172
- ConnectionPool.new(size: configuration.concurrency, timeout: 1) { build_redis }
198
+ @connection_pool ||= ConnectionPool.new(size: configuration.concurrency, timeout: 1) { build_redis }
173
199
  end
174
200
  end
175
201
  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'
4
+ version: 0.4.1
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-03-19 00:00:00.000000000 Z
11
+ date: 2016-08-23 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.5.1
271
+ rubygems_version: 2.4.8
272
272
  signing_key:
273
273
  specification_version: 4
274
274
  summary: Fast and distributed workflow runner using only Sidekiq and Redis