protoboard 0.1.5 → 0.2.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 +5 -5
- data/README.md +25 -1
- data/lib/protoboard/circuit.rb +5 -0
- data/lib/protoboard/circuit_breaker.rb +15 -5
- data/lib/protoboard/circuit_proxy_factory.rb +21 -3
- data/lib/protoboard/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 26c6de613a9f52598427a885b88f3633bafbbbd9687ef8f6195245e18861dc28
|
4
|
+
data.tar.gz: f5d1a0a55487c21fe5a8c5f12c0b80ef5cac20c086ae3387bf570151a0086730
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3214c6f8b365ea31d311d8f81a2aeea9109969e630d2287bf848b1cd06299202ec389ff0adec6e63e61280c6be66d7bfd18b98cf040b845ba90b2e5667043820
|
7
|
+
data.tar.gz: d4558604304fa9456c060852719e77f84137931e659d63943ac85e8be14673d7cfac7111b45964e63944fdda49d90711fa99d9e830264cbb0baf2e68d76c3066
|
data/README.md
CHANGED
@@ -66,7 +66,7 @@ end
|
|
66
66
|
Also if you want to add more than one method in the same class and customize the circuit name:
|
67
67
|
|
68
68
|
```ruby
|
69
|
-
class
|
69
|
+
class MyFooService
|
70
70
|
include Protoboard::CircuitBreaker
|
71
71
|
|
72
72
|
register_circuits({ some_method: 'my_custom_name', other_method: 'my_other_custom_name' },
|
@@ -81,6 +81,30 @@ class Foo4
|
|
81
81
|
end
|
82
82
|
```
|
83
83
|
|
84
|
+
And you can add singleton methods to be wrapped by a circuit:
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
class MyFooService
|
88
|
+
include Protoboard::CircuitBreaker
|
89
|
+
|
90
|
+
register_circuits [:some_method, :some_singleton_method],
|
91
|
+
singleton_methods: [:some_singleton_method],
|
92
|
+
options: {
|
93
|
+
service: 'my_cool_service',
|
94
|
+
open_after: 2,
|
95
|
+
cool_off_after: 3
|
96
|
+
}
|
97
|
+
|
98
|
+
def self.some_singleton_method
|
99
|
+
# Something that can break
|
100
|
+
end
|
101
|
+
|
102
|
+
def some_method
|
103
|
+
# Something that can break
|
104
|
+
end
|
105
|
+
end
|
106
|
+
```
|
107
|
+
|
84
108
|
### Callbacks
|
85
109
|
|
86
110
|
Any callback should receive one argument that it will be an instance of `CircuitExecution` class, that object will respond to the following methods:
|
data/lib/protoboard/circuit.rb
CHANGED
@@ -20,8 +20,13 @@ module Protoboard
|
|
20
20
|
@fallback = options[:fallback]
|
21
21
|
@on_before = options.fetch(:on_before, [])
|
22
22
|
@on_after = options.fetch(:on_after, [])
|
23
|
+
@singleton_method = options.fetch(:singleton_method, false)
|
23
24
|
rescue KeyError => error
|
24
25
|
raise ArgumentError, "Missing required arguments: #{error.message}"
|
25
26
|
end
|
27
|
+
|
28
|
+
def singleton_method?
|
29
|
+
@singleton_method
|
30
|
+
end
|
26
31
|
end
|
27
32
|
end
|
@@ -28,7 +28,7 @@ module Protoboard
|
|
28
28
|
# ====
|
29
29
|
#
|
30
30
|
# * +fallback+ - A callable object with code to be executed as an alternative plan if the code of the circuit fails
|
31
|
-
def register_circuits(circuit_methods, on_before: [], on_after: [], options:, fallback: nil)
|
31
|
+
def register_circuits(circuit_methods, on_before: [], on_after: [], options:, fallback: nil, singleton_methods: [])
|
32
32
|
Protoboard::Helpers::VALIDATE_CALLBACKS.call(on_before)
|
33
33
|
Protoboard::Helpers::VALIDATE_CALLBACKS.call(on_after)
|
34
34
|
|
@@ -39,7 +39,8 @@ module Protoboard
|
|
39
39
|
fallback: fallback,
|
40
40
|
on_before: on_before,
|
41
41
|
on_after: on_after
|
42
|
-
)
|
42
|
+
),
|
43
|
+
singleton_methods
|
43
44
|
)
|
44
45
|
|
45
46
|
circuits.each do |circuit|
|
@@ -47,7 +48,10 @@ module Protoboard
|
|
47
48
|
end
|
48
49
|
|
49
50
|
proxy_module = Protoboard::CircuitBreaker.create_circuit_proxy(circuits, name)
|
50
|
-
|
51
|
+
|
52
|
+
prepend proxy_module::InstanceMethods
|
53
|
+
|
54
|
+
singleton_class.prepend proxy_module::ClassMethods
|
51
55
|
end
|
52
56
|
end
|
53
57
|
|
@@ -84,7 +88,7 @@ module Protoboard
|
|
84
88
|
|
85
89
|
##
|
86
90
|
# Creates a new +circuit+.
|
87
|
-
def create_circuits(circuit_methods,class_name, options)
|
91
|
+
def create_circuits(circuit_methods,class_name, options, singleton_methods)
|
88
92
|
circuit_hash = case circuit_methods
|
89
93
|
when Array
|
90
94
|
circuit_methods.reduce({}) do |memo, value|
|
@@ -95,8 +99,14 @@ module Protoboard
|
|
95
99
|
else
|
96
100
|
raise ArgumentError, 'Invalid input for circuit methods'
|
97
101
|
end
|
102
|
+
|
98
103
|
circuit_hash.map do |circuit_method, circuit_name|
|
99
|
-
Circuit.new({
|
104
|
+
Circuit.new({
|
105
|
+
name: circuit_name,
|
106
|
+
method_name: circuit_method,
|
107
|
+
singleton_method: singleton_methods.include?(circuit_method.to_sym)
|
108
|
+
}
|
109
|
+
.merge(options))
|
100
110
|
end
|
101
111
|
end
|
102
112
|
|
@@ -12,14 +12,32 @@ module Protoboard
|
|
12
12
|
module_name = infer_module_name(class_name, circuits.map(&:method_name))
|
13
13
|
proxy_module = Module.new
|
14
14
|
|
15
|
-
|
15
|
+
# Encapsulates instance methods in a module to be used later
|
16
|
+
instance_methods = Module.new do
|
16
17
|
circuits.each do |circuit|
|
17
|
-
|
18
|
-
|
18
|
+
unless circuit.singleton_method?
|
19
|
+
define_method(circuit.method_name) do |*args|
|
20
|
+
Protoboard.config.adapter.run_circuit(circuit) { super(*args) }
|
21
|
+
end
|
19
22
|
end
|
20
23
|
end
|
21
24
|
end
|
22
25
|
|
26
|
+
proxy_module.const_set('InstanceMethods', instance_methods)
|
27
|
+
|
28
|
+
# Encapsulates singleton methods in a module to be used later
|
29
|
+
class_methods = Module.new do
|
30
|
+
circuits.each do |circuit|
|
31
|
+
if circuit.singleton_method?
|
32
|
+
define_method(circuit.method_name) do |*args|
|
33
|
+
Protoboard.config.adapter.run_circuit(circuit) { super(*args) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
proxy_module.const_set('ClassMethods', class_methods)
|
40
|
+
|
23
41
|
Protoboard.const_set(module_name, proxy_module)
|
24
42
|
end
|
25
43
|
|
data/lib/protoboard/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protoboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carlos Atkinson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-06-
|
12
|
+
date: 2018-06-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: dry-configurable
|
@@ -163,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
163
|
version: '0'
|
164
164
|
requirements: []
|
165
165
|
rubyforge_project:
|
166
|
-
rubygems_version: 2.
|
166
|
+
rubygems_version: 2.7.3
|
167
167
|
signing_key:
|
168
168
|
specification_version: 4
|
169
169
|
summary: Protoboard abstracts the way you use Circuit Breaker allowing you to easily
|