concurrent_rails 0.7.1 → 0.8.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/README.md +1 -1
- data/lib/concurrent_rails/combinator_adapter.rb +31 -0
- data/lib/concurrent_rails/delay_adapter.rb +3 -2
- data/lib/concurrent_rails/future_adapter.rb +3 -2
- data/lib/concurrent_rails/promises.rb +10 -19
- data/lib/concurrent_rails/railtie.rb +3 -0
- data/lib/concurrent_rails/schedule_adapter.rb +24 -0
- data/lib/concurrent_rails/testing.rb +1 -1
- data/lib/concurrent_rails/version.rb +1 -1
- data/lib/concurrent_rails.rb +1 -2
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cb04be405f37c5acf9a5fa5ed21ba327bb92168cc6f830dc52314356ccbfd4dd
|
|
4
|
+
data.tar.gz: cabf17aba3c7c80939b95d5af80e48cb6fcc8c4260f2278386e3952b2128a59f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 971b987e34b8eb5142d05f774368cec64e363c4c7ecd23555dcd594b8631d4237c85ab969a5392c184ed7a727c78c13586876e1ce6b629ae86bf865ac1ccec1d
|
|
7
|
+
data.tar.gz: 575157aae6f247f68672327689b7396804d63e1b78162f68a73be51ac56a818039bb40c8af765c5481dbf2b557fb4cee884d93aaf5949ea744ba9599aeb99479
|
data/README.md
CHANGED
|
@@ -127,7 +127,7 @@ For more information on how Futures works and how Rails handles multithread chec
|
|
|
127
127
|
Add this line to your application's Gemfile:
|
|
128
128
|
|
|
129
129
|
```ruby
|
|
130
|
-
gem 'concurrent_rails', '~> 0.
|
|
130
|
+
gem 'concurrent_rails', '~> 0.7'
|
|
131
131
|
```
|
|
132
132
|
|
|
133
133
|
And then execute:
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ConcurrentRails
|
|
4
|
+
module CombinatorAdapter
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
class_methods do
|
|
8
|
+
def zip(*promises)
|
|
9
|
+
new(:io).tap { |p| p.instance_variable_set(:@instance, Concurrent::Promises.zip(*unwrap(promises))) }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def any_resolved_future(*promises)
|
|
13
|
+
new(:io).tap { |p| p.instance_variable_set(:@instance, Concurrent::Promises.any_resolved_future(*unwrap(promises))) }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def fulfilled_future(value, executor = :io)
|
|
17
|
+
new(executor).tap { |p| p.instance_variable_set(:@instance, Concurrent::Promises.fulfilled_future(value)) }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def rejected_future(reason, executor = :io)
|
|
21
|
+
new(executor).tap { |p| p.instance_variable_set(:@instance, Concurrent::Promises.rejected_future(reason)) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def unwrap(promises)
|
|
27
|
+
promises.map { |p| p.is_a?(ConcurrentRails::Promises) ? p.__send__(:instance) : p }
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -14,8 +14,9 @@ module ConcurrentRails
|
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def delay_on_rails(*args
|
|
18
|
-
|
|
17
|
+
def delay_on_rails(*args)
|
|
18
|
+
wrapped_task = proc { |*a| rails_wrapped { yield(*a) } }
|
|
19
|
+
@instance = delay_on(executor, *args, &wrapped_task)
|
|
19
20
|
|
|
20
21
|
self
|
|
21
22
|
end
|
|
@@ -14,8 +14,9 @@ module ConcurrentRails
|
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def future_on_rails(*args
|
|
18
|
-
|
|
17
|
+
def future_on_rails(*args)
|
|
18
|
+
wrapped_task = proc { |*a| rails_wrapped { yield(*a) } }
|
|
19
|
+
@instance = future_on(executor, *args, &wrapped_task)
|
|
19
20
|
|
|
20
21
|
self
|
|
21
22
|
end
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
module ConcurrentRails
|
|
4
4
|
class Promises
|
|
5
5
|
include Concurrent::Promises::FactoryMethods
|
|
6
|
+
include ConcurrentRails::CombinatorAdapter
|
|
6
7
|
include ConcurrentRails::DelayAdapter
|
|
7
8
|
include ConcurrentRails::FutureAdapter
|
|
9
|
+
include ConcurrentRails::ScheduleAdapter
|
|
8
10
|
|
|
9
11
|
def initialize(executor)
|
|
10
12
|
@executor = executor
|
|
@@ -12,18 +14,15 @@ module ConcurrentRails
|
|
|
12
14
|
|
|
13
15
|
%i[value value!].each do |method_name|
|
|
14
16
|
define_method(method_name) do |timeout = nil, timeout_value = nil|
|
|
15
|
-
|
|
16
|
-
instance.public_send(method_name, timeout, timeout_value)
|
|
17
|
-
end
|
|
17
|
+
rails_wrapped { instance.public_send(method_name, timeout, timeout_value) }
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
%i[then chain].each do |chainable|
|
|
22
22
|
define_method(chainable) do |*args, &task|
|
|
23
23
|
method = "#{chainable}_on"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
end
|
|
24
|
+
wrapped_task = proc { |*a| rails_wrapped { task.call(*a) } }
|
|
25
|
+
@instance = instance.public_send(method, executor, *args, &wrapped_task)
|
|
27
26
|
|
|
28
27
|
self
|
|
29
28
|
end
|
|
@@ -36,24 +35,22 @@ module ConcurrentRails
|
|
|
36
35
|
end
|
|
37
36
|
|
|
38
37
|
def wait(timeout = nil)
|
|
39
|
-
result =
|
|
38
|
+
result = rails_wrapped { instance.__send__(:wait_until_resolved, timeout) }
|
|
40
39
|
|
|
41
40
|
timeout ? result : self
|
|
42
41
|
end
|
|
43
42
|
|
|
44
43
|
%i[on_fulfillment on_rejection on_resolution].each do |method|
|
|
45
44
|
define_method(method) do |*args, &callback_task|
|
|
46
|
-
rails_wrapped
|
|
47
|
-
|
|
48
|
-
end
|
|
45
|
+
wrapped_callback = proc { |*a| rails_wrapped { callback_task.call(*a) } }
|
|
46
|
+
@instance = instance.__send__(:"#{method}_using", executor, *args, &wrapped_callback)
|
|
49
47
|
|
|
50
48
|
self
|
|
51
49
|
end
|
|
52
50
|
|
|
53
51
|
define_method(:"#{method}!") do |*args, &callback_task|
|
|
54
|
-
rails_wrapped
|
|
55
|
-
|
|
56
|
-
end
|
|
52
|
+
wrapped_callback = proc { |*a| rails_wrapped { callback_task.call(*a) } }
|
|
53
|
+
@instance = instance.__send__(:add_callback, "callback_#{method}", args, wrapped_callback)
|
|
57
54
|
|
|
58
55
|
self
|
|
59
56
|
end
|
|
@@ -69,12 +66,6 @@ module ConcurrentRails
|
|
|
69
66
|
Rails.application.executor.wrap(&)
|
|
70
67
|
end
|
|
71
68
|
|
|
72
|
-
def permit_concurrent_loads(&block)
|
|
73
|
-
rails_wrapped do
|
|
74
|
-
ActiveSupport::Dependencies.interlock.permit_concurrent_loads(&block)
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
69
|
attr_reader :instance
|
|
79
70
|
end
|
|
80
71
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ConcurrentRails
|
|
4
|
+
module ScheduleAdapter
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
class_methods do
|
|
8
|
+
def schedule(delay, *args, &task)
|
|
9
|
+
schedule_on(:io, delay, *args, &task)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def schedule_on(executor, delay, *args, &task)
|
|
13
|
+
new(executor).schedule_on_rails(delay, *args, &task)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def schedule_on_rails(delay, *args)
|
|
18
|
+
wrapped_task = proc { |*a| rails_wrapped { yield(*a) } }
|
|
19
|
+
@instance = schedule_on(executor, delay, *args, &wrapped_task)
|
|
20
|
+
|
|
21
|
+
self
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/concurrent_rails.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: concurrent_rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.8.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Luiz Eduardo Kowalski
|
|
@@ -48,10 +48,12 @@ files:
|
|
|
48
48
|
- README.md
|
|
49
49
|
- Rakefile
|
|
50
50
|
- lib/concurrent_rails.rb
|
|
51
|
+
- lib/concurrent_rails/combinator_adapter.rb
|
|
51
52
|
- lib/concurrent_rails/delay_adapter.rb
|
|
52
53
|
- lib/concurrent_rails/future_adapter.rb
|
|
53
54
|
- lib/concurrent_rails/promises.rb
|
|
54
55
|
- lib/concurrent_rails/railtie.rb
|
|
56
|
+
- lib/concurrent_rails/schedule_adapter.rb
|
|
55
57
|
- lib/concurrent_rails/testing.rb
|
|
56
58
|
- lib/concurrent_rails/version.rb
|
|
57
59
|
homepage: https://github.com/luizkowalski/concurrent_rails
|
|
@@ -76,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
76
78
|
- !ruby/object:Gem::Version
|
|
77
79
|
version: '0'
|
|
78
80
|
requirements: []
|
|
79
|
-
rubygems_version: 4.0.
|
|
81
|
+
rubygems_version: 4.0.8
|
|
80
82
|
specification_version: 4
|
|
81
83
|
summary: Multithread is hard
|
|
82
84
|
test_files: []
|