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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc63638fb76dc139c10b9ed53d61e020f7288bbd13f3bed9c4e5129b93c016c9
4
- data.tar.gz: e61aae19d4fd6f1023be007ed77a2edf333a922fe0ab522ea533175e975ce941
3
+ metadata.gz: cb04be405f37c5acf9a5fa5ed21ba327bb92168cc6f830dc52314356ccbfd4dd
4
+ data.tar.gz: cabf17aba3c7c80939b95d5af80e48cb6fcc8c4260f2278386e3952b2128a59f
5
5
  SHA512:
6
- metadata.gz: f236962918393d4f1a8c81edec667564fc862825940a0ef30e33053d1d1061017172b14cb407eb87177ea1db41471de9c7abafb0648ebd63183b107df1ad3604
7
- data.tar.gz: e453ea4cdcd0161d0159dfeaec1931e43dbd992120ecb57953935517d28072a79338a731feb1be660108dd24f3bb376f66f013de3c1653d08a5e4f756ecc0b7e
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.5.1'
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, &task)
18
- @instance = rails_wrapped { delay_on(executor, *args, &task) }
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, &task)
18
- @instance = rails_wrapped { future_on(executor, *args, &task) }
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
- permit_concurrent_loads do
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
- @instance = rails_wrapped do
25
- instance.public_send(method, executor, *args, &task)
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 = permit_concurrent_loads { instance.__send__(:wait_until_resolved, timeout) }
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 do
47
- @instance = instance.__send__(:"#{method}_using", executor, *args, &callback_task)
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 do
55
- @instance = instance.__send__(:add_callback, "callback_#{method}", args, callback_task)
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
@@ -2,5 +2,8 @@
2
2
 
3
3
  module ConcurrentRails
4
4
  class Railtie < ::Rails::Railtie
5
+ initializer "concurrent_rails.executor_hooks" do |app|
6
+ # TODO: Add something here at some point
7
+ end
5
8
  end
6
9
  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
@@ -9,7 +9,7 @@ module ConcurrentRails
9
9
  define_method(test_mode) do |&task|
10
10
  @execution_mode = test_mode
11
11
  result = task.call
12
- @execution_mode = :real
12
+ @execution_mode = "real"
13
13
 
14
14
  result
15
15
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ConcurrentRails
4
- VERSION = "0.7.1"
4
+ VERSION = "0.8.0"
5
5
  end
@@ -5,5 +5,4 @@ require "zeitwerk"
5
5
  loader = Zeitwerk::Loader.for_gem
6
6
  loader.setup
7
7
 
8
- module ConcurrentRails
9
- end
8
+ module ConcurrentRails; end
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.7.1
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.2
81
+ rubygems_version: 4.0.8
80
82
  specification_version: 4
81
83
  summary: Multithread is hard
82
84
  test_files: []