asynchronic 3.0.3 → 4.0.0
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/.travis.yml +1 -0
- data/README.md +1 -1
- data/lib/asynchronic.rb +8 -0
- data/lib/asynchronic/data_store/in_memory.rb +17 -15
- data/lib/asynchronic/data_store/key.rb +3 -3
- data/lib/asynchronic/data_store/lazy_value.rb +5 -3
- data/lib/asynchronic/data_store/redis.rb +22 -14
- data/lib/asynchronic/data_store/scoped_store.rb +18 -19
- data/lib/asynchronic/environment.rb +3 -3
- data/lib/asynchronic/error.rb +2 -3
- data/lib/asynchronic/job.rb +12 -12
- data/lib/asynchronic/notifier/broadcaster.rb +8 -4
- data/lib/asynchronic/process.rb +35 -32
- data/lib/asynchronic/queue_engine/in_memory.rb +17 -11
- data/lib/asynchronic/queue_engine/ost.rb +7 -5
- data/lib/asynchronic/queue_engine/synchronic.rb +19 -7
- data/lib/asynchronic/version.rb +1 -1
- data/lib/asynchronic/worker.rb +7 -10
- data/spec/data_store/data_store_examples.rb +17 -9
- data/spec/data_store/in_memory_spec.rb +0 -2
- data/spec/data_store/key_spec.rb +1 -1
- data/spec/data_store/lazy_value_examples.rb +7 -5
- data/spec/data_store/redis_spec.rb +4 -10
- data/spec/expectations.rb +2 -2
- data/spec/facade_spec.rb +3 -3
- data/spec/jobs.rb +10 -10
- data/spec/minitest_helper.rb +5 -12
- data/spec/process/life_cycle_examples.rb +24 -22
- data/spec/process/life_cycle_in_memory_spec.rb +0 -1
- data/spec/process/life_cycle_redis_spec.rb +0 -1
- data/spec/queue_engine/in_memory_spec.rb +1 -3
- data/spec/queue_engine/ost_spec.rb +1 -7
- data/spec/queue_engine/queue_engine_examples.rb +17 -9
- data/spec/queue_engine/synchronic_spec.rb +1 -1
- data/spec/worker/in_memory_spec.rb +1 -2
- data/spec/worker/redis_spec.rb +0 -6
- data/spec/worker/worker_examples.rb +6 -4
- metadata +3 -3
data/spec/minitest_helper.rb
CHANGED
@@ -9,9 +9,11 @@ require 'expectations'
|
|
9
9
|
require 'timeout'
|
10
10
|
require 'pry-nav'
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
require_relative 'data_store/data_store_examples'
|
13
|
+
require_relative 'data_store/lazy_value_examples'
|
14
|
+
require_relative 'process/life_cycle_examples'
|
15
|
+
require_relative 'queue_engine/queue_engine_examples'
|
16
|
+
require_relative 'worker/worker_examples'
|
15
17
|
|
16
18
|
Asynchronic.logger.level = Logger::FATAL
|
17
19
|
|
@@ -20,13 +22,4 @@ class Minitest::Spec
|
|
20
22
|
Asynchronic.restore_default_configuration
|
21
23
|
Asynchronic.default_queue = :asynchronic_test
|
22
24
|
end
|
23
|
-
end
|
24
|
-
|
25
|
-
module Asynchronic::DataStore::Helper
|
26
|
-
def dump
|
27
|
-
puts 'DataStore:'
|
28
|
-
each do |k,v|
|
29
|
-
puts "#{k}: #{v}"
|
30
|
-
end
|
31
|
-
end
|
32
25
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module LifeCycleExamples
|
2
|
-
|
2
|
+
|
3
|
+
extend Minitest::Spec::DSL
|
4
|
+
|
3
5
|
let(:env) { Asynchronic::Environment.new queue_engine, data_store, notifier }
|
4
6
|
|
5
7
|
let(:queue) { env.default_queue }
|
@@ -29,7 +31,7 @@ module LifeCycleExamples
|
|
29
31
|
|
30
32
|
process.must_have_connection_name
|
31
33
|
process.wont_be :dead?
|
32
|
-
|
34
|
+
|
33
35
|
process.send(:connected?).must_be_true
|
34
36
|
|
35
37
|
env.queue_engine.stub(:active_connections, ->() { raise 'Forced error' }) do
|
@@ -138,7 +140,7 @@ module LifeCycleExamples
|
|
138
140
|
process[GraphJob::Total].must_be_pending
|
139
141
|
process[GraphJob::Total].must_have_params '10%' => nil, '20%' => nil
|
140
142
|
queue.must_enqueued process[GraphJob::Sum]
|
141
|
-
|
143
|
+
|
142
144
|
execute queue
|
143
145
|
|
144
146
|
process.must_be_waiting
|
@@ -294,7 +296,7 @@ module LifeCycleExamples
|
|
294
296
|
process[:word_3].result.must_equal 'Take it easy'
|
295
297
|
queue.must_be_empty
|
296
298
|
end
|
297
|
-
|
299
|
+
|
298
300
|
it 'Custom queue' do
|
299
301
|
process = create CustomQueueJob, input: 'hello'
|
300
302
|
|
@@ -308,7 +310,7 @@ module LifeCycleExamples
|
|
308
310
|
|
309
311
|
process.must_be_queued
|
310
312
|
process.processes.must_be_empty
|
311
|
-
|
313
|
+
|
312
314
|
env.queue(:queue_1).must_enqueued process
|
313
315
|
env.queue(:queue_2).must_be_empty
|
314
316
|
env.queue(:queue_3).must_be_empty
|
@@ -318,7 +320,7 @@ module LifeCycleExamples
|
|
318
320
|
process.must_be_waiting
|
319
321
|
process[CustomQueueJob::Reverse].must_be_queued
|
320
322
|
process[CustomQueueJob::Reverse].must_have_params input: 'hello'
|
321
|
-
|
323
|
+
|
322
324
|
env.queue(:queue_1).must_be_empty
|
323
325
|
env.queue(:queue_2).must_enqueued process[CustomQueueJob::Reverse]
|
324
326
|
env.queue(:queue_3).must_be_empty
|
@@ -329,7 +331,7 @@ module LifeCycleExamples
|
|
329
331
|
process.result.must_equal 'olleh'
|
330
332
|
process[CustomQueueJob::Reverse].must_be_completed
|
331
333
|
process[CustomQueueJob::Reverse].result.must_equal 'olleh'
|
332
|
-
|
334
|
+
|
333
335
|
env.queue(:queue_1).must_be_empty
|
334
336
|
env.queue(:queue_2).must_be_empty
|
335
337
|
env.queue(:queue_3).must_be_empty
|
@@ -485,7 +487,7 @@ module LifeCycleExamples
|
|
485
487
|
|
486
488
|
it 'Data' do
|
487
489
|
process = create DataJob, input: 1
|
488
|
-
|
490
|
+
|
489
491
|
process.enqueue
|
490
492
|
execute queue
|
491
493
|
|
@@ -497,7 +499,7 @@ module LifeCycleExamples
|
|
497
499
|
it 'Nested job with error in child' do
|
498
500
|
process = create NestedJobWithErrorInChildJob
|
499
501
|
|
500
|
-
process.enqueue
|
502
|
+
process.enqueue
|
501
503
|
|
502
504
|
Timeout.timeout(1) do
|
503
505
|
until process.status == :aborted
|
@@ -511,17 +513,17 @@ module LifeCycleExamples
|
|
511
513
|
it 'Nested job with error in parent' do
|
512
514
|
process = create NestedJobWithErrorInParentJob
|
513
515
|
|
514
|
-
process.enqueue
|
516
|
+
process.enqueue
|
515
517
|
|
516
518
|
execute queue
|
517
|
-
|
519
|
+
|
518
520
|
process.real_error.must_equal "Error in parent"
|
519
521
|
end
|
520
522
|
|
521
523
|
it 'Abort queued After error' do
|
522
524
|
process = create AbortQueuedAfterErrorJob
|
523
525
|
|
524
|
-
process.enqueue
|
526
|
+
process.enqueue
|
525
527
|
|
526
528
|
execute queue
|
527
529
|
|
@@ -602,27 +604,27 @@ module LifeCycleExamples
|
|
602
604
|
|
603
605
|
execute queue
|
604
606
|
|
605
|
-
process.full_status.must_equal 'NestedJob' => :waiting,
|
607
|
+
process.full_status.must_equal 'NestedJob' => :waiting,
|
606
608
|
'NestedJob::Level1' => :queued
|
607
609
|
|
608
610
|
execute queue
|
609
611
|
|
610
|
-
process.full_status.must_equal 'NestedJob' => :waiting,
|
611
|
-
'NestedJob::Level1' => :waiting,
|
612
|
+
process.full_status.must_equal 'NestedJob' => :waiting,
|
613
|
+
'NestedJob::Level1' => :waiting,
|
612
614
|
'NestedJob::Level1::Level2' => :queued
|
613
615
|
|
614
616
|
process.cancel!
|
615
617
|
|
616
618
|
process.real_error.must_equal Asynchronic::Process::CANCELED_ERROR_MESSAGE
|
617
619
|
|
618
|
-
process.full_status.must_equal 'NestedJob' => :aborted,
|
619
|
-
'NestedJob::Level1' => :waiting,
|
620
|
+
process.full_status.must_equal 'NestedJob' => :aborted,
|
621
|
+
'NestedJob::Level1' => :waiting,
|
620
622
|
'NestedJob::Level1::Level2' => :queued
|
621
623
|
|
622
624
|
execute queue
|
623
625
|
|
624
|
-
process.full_status.must_equal 'NestedJob' => :aborted,
|
625
|
-
'NestedJob::Level1' => :aborted,
|
626
|
+
process.full_status.must_equal 'NestedJob' => :aborted,
|
627
|
+
'NestedJob::Level1' => :aborted,
|
626
628
|
'NestedJob::Level1::Level2' => :aborted
|
627
629
|
end
|
628
630
|
|
@@ -650,7 +652,7 @@ module LifeCycleExamples
|
|
650
652
|
process_1 = create AliasJob
|
651
653
|
process_1.enqueue
|
652
654
|
4.times { execute queue }
|
653
|
-
|
655
|
+
|
654
656
|
process_2 = create AliasJob
|
655
657
|
process_2.enqueue
|
656
658
|
execute queue
|
@@ -670,7 +672,7 @@ module LifeCycleExamples
|
|
670
672
|
data_store.keys.select { |k| k.start_with? pid_3 }.count.must_equal 7
|
671
673
|
|
672
674
|
gc = Asynchronic::GarbageCollector.new env, 0.001
|
673
|
-
|
675
|
+
|
674
676
|
gc.add_condition('Finalized', &:finalized?)
|
675
677
|
gc.add_condition('Waiting', &:waiting?)
|
676
678
|
gc.add_condition('Exception') { raise 'Invalid condition' }
|
@@ -678,7 +680,7 @@ module LifeCycleExamples
|
|
678
680
|
gc.conditions_names.must_equal ['Finalized', 'Waiting', 'Exception']
|
679
681
|
|
680
682
|
gc.remove_condition 'Waiting'
|
681
|
-
|
683
|
+
|
682
684
|
gc.conditions_names.must_equal ['Finalized', 'Exception']
|
683
685
|
|
684
686
|
Thread.new do
|
@@ -1,11 +1,9 @@
|
|
1
1
|
require 'minitest_helper'
|
2
|
-
require_relative './queue_engine_examples'
|
3
2
|
|
4
3
|
describe Asynchronic::QueueEngine::InMemory do
|
5
4
|
|
6
5
|
let(:engine) { Asynchronic::QueueEngine::InMemory.new }
|
7
|
-
let(:listener) { Asynchronic::QueueEngine::InMemory::Listener.new }
|
8
6
|
|
9
7
|
include QueueEngineExamples
|
10
|
-
|
8
|
+
|
11
9
|
end
|
@@ -1,19 +1,13 @@
|
|
1
1
|
require 'minitest_helper'
|
2
|
-
require_relative './queue_engine_examples'
|
3
2
|
|
4
3
|
describe Asynchronic::QueueEngine::Ost do
|
5
4
|
|
6
5
|
let(:engine) { Asynchronic::QueueEngine::Ost.new }
|
7
|
-
let(:listener) { Asynchronic::QueueEngine::Ost::Listener.new }
|
8
6
|
|
9
|
-
before do
|
10
|
-
engine.clear
|
11
|
-
end
|
12
|
-
|
13
7
|
include QueueEngineExamples
|
14
8
|
|
15
9
|
it 'Engine and queues use same redis connection' do
|
16
10
|
engine.redis.must_equal queue.redis
|
17
11
|
end
|
18
|
-
|
12
|
+
|
19
13
|
end
|
@@ -1,26 +1,34 @@
|
|
1
1
|
module QueueEngineExamples
|
2
|
-
|
2
|
+
|
3
|
+
extend Minitest::Spec::DSL
|
4
|
+
|
3
5
|
let(:queue) { engine[:test_queue] }
|
4
6
|
|
7
|
+
let(:listener) { engine.listener }
|
8
|
+
|
9
|
+
after do
|
10
|
+
engine.clear
|
11
|
+
end
|
12
|
+
|
5
13
|
it 'Engine' do
|
6
|
-
engine.
|
7
|
-
|
14
|
+
engine.queue_names.must_be_empty
|
15
|
+
|
8
16
|
queue = engine[:test_engine]
|
9
17
|
queue.must_be_instance_of engine.class.const_get(:Queue)
|
10
|
-
engine.
|
11
|
-
|
18
|
+
engine.queue_names.must_equal [:test_engine]
|
19
|
+
|
12
20
|
engine[:test_engine].must_equal queue
|
13
|
-
|
21
|
+
|
14
22
|
engine.clear
|
15
|
-
engine.
|
23
|
+
engine.queue_names.must_be_empty
|
16
24
|
end
|
17
25
|
|
18
26
|
it 'Queue (push/pop)' do
|
19
27
|
queue.must_be_empty
|
20
|
-
|
28
|
+
|
21
29
|
queue.push 'msg_1'
|
22
30
|
queue.push 'msg_2'
|
23
|
-
|
31
|
+
|
24
32
|
queue.size.must_equal 2
|
25
33
|
queue.to_a.must_equal %w(msg_1 msg_2)
|
26
34
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'minitest_helper'
|
2
|
-
require_relative './worker_examples'
|
3
2
|
|
4
3
|
describe Asynchronic::Worker, 'InMemory' do
|
5
4
|
|
@@ -8,5 +7,5 @@ describe Asynchronic::Worker, 'InMemory' do
|
|
8
7
|
let(:notifier) { Asynchronic::Notifier::InMemory.new }
|
9
8
|
|
10
9
|
include WorkerExamples
|
11
|
-
|
10
|
+
|
12
11
|
end
|
data/spec/worker/redis_spec.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'minitest_helper'
|
2
|
-
require_relative './worker_examples'
|
3
2
|
|
4
3
|
describe Asynchronic::Worker, 'Redis' do
|
5
4
|
|
@@ -7,11 +6,6 @@ describe Asynchronic::Worker, 'Redis' do
|
|
7
6
|
let(:data_store) { Asynchronic::DataStore::Redis.new :asynchronic_test}
|
8
7
|
let(:notifier) { Asynchronic::Notifier::Broadcaster.new }
|
9
8
|
|
10
|
-
after do
|
11
|
-
data_store.clear
|
12
|
-
queue_engine.clear
|
13
|
-
end
|
14
|
-
|
15
9
|
include WorkerExamples
|
16
10
|
|
17
11
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module WorkerExamples
|
2
2
|
|
3
|
+
extend Minitest::Spec::DSL
|
4
|
+
|
3
5
|
let(:env) { Asynchronic::Environment.new queue_engine, data_store, notifier }
|
4
6
|
let(:queue_name) { :test_worker }
|
5
7
|
let(:queue) { env.queue queue_name }
|
@@ -27,7 +29,7 @@ module WorkerExamples
|
|
27
29
|
|
28
30
|
Thread.new do
|
29
31
|
loop { break if queue.empty? }
|
30
|
-
worker.stop
|
32
|
+
worker.stop
|
31
33
|
end
|
32
34
|
|
33
35
|
worker.start
|
@@ -45,10 +47,10 @@ module WorkerExamples
|
|
45
47
|
|
46
48
|
Asynchronic::Worker.start :test_worker do |worker|
|
47
49
|
loop { break if worker.queue.empty? }
|
48
|
-
worker.stop
|
50
|
+
worker.stop
|
49
51
|
end
|
50
|
-
|
51
|
-
processes.each { |p| p.must_be :completed? }
|
52
|
+
|
53
|
+
processes.each { |p| p.must_be :completed? }
|
52
54
|
end
|
53
55
|
|
54
56
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asynchronic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Naiman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ost
|
@@ -297,7 +297,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
297
297
|
- !ruby/object:Gem::Version
|
298
298
|
version: '0'
|
299
299
|
requirements: []
|
300
|
-
rubygems_version: 3.0.
|
300
|
+
rubygems_version: 3.0.8
|
301
301
|
signing_key:
|
302
302
|
specification_version: 4
|
303
303
|
summary: DSL for asynchronic pipeline using queues over Redis
|