asynchronic 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/README.md +0 -70
  4. data/Rakefile +7 -0
  5. data/asynchronic.gemspec +5 -1
  6. data/lib/asynchronic/data_store/in_memory.rb +47 -0
  7. data/lib/asynchronic/data_store/key.rb +15 -0
  8. data/lib/asynchronic/data_store/lookup.rb +27 -0
  9. data/lib/asynchronic/data_store/redis.rb +52 -0
  10. data/lib/asynchronic/environment.rb +57 -0
  11. data/lib/asynchronic/error.rb +13 -0
  12. data/lib/asynchronic/hash.rb +31 -0
  13. data/lib/asynchronic/job.rb +46 -0
  14. data/lib/asynchronic/process.rb +117 -48
  15. data/lib/asynchronic/queue_engine/in_memory.rb +72 -0
  16. data/lib/asynchronic/queue_engine/ost.rb +73 -0
  17. data/lib/asynchronic/runtime.rb +40 -0
  18. data/lib/asynchronic/version.rb +1 -1
  19. data/lib/asynchronic/worker.rb +27 -18
  20. data/lib/asynchronic.rb +17 -32
  21. data/spec/coverage_helper.rb +0 -6
  22. data/spec/data_store/data_store_examples.rb +62 -0
  23. data/spec/data_store/in_memory_spec.rb +10 -0
  24. data/spec/data_store/key_spec.rb +36 -0
  25. data/spec/data_store/lookup_spec.rb +92 -0
  26. data/spec/data_store/redis_spec.rb +14 -0
  27. data/spec/expectations.rb +89 -0
  28. data/spec/facade_spec.rb +61 -0
  29. data/spec/jobs.rb +123 -33
  30. data/spec/minitest_helper.rb +12 -14
  31. data/spec/process/life_cycle_examples.rb +329 -0
  32. data/spec/process/life_cycle_in_memory_spec.rb +11 -0
  33. data/spec/process/life_cycle_redis_spec.rb +15 -0
  34. data/spec/queue_engine/in_memory_spec.rb +11 -0
  35. data/spec/queue_engine/ost_spec.rb +15 -0
  36. data/spec/queue_engine/queue_engine_examples.rb +47 -0
  37. data/spec/worker/in_memory_spec.rb +11 -0
  38. data/spec/worker/redis_spec.rb +16 -0
  39. data/spec/worker/worker_examples.rb +49 -0
  40. metadata +111 -18
  41. data/lib/asynchronic/persistent.rb +0 -61
  42. data/lib/asynchronic/pipeline.rb +0 -23
  43. data/spec/integration_spec.rb +0 -122
  44. data/spec/persistent_spec.rb +0 -88
data/spec/jobs.rb CHANGED
@@ -1,58 +1,148 @@
1
- class Registry
2
- extend Enumerable
1
+ class BasicJob < Asynchronic::Job
2
+ define do
3
+ data[:output] = data[:input] + 1
4
+ end
5
+ end
6
+
7
+
8
+ class SequentialJob < Asynchronic::Job
9
+
10
+ define do
11
+ define_job Step1
12
+ define_job Step2, dependency: Step1
13
+ end
14
+
15
+ class Step1 < Asynchronic::Job
16
+ define do
17
+ data[:partial] = data[:input] * 10
18
+ end
19
+ end
20
+
21
+ class Step2 < Asynchronic::Job
22
+ define do
23
+ data[:output] = data[:partial] / 100
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+
30
+ class GraphJob < Asynchronic::Job
31
+
32
+ define do
33
+ define_job Sum
34
+ define_job TenPercent, dependency: Sum
35
+ define_job TwentyPercent, dependency: Sum
36
+ define_job Total, dependencies: [TenPercent, TwentyPercent]
37
+ end
38
+
39
+ class Sum < Asynchronic::Job
40
+ define do
41
+ data[:sum] = data[:input] + 100
42
+ end
43
+ end
44
+
45
+ class TenPercent < Asynchronic::Job
46
+ define do
47
+ data['10%'] = data[:sum] * 0.1
48
+ end
49
+ end
3
50
 
4
- def self.add(arg)
5
- Asynchronic.logger.debug('Asynchronic') { "Registry: #{arg}" }
6
- elements << arg
7
- arg
51
+ class TwentyPercent < Asynchronic::Job
52
+ define do
53
+ data['20%'] = data[:sum] * 0.2
54
+ end
8
55
  end
9
56
 
10
- def self.clear
11
- elements.clear
57
+ class Total < Asynchronic::Job
58
+ define do
59
+ data[:output] = {'10%' => data['10%'], '20%' => data['20%']}
60
+ end
12
61
  end
13
62
 
14
- def self.each(&block)
15
- elements.each(&block)
63
+ end
64
+
65
+
66
+ class ParallelJob < Asynchronic::Job
67
+ define do
68
+ data[:times].times do |i|
69
+ define_job Child, local: {index: i}
70
+ end
16
71
  end
17
72
 
18
- def self.empty?
19
- !any?
73
+ class Child < Asynchronic::Job
74
+ define do
75
+ data["key_#{index}"] = data[:input] * index
76
+ end
20
77
  end
78
+ end
21
79
 
22
- private
23
80
 
24
- def self.elements
25
- @elements ||= []
81
+ class NestedJob < Asynchronic::Job
82
+ define do
83
+ define_job Level1
84
+ end
85
+
86
+ class Level1 < Asynchronic::Job
87
+ define do
88
+ data[:input] += 1
89
+ define_job Level2
90
+ end
91
+
92
+ class Level2 < Asynchronic::Job
93
+ define do
94
+ data[:output] = data[:input] ** 2
95
+ end
96
+ end
26
97
  end
27
98
  end
28
99
 
29
- class SingleStepJob
30
- extend Asynchronic::Pipeline
31
- step :step_name do
32
- Registry.add :single_step_job
100
+
101
+ class DependencyAliasJob < Asynchronic::Job
102
+ define do
103
+ define_job Write, local: {text: 'Take'}, alias: :word_1
104
+ define_job Write, local: {text: 'it'}, alias: :word_2, dependency: :word_1
105
+ define_job Write, local: {text: 'easy'}, alias: :word_3, dependency: :word_2
106
+ end
107
+
108
+ class Write < Asynchronic::Job
109
+ define do
110
+ data[:text] = "#{data[:text]} #{text}".strip
111
+ end
33
112
  end
34
113
  end
35
114
 
36
- class TwoStepsWithSpecificQueueJob
37
- extend Asynchronic::Pipeline
38
- queue :specific_queue
39
- step :first do |ctx|
40
- ctx[:value2] = ctx[:value1] / 2
41
- Registry.add ctx[:value1] + 1
115
+
116
+ class CustomQueueJob < Asynchronic::Job
117
+ queue :queue_1
118
+ define do
119
+ define_job Reverse, queue: :queue_2
42
120
  end
43
- step :second do |ctx, input|
44
- Registry.add input * ctx[:value2]
121
+
122
+ class Reverse < Asynchronic::Job
123
+ queue :queue_3
124
+ define do
125
+ data[:output] = data[:input].reverse
126
+ end
45
127
  end
46
128
  end
47
129
 
48
- class MultipleQueuesJob
49
- extend Asynchronic::Pipeline
50
- step :first_queue, queue: :queue1 do
51
- Registry.add :first_queue
130
+
131
+ class ExceptionJob < Asynchronic::Job
132
+ define do
133
+ raise 'Error for test'
52
134
  end
53
- step :second_queue, queue: ->(ctx){ctx[:dynamic_queue]} do
54
- Registry.add :second_queue
135
+ end
136
+
137
+
138
+ class InnerExceptionJob < Asynchronic::Job
139
+ define do
140
+ define_job ExceptionJob
55
141
  end
56
142
  end
57
143
 
58
144
 
145
+ class WorkerJob < Asynchronic::Job
146
+ define do
147
+ end
148
+ end
@@ -1,31 +1,29 @@
1
1
  require 'coverage_helper'
2
2
  require 'minitest/autorun'
3
+ require 'minitest/great_expectations'
3
4
  require 'turn'
4
5
  require 'asynchronic'
6
+ require 'jobs'
7
+ require 'expectations'
5
8
 
6
9
  Turn.config do |c|
7
10
  c.format = :pretty
8
11
  c.natural = true
9
12
  end
10
13
 
11
- logger = Logger.new($stdout)
12
- logger.level = Logger::ERROR
13
- Asynchronic.logger = logger
14
-
15
- Asynchronic.connect_redis host: 'localhost', port: 6379
16
-
17
- Asynchronic.default_queue = 'asynchronic_test'
14
+ class Module
15
+ include Minitest::Spec::DSL
16
+ end
18
17
 
19
- Asynchronic.archiving_path = File.expand_path('../tmp', File.dirname(__FILE__))
18
+ Asynchronic.logger.level = Logger::FATAL
20
19
 
21
- class MiniTest::Spec
22
-
20
+ class Minitest::Spec
23
21
  before do
24
- Redis.current.flushdb
22
+ Asynchronic.restore_default_configuration
25
23
  end
26
24
 
27
- def redis
28
- Redis.current
25
+ after do
26
+ Asynchronic::DataStore::Redis.new.clear
27
+ Asynchronic::QueueEngine::Ost.new.clear
29
28
  end
30
-
31
29
  end
@@ -0,0 +1,329 @@
1
+ module LifeCycleExamples
2
+
3
+ let(:env) { Asynchronic::Environment.new queue_engine, data_store }
4
+
5
+ let(:queue) { env.default_queue }
6
+
7
+ def execute_work(queue)
8
+ env.load_process(queue.pop).execute
9
+ end
10
+
11
+ def enqueue(process, data={})
12
+ process.enqueue(data).must_equal process.job.lookup.id
13
+ end
14
+
15
+ it 'Basic' do
16
+ process = env.build_process BasicJob
17
+
18
+ process.must_be_initialized
19
+ queue.must_be_empty
20
+
21
+ enqueue process, input: 1
22
+
23
+ process.must_be_queued
24
+ process.must_have input: 1
25
+ queue.must_enqueued process
26
+
27
+ execute_work queue
28
+
29
+ process.must_be_completed
30
+ process.must_have input: 1, output: 2
31
+ queue.must_be_empty
32
+ end
33
+
34
+ it 'Sequential' do
35
+ process = env.build_process SequentialJob
36
+
37
+ process.must_be_initialized
38
+ queue.must_be_empty
39
+
40
+ enqueue process, input: 50
41
+
42
+ process.must_be_queued
43
+ process.processes.must_be_empty
44
+ process.must_have input: 50
45
+ queue.must_enqueued process
46
+
47
+ execute_work queue
48
+
49
+ process.must_be_waiting
50
+ process.processes(SequentialJob::Step1).must_be_queued
51
+ process.processes(SequentialJob::Step2).must_be_pending
52
+ process.must_have input: 50
53
+ queue.must_enqueued process.processes(SequentialJob::Step1)
54
+
55
+ execute_work queue
56
+
57
+ process.must_be_waiting
58
+ process.processes(SequentialJob::Step1).must_be_completed
59
+ process.processes(SequentialJob::Step2).must_be_queued
60
+ process.must_have input: 50, partial: 500
61
+ queue.must_enqueued process.processes(SequentialJob::Step2)
62
+
63
+ execute_work queue
64
+
65
+ process.must_be_completed
66
+ process.processes(SequentialJob::Step1).must_be_completed
67
+ process.processes(SequentialJob::Step2).must_be_completed
68
+ process.must_have input: 50, partial: 500, output: 5
69
+ queue.must_be_empty
70
+ end
71
+
72
+ it 'Graph' do
73
+ process = env.build_process GraphJob
74
+
75
+ process.must_be_initialized
76
+ queue.must_be_empty
77
+
78
+ enqueue process, input: 100
79
+
80
+ process.must_be_queued
81
+ process.processes.must_be_empty
82
+ process.must_have input: 100
83
+ queue.must_enqueued process
84
+
85
+ execute_work queue
86
+
87
+ process.must_be_waiting
88
+ process.processes(GraphJob::Sum).must_be_queued
89
+ process.processes(GraphJob::TenPercent).must_be_pending
90
+ process.processes(GraphJob::TwentyPercent).must_be_pending
91
+ process.processes(GraphJob::Total).must_be_pending
92
+ process.must_have input: 100
93
+ queue.must_enqueued process.processes(GraphJob::Sum)
94
+
95
+ execute_work queue
96
+
97
+ process.must_be_waiting
98
+ process.processes(GraphJob::Sum).must_be_completed
99
+ process.processes(GraphJob::TenPercent).must_be_queued
100
+ process.processes(GraphJob::TwentyPercent).must_be_queued
101
+ process.processes(GraphJob::Total).must_be_pending
102
+ process.must_have input: 100, sum: 200
103
+ queue.must_enqueued [process.processes(GraphJob::TenPercent), process.processes(GraphJob::TwentyPercent)]
104
+
105
+ 2.times { execute_work queue }
106
+
107
+ process.must_be_waiting
108
+ process.processes(GraphJob::Sum).must_be_completed
109
+ process.processes(GraphJob::TenPercent).must_be_completed
110
+ process.processes(GraphJob::TwentyPercent).must_be_completed
111
+ process.processes(GraphJob::Total).must_be_queued
112
+ process.must_have input: 100, sum: 200, '10%' => 20, '20%' => 40
113
+ queue.must_enqueued process.processes(GraphJob::Total)
114
+
115
+ execute_work queue
116
+
117
+ process.must_be_completed
118
+ process.processes(GraphJob::Sum).must_be_completed
119
+ process.processes(GraphJob::TenPercent).must_be_completed
120
+ process.processes(GraphJob::TwentyPercent).must_be_completed
121
+ process.processes(GraphJob::Total).must_be_completed
122
+ process.must_have input: 100, sum: 200, '10%' => 20, '20%' => 40, output: {'10%' => 20, '20%' => 40}
123
+ queue.must_be_empty
124
+ end
125
+
126
+ it 'Parallel' do
127
+ process = env.build_process ParallelJob
128
+
129
+ process.must_be_initialized
130
+ queue.must_be_empty
131
+
132
+ enqueue process, input: 10, times: 3
133
+
134
+ process.must_be_queued
135
+ process.processes.must_be_empty
136
+ process.must_have input: 10, times: 3
137
+ queue.must_enqueued process
138
+
139
+ execute_work queue
140
+
141
+ process.must_be_waiting
142
+ process.processes.each { |p| p.must_be_queued }
143
+ process.must_have input: 10, times: 3
144
+ queue.must_enqueued process.processes
145
+
146
+ 3.times { execute_work queue }
147
+
148
+ process.must_be_completed
149
+ process.processes.each { |p| p.must_be_completed }
150
+ hash = Hash[3.times.map { |i| ["key_#{i}", 10 * i] }]
151
+ process.must_have hash.merge(input: 10, times: 3)
152
+ queue.must_be_empty
153
+ end
154
+
155
+ it 'Nested' do
156
+ process = env.build_process NestedJob
157
+
158
+ process.must_be_initialized
159
+ queue.must_be_empty
160
+
161
+ enqueue process, input: 4
162
+
163
+ process.must_be_queued
164
+ process.processes.must_be_empty
165
+ process.must_have input: 4
166
+ queue.must_enqueued process
167
+
168
+ execute_work queue
169
+
170
+ process.must_be_waiting
171
+ process.processes(NestedJob::Level1).must_be_queued
172
+ process.processes(NestedJob::Level1).processes.must_be_empty
173
+ process.must_have input: 4
174
+ queue.must_enqueued process.processes(NestedJob::Level1)
175
+
176
+ execute_work queue
177
+
178
+ process.must_be_waiting
179
+ process.processes(NestedJob::Level1).must_be_waiting
180
+ process.processes(NestedJob::Level1).processes(NestedJob::Level1::Level2).must_be_queued
181
+ process.must_have input: 5
182
+ queue.must_enqueued process.processes(NestedJob::Level1).processes(NestedJob::Level1::Level2)
183
+
184
+ execute_work queue
185
+
186
+ process.must_be_completed
187
+ process.processes(NestedJob::Level1).must_be_completed
188
+ process.processes(NestedJob::Level1).processes(NestedJob::Level1::Level2).must_be_completed
189
+ process.must_have input: 5, output: 25
190
+ queue.must_be_empty
191
+ end
192
+
193
+ it 'Dependency alias' do
194
+ process = env.build_process DependencyAliasJob
195
+
196
+ process.must_be_initialized
197
+ queue.must_be_empty
198
+
199
+ enqueue process
200
+
201
+ process.must_be_queued
202
+ process.processes.must_be_empty
203
+ process.data.must_be_empty
204
+ queue.must_enqueued process
205
+
206
+ execute_work queue
207
+
208
+ process.must_be_waiting
209
+ process.processes(:word_1).must_be_queued
210
+ process.processes(:word_2).must_be_pending
211
+ process.processes(:word_3).must_be_pending
212
+ process.data.must_be_empty
213
+ queue.must_enqueued process.processes(:word_1)
214
+
215
+ execute_work queue
216
+
217
+ process.must_be_waiting
218
+ process.processes(:word_1).must_be_completed
219
+ process.processes(:word_2).must_be_queued
220
+ process.processes(:word_3).must_be_pending
221
+ process.must_have text: 'Take'
222
+ queue.must_enqueued process.processes(:word_2)
223
+
224
+ execute_work queue
225
+
226
+ process.must_be_waiting
227
+ process.processes(:word_1).must_be_completed
228
+ process.processes(:word_2).must_be_completed
229
+ process.processes(:word_3).must_be_queued
230
+ process.must_have text: 'Take it'
231
+ queue.must_enqueued process.processes(:word_3)
232
+
233
+ execute_work queue
234
+
235
+ process.must_be_completed
236
+ process.processes(:word_1).must_be_completed
237
+ process.processes(:word_2).must_be_completed
238
+ process.processes(:word_3).must_be_completed
239
+ process.must_have text: 'Take it easy'
240
+ queue.must_be_empty
241
+ end
242
+
243
+ it 'Custom queue' do
244
+ process = env.build_process CustomQueueJob
245
+
246
+ process.must_be_initialized
247
+
248
+ env.queue(:queue_1).must_be_empty
249
+ env.queue(:queue_2).must_be_empty
250
+ env.queue(:queue_3).must_be_empty
251
+
252
+ enqueue process, input: 'hello'
253
+
254
+ process.must_be_queued
255
+ process.processes.must_be_empty
256
+ process.must_have input: 'hello'
257
+
258
+ env.queue(:queue_1).must_enqueued process
259
+ env.queue(:queue_2).must_be_empty
260
+ env.queue(:queue_3).must_be_empty
261
+
262
+ execute_work env.queue(:queue_1)
263
+
264
+ process.must_be_waiting
265
+ process.processes(CustomQueueJob::Reverse).must_be_queued
266
+ process.must_have input: 'hello'
267
+
268
+ env.queue(:queue_1).must_be_empty
269
+ env.queue(:queue_2).must_enqueued process.processes(CustomQueueJob::Reverse)
270
+ env.queue(:queue_3).must_be_empty
271
+
272
+ execute_work env.queue(:queue_2)
273
+
274
+ process.must_be_completed
275
+ process.processes(CustomQueueJob::Reverse).must_be_completed
276
+ process.must_have input: 'hello', output: 'olleh'
277
+
278
+ env.queue(:queue_1).must_be_empty
279
+ env.queue(:queue_2).must_be_empty
280
+ env.queue(:queue_3).must_be_empty
281
+ end
282
+
283
+ it 'Exception' do
284
+ process = env.build_process ExceptionJob
285
+
286
+ process.must_be_initialized
287
+ queue.must_be_empty
288
+
289
+ enqueue process
290
+
291
+ process.must_be_queued
292
+ queue.must_enqueued process
293
+
294
+ execute_work queue
295
+
296
+ process.must_be_aborted
297
+ process.error.must_be_instance_of Asynchronic::Error
298
+ process.error.message.must_equal 'Error for test'
299
+ end
300
+
301
+ it 'Inner exception' do
302
+ process = env.build_process InnerExceptionJob
303
+
304
+ process.must_be_initialized
305
+ queue.must_be_empty
306
+
307
+ enqueue process
308
+
309
+ process.must_be_queued
310
+ queue.must_enqueued process
311
+
312
+ execute_work queue
313
+
314
+ process.must_be_waiting
315
+ process.processes(ExceptionJob).must_be_queued
316
+ queue.must_enqueued process.processes(ExceptionJob)
317
+
318
+ execute_work queue
319
+
320
+ process.must_be_aborted
321
+ process.error.must_be_instance_of Asynchronic::Error
322
+ process.error.message.must_equal 'Error caused by ExceptionJob'
323
+
324
+ process.processes(ExceptionJob).must_be_aborted
325
+ process.processes(ExceptionJob).error.must_be_instance_of Asynchronic::Error
326
+ process.processes(ExceptionJob).error.message.must_equal 'Error for test'
327
+ end
328
+
329
+ end
@@ -0,0 +1,11 @@
1
+ require 'minitest_helper'
2
+ require_relative './life_cycle_examples.rb'
3
+
4
+ describe Asynchronic::Process, 'Life cycle - InMemory' do
5
+
6
+ let(:queue_engine) { Asynchronic::QueueEngine::InMemory.new }
7
+ let(:data_store) { Asynchronic::DataStore::InMemory.new }
8
+
9
+ include LifeCycleExamples
10
+
11
+ end
@@ -0,0 +1,15 @@
1
+ require 'minitest_helper'
2
+ require_relative './life_cycle_examples.rb'
3
+
4
+ describe Asynchronic::Process, 'Life cycle - Redis' do
5
+
6
+ let(:queue_engine) { Asynchronic::QueueEngine::Ost.new }
7
+ let(:data_store) { Asynchronic::DataStore::Redis.new }
8
+
9
+ before do
10
+ Redis.current.flushdb
11
+ end
12
+
13
+ include LifeCycleExamples
14
+
15
+ end
@@ -0,0 +1,11 @@
1
+ require 'minitest_helper'
2
+ require_relative './queue_engine_examples'
3
+
4
+ describe Asynchronic::QueueEngine::InMemory do
5
+
6
+ let(:engine) { Asynchronic::QueueEngine::InMemory.new }
7
+ let(:listener) { Asynchronic::QueueEngine::InMemory::Listener.new }
8
+
9
+ include QueueEngineExamples
10
+
11
+ end
@@ -0,0 +1,15 @@
1
+ require 'minitest_helper'
2
+ require_relative './queue_engine_examples'
3
+
4
+ describe Asynchronic::QueueEngine::Ost do
5
+
6
+ let(:engine) { Asynchronic::QueueEngine::Ost.new }
7
+ let(:listener) { Asynchronic::QueueEngine::Ost::Listener.new }
8
+
9
+ before do
10
+ engine.clear
11
+ end
12
+
13
+ include QueueEngineExamples
14
+
15
+ end
@@ -0,0 +1,47 @@
1
+ module QueueEngineExamples
2
+
3
+ let(:queue) { engine[:test_queue] }
4
+
5
+ it 'Engine' do
6
+ engine.queues.must_be_empty
7
+
8
+ queue = engine[:test_engine]
9
+ queue.must_be_instance_of engine.class.const_get(:Queue)
10
+ engine.queues.must_equal [:test_engine]
11
+
12
+ engine[:test_engine].must_equal queue
13
+
14
+ engine.clear
15
+ engine.queues.must_be_empty
16
+ end
17
+
18
+ it 'Queue (push/pop)' do
19
+ queue.must_be_empty
20
+
21
+ queue.push 'msg_1'
22
+ queue.push 'msg_2'
23
+
24
+ queue.size.must_equal 2
25
+ queue.to_a.must_equal %w(msg_1 msg_2)
26
+
27
+ queue.pop.must_equal 'msg_1'
28
+
29
+ queue.size.must_equal 1
30
+ queue.to_a.must_equal %w(msg_2)
31
+ end
32
+
33
+ it 'Listener' do
34
+ queue.push 'msg_1'
35
+ queue.push 'msg_2'
36
+
37
+ messages = []
38
+
39
+ listener.listen(queue) do |msg|
40
+ messages << msg
41
+ listener.stop if queue.empty?
42
+ end
43
+
44
+ messages.must_equal %w(msg_1 msg_2)
45
+ end
46
+
47
+ end
@@ -0,0 +1,11 @@
1
+ require 'minitest_helper'
2
+ require_relative './worker_examples'
3
+
4
+ describe Asynchronic::Worker, 'InMemory' do
5
+
6
+ let(:queue_engine) { Asynchronic::QueueEngine::InMemory.new }
7
+ let(:data_store) { Asynchronic::DataStore::InMemory.new }
8
+
9
+ include WorkerExamples
10
+
11
+ end
@@ -0,0 +1,16 @@
1
+ require 'minitest_helper'
2
+ require_relative './worker_examples'
3
+
4
+ describe Asynchronic::Worker, 'Redis' do
5
+
6
+ let(:queue_engine) { Asynchronic::QueueEngine::Ost.new }
7
+ let(:data_store) { Asynchronic::DataStore::Redis.new }
8
+
9
+ before do
10
+ data_store.clear
11
+ queue_engine.clear
12
+ end
13
+
14
+ include WorkerExamples
15
+
16
+ end