breaker_machines 0.17.0-aarch64-linux → 0.19.0-aarch64-linux

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: 590bb281467ca287bc7c2d181f50d7c4ee1568c215cc548dd28be7ae8efe8947
4
- data.tar.gz: 6259e545296cf0dba23de4eaebaf8941e232fc55cdc743b545a8a31a8f224341
3
+ metadata.gz: 487a558aca59fd540c58f62522a0a17fb4d09dd9b7be651dc2287b641d5234ab
4
+ data.tar.gz: a107fb51fe5bca08c6cee529a52c67318a59f93f152ba1cbcf56ff1485392e8c
5
5
  SHA512:
6
- metadata.gz: 45fb558408a2686f7f4c837c884e4c63baa2111a1464c46c9af9c54c076310fdf70644917526c646faae0860438632886d6ffb4bdbbd55e1d4943523bfaefa5a
7
- data.tar.gz: 4e9090ce87896c889d7e135536fa01d7373f97ab8447813cf06dfc6d972465361ebf4dbac1c5f8379538c8d5a9e406617b9643042f8632a01e0cc882b6ec46b5
6
+ metadata.gz: f269384b44021356303e1b28d3068a3f2a47b90d4a35b318724b8bb15710a8e49ea1e5755260eb23b0b85e0b8ac92409ab0baeb2646fe7603f1116f88a93bd12
7
+ data.tar.gz: fc91de78c041680da7aca666462fa2a6b3ad6c3eed09eadce3f1edc20c21dbb16cceae15a4e3fad9c3047ff9a19a153c8c9366b9a7d7d37c66ff4c679b6804c8
@@ -11,11 +11,11 @@ module BreakerMachines
11
11
  include Circuit::AsyncStateManagement
12
12
 
13
13
  # Additional async-specific methods
14
- def call_async(&block)
14
+ def call_async(&)
15
15
  require 'async' unless defined?(::Async)
16
16
 
17
17
  Async do
18
- call(&block)
18
+ call(&)
19
19
  end
20
20
  end
21
21
 
@@ -57,23 +57,15 @@ module BreakerMachines
57
57
 
58
58
  # Execute a block with circuit breaker protection
59
59
  #
60
+ # Admission, the open -> half-open cooldown, and half-open probe limits run
61
+ # in the native circuit. A StandardError counts as a failure and is
62
+ # re-raised; other exceptions and throw/break pass through uncounted.
63
+ #
60
64
  # @yield Block to execute
61
65
  # @return Result of the block
62
- # @raise [CircuitOpenError] if circuit is open
63
- def call
64
- raise CircuitOpenError, "Circuit '#{@name}' is open" if open?
65
-
66
- start_time = BreakerMachines.monotonic_time
67
- begin
68
- result = yield
69
- duration = BreakerMachines.monotonic_time - start_time
70
- @native_circuit.record_success(duration)
71
- result
72
- rescue StandardError => _e
73
- duration = BreakerMachines.monotonic_time - start_time
74
- @native_circuit.record_failure(duration)
75
- raise
76
- end
66
+ # @raise [CircuitOpenError] if circuit is open or its probe slots are taken
67
+ def call(&)
68
+ @native_circuit.call(&)
77
69
  end
78
70
 
79
71
  # Check if circuit is open
@@ -88,8 +80,14 @@ module BreakerMachines
88
80
  @native_circuit.is_closed
89
81
  end
90
82
 
83
+ # Check if circuit is half-open (probing for recovery)
84
+ # @return [Boolean]
85
+ def half_open?
86
+ @native_circuit.is_half_open
87
+ end
88
+
91
89
  # Get current state name
92
- # @return [String] 'open' or 'closed'
90
+ # @return [String] 'closed', 'open', or 'half_open'
93
91
  def state
94
92
  @native_circuit.state_name
95
93
  end
@@ -160,7 +160,7 @@ module BreakerMachines
160
160
  @config[:exceptions] = exceptions
161
161
  end
162
162
 
163
- def fiber_safe(enabled = true) # rubocop:disable Style/OptionalBooleanParameter
163
+ def fiber_safe(enabled = true)
164
164
  @config[:fiber_safe] = enabled
165
165
  end
166
166
 
@@ -39,12 +39,12 @@ module BreakerMachines
39
39
  end
40
40
  end
41
41
 
42
- def circuit(name, &block)
42
+ def circuit(name, &)
43
43
  @circuits ||= {}
44
44
 
45
45
  if block_given?
46
46
  builder = DSL::CircuitBuilder.new
47
- builder.instance_eval(&block)
47
+ builder.instance_eval(&)
48
48
  @circuits[name] = builder.config
49
49
  end
50
50
 
@@ -52,12 +52,12 @@ module BreakerMachines
52
52
  end
53
53
 
54
54
  # Define a cascading circuit breaker that can trip dependent circuits
55
- def cascade_circuit(name, &block)
55
+ def cascade_circuit(name, &)
56
56
  @circuits ||= {}
57
57
 
58
58
  if block_given?
59
59
  builder = DSL::CascadingCircuitBuilder.new
60
- builder.instance_eval(&block)
60
+ builder.instance_eval(&)
61
61
  @circuits[name] = builder.config.merge(circuit_type: :cascading)
62
62
  end
63
63
 
@@ -81,12 +81,12 @@ module BreakerMachines
81
81
  end
82
82
 
83
83
  # Define reusable circuit templates
84
- def circuit_template(name, &block)
84
+ def circuit_template(name, &)
85
85
  @circuit_templates ||= {}
86
86
 
87
87
  if block_given?
88
88
  builder = DSL::CircuitBuilder.new
89
- builder.instance_eval(&block)
89
+ builder.instance_eval(&)
90
90
  @circuit_templates[name] = builder.config
91
91
  end
92
92
 
@@ -60,7 +60,7 @@ module BreakerMachines
60
60
  end
61
61
 
62
62
  # Force open a circuit by name
63
- def force_open(name) # rubocop:disable Naming/PredicateMethod
63
+ def force_open(name)
64
64
  circuits = find_by_name(name)
65
65
  return false if circuits.empty?
66
66
 
@@ -69,7 +69,7 @@ module BreakerMachines
69
69
  end
70
70
 
71
71
  # Force close a circuit by name
72
- def force_close(name) # rubocop:disable Naming/PredicateMethod
72
+ def force_close(name)
73
73
  circuits = find_by_name(name)
74
74
  return false if circuits.empty?
75
75
 
@@ -78,7 +78,7 @@ module BreakerMachines
78
78
  end
79
79
 
80
80
  # Reset a circuit by name
81
- def reset(name) # rubocop:disable Naming/PredicateMethod
81
+ def reset(name)
82
82
  circuits = find_by_name(name)
83
83
  return false if circuits.empty?
84
84
 
@@ -80,7 +80,7 @@ module BreakerMachines
80
80
 
81
81
  private
82
82
 
83
- def execute_with_fallback(method, *args, **kwargs)
83
+ def execute_with_fallback(method, *, **kwargs)
84
84
  chain_started_at = BreakerMachines.monotonic_time
85
85
  attempted_backends = []
86
86
 
@@ -100,9 +100,9 @@ module BreakerMachines
100
100
 
101
101
  result = backend.with_timeout(config[:timeout]) do
102
102
  if kwargs.any?
103
- backend.send(method, *args, **kwargs)
103
+ backend.send(method, *, **kwargs)
104
104
  else
105
- backend.send(method, *args)
105
+ backend.send(method, *)
106
106
  end
107
107
  end
108
108
 
@@ -58,10 +58,12 @@ module BreakerMachines
58
58
  timestamp: current_time
59
59
  }
60
60
 
61
- # Clean old events periodically (every 100 events)
62
- return unless events.size > 100
61
+ # Keep 5 minutes of history. Events are appended oldest first, so only
62
+ # scan once the oldest has aged out; scanning on every write made each
63
+ # write O(n) once more than 100 events were retained.
64
+ cutoff_time = current_time - 300
65
+ return unless events.size > 100 && events.first[:timestamp] < cutoff_time
63
66
 
64
- cutoff_time = current_time - 300 # Keep 5 minutes of history
65
67
  events.delete_if { |e| e[:timestamp] < cutoff_time }
66
68
  end
67
69
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BreakerMachines
4
- VERSION = '0.17.0'
4
+ VERSION = '0.19.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: breaker_machines
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.19.0
5
5
  platform: aarch64-linux
6
6
  authors:
7
7
  - Abdelkader Boudih
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-09-14 00:00:00.000000000 Z
11
+ date: 2026-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.2'
33
+ version: '0.9'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.2'
40
+ version: '0.9'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: concurrent-ruby
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: state_machines
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.200.0
61
+ version: '0.202'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.200.0
68
+ version: '0.202'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: zeitwerk
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -179,8 +179,7 @@ files:
179
179
  - lib/breaker_machines/storage/null.rb
180
180
  - lib/breaker_machines/types.rb
181
181
  - lib/breaker_machines/version.rb
182
- - lib/breaker_machines_native/3.4/breaker_machines_native.so
183
- - lib/breaker_machines_native/4.0/breaker_machines_native.so
182
+ - lib/breaker_machines_native/breaker_machines_native.so
184
183
  - sig/README.md
185
184
  - sig/all.rbs
186
185
  - sig/breaker_machines.rbs
@@ -212,7 +211,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
212
211
  requirements:
213
212
  - - ">="
214
213
  - !ruby/object:Gem::Version
215
- version: '3.4'
214
+ version: '4.0'
216
215
  - - "<"
217
216
  - !ruby/object:Gem::Version
218
217
  version: 4.1.dev