circuit_switch 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -1
- data/README.md +9 -3
- data/lib/circuit_switch/builder.rb +66 -0
- data/lib/circuit_switch/core.rb +36 -29
- data/lib/circuit_switch/notification.rb +1 -1
- data/lib/circuit_switch/orm/active_record/circuit_switch.rb +8 -1
- data/lib/circuit_switch/stacktrace_modifier.rb +1 -1
- data/lib/circuit_switch/tasks/circuit_switch.rake +15 -15
- data/lib/circuit_switch/version.rb +1 -1
- data/lib/circuit_switch/workers/due_date_notifier.rb +1 -1
- data/lib/circuit_switch/workers/reporter.rb +12 -8
- data/lib/circuit_switch/workers/run_count_updater.rb +13 -9
- data/lib/circuit_switch.rb +29 -36
- data/lib/generators/circuit_switch/migration_generator.rb +8 -1
- data/lib/generators/circuit_switch/templates/add_key.rb.erb +13 -0
- data/lib/generators/circuit_switch/templates/initializer.rb +1 -1
- data/lib/generators/circuit_switch/templates/migration.rb.erb +1 -0
- 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: 9281021c31b4e885f3e8c8ca7fbd1fd83e713202950776c910f9b0951891a5c6
|
4
|
+
data.tar.gz: 8f4969657c64c2016724fabadd8d2cbddf063e6ffc3dd0298fb2e9e0b06e688a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94cc63d4de19ffdc4cea5a5e331af21ab458f26f5333a6ceb4b84c7b3ba13edb44ebee7c0379c555d1ea7f390e8a31cb159c35c8d181cd8dec4a16cb049507ab
|
7
|
+
data.tar.gz: 2f490f1e01f4e05351cbde8ee6fe328e200c020dcbb0d83a1f627983a47c192f4c4ab8f5c3b3878bd58e7a026003d0bd79a5995044987b275b59b6d9902f478b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
## 0.2.1
|
2
|
+
|
3
|
+
### New features
|
4
|
+
|
5
|
+
* Add `initially_closed` option to `run` and `open?`.
|
6
|
+
* Add `key` argument for easy handling for human more than caller.
|
7
|
+
To migrate, run next.
|
8
|
+
|
9
|
+
```
|
10
|
+
rails generate circuit_switch:migration add_key
|
11
|
+
rails db:migrate
|
12
|
+
```
|
13
|
+
|
14
|
+
### Changes
|
15
|
+
|
16
|
+
* Modify log level from warn to info when default value for `close_if_reach_limit` is used.
|
17
|
+
* Suppress warning that ivar is not initialized.
|
18
|
+
|
1
19
|
## 0.2.0
|
2
20
|
|
3
21
|
### Breaking Changes
|
@@ -6,7 +24,7 @@
|
|
6
24
|
|
7
25
|
## 0.1.2
|
8
26
|
|
9
|
-
* Modify `CircuitSwitch.open?`
|
27
|
+
* Modify `CircuitSwitch.open?` receives same arguments as `CircuitSwitch.run`
|
10
28
|
|
11
29
|
## 0.1.1
|
12
30
|
|
data/README.md
CHANGED
@@ -37,7 +37,7 @@ rails generate circuit_switch:install
|
|
37
37
|
```
|
38
38
|
|
39
39
|
Generate a migration for ActiveRecord.
|
40
|
-
This table saves circuit caller, called count, limit count and so on.
|
40
|
+
This table saves named key, circuit caller, called count, limit count and so on.
|
41
41
|
|
42
42
|
```
|
43
43
|
rails generate circuit_switch:migration circuit_switch
|
@@ -61,11 +61,14 @@ To switch circuit opening and closing, some conditions can be set. By default, t
|
|
61
61
|
You can also set `limit_count` to close circuit when reached the specified count. Default limit_count is 10. To change this default value, modify `circuit_switches.run_limit_count` default value in the migration file.
|
62
62
|
`run` receives optional arguments.
|
63
63
|
|
64
|
+
- `key`: [String] Named key to find switch instead of caller
|
65
|
+
If no key passed, use caller.
|
64
66
|
- `if`: [Boolean, Proc] Call proc when `if` is truthy (default: true)
|
65
67
|
- `close_if`: [Boolean, Proc] Call proc when `close_if` is falsy (default: false)
|
66
68
|
- `close_if_reach_limit`: [Boolean] Stop calling proc when run count reaches limit (default: false)
|
67
69
|
- `limit_count`: [Integer] Limit count. Use `run_limit_count` default value if it's nil (default: nil)
|
68
70
|
Can't be set 0 when `close_if_reach_limit` is true
|
71
|
+
- `initially_closed`: [Boolean] Create switch with terminated mode (default: false)
|
69
72
|
|
70
73
|
To close the circuit at specific date or when called 1000 times, code goes like:
|
71
74
|
|
@@ -106,6 +109,8 @@ CircuitSwitch.report(if: some_condition)
|
|
106
109
|
Same as `run`, some conditions can be set. By default, reporting is stopped when reached the specified count. The default count is 10. To change this default value, modify `circuit_switches.report_limit_count` default value in the migration file.
|
107
110
|
`report` receives optional arguments.
|
108
111
|
|
112
|
+
- `key`: [String] Named key to find switch instead of caller
|
113
|
+
If no key passed, use caller.
|
109
114
|
- `if`: [Boolean, Proc] Report when `if` is truthy (default: true)
|
110
115
|
- `stop_report_if`: [Boolean, Proc] Report when `close_if` is falsy (default: false)
|
111
116
|
- `stop_report_if_reach_limit`: [Boolean] Stop reporting when reported count reaches limit (default: true)
|
@@ -131,10 +136,11 @@ called_path: /app/services/greetings_service:21 block in validate
|
|
131
136
|
|
132
137
|
## Task
|
133
138
|
|
134
|
-
When find a problem and you want to terminate running or reporting right now, execute a task with it's caller.
|
139
|
+
When find a problem and you want to terminate running or reporting right now, execute a task with it's caller.
|
140
|
+
You can specify either key or caller.
|
135
141
|
|
136
142
|
```
|
137
|
-
rake circuit_switch:terminate_to_run[
|
143
|
+
rake circuit_switch:terminate_to_run[your_key]
|
138
144
|
rake circuit_switch:terminate_to_report[/app/services/greetings_service:21 block in validate]
|
139
145
|
```
|
140
146
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative 'core'
|
2
|
+
|
3
|
+
module CircuitSwitch
|
4
|
+
class Builder < Core
|
5
|
+
def initialize
|
6
|
+
super
|
7
|
+
@run = false
|
8
|
+
@reported = false
|
9
|
+
end
|
10
|
+
|
11
|
+
def assign_runner(
|
12
|
+
key: nil,
|
13
|
+
if: true,
|
14
|
+
close_if: false,
|
15
|
+
close_if_reach_limit: nil,
|
16
|
+
limit_count: nil,
|
17
|
+
initially_closed: false
|
18
|
+
)
|
19
|
+
@key = key
|
20
|
+
@run_if = binding.local_variable_get(:if)
|
21
|
+
@close_if = close_if
|
22
|
+
@close_if_reach_limit = close_if_reach_limit
|
23
|
+
@run_limit_count = limit_count
|
24
|
+
@initially_closed = initially_closed
|
25
|
+
end
|
26
|
+
|
27
|
+
def assign_reporter(
|
28
|
+
key: nil,
|
29
|
+
if: true,
|
30
|
+
stop_report_if: false,
|
31
|
+
stop_report_if_reach_limit: true,
|
32
|
+
limit_count: nil
|
33
|
+
)
|
34
|
+
@key = key
|
35
|
+
@report_if = binding.local_variable_get(:if)
|
36
|
+
@stop_report_if = stop_report_if
|
37
|
+
@stop_report_if_reach_limit = stop_report_if_reach_limit
|
38
|
+
@report_limit_count = limit_count
|
39
|
+
end
|
40
|
+
|
41
|
+
def run(key: nil, if: nil, close_if: nil, close_if_reach_limit: nil, limit_count: nil, initially_closed: nil, &block)
|
42
|
+
arguments = {
|
43
|
+
key: key,
|
44
|
+
if: binding.local_variable_get(:if),
|
45
|
+
close_if: close_if,
|
46
|
+
close_if_reach_limit: close_if_reach_limit,
|
47
|
+
limit_count: limit_count,
|
48
|
+
initially_closed: initially_closed,
|
49
|
+
}.select { |_, v| v }
|
50
|
+
assign_runner(**arguments)
|
51
|
+
execute_run(&block)
|
52
|
+
end
|
53
|
+
|
54
|
+
def report(key: nil, if: nil, stop_report_if: nil, stop_report_if_reach_limit: nil, limit_count: nil)
|
55
|
+
arguments = {
|
56
|
+
key: key,
|
57
|
+
if: binding.local_variable_get(:if),
|
58
|
+
stop_report_if: stop_report_if,
|
59
|
+
stop_report_if_reach_limit: stop_report_if_reach_limit,
|
60
|
+
limit_count: limit_count
|
61
|
+
}.select { |_, v| v }
|
62
|
+
assign_reporter(**arguments)
|
63
|
+
execute_report
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/circuit_switch/core.rb
CHANGED
@@ -1,54 +1,55 @@
|
|
1
|
+
require_relative 'notification'
|
2
|
+
require_relative 'workers/reporter'
|
3
|
+
require_relative 'workers/run_count_updater'
|
4
|
+
|
1
5
|
module CircuitSwitch
|
2
6
|
class Core
|
3
7
|
delegate :config, to: ::CircuitSwitch
|
8
|
+
attr_reader :key, :run_if, :close_if, :close_if_reach_limit, :run_limit_count, :initially_closed,
|
9
|
+
:report_if, :stop_report_if, :stop_report_if_reach_limit, :report_limit_count
|
4
10
|
|
5
|
-
def
|
6
|
-
if
|
7
|
-
close_if: false,
|
8
|
-
close_if_reach_limit: nil,
|
9
|
-
limit_count: nil,
|
10
|
-
&block
|
11
|
-
)
|
12
|
-
if close_if_reach_limit && limit_count == 0
|
11
|
+
def execute_run(&block)
|
12
|
+
if close_if_reach_limit && run_limit_count == 0
|
13
13
|
raise CircuitSwitchError.new('Can\'t set limit_count to 0 when close_if_reach_limit is true')
|
14
14
|
end
|
15
15
|
if close_if_reach_limit.nil?
|
16
|
-
Logger.new($stdout).
|
17
|
-
close_if_reach_limit = false
|
16
|
+
Logger.new($stdout).info('Default value for close_if_reach_limit is modified from true to false at ver 0.2.0.')
|
17
|
+
@close_if_reach_limit = false
|
18
18
|
end
|
19
|
-
|
20
|
-
return self if
|
19
|
+
|
20
|
+
return self if evaluate(close_if) || !evaluate(run_if)
|
21
|
+
return self if close_if_reach_limit && switch.reached_run_limit?(run_limit_count)
|
21
22
|
return self if switch.run_is_terminated?
|
22
23
|
|
23
|
-
|
24
|
+
unless switch.new_record? && initially_closed
|
25
|
+
yield
|
26
|
+
@run = true
|
27
|
+
end
|
24
28
|
RunCountUpdater.perform_later(
|
25
|
-
|
29
|
+
key: key,
|
30
|
+
limit_count: run_limit_count,
|
26
31
|
called_path: called_path,
|
27
|
-
reported: reported
|
32
|
+
reported: reported?,
|
33
|
+
initially_closed: initially_closed
|
28
34
|
)
|
29
|
-
@run = true
|
30
35
|
self
|
31
36
|
end
|
32
37
|
|
33
|
-
def
|
34
|
-
if: true,
|
35
|
-
stop_report_if: false,
|
36
|
-
stop_report_if_reach_limit: true,
|
37
|
-
limit_count: nil
|
38
|
-
)
|
38
|
+
def execute_report
|
39
39
|
if config.reporter.nil?
|
40
40
|
raise CircuitSwitchError.new('Set config.reporter.')
|
41
41
|
end
|
42
|
-
if stop_report_if_reach_limit &&
|
42
|
+
if stop_report_if_reach_limit && report_limit_count == 0
|
43
43
|
raise CircuitSwitchError.new('Can\'t set limit_count to 0 when stop_report_if_reach_limit is true')
|
44
44
|
end
|
45
45
|
return self unless config.enable_report?
|
46
|
-
return self if evaluate(stop_report_if) || !evaluate(
|
46
|
+
return self if evaluate(stop_report_if) || !evaluate(report_if)
|
47
47
|
return self if switch.report_is_terminated?
|
48
|
-
return self if stop_report_if_reach_limit && switch.reached_report_limit?(
|
48
|
+
return self if stop_report_if_reach_limit && switch.reached_report_limit?(report_limit_count)
|
49
49
|
|
50
50
|
Reporter.perform_later(
|
51
|
-
|
51
|
+
key: key,
|
52
|
+
limit_count: report_limit_count,
|
52
53
|
called_path: called_path,
|
53
54
|
run: run?
|
54
55
|
)
|
@@ -58,18 +59,24 @@ module CircuitSwitch
|
|
58
59
|
|
59
60
|
# @return [Boolean]
|
60
61
|
def run?
|
61
|
-
|
62
|
+
@run
|
62
63
|
end
|
63
64
|
|
64
65
|
# @return [Boolean]
|
65
66
|
def reported?
|
66
|
-
|
67
|
+
@reported
|
67
68
|
end
|
68
69
|
|
69
70
|
private
|
70
71
|
|
71
72
|
def switch
|
72
|
-
@switch
|
73
|
+
return @switch if defined? @switch
|
74
|
+
|
75
|
+
if key
|
76
|
+
@switch = CircuitSwitch.find_or_initialize_by(key: key)
|
77
|
+
else
|
78
|
+
@switch = CircuitSwitch.find_or_initialize_by(caller: called_path)
|
79
|
+
end
|
73
80
|
end
|
74
81
|
|
75
82
|
def called_path
|
@@ -1,5 +1,11 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
1
3
|
module CircuitSwitch
|
2
4
|
class CircuitSwitch < ::ActiveRecord::Base
|
5
|
+
after_initialize do |switch|
|
6
|
+
switch.key ||= switch.caller
|
7
|
+
end
|
8
|
+
|
3
9
|
def assign(run_limit_count: nil, report_limit_count: nil)
|
4
10
|
self.run_limit_count = run_limit_count if run_limit_count
|
5
11
|
self.report_limit_count = report_limit_count if report_limit_count
|
@@ -31,7 +37,8 @@ module CircuitSwitch
|
|
31
37
|
end
|
32
38
|
|
33
39
|
def message
|
34
|
-
|
40
|
+
process = key == caller ? 'Watching process' : "Process for '#{key}'"
|
41
|
+
"#{process} is called for #{report_count}th. Report until for #{report_limit_count}th."
|
35
42
|
end
|
36
43
|
|
37
44
|
private
|
@@ -1,40 +1,40 @@
|
|
1
1
|
namespace :circuit_switch do
|
2
2
|
desc 'Update run_is_terminated to true to close circuit'
|
3
|
-
task :terminate_to_run, ['
|
4
|
-
|
5
|
-
puts "Start to update run_is_terminated of circuit_switch for '#{
|
3
|
+
task :terminate_to_run, ['key_or_caller'] => :environment do |_, arg|
|
4
|
+
key_or_caller = arg[:key_or_caller]
|
5
|
+
puts "Start to update run_is_terminated of circuit_switch for '#{key_or_caller}' to true."
|
6
6
|
sleep(3)
|
7
7
|
|
8
|
-
switch = CircuitSwitch::CircuitSwitch.find_by!(caller:
|
8
|
+
switch = CircuitSwitch::CircuitSwitch.find_by(key: key_or_caller) || CircuitSwitch::CircuitSwitch.find_by!(caller: key_or_caller)
|
9
9
|
puts "circuit_switch is found. id: #{switch.id}."
|
10
10
|
|
11
11
|
switch.update(run_is_terminated: true)
|
12
|
-
puts "Updated run_is_terminated of circuit_switch for '#{
|
12
|
+
puts "Updated run_is_terminated of circuit_switch for '#{key_or_caller}' to true."
|
13
13
|
end
|
14
14
|
|
15
15
|
desc 'Update report_is_terminated to true to stop reporting'
|
16
|
-
task :terminate_to_report, ['
|
17
|
-
|
18
|
-
puts "Start to update report_is_terminated of circuit_switch for '#{
|
16
|
+
task :terminate_to_report, ['key_or_caller'] => :environment do |_, arg|
|
17
|
+
key_or_caller = arg[:key_or_caller]
|
18
|
+
puts "Start to update report_is_terminated of circuit_switch for '#{key_or_caller}' to true."
|
19
19
|
sleep(3)
|
20
20
|
|
21
|
-
switch = CircuitSwitch::CircuitSwitch.find_by!(caller:
|
21
|
+
switch = CircuitSwitch::CircuitSwitch.find_by(key: key_or_caller) || CircuitSwitch::CircuitSwitch.find_by!(caller: key_or_caller)
|
22
22
|
puts "circuit_switch is found. id: #{switch.id}."
|
23
23
|
|
24
24
|
switch.update(report_is_terminated: true)
|
25
|
-
puts "Updated report_is_terminated of circuit_switch for '#{
|
25
|
+
puts "Updated report_is_terminated of circuit_switch for '#{key_or_caller}' to true."
|
26
26
|
end
|
27
27
|
|
28
28
|
desc 'Delete switch'
|
29
|
-
task :delete_switch, ['
|
30
|
-
|
31
|
-
puts "Start to delete circuit_switch for '#{
|
29
|
+
task :delete_switch, ['key_or_caller'] => :environment do |_, arg|
|
30
|
+
key_or_caller = arg[:key_or_caller]
|
31
|
+
puts "Start to delete circuit_switch for '#{key_or_caller}'."
|
32
32
|
sleep(3)
|
33
33
|
|
34
|
-
switch = CircuitSwitch::CircuitSwitch.find_by!(caller:
|
34
|
+
switch = CircuitSwitch::CircuitSwitch.find_by(key: key_or_caller) || CircuitSwitch::CircuitSwitch.find_by!(caller: key_or_caller)
|
35
35
|
puts "circuit_switch is found. id: #{switch.id}."
|
36
36
|
|
37
37
|
switch.destroy!
|
38
|
-
puts "Successfully deleted circuit_switch for '#{
|
38
|
+
puts "Successfully deleted circuit_switch for '#{key_or_caller}'."
|
39
39
|
end
|
40
40
|
end
|
@@ -10,7 +10,7 @@ module CircuitSwitch
|
|
10
10
|
circuit_switches = CircuitSwitch.where('due_date <= ?', Date.today).order(id: :asc)
|
11
11
|
if circuit_switches.present?
|
12
12
|
message = "Due date has come! Let's consider about removing switches and cleaning up code! :)\n" +
|
13
|
-
circuit_switches.map { |switch| "id: #{switch.id}, caller: '#{switch.caller}'
|
13
|
+
circuit_switches.map { |switch| "id: #{switch.id}, key: '#{switch.key}', caller: '#{switch.caller}', created_at: #{switch.created_at}" }.join("\n")
|
14
14
|
config.due_date_notifier.call(message)
|
15
15
|
else
|
16
16
|
switches_count = CircuitSwitch.all.size
|
@@ -1,16 +1,20 @@
|
|
1
|
+
require 'active_job'
|
2
|
+
require 'active_support/core_ext/module/delegation'
|
3
|
+
|
1
4
|
module CircuitSwitch
|
2
5
|
class Reporter < ::ActiveJob::Base
|
3
6
|
delegate :config, to: ::CircuitSwitch
|
4
7
|
|
5
|
-
def perform(limit_count:, called_path:, run:)
|
6
|
-
circuit_switch
|
7
|
-
if run
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
CircuitSwitch.find_or_initialize_by(caller: called_path)
|
8
|
+
def perform(key:, limit_count:, called_path:, run:)
|
9
|
+
# Wait for RunCountUpdater saves circuit_switch
|
10
|
+
sleep(3) if run
|
11
|
+
|
12
|
+
circuit_switch = key ? CircuitSwitch.find_by(key: key) : CircuitSwitch.find_by(caller: called_path)
|
13
|
+
if run && circuit_switch.nil?
|
14
|
+
raise ActiveRecord::RecordNotFound.new('Couldn\'t find CircuitSwitch::CircuitSwitch')
|
13
15
|
end
|
16
|
+
|
17
|
+
circuit_switch ||= CircuitSwitch.new(key: key, caller: called_path)
|
14
18
|
circuit_switch.due_date ||= config.due_date
|
15
19
|
circuit_switch.assign(report_limit_count: limit_count).increment_report_count
|
16
20
|
raise CalledNotification.new(circuit_switch.message)
|
@@ -1,16 +1,20 @@
|
|
1
|
+
require 'active_job'
|
2
|
+
require 'active_support/core_ext/module/delegation'
|
3
|
+
|
1
4
|
module CircuitSwitch
|
2
5
|
class RunCountUpdater < ::ActiveJob::Base
|
3
6
|
delegate :config, to: ::CircuitSwitch
|
4
7
|
|
5
|
-
def perform(limit_count:, called_path:, reported:)
|
6
|
-
circuit_switch
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
def perform(key:, limit_count:, called_path:, reported:, initially_closed:)
|
9
|
+
# Wait for Reporter saves circuit_switch
|
10
|
+
sleep(3) if reported
|
11
|
+
|
12
|
+
circuit_switch = key ? CircuitSwitch.find_by(key: key) : CircuitSwitch.find_by(caller: called_path)
|
13
|
+
if reported && circuit_switch.nil?
|
14
|
+
raise ActiveRecord::RecordNotFound.new('Couldn\'t find CircuitSwitch::CircuitSwitch')
|
15
|
+
end
|
16
|
+
|
17
|
+
circuit_switch ||= CircuitSwitch.new(key: key, caller: called_path, run_is_terminated: initially_closed)
|
14
18
|
circuit_switch.due_date ||= config.due_date
|
15
19
|
circuit_switch.assign(run_limit_count: limit_count).increment_run_count
|
16
20
|
end
|
data/lib/circuit_switch.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require "circuit_switch/workers/due_date_notifier"
|
8
|
-
require "circuit_switch/workers/reporter"
|
9
|
-
require "circuit_switch/workers/run_count_updater"
|
1
|
+
require_relative 'circuit_switch/configuration'
|
2
|
+
require_relative 'circuit_switch/builder'
|
3
|
+
require_relative 'circuit_switch/orm/active_record/circuit_switch'
|
4
|
+
require_relative 'circuit_switch/railtie' if defined?(Rails::Railtie)
|
5
|
+
require_relative 'circuit_switch/version'
|
6
|
+
require_relative 'circuit_switch/workers/due_date_notifier'
|
10
7
|
|
11
8
|
module CircuitSwitch
|
12
9
|
class << self
|
@@ -18,73 +15,69 @@ module CircuitSwitch
|
|
18
15
|
@config ||= Configuration.new
|
19
16
|
end
|
20
17
|
|
18
|
+
# @param key [String] Named key to find switch instead of caller
|
21
19
|
# @param if [Boolean, Proc] Call proc when `if` is truthy (default: true)
|
22
20
|
# @param close_if [Boolean, Proc] Call proc when `close_if` is falsy (default: false)
|
23
21
|
# @param close_if_reach_limit [Boolean] Stop calling proc when run count reaches limit (default: false)
|
24
22
|
# @param limit_count [Integer] Limit count. Use `run_limit_count` default value if it's nil
|
25
23
|
# Can't be set 0 when `close_if_reach_limit` is true (default: nil)
|
24
|
+
# @param initially_closed [Boolean] Create switch with terminated mode (default: false)
|
26
25
|
# @param [Proc] block
|
27
|
-
def run(
|
28
|
-
|
29
|
-
|
30
|
-
close_if_reach_limit: nil,
|
31
|
-
limit_count: nil,
|
32
|
-
&block
|
33
|
-
)
|
34
|
-
Core.new.run(
|
26
|
+
def run(key: nil, if: nil, close_if: nil, close_if_reach_limit: nil, limit_count: nil, initially_closed: nil, &block)
|
27
|
+
arguments = {
|
28
|
+
key: key,
|
35
29
|
if: binding.local_variable_get(:if),
|
36
30
|
close_if: close_if,
|
37
31
|
close_if_reach_limit: close_if_reach_limit,
|
38
32
|
limit_count: limit_count,
|
39
|
-
|
40
|
-
|
33
|
+
initially_closed: initially_closed,
|
34
|
+
}.select { |_, v| v }
|
35
|
+
Builder.new.run(**arguments, &block)
|
41
36
|
end
|
42
37
|
|
38
|
+
# @param key [String] Named key to find switch instead of caller
|
43
39
|
# @param if [Boolean, Proc] Report when `if` is truthy (default: true)
|
44
40
|
# @param stop_report_if [Boolean, Proc] Report when `close_if` is falsy (default: false)
|
45
41
|
# @param stop_report_if_reach_limit [Boolean] Stop reporting when reported count reaches limit (default: true)
|
46
42
|
# @param limit_count [Integer] Limit count. Use `report_limit_count` default value if it's nil
|
47
43
|
# Can't be set 0 when `stop_report_if_reach_limit` is true (default: nil)
|
48
|
-
def report(
|
49
|
-
if: true,
|
50
|
-
stop_report_if: false,
|
51
|
-
stop_report_if_reach_limit: true,
|
52
|
-
limit_count: nil
|
53
|
-
)
|
44
|
+
def report(key: nil, if: nil, stop_report_if: nil, stop_report_if_reach_limit: nil, limit_count: nil)
|
54
45
|
if block_given?
|
55
46
|
raise ArgumentError.new('CircuitSwitch.report doesn\'t receive block. Use CircuitSwitch.run if you want to pass block.')
|
56
47
|
end
|
57
48
|
|
58
|
-
|
49
|
+
arguments = {
|
50
|
+
key: key,
|
59
51
|
if: binding.local_variable_get(:if),
|
60
52
|
stop_report_if: stop_report_if,
|
61
53
|
stop_report_if_reach_limit: stop_report_if_reach_limit,
|
62
54
|
limit_count: limit_count
|
63
|
-
|
55
|
+
}.select { |_, v| v }
|
56
|
+
Builder.new.report(**arguments)
|
64
57
|
end
|
65
58
|
|
66
59
|
# Syntax sugar for `CircuitSwitch.run`
|
60
|
+
# @param key [String] Named key to find switch instead of caller
|
67
61
|
# @param if [Boolean, Proc] `CircuitSwitch.run` is runnable when `if` is truthy (default: true)
|
68
62
|
# @param close_if [Boolean, Proc] `CircuitSwitch.run` is runnable when `close_if` is falsy (default: false)
|
69
63
|
# @param close_if_reach_limit [Boolean] `CircuitSwitch.run` is NOT runnable when run count reaches limit (default: true)
|
70
64
|
# @param limit_count [Integer] Limit count. Use `run_limit_count` default value if it's nil. Can't be set 0 (default: nil)
|
65
|
+
# @param initially_closed [Boolean] Create switch with terminated mode (default: false)
|
71
66
|
# @return [Boolean]
|
72
|
-
def open?(
|
73
|
-
if: true,
|
74
|
-
close_if: false,
|
75
|
-
close_if_reach_limit: true,
|
76
|
-
limit_count: nil
|
77
|
-
)
|
67
|
+
def open?(key: nil, if: nil, close_if: nil, close_if_reach_limit: nil, limit_count: nil, initially_closed: nil)
|
78
68
|
if block_given?
|
79
69
|
raise ArgumentError.new('CircuitSwitch.open doesn\'t receive block. Use CircuitSwitch.run if you want to pass block.')
|
80
70
|
end
|
81
71
|
|
82
|
-
|
72
|
+
arguments = {
|
73
|
+
key: key,
|
83
74
|
if: binding.local_variable_get(:if),
|
84
75
|
close_if: close_if,
|
85
76
|
close_if_reach_limit: close_if_reach_limit,
|
86
|
-
limit_count: limit_count
|
87
|
-
|
77
|
+
limit_count: limit_count,
|
78
|
+
initially_closed: initially_closed,
|
79
|
+
}.select { |_, v| v }
|
80
|
+
Builder.new.run(**arguments) {}.run?
|
88
81
|
end
|
89
82
|
end
|
90
83
|
end
|
@@ -4,9 +4,16 @@ module CircuitSwitch
|
|
4
4
|
class MigrationGenerator < ActiveRecord::Generators::Base
|
5
5
|
desc 'Create a migration to manage circuit switches state'
|
6
6
|
source_root File.expand_path('templates', __dir__)
|
7
|
+
argument :migration_type, required: false, type: :array, default: ['create'],
|
8
|
+
desc: 'Type of migration to create or add key column. By default to create.',
|
9
|
+
banner: 'create or add_key'
|
7
10
|
|
8
11
|
def generate_migration
|
9
|
-
|
12
|
+
if migration_type == ['add_key']
|
13
|
+
migration_template 'add_key.rb.erb', 'db/migrate/add_key_to_circuit_switches.rb', migration_version: migration_version
|
14
|
+
else
|
15
|
+
migration_template 'migration.rb.erb', 'db/migrate/create_circuit_switches.rb', migration_version: migration_version
|
16
|
+
end
|
10
17
|
end
|
11
18
|
|
12
19
|
def migration_version
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class AddKeyToCircuitSwitches < ActiveRecord::Migration<%= migration_version %>
|
2
|
+
def up
|
3
|
+
add_column :circuit_switches, :key, :string, after: :id
|
4
|
+
CircuitSwitch::CircuitSwitch.all.each { |switch| switch.update_column(:key, switch.caller) }
|
5
|
+
change_column_null :circuit_switches, :key, false
|
6
|
+
add_index :circuit_switches, :key
|
7
|
+
end
|
8
|
+
|
9
|
+
def down
|
10
|
+
remove_index :circuit_switches, :key
|
11
|
+
remove_column :circuit_switches, :key
|
12
|
+
end
|
13
|
+
end
|
@@ -29,7 +29,7 @@ CircuitSwitch.configure do |config|
|
|
29
29
|
# You may be want backtrace when report to plain feed; e.g. Slack or email.
|
30
30
|
# config.with_backtrace = false
|
31
31
|
|
32
|
-
#
|
32
|
+
# Allowed backtrace paths to report
|
33
33
|
# Specify with `with_backtrace` option.
|
34
34
|
# Allowed all paths when set `[]`.
|
35
35
|
# config.allowed_backtrace_paths = [Dir.pwd]
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class CreateCircuitSwitches < ActiveRecord::Migration<%= migration_version %>
|
2
2
|
def change
|
3
3
|
create_table :circuit_switches do |t|
|
4
|
+
t.string :key, null: false, index: true
|
4
5
|
t.string :caller, null: false
|
5
6
|
t.integer :run_count, default: 0, null: false
|
6
7
|
t.integer :run_limit_count, default: 10, null: false
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: circuit_switch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- makicamel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activejob
|
@@ -114,6 +114,7 @@ files:
|
|
114
114
|
- bin/setup
|
115
115
|
- circuit_switch.gemspec
|
116
116
|
- lib/circuit_switch.rb
|
117
|
+
- lib/circuit_switch/builder.rb
|
117
118
|
- lib/circuit_switch/configuration.rb
|
118
119
|
- lib/circuit_switch/core.rb
|
119
120
|
- lib/circuit_switch/notification.rb
|
@@ -128,6 +129,7 @@ files:
|
|
128
129
|
- lib/circuit_switch/workers/run_count_updater.rb
|
129
130
|
- lib/generators/circuit_switch/install_generator.rb
|
130
131
|
- lib/generators/circuit_switch/migration_generator.rb
|
132
|
+
- lib/generators/circuit_switch/templates/add_key.rb.erb
|
131
133
|
- lib/generators/circuit_switch/templates/initializer.rb
|
132
134
|
- lib/generators/circuit_switch/templates/migration.rb.erb
|
133
135
|
homepage: https://github.com/makicamel/circuit_switch
|