asynchronic 1.6.3 → 2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d090602f5e7db3b74e67c5057d7aec4761c2007e
4
- data.tar.gz: b2e6ce2ff2d236510a71d91d7d5e0042179e4a64
3
+ metadata.gz: 7a0200ef4e9c9c465ddc70786d71e15bb2fa2f4d
4
+ data.tar.gz: 0d5320739a21a0cd57f7e65cfe28d6dea571dbfb
5
5
  SHA512:
6
- metadata.gz: dd1f22974965986b3ce74f2187edf7ad7911bee32562871a7591cea31a93fa22187beaa8b3e1fcf416a09560585460c51557669cc07c067eed6007d31d7959ed
7
- data.tar.gz: 1a8db5dddd1501792e2bc00cfe57be14b0ef0c8f6e44d8c29a77c03bb0ce0f80d0cda483f87b84703f474a245e3bed611909e2496e0fc44e444cebca6b1bab82
6
+ metadata.gz: 2294c1215c7b3abb787c3ec9cd955b254b9b1ec235e6c028d1ff9620b881bc0f0a7ed937b98b14e1ef2537b0be2921e67772ccaec1d9b37616bccc8a11fbe8cf
7
+ data.tar.gz: 8fa59d9eeafa9a952a9c76c2b91c807d4eaa0fcbc58ee2b1bed1bd637358b42f4c2ef8e1fb1bb864bad86664e45c67fbc44e8bd8e2099dedda6b6e08e95e6cc2
@@ -1,7 +1,6 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 1.9.3
5
4
  - 2.0
6
5
  - 2.1
7
6
  - 2.2
@@ -9,7 +8,6 @@ rvm:
9
8
  - 2.4.0
10
9
  - 2.5.0
11
10
  - 2.6.0
12
- - jruby-1.7.25
13
11
  - jruby-9.1.7.0
14
12
  - ruby-head
15
13
  - jruby-head
@@ -18,8 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'redis', '~> 3.0'
22
- spec.add_dependency 'ost', '~> 0.1'
21
+ spec.add_dependency 'ost', '~> 1.0'
23
22
  spec.add_dependency 'class_config', '~> 0.0'
24
23
  spec.add_dependency 'transparent_proxy', '~> 0.0'
25
24
  spec.add_dependency 'multi_require', '~> 1.0'
@@ -33,10 +32,4 @@ Gem::Specification.new do |spec|
33
32
  spec.add_development_dependency 'simplecov', '~> 0.12'
34
33
  spec.add_development_dependency 'coveralls', '~> 0.8'
35
34
  spec.add_development_dependency 'pry-nav', '~> 0.2'
36
-
37
- if RUBY_VERSION < '2'
38
- spec.add_development_dependency 'term-ansicolor', '~> 1.3.0'
39
- spec.add_development_dependency 'tins', '~> 1.6.0'
40
- spec.add_development_dependency 'json', '~> 1.8'
41
- end
42
35
  end
@@ -1,11 +1,13 @@
1
1
  require 'forwardable'
2
2
  require 'securerandom'
3
- require 'redis'
4
3
  require 'ost'
4
+ require 'redic'
5
5
  require 'class_config'
6
6
  require 'transparent_proxy'
7
7
  require 'logger'
8
8
  require 'multi_require'
9
+ require 'timeout'
10
+ require 'socket'
9
11
 
10
12
  MultiRequire.require_relative_pattern 'asynchronic/**/*.rb'
11
13
 
@@ -20,6 +22,8 @@ module Asynchronic
20
22
  attr_config :retry_timeout, 30
21
23
  attr_config :garbage_collector_timeout, 30
22
24
  attr_config :redis_data_store_sync_timeout, 0.01
25
+ attr_config :keep_alive_timeout, 0.1
26
+ attr_config :connection_name, "HOST=#{Socket.gethostname},PID=#{::Process.pid}"
23
27
 
24
28
  def self.environment
25
29
  Environment.new queue_engine, data_store
@@ -18,7 +18,7 @@ module Asynchronic
18
18
  end
19
19
 
20
20
  def data_store
21
- @data_store_class.connect *@data_store_connection_args
21
+ @data_store_class.connect(*@data_store_connection_args)
22
22
  end
23
23
 
24
24
  def to_value
@@ -8,11 +8,11 @@ module Asynchronic
8
8
 
9
9
  def initialize(scope, *args)
10
10
  @scope = Key[scope]
11
- @connection = ::Redis.new(*args)
11
+ @redis = Redic.new(*args)
12
12
  end
13
13
 
14
14
  def [](key)
15
- value = @connection.get @scope[key]
15
+ value = @redis.call 'GET', @scope[key]
16
16
  value ? Marshal.load(value) : nil
17
17
  rescue => ex
18
18
  Asynchronic.logger.warn('Asynchronic') { ex.message }
@@ -20,33 +20,33 @@ module Asynchronic
20
20
  end
21
21
 
22
22
  def []=(key, value)
23
- @connection.set @scope[key], Marshal.dump(value)
23
+ @redis.call 'SET', @scope[key], Marshal.dump(value)
24
24
  end
25
25
 
26
26
  def delete(key)
27
- @connection.del @scope[key]
27
+ @redis.call 'DEL', @scope[key]
28
28
  end
29
29
 
30
30
  def delete_cascade(key)
31
- @connection.del @scope[key]
32
- @connection.keys(@scope[key]['*']).each { |k| @connection.del k }
31
+ @redis.call 'DEL', @scope[key]
32
+ @redis.call('KEYS', @scope[key]['*']).each { |k| @redis.call 'DEL', k }
33
33
  end
34
34
 
35
35
  def keys
36
- @connection.keys(@scope['*']).map { |k| Key[k].remove_first }
36
+ @redis.call('KEYS', @scope['*']).map { |k| Key[k].remove_first }
37
37
  end
38
38
 
39
39
  def synchronize(key)
40
- while @connection.getset(@scope[key][LOCKED], LOCKED) == LOCKED
40
+ while @redis.call('GETSET', @scope[key][LOCKED], LOCKED) == LOCKED
41
41
  sleep Asynchronic.redis_data_store_sync_timeout
42
42
  end
43
43
  yield
44
44
  ensure
45
- @connection.del @scope[key][LOCKED]
45
+ @redis.call 'DEL', @scope[key][LOCKED]
46
46
  end
47
47
 
48
48
  def connection_args
49
- [@scope, @connection.client.options]
49
+ [@scope, @redis.url]
50
50
  end
51
51
 
52
52
  def self.connect(*args)
@@ -11,7 +11,7 @@ module Asynchronic
11
11
  aborted: :finalized_at
12
12
  }
13
13
 
14
- ATTRIBUTE_NAMES = [:type, :name, :queue, :status, :dependencies, :data, :result, :error] | TIME_TRACKING_MAP.values.uniq
14
+ ATTRIBUTE_NAMES = [:type, :name, :queue, :status, :dependencies, :data, :result, :error, :connection_name] | TIME_TRACKING_MAP.values.uniq
15
15
 
16
16
  CANCELED_ERROR_MESSAGE = 'Canceled'
17
17
 
@@ -47,6 +47,10 @@ module Asynchronic
47
47
  abort! CANCELED_ERROR_MESSAGE
48
48
  end
49
49
 
50
+ def dead?
51
+ (running? && !connected?) || processes.any?(&:dead?)
52
+ end
53
+
50
54
  def destroy
51
55
  data_store.delete_cascade
52
56
  end
@@ -75,7 +79,7 @@ module Asynchronic
75
79
 
76
80
  def processes
77
81
  data_store.scoped(:processes).keys.
78
- select { |k| k.sections.count == 2 && k.match(/name$/) }.
82
+ select { |k| k.sections.count == 2 && k.match(/\|name$/) }.
79
83
  sort.map { |k| Process.new environment, id[:processes][k.remove_last] }
80
84
  end
81
85
 
@@ -208,6 +212,8 @@ module Asynchronic
208
212
  end
209
213
 
210
214
  def run
215
+ self.connection_name = Asynchronic.connection_name
216
+
211
217
  if root.aborted?
212
218
  abort!
213
219
  else
@@ -215,6 +221,7 @@ module Asynchronic
215
221
  self.result = job.call
216
222
  waiting!
217
223
  end
224
+
218
225
  rescue Exception => ex
219
226
  message = "Failed process #{type} (#{id})\n#{ex.class} #{ex.message}\n#{ex.backtrace.join("\n")}"
220
227
  Asynchronic.logger.error('Asynchronic') { message }
@@ -249,5 +256,9 @@ module Asynchronic
249
256
  parent.queue if parent
250
257
  end
251
258
 
259
+ def connected?
260
+ connection_name && environment.queue_engine.active_connections.include?(connection_name)
261
+ end
262
+
252
263
  end
253
264
  end
@@ -33,6 +33,11 @@ module Asynchronic
33
33
  true
34
34
  end
35
35
 
36
+ def active_connections
37
+ [Asynchronic.connection_name]
38
+ end
39
+
40
+
36
41
  class Queue
37
42
 
38
43
  extend Forwardable
@@ -1,17 +1,14 @@
1
1
  module Asynchronic
2
2
  module QueueEngine
3
3
  class Ost
4
-
4
+
5
5
  attr_reader :default_queue
6
6
 
7
7
  def initialize(options={})
8
- ::Ost.connect options[:redis] if options.key?(:redis)
9
- @default_queue = options[:default_queue]
8
+ @redis = Redic.new(*Array(options[:redis]))
9
+ @default_queue = options.fetch(:default_queue, Asynchronic.default_queue)
10
10
  @queues ||= Hash.new { |h,k| h[k] = Queue.new k }
11
- end
12
-
13
- def default_queue
14
- @default_queue ||= Asynchronic.default_queue
11
+ @keep_alive_thread = notify_keep_alive
15
12
  end
16
13
 
17
14
  def [](name)
@@ -19,12 +16,12 @@ module Asynchronic
19
16
  end
20
17
 
21
18
  def queues
22
- (@queues.values.map(&:key) | redis.keys('ost:*')).map { |q| q.to_s[4..-1].to_sym }
19
+ (@queues.values.map(&:key) | @redis.call('KEYS', 'ost:*')).map { |q| q.to_s[4..-1].to_sym }
23
20
  end
24
21
 
25
22
  def clear
26
23
  @queues.clear
27
- redis.keys('ost:*').each { |k| redis.del k }
24
+ @redis.call('KEYS', 'ost:*').each { |k| @redis.call('DEL', k) }
28
25
  end
29
26
 
30
27
  def listener
@@ -35,21 +32,32 @@ module Asynchronic
35
32
  true
36
33
  end
37
34
 
35
+ def active_connections
36
+ @redis.call('CLIENT', 'LIST').split("\n").map do |connection_info|
37
+ connection_info.split(' ').detect { |a| a.match(/name=/) }[5..-1]
38
+ end.uniq.reject(&:empty?)
39
+ end
40
+
38
41
  private
39
42
 
40
- def redis
41
- @redis ||= Redis.connect(::Ost.options)
43
+ def notify_keep_alive
44
+ Thread.new do
45
+ loop do
46
+ @redis.call 'CLIENT', 'SETNAME', Asynchronic.connection_name
47
+ sleep Asynchronic.keep_alive_timeout
48
+ end
49
+ end
42
50
  end
43
51
 
44
52
 
45
53
  class Queue < ::Ost::Queue
46
54
 
47
55
  def pop
48
- key.rpop
56
+ redis.call 'RPOP', key
49
57
  end
50
58
 
51
59
  def empty?
52
- !redis.exists(key)
60
+ redis.call('EXISTS', key) == 0
53
61
  end
54
62
 
55
63
  def size
@@ -68,7 +76,7 @@ module Asynchronic
68
76
  def listen(queue, &block)
69
77
  @current_queue = queue
70
78
  Asynchronic.retry_execution(self.class, 'listen') do
71
- queue.each &block
79
+ queue.each(&block)
72
80
  end
73
81
  end
74
82
 
@@ -29,6 +29,11 @@ module Asynchronic
29
29
  false
30
30
  end
31
31
 
32
+ def active_connections
33
+ [Asynchronic.connection_name]
34
+ end
35
+
36
+
32
37
  class Queue
33
38
 
34
39
  def initialize(engine)
@@ -1,3 +1,3 @@
1
1
  module Asynchronic
2
- VERSION = '1.6.3'
3
- end
2
+ VERSION = '2.0.0'
3
+ end
@@ -23,7 +23,7 @@ class Asynchronic::Worker
23
23
  end
24
24
 
25
25
  def stop
26
- Asynchronic.logger.info('Asynchronic') { "Stopping worker of #{@queue_name} (#{Process.pid})" }
26
+ Asynchronic.logger.info('Asynchronic') { "Stopping worker of #{queue_name} (#{Process.pid})" }
27
27
  listener.stop
28
28
  end
29
29
 
@@ -22,19 +22,19 @@ module DataStoreExamples
22
22
  end
23
23
 
24
24
  it 'Delete cascade' do
25
- data_store[Key[:key_1]] = 1
26
- data_store[Key[:key_1][:key_1_1]] = 2
27
- data_store[Key[:key_1][:key_1_2]] = 3
28
- data_store[Key[:key_2]] = 4
29
- data_store[Key[:key_2][:key_2_1]] = 5
30
- data_store[Key[:key_2][:key_2_2]] = 6
25
+ data_store[Asynchronic::DataStore::Key[:key_1]] = 1
26
+ data_store[Asynchronic::DataStore::Key[:key_1][:key_1_1]] = 2
27
+ data_store[Asynchronic::DataStore::Key[:key_1][:key_1_2]] = 3
28
+ data_store[Asynchronic::DataStore::Key[:key_2]] = 4
29
+ data_store[Asynchronic::DataStore::Key[:key_2][:key_2_1]] = 5
30
+ data_store[Asynchronic::DataStore::Key[:key_2][:key_2_2]] = 6
31
31
 
32
- data_store.delete_cascade Key[:key_1]
32
+ data_store.delete_cascade Asynchronic::DataStore::Key[:key_1]
33
33
 
34
34
  data_store.keys.sort.must_equal [
35
- Key[:key_2],
36
- Key[:key_2][:key_2_1],
37
- Key[:key_2][:key_2_2]
35
+ Asynchronic::DataStore::Key[:key_2],
36
+ Asynchronic::DataStore::Key[:key_2][:key_2_1],
37
+ Asynchronic::DataStore::Key[:key_2][:key_2_2]
38
38
  ]
39
39
  end
40
40
 
@@ -75,6 +75,10 @@ module MiniTest::Assertions
75
75
  process.finalized_at.must_be_instance_of Time
76
76
  end
77
77
 
78
+ def assert_have_connection_name(process)
79
+ process.connection_name.must_equal Asynchronic.connection_name
80
+ end
81
+
78
82
  end
79
83
 
80
84
  Asynchronic::QueueEngine::InMemory::Queue.infect_an_assertion :assert_enqueued, :must_enqueued
@@ -85,4 +89,5 @@ Asynchronic::Process.infect_an_assertion :assert_be_pending, :must_be_pending, :
85
89
  Asynchronic::Process.infect_an_assertion :assert_be_queued, :must_be_queued, :unary
86
90
  Asynchronic::Process.infect_an_assertion :assert_be_waiting, :must_be_waiting, :unary
87
91
  Asynchronic::Process.infect_an_assertion :assert_be_completed, :must_be_completed, :unary
88
- Asynchronic::Process.infect_an_assertion :assert_be_aborted, :must_be_aborted, :unary
92
+ Asynchronic::Process.infect_an_assertion :assert_be_aborted, :must_be_aborted, :unary
93
+ Asynchronic::Process.infect_an_assertion :assert_have_connection_name, :must_have_connection_name, :unary
@@ -64,4 +64,16 @@ describe Asynchronic, 'Facade' do
64
64
  Asynchronic.garbage_collector.must_be_instance_of Asynchronic::GarbageCollector
65
65
  end
66
66
 
67
+ it 'Redis data store sync timeout' do
68
+ Asynchronic.redis_data_store_sync_timeout.must_equal 0.01
69
+ end
70
+
71
+ it 'Keep alive timeout' do
72
+ Asynchronic.keep_alive_timeout.must_equal 0.1
73
+ end
74
+
75
+ it 'Connection name' do
76
+ Asynchronic.connection_name.must_equal "HOST=#{Socket.gethostname},PID=#{::Process.pid}"
77
+ end
78
+
67
79
  end
@@ -5,6 +5,7 @@ require 'minitest/colorin'
5
5
  require 'minitest/great_expectations'
6
6
  require 'jobs'
7
7
  require 'expectations'
8
+ require 'timeout'
8
9
  require 'pry-nav'
9
10
 
10
11
  class Module
@@ -10,17 +10,22 @@ module LifeCycleExamples
10
10
  end
11
11
 
12
12
  def create(type, params={})
13
- env.create_process type, params
13
+ env.create_process(type, params).tap do |process|
14
+ process.must_be_initialized
15
+ end
14
16
  end
15
17
 
16
18
  def execute(queue)
17
- env.load_process(queue.pop).execute
19
+ process = env.load_process(queue.pop)
20
+ process.execute
21
+ process.must_have_connection_name
22
+ process.wont_be :dead?
23
+ process.send(:connected?).must_be_true
18
24
  end
19
25
 
20
26
  it 'Basic' do
21
27
  process = create BasicJob, input: 1
22
28
 
23
- process.must_be_initialized
24
29
  process.must_have_params input: 1
25
30
  queue.must_be_empty
26
31
 
@@ -39,7 +44,6 @@ module LifeCycleExamples
39
44
  it 'Sequential' do
40
45
  process = create SequentialJob, input: 50
41
46
 
42
- process.must_be_initialized
43
47
  process.must_have_params input: 50
44
48
  queue.must_be_empty
45
49
 
@@ -77,7 +81,6 @@ module LifeCycleExamples
77
81
  it 'Graph' do
78
82
  process = create GraphJob, input: 100
79
83
 
80
- process.must_be_initialized
81
84
  process.must_have_params input: 100
82
85
  queue.must_be_empty
83
86
 
@@ -133,7 +136,6 @@ module LifeCycleExamples
133
136
  it 'Parallel' do
134
137
  process = create ParallelJob, input: 10, times: 3
135
138
 
136
- process.must_be_initialized
137
139
  process.must_have_params input: 10, times: 3
138
140
  queue.must_be_empty
139
141
 
@@ -167,7 +169,6 @@ module LifeCycleExamples
167
169
  it 'Nested' do
168
170
  process = create NestedJob, input: 4
169
171
 
170
- process.must_be_initialized
171
172
  process.must_have_params input: 4
172
173
  queue.must_be_empty
173
174
 
@@ -207,7 +208,6 @@ module LifeCycleExamples
207
208
  it 'Alias' do
208
209
  process = create AliasJob
209
210
 
210
- process.must_be_initialized
211
211
  queue.must_be_empty
212
212
 
213
213
  process.enqueue
@@ -261,7 +261,6 @@ module LifeCycleExamples
261
261
  it 'Custom queue' do
262
262
  process = create CustomQueueJob, input: 'hello'
263
263
 
264
- process.must_be_initialized
265
264
  process.must_have_params input: 'hello'
266
265
 
267
266
  env.queue(:queue_1).must_be_empty
@@ -302,7 +301,6 @@ module LifeCycleExamples
302
301
  it 'Exception' do
303
302
  process = create ExceptionJob
304
303
 
305
- process.must_be_initialized
306
304
  queue.must_be_empty
307
305
 
308
306
  process.enqueue
@@ -320,7 +318,6 @@ module LifeCycleExamples
320
318
  it 'Inner exception' do
321
319
  process = create InnerExceptionJob
322
320
 
323
- process.must_be_initialized
324
321
  queue.must_be_empty
325
322
 
326
323
  process.enqueue
@@ -348,7 +345,6 @@ module LifeCycleExamples
348
345
  it 'Forward reference' do
349
346
  process = create ForwardReferenceJob
350
347
 
351
- process.must_be_initialized
352
348
  queue.must_be_empty
353
349
 
354
350
  process.enqueue
@@ -391,7 +387,6 @@ module LifeCycleExamples
391
387
  it 'Job with retries' do
392
388
  process = create WithRetriesJob
393
389
 
394
- process.must_be_initialized
395
390
  queue.must_be_empty
396
391
 
397
392
  process.enqueue
@@ -604,7 +599,7 @@ module LifeCycleExamples
604
599
  pid_1 = process_1.id
605
600
  pid_2 = process_2.id
606
601
 
607
- data_store.keys.select { |k| k.start_with? pid_1 }.count.must_equal 37
602
+ data_store.keys.select { |k| k.start_with? pid_1 }.count.must_equal 38
608
603
  data_store.keys.select { |k| k.start_with? pid_2 }.count.must_equal 7
609
604
 
610
605
  process_1.destroy
@@ -628,8 +623,8 @@ module LifeCycleExamples
628
623
  process_1.must_be_completed
629
624
  process_2.must_be_waiting
630
625
 
631
- data_store.keys.select { |k| k.start_with? pid_1 }.count.must_equal 49
632
- data_store.keys.select { |k| k.start_with? pid_2 }.count.must_equal 37
626
+ data_store.keys.select { |k| k.start_with? pid_1 }.count.must_equal 53
627
+ data_store.keys.select { |k| k.start_with? pid_2 }.count.must_equal 38
633
628
 
634
629
  gc = Asynchronic::GarbageCollector.new env, 0.001
635
630
 
@@ -651,13 +646,12 @@ module LifeCycleExamples
651
646
  gc.start
652
647
 
653
648
  data_store.keys.select { |k| k.start_with? pid_1 }.count.must_equal 0
654
- data_store.keys.select { |k| k.start_with? pid_2 }.count.must_equal 37
649
+ data_store.keys.select { |k| k.start_with? pid_2 }.count.must_equal 38
655
650
  end
656
651
 
657
652
  it 'Before finalize hook when completed' do
658
653
  process = create BeforeFinalizeCompletedJob
659
654
 
660
- process.must_be_initialized
661
655
  queue.must_be_empty
662
656
 
663
657
  process.enqueue
@@ -675,7 +669,6 @@ module LifeCycleExamples
675
669
  it 'Before finalize hook when aborted' do
676
670
  process = create BeforeFinalizeAbortedJob
677
671
 
678
- process.must_be_initialized
679
672
  queue.must_be_empty
680
673
 
681
674
  process.enqueue
@@ -693,7 +686,6 @@ module LifeCycleExamples
693
686
  it 'Before finalize raises exception and aborts' do
694
687
  process = create BeforeFinalizeRaisesExceptionJob
695
688
 
696
- process.must_be_initialized
697
689
  queue.must_be_empty
698
690
 
699
691
  process.enqueue
@@ -711,7 +703,6 @@ module LifeCycleExamples
711
703
  it 'Before finalize raises exception on aborted job' do
712
704
  process = create BeforeFinalizeExceptionOnAbortedJob
713
705
 
714
- process.must_be_initialized
715
706
  queue.must_be_empty
716
707
 
717
708
  process.enqueue
@@ -31,17 +31,23 @@ module QueueEngineExamples
31
31
  end
32
32
 
33
33
  it 'Listener' do
34
- queue.push 'msg_1'
35
- queue.push 'msg_2'
34
+ Timeout.timeout(5) do
35
+ queue.push 'msg_1'
36
+ queue.push 'msg_2'
36
37
 
37
- messages = []
38
+ messages = []
38
39
 
39
- listener.listen(queue) do |msg|
40
- messages << msg
41
- listener.stop if queue.empty?
40
+ listener.listen(queue) do |msg|
41
+ messages << msg
42
+ listener.stop if queue.empty?
43
+ end
44
+
45
+ messages.must_equal %w(msg_1 msg_2)
42
46
  end
47
+ end
43
48
 
44
- messages.must_equal %w(msg_1 msg_2)
49
+ it 'Active connections' do
50
+ engine.active_connections.must_equal [Asynchronic.connection_name]
45
51
  end
46
52
 
47
53
  end
@@ -34,5 +34,9 @@ describe Asynchronic::QueueEngine::Synchronic do
34
34
  process.must_be_completed
35
35
  process.result.must_equal '10%' => 20, '20%' => 40
36
36
  end
37
-
37
+
38
+ it 'Active connections' do
39
+ Asynchronic.queue_engine.active_connections.must_equal [Asynchronic.connection_name]
40
+ end
41
+
38
42
  end
metadata CHANGED
@@ -1,43 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asynchronic
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.3
4
+ version: 2.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: 2019-04-05 00:00:00.000000000 Z
11
+ date: 2019-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: redis
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '3.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '3.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: ost
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '0.1'
19
+ version: '1.0'
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '0.1'
26
+ version: '1.0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: class_config
43
29
  requirement: !ruby/object:Gem::Requirement