exceptional_synchrony 1.3.0 → 1.4.1

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: d067a2b3a9635740dbee2374a06e772c29ca9a8fe57a61108c94118ac15480bb
4
- data.tar.gz: 665f4bf8ccc1ea699c0d56a4f7d38647c2e3e64e814b736562bf83b69ccd0d25
3
+ metadata.gz: 5c1805d12af62c0dac803b64eadb0e7b21efa614f5c10600d75280649a7d2a0e
4
+ data.tar.gz: 89f0a7ededf02acc4f84df65df03880af40edc4e41d0f930244262067ab10961
5
5
  SHA512:
6
- metadata.gz: 9961b1ef53acfb4c94651611871b120279dab3b3564e1841b199a7b2fa1f7a3728bca945517f50964704b0491f9a086192cb857a3205c6008758ecb51a4fb9c5
7
- data.tar.gz: 0a4d64204faf45276aaca59757ad43bb850c75ea668671e92eae251721a19c6b2ce0ecae5b3bb38c8a64179ba41d0b0864bf1a6640de4e234c4c772434bcfca0
6
+ metadata.gz: cab5a438cdef3a5e1682912e500b79eff2d11992e351070064b167df9125d305429a26f153dc2aa33923695970584b06da731b7220c50b230e3e4a202a49ce99
7
+ data.tar.gz: 18fca7c2d477146a3886b66abb32a2c43d5125f220c45f8d71c47f4ed4d2d28f8fbf98257cb396033a8223e9e26ea8d35ae110e2d7e88ffe0a17d148a9a594bc
data/CHANGELOG.md CHANGED
@@ -6,6 +6,15 @@ Note: This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0
6
6
 
7
7
  All notable changes to this project will be documented in this file.
8
8
 
9
+ ## [1.4.1] - 2021-03-09
10
+ ### Fixed
11
+ - FaradayAdapterPatch_v1 name typo
12
+
13
+ ## [1.4.0] - 2021-03-08
14
+ ### Added
15
+ - Added use of Thread local variable to indicate when Eventmachine is running using EM::Synchrony
16
+ - Added faraday gem monkey patch to use the new Thread local variable to choose the adapter to use
17
+
9
18
  ## [1.3.0] - 2021-02-04
10
19
  ### Added
11
20
  - Extend `EMP.defer` to have a new keyword argument, `wait_for_result` for the callers to control whether they should should block until the background thread returns. To preserve existing behavior, this option defaults to `true`, so `EMP.defer` will block in order to return the value (or raise an exception) from the deferred block. Callers can pass `wait_for_result: false` if they do not want to block.
@@ -24,6 +33,8 @@ All notable changes to this project will be documented in this file.
24
33
  ## [1.1.1] - 2020-05-03
25
34
  - Replace hobo_support with invoca_utils
26
35
 
36
+ [1.4.1]: https://github.com/Invoca/exceptional_synchrony/compare/v1.4.0...v1.4.1
37
+ [1.4.0]: https://github.com/Invoca/exceptional_synchrony/compare/v1.3.0...v1.4.0
27
38
  [1.3.0]: https://github.com/Invoca/exceptional_synchrony/compare/v1.2.0...v1.3.0
28
39
  [1.2.0]: https://github.com/Invoca/exceptional_synchrony/compare/v1.1.1...v1.2.0
29
40
  [1.1.1]: https://github.com/Invoca/exceptional_synchrony/compare/v1.1.0...v1.1.1
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- exceptional_synchrony (1.3.0)
4
+ exceptional_synchrony (1.4.1)
5
5
  em-http-request
6
6
  em-synchrony
7
7
  eventmachine
@@ -11,30 +11,30 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- actionmailer (6.1.1)
15
- actionpack (= 6.1.1)
16
- actionview (= 6.1.1)
17
- activejob (= 6.1.1)
18
- activesupport (= 6.1.1)
14
+ actionmailer (6.1.3)
15
+ actionpack (= 6.1.3)
16
+ actionview (= 6.1.3)
17
+ activejob (= 6.1.3)
18
+ activesupport (= 6.1.3)
19
19
  mail (~> 2.5, >= 2.5.4)
20
20
  rails-dom-testing (~> 2.0)
21
- actionpack (6.1.1)
22
- actionview (= 6.1.1)
23
- activesupport (= 6.1.1)
21
+ actionpack (6.1.3)
22
+ actionview (= 6.1.3)
23
+ activesupport (= 6.1.3)
24
24
  rack (~> 2.0, >= 2.0.9)
25
25
  rack-test (>= 0.6.3)
26
26
  rails-dom-testing (~> 2.0)
27
27
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
28
- actionview (6.1.1)
29
- activesupport (= 6.1.1)
28
+ actionview (6.1.3)
29
+ activesupport (= 6.1.3)
30
30
  builder (~> 3.1)
31
31
  erubi (~> 1.4)
32
32
  rails-dom-testing (~> 2.0)
33
33
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
34
- activejob (6.1.1)
35
- activesupport (= 6.1.1)
34
+ activejob (6.1.3)
35
+ activesupport (= 6.1.3)
36
36
  globalid (>= 0.3.6)
37
- activesupport (6.1.1)
37
+ activesupport (6.1.3)
38
38
  concurrent-ruby (~> 1.0, >= 1.0.2)
39
39
  i18n (>= 1.6, < 2)
40
40
  minitest (>= 5.1)
@@ -64,19 +64,21 @@ GEM
64
64
  em-synchrony (1.0.6)
65
65
  eventmachine (>= 1.0.0.beta.1)
66
66
  erubi (1.10.0)
67
+ escalate (0.3.0)
67
68
  eventmachine (1.2.7)
68
- exception_handling (2.8.1)
69
+ exception_handling (2.9.0)
69
70
  actionmailer (>= 4.2, < 7.0)
70
71
  actionpack (>= 4.2, < 7.0)
71
72
  activesupport (>= 4.2, < 7.0)
72
73
  contextual_logger (~> 0.7)
74
+ escalate (~> 0.2)
73
75
  eventmachine (~> 1.0)
74
76
  invoca-utils (~> 0.3)
75
77
  globalid (0.4.2)
76
78
  activesupport (>= 4.2.0)
77
79
  hashdiff (1.0.1)
78
80
  http_parser.rb (0.6.0)
79
- i18n (1.8.7)
81
+ i18n (1.8.9)
80
82
  concurrent-ruby (~> 1.0)
81
83
  invoca-utils (0.4.1)
82
84
  json (2.5.1)
@@ -87,15 +89,13 @@ GEM
87
89
  mini_mime (>= 0.1.1)
88
90
  method_source (1.0.0)
89
91
  mini_mime (1.0.2)
90
- mini_portile2 (2.5.0)
91
92
  minitest (5.14.0)
92
93
  minitest-reporters (1.4.2)
93
94
  ansi
94
95
  builder
95
96
  minitest (>= 5.0)
96
97
  ruby-progressbar
97
- nokogiri (1.11.1)
98
- mini_portile2 (~> 2.5.0)
98
+ nokogiri (1.11.1-x86_64-darwin)
99
99
  racc (~> 1.4)
100
100
  pry (0.13.1)
101
101
  coderay (~> 1.1)
@@ -3,6 +3,7 @@
3
3
  require 'eventmachine'
4
4
  require 'em-http'
5
5
  require 'em-synchrony/em-http'
6
+ require_relative 'faraday_monkey_patch'
6
7
 
7
8
  module ExceptionalSynchrony
8
9
  # It is important for this exception to be inherited from Exception so that
@@ -62,6 +63,7 @@ module ExceptionalSynchrony
62
63
  def stop
63
64
  @proxy_class.stop
64
65
  @proxy_class.next_tick { } #Fake out EventMachine's epoll mechanism so we don't block until timers fire
66
+ Thread.current.thread_variable_set(:em_synchrony_reactor_thread, false)
65
67
  end
66
68
 
67
69
  def defers_finished?
@@ -72,6 +74,7 @@ module ExceptionalSynchrony
72
74
  @proxy_class.connect(server, port, handler, *args, &block)
73
75
  end
74
76
 
77
+ # This method starts the EventMachine reactor.
75
78
  # The on_error option has these possible values:
76
79
  # :log - log any rescued StandardError exceptions and continue
77
80
  # :raise - raise FatalRunError for any rescued StandardError exceptions
@@ -136,6 +139,7 @@ module ExceptionalSynchrony
136
139
  def run_with_error_logging(&block)
137
140
  ensure_completely_safe("run_with_error_logging") do
138
141
  if @proxy_class.respond_to?(:synchrony)
142
+ Thread.current.thread_variable_set(:em_synchrony_reactor_thread, true)
139
143
  @proxy_class.synchrony(&block)
140
144
  else
141
145
  @proxy_class.run(&block)
@@ -148,6 +152,7 @@ module ExceptionalSynchrony
148
152
 
149
153
  rescue_exceptions_and_ensure_exit("run_with_error_raising") do
150
154
  if @proxy_class.respond_to?(:synchrony)
155
+ Thread.current.thread_variable_set(:em_synchrony_reactor_thread, true)
151
156
  @proxy_class.synchrony(&run_block)
152
157
  else
153
158
  @proxy_class.run(&run_block)
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Monkey patch for the Faraday method that creates the adapter used for a connection.
4
+ # If the thread local variable :em_synchrony_reactor_thread is true, it overrides this method
5
+ # in order to force use of the :em_synchrony adapter rather than the :net_http adapter.
6
+ # This ensures that the Eventmachine reactor does not get blocked by connection i/o.
7
+ begin
8
+ require 'faraday'
9
+
10
+ module ExceptionalSynchrony
11
+ # Patch built relative to faraday v0.17.3
12
+ module FaradayAdapterPatch_v0
13
+ def adapter(key, *args, &block)
14
+
15
+ # BEGIN PATCH
16
+ if key == :net_http && Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
17
+ key = :em_synchrony
18
+ end
19
+ # END PATCH
20
+
21
+ use_symbol(Faraday::Adapter, key, *args, &block)
22
+ end
23
+ end
24
+
25
+ # Patch built relative to faraday v1.3.0 although the ruby2_keywords prefix
26
+ # was dropped from the adapter method definition to simplify this code
27
+ module FaradayAdapterPatch_v1
28
+ def adapter(klass = NO_ARGUMENT, *args, &block)
29
+ return @adapter if klass == NO_ARGUMENT
30
+
31
+ klass = Faraday::Adapter.lookup_middleware(klass) if klass.is_a?(Symbol)
32
+
33
+ # BEGIN PATCH
34
+ if klass == Faraday::Adapter::NetHttp && Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
35
+ klass = Faraday::Adapter::EMSynchrony
36
+ end
37
+ # END PATCH
38
+
39
+ @adapter = self.class::Handler.new(klass, *args, &block)
40
+ end
41
+ end
42
+ end
43
+
44
+ if Faraday::VERSION.start_with?("0")
45
+ Faraday::RackBuilder.prepend ExceptionalSynchrony::FaradayAdapterPatch_v0
46
+ else
47
+ Faraday::RackBuilder.prepend ExceptionalSynchrony::FaradayAdapterPatch_v1
48
+ end
49
+
50
+ rescue LoadError
51
+ # Monkey patch is not needed if faraday is not available
52
+ end
@@ -1,3 +1,3 @@
1
1
  module ExceptionalSynchrony
2
- VERSION = '1.3.0'
2
+ VERSION = '1.4.1'
3
3
  end
@@ -64,6 +64,14 @@ describe ExceptionalSynchrony::EventMachineProxy do
64
64
  @em.stop
65
65
  end
66
66
 
67
+ it "should set thread variable :em_synchrony_reactor_thread running to false when stop" do
68
+ @em.run do
69
+ assert_equal true, Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
70
+ @em.stop
71
+ assert_equal false, Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
72
+ end
73
+ end
74
+
67
75
  it "should proxy connect" do
68
76
  ServerClass = Class.new
69
77
  mock(EventMachine).connect(ServerClass, 8080, :handler, :extra_arg).yields(:called)
@@ -171,6 +179,10 @@ describe ExceptionalSynchrony::EventMachineProxy do
171
179
  end
172
180
 
173
181
  describe "without error" do
182
+ before do
183
+ Thread.current.thread_variable_set(:em_synchrony_reactor_thread, nil)
184
+ end
185
+
174
186
  [:log, :raise].each do |on_error|
175
187
  describe "when using #{method} and on_error = #{on_error}" do
176
188
  it "should dispatch to the proxy's synchrony method instead of run iff synchrony" do
@@ -178,6 +190,15 @@ describe ExceptionalSynchrony::EventMachineProxy do
178
190
  assert_equal method, (@proxy.run(on_error: on_error) { dispatched = true })
179
191
  assert_equal true, dispatched
180
192
  end
193
+
194
+ if method == :synchrony
195
+ it "should set thread variable :em_synchrony_reactor_thread running to true" do
196
+ assert_nil Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
197
+ @proxy.run(on_error: on_error) do
198
+ assert_equal true, Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
199
+ end
200
+ end
201
+ end
181
202
  end
182
203
  end
183
204
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exceptional_synchrony
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Invoca
@@ -101,6 +101,7 @@ files:
101
101
  - lib/exceptional_synchrony.rb
102
102
  - lib/exceptional_synchrony/callback_exceptions.rb
103
103
  - lib/exceptional_synchrony/event_machine_proxy.rb
104
+ - lib/exceptional_synchrony/faraday_monkey_patch.rb
104
105
  - lib/exceptional_synchrony/limited_work_queue.rb
105
106
  - lib/exceptional_synchrony/parallel_sync.rb
106
107
  - lib/exceptional_synchrony/version.rb