gush 0.4 → 0.4.1

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
  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