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
         |