sc4ry 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/.rubocop.yml +47 -0
- data/Gemfile +9 -8
- data/README.md +254 -55
- data/Rakefile +32 -25
- data/VERSION +1 -1
- data/assets/images/sc4ry_workflow.png +0 -0
- data/bin/console +4 -3
- data/lib/sc4ry/backends/init.rb +3 -1
- data/lib/sc4ry/backends/memory.rb +16 -18
- data/lib/sc4ry/backends/redis.rb +59 -62
- data/lib/sc4ry/circuits.rb +111 -105
- data/lib/sc4ry/config.rb +89 -81
- data/lib/sc4ry/constants.rb +50 -46
- data/lib/sc4ry/dependencies.rb +3 -3
- data/lib/sc4ry/exceptions.rb +36 -42
- data/lib/sc4ry/exporters/init.rb +3 -1
- data/lib/sc4ry/helpers.rb +29 -34
- data/lib/sc4ry/logger.rb +24 -23
- data/lib/sc4ry/notifiers/init.rb +34 -33
- data/lib/sc4ry/notifiers/mattermost.rb +37 -38
- data/lib/sc4ry/notifiers/prometheus.rb +15 -19
- data/lib/sc4ry/run_controller.rb +23 -30
- data/lib/sc4ry/store.rb +45 -39
- data/lib/sc4ry/version.rb +2 -1
- data/lib/sc4ry.rb +3 -9
- data/samples/test.rb +159 -0
- data/sc4ry.gemspec +19 -19
- metadata +23 -22
- data/ultragreen_roodi_coding_convention.yml +0 -25
data/lib/sc4ry/config.rb
CHANGED
@@ -1,91 +1,99 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Sc4ry module
|
2
4
|
# @note namespace
|
3
5
|
module Sc4ry
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
# Sc4ry::Config module
|
7
|
+
# @note namespace
|
8
|
+
module Config
|
9
|
+
# Configuration validator for Sc4ry default and circuits configuration
|
10
|
+
# @private
|
11
|
+
class Validator
|
12
|
+
# accessor on Circuit definition given for validation
|
13
|
+
attr_reader :input
|
10
14
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@input = definition
|
30
|
-
end
|
31
|
-
|
32
|
-
# Validation method, alter by reference the config attribut
|
33
|
-
# @raise ConfigError if un unknown key is given in definition to merge.
|
34
|
-
def validate!
|
35
|
-
unknown_keys = @input.keys.difference @config.keys
|
36
|
-
raise ConfigError::new("Unknown keys in config set : #{unknown_keys.to_s}") unless unknown_keys.empty?
|
37
|
-
validate_formats
|
38
|
-
@config.merge! @input
|
39
|
-
format_exceptions
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
# Validation private sub method
|
44
|
-
# @raise ConfigError if proposed values haven't the good format and deeply in array
|
45
|
-
def validate_formats
|
46
|
-
@input.each do |spec,value|
|
47
|
-
raise ConfigError::new("#{spec} value #{DEFAULT_CONFIG_FORMATS[spec][:desc]}") unless DEFAULT_CONFIG_FORMATS[spec][:proc].call(value)
|
48
|
-
if DEFAULT_CONFIG_FORMATS[spec].include? :list then
|
49
|
-
value.each do |item|
|
50
|
-
raise ConfigError::new("#{spec} value must be in #{DEFAULT_CONFIG_FORMATS[spec][:list]}") unless DEFAULT_CONFIG_FORMATS[spec][:list].include? item
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# adapter for exception key in config String to Constant Class Name if need
|
57
|
-
# @note by reference
|
58
|
-
def format_exceptions
|
59
|
-
@config[:exceptions].map! {|item| item = (item.class == String)? Object.const_get(item) : item }
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
15
|
+
# accessor on circuit initial definition from default config or given in construction by from keyword
|
16
|
+
# @note altered by reference to final result mapping with {#validate!}
|
17
|
+
attr_reader :config
|
18
|
+
|
19
|
+
def result
|
20
|
+
@config
|
21
|
+
end
|
22
|
+
|
23
|
+
include Sc4ry::Constants
|
24
|
+
include Sc4ry::Exceptions
|
25
|
+
# Validator constructor
|
26
|
+
# @param [Hash] definition the config hash to merge and validate
|
27
|
+
# @param [Hash] from config hash merged on origin (default : the Sc4ry base config from Constants )
|
28
|
+
# @return [Validator] a new instance of Validator
|
29
|
+
def initialize(definition:, from: DEFAULT_CONFIG)
|
30
|
+
@config = from
|
31
|
+
@input = definition
|
32
|
+
end
|
63
33
|
|
64
|
-
|
65
|
-
|
66
|
-
|
34
|
+
# Validation method, alter by reference the config attribut
|
35
|
+
# @raise ConfigError if un unknown key is given in definition to merge.
|
36
|
+
def validate!
|
37
|
+
unknown_keys = @input.keys.difference @config.keys
|
38
|
+
raise ConfigError, "Unknown keys in config set : #{unknown_keys}" unless unknown_keys.empty?
|
67
39
|
|
68
|
-
|
40
|
+
validate_formats
|
41
|
+
@config.merge! @input
|
42
|
+
format_exceptions
|
43
|
+
end
|
69
44
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
45
|
+
private
|
46
|
+
|
47
|
+
# Validation private sub method
|
48
|
+
# @raise ConfigError if proposed values haven't the good format and deeply in array
|
49
|
+
def validate_formats
|
50
|
+
@input.each do |spec, value|
|
51
|
+
unless DEFAULT_CONFIG_FORMATS[spec][:proc].call(value)
|
52
|
+
raise ConfigError,
|
53
|
+
"#{spec} value #{DEFAULT_CONFIG_FORMATS[spec][:desc]}"
|
54
|
+
end
|
55
|
+
|
56
|
+
next unless DEFAULT_CONFIG_FORMATS[spec].include? :list
|
57
|
+
|
58
|
+
value.each do |item|
|
59
|
+
unless DEFAULT_CONFIG_FORMATS[spec][:list].include? item
|
60
|
+
raise ConfigError,
|
61
|
+
"#{spec} value must be in #{DEFAULT_CONFIG_FORMATS[spec][:list]}"
|
87
62
|
end
|
63
|
+
end
|
88
64
|
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# adapter for exception key in config String to Constant Class Name if need
|
68
|
+
# @note by reference
|
69
|
+
def format_exceptions
|
70
|
+
@config[:exceptions].map! { |item| item.instance_of?(String) ? Object.const_get(item) : item }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Config Data mapper for block yielding methods for configuration
|
75
|
+
# @note work for/with {Sc4ry::Circuits.configure} and {Sc4ry::Circuits.register} when block given
|
76
|
+
class ConfigMapper
|
77
|
+
include Sc4ry::Constants
|
89
78
|
|
79
|
+
# config from given definition passed in constructor
|
80
|
+
attr_reader :config
|
81
|
+
|
82
|
+
# the mapping constructor from a given definition or the default From Sc4ry config (Constant)
|
83
|
+
# @param [Hash] definition a config hash
|
84
|
+
# @note creating dynamically accessors on config record given in definition
|
85
|
+
def initialize(definition: DEFAULT_CONFIG)
|
86
|
+
@config = definition
|
87
|
+
@config.each do |key, _value|
|
88
|
+
define_singleton_method "#{key}=".to_sym do |val|
|
89
|
+
key = __method__.to_s.chop.to_sym
|
90
|
+
@config[key] = val
|
91
|
+
end
|
92
|
+
define_singleton_method key do
|
93
|
+
return @config[__method__]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
90
97
|
end
|
91
|
-
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/sc4ry/constants.rb
CHANGED
@@ -1,51 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Sc4ry module
|
2
4
|
# @note namespace
|
3
5
|
module Sc4ry
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
CURRENT_NOTIFIERS = [:prometheus, :mattermost]
|
10
|
-
|
11
|
-
# the Sc4ry default config entries and values
|
12
|
-
DEFAULT_CONFIG = {
|
13
|
-
:max_failure_count => 5,
|
14
|
-
:timeout_value => 20,
|
15
|
-
:timeout => false,
|
16
|
-
:max_timeout_count => 5,
|
17
|
-
:max_time => 10,
|
18
|
-
:max_overtime_count => 3,
|
19
|
-
:check_delay => 30,
|
20
|
-
:notifiers => [],
|
21
|
-
:forward_unknown_exceptions => true,
|
22
|
-
:raise_on_opening => false,
|
23
|
-
:exceptions => [StandardError, RuntimeError]
|
24
|
-
}
|
6
|
+
# Sc4ry::Constants module
|
7
|
+
# @note namespace
|
8
|
+
module Constants
|
9
|
+
# notifiers available in Sc4ry natively
|
10
|
+
CURRENT_NOTIFIERS = %i[prometheus mattermost]
|
25
11
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
:list => CURRENT_NOTIFIERS},
|
41
|
-
:forward_unknown_exceptions => {:proc => Proc::new {|item| [true,false].include? item}, :desc => "must be a Boolean"},
|
42
|
-
:raise_on_opening => {:proc => Proc::new {|item| [true,false].include? item}, :desc => "must be a Boolean"},
|
43
|
-
:exceptions => {
|
44
|
-
:proc => Proc::new {|item| item.class == Array and item.select {|val|
|
45
|
-
[Class,String].include? val.class}.size == item.size
|
46
|
-
},
|
47
|
-
:desc => "must be an Array of Exception(Class) or String"}
|
48
|
-
}
|
12
|
+
# the Sc4ry default config entries and values
|
13
|
+
DEFAULT_CONFIG = {
|
14
|
+
max_failure_count: 5,
|
15
|
+
timeout_value: 20,
|
16
|
+
timeout: false,
|
17
|
+
max_timeout_count: 5,
|
18
|
+
max_time: 10,
|
19
|
+
max_overtime_count: 3,
|
20
|
+
check_delay: 30,
|
21
|
+
notifiers: [],
|
22
|
+
forward_unknown_exceptions: true,
|
23
|
+
raise_on_opening: false,
|
24
|
+
exceptions: [StandardError, RuntimeError]
|
25
|
+
}
|
49
26
|
|
50
|
-
|
51
|
-
|
27
|
+
# Default config supported entries with format and Proc checker for {Sc4ry::Config::Validator}
|
28
|
+
DEFAULT_CONFIG_FORMATS = {
|
29
|
+
max_failure_count: { proc: proc { |item| item.instance_of?(Integer) }, desc: 'must be an Integer' },
|
30
|
+
timeout_value: { proc: proc { |item| item.instance_of?(Integer) }, desc: 'must be an Integer' },
|
31
|
+
timeout: { proc: proc { |item| [true, false].include? item }, desc: 'must be a Boolean' },
|
32
|
+
max_timeout_count: { proc: proc { |item| item.instance_of?(Integer) }, desc: 'must be an Integer' },
|
33
|
+
max_time: { proc: proc { |item| item.instance_of?(Integer) }, desc: 'must be an Integer' },
|
34
|
+
max_overtime_count: { proc: proc { |item| item.instance_of?(Integer) }, desc: 'must be an Integer' },
|
35
|
+
check_delay: { proc: proc { |item| item.instance_of?(Integer) }, desc: 'must be an Integer' },
|
36
|
+
notifiers: {
|
37
|
+
proc: proc do |item|
|
38
|
+
item.instance_of?(Array) and item.select { |val| val.instance_of?(Symbol) }.size == item.size
|
39
|
+
end,
|
40
|
+
desc: 'must be an Array of Symbol',
|
41
|
+
list: CURRENT_NOTIFIERS
|
42
|
+
},
|
43
|
+
forward_unknown_exceptions: { proc: proc { |item| [true, false].include? item }, desc: 'must be a Boolean' },
|
44
|
+
raise_on_opening: { proc: proc { |item| [true, false].include? item }, desc: 'must be a Boolean' },
|
45
|
+
exceptions: {
|
46
|
+
proc: proc do |item|
|
47
|
+
item.instance_of?(Array) and item.select do |val|
|
48
|
+
[Class, String].include? val.class
|
49
|
+
end.size == item.size
|
50
|
+
end,
|
51
|
+
desc: 'must be an Array of Exception(Class) or String'
|
52
|
+
}
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
data/lib/sc4ry/dependencies.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# rubygems depends
|
2
4
|
require 'rest-client'
|
3
5
|
require 'prometheus/client'
|
@@ -6,7 +8,7 @@ require 'redis'
|
|
6
8
|
require 'version'
|
7
9
|
|
8
10
|
# Stdlibs depends
|
9
|
-
require 'logger'
|
11
|
+
require 'logger'
|
10
12
|
require 'timeout'
|
11
13
|
require 'forwardable'
|
12
14
|
require 'singleton'
|
@@ -17,7 +19,6 @@ require 'uri'
|
|
17
19
|
require 'json'
|
18
20
|
require 'yaml'
|
19
21
|
|
20
|
-
|
21
22
|
# Sc4ry internal depends
|
22
23
|
require_relative 'helpers'
|
23
24
|
require_relative 'exceptions'
|
@@ -31,4 +32,3 @@ require_relative 'backends/init'
|
|
31
32
|
require_relative 'store'
|
32
33
|
require_relative 'run_controller'
|
33
34
|
require_relative 'circuits'
|
34
|
-
|
data/lib/sc4ry/exceptions.rb
CHANGED
@@ -1,50 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Sc4ry module
|
2
4
|
# @note namespace
|
3
5
|
module Sc4ry
|
6
|
+
# Sc4ry::Exceptions module
|
7
|
+
# @note namespace
|
8
|
+
module Exceptions
|
9
|
+
# Exception use in {Sc4ry::Circuits} when running circuit {Sc4ry::Circuits::run}
|
10
|
+
class CircuitBreaked < StandardError
|
11
|
+
def initialize(msg = 'Circuit just opened')
|
12
|
+
super(msg)
|
13
|
+
end
|
14
|
+
end
|
4
15
|
|
5
|
-
# Sc4ry::
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def initialize(msg="Circuit just opened")
|
12
|
-
super(msg)
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
# Generic Exception use in {Sc4ry::Circuits}
|
18
|
-
class Sc4ryGenericError < StandardError
|
19
|
-
def initialize(msg="")
|
20
|
-
super(msg)
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
16
|
+
# Generic Exception use in {Sc4ry::Circuits}
|
17
|
+
class Sc4ryGenericError < StandardError
|
18
|
+
def initialize(msg = '')
|
19
|
+
super(msg)
|
20
|
+
end
|
21
|
+
end
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
23
|
+
# Exception use in {Sc4ry::Store} or/and {Sc4ry::Backend} on data string issues
|
24
|
+
class Sc4ryBackendError < StandardError
|
25
|
+
def initialize(msg = '')
|
26
|
+
super(msg)
|
27
|
+
end
|
28
|
+
end
|
32
29
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
# Exception use in {Sc4ry::Circuits} on config management issues
|
42
|
-
class ConfigError < StandardError
|
43
|
-
def initialize(msg="")
|
44
|
-
super(msg)
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
30
|
+
# Exception use in {Sc4ry::Notifiers} on notification issues
|
31
|
+
class Sc4ryNotifierError < StandardError
|
32
|
+
def initialize(msg = '')
|
33
|
+
super(msg)
|
34
|
+
end
|
35
|
+
end
|
48
36
|
|
37
|
+
# Exception use in {Sc4ry::Circuits} on config management issues
|
38
|
+
class ConfigError < StandardError
|
39
|
+
def initialize(msg = '')
|
40
|
+
super(msg)
|
41
|
+
end
|
49
42
|
end
|
50
|
-
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/sc4ry/exporters/init.rb
CHANGED
data/lib/sc4ry/helpers.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Sc4ry module
|
2
4
|
# @note namespace
|
3
5
|
module Sc4ry
|
4
|
-
|
5
|
-
#
|
6
|
-
|
7
|
-
module Helpers
|
8
|
-
|
6
|
+
# Sc4ry::Helpers module
|
7
|
+
# @note namespace
|
8
|
+
module Helpers
|
9
9
|
# class method (module) to help logging messages
|
10
10
|
# @param [Symbol] target a specific logger, restored old after
|
11
11
|
# @param [Symbol] level (default :info) a logging level (see Logger Stdlib)
|
12
12
|
# @param [String] message your message
|
13
13
|
# @return [Boolean]
|
14
|
-
def
|
15
|
-
save = Sc4ry::Loggers.current
|
14
|
+
def self.log(message:, target: nil, level: :info)
|
15
|
+
save = Sc4ry::Loggers.current
|
16
16
|
Sc4ry::Loggers.current = target if target
|
17
|
-
Sc4ry::Loggers.get.send level, "Sc4ry : #{message}"
|
17
|
+
Sc4ry::Loggers.get.send level, "Sc4ry : #{message}"
|
18
18
|
Sc4ry::Loggers.current = save
|
19
|
-
|
19
|
+
true
|
20
20
|
end
|
21
21
|
|
22
22
|
# TCP/IP service checker
|
@@ -25,39 +25,34 @@ module Sc4ry
|
|
25
25
|
# @option options [String] :host hostname
|
26
26
|
# @option options [String] :port TCP port
|
27
27
|
# @option options [String] :url full URL, priority on :host and :port
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
return true
|
43
|
-
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
44
|
-
return false
|
45
|
-
end
|
46
|
-
end
|
47
|
-
rescue Timeout::Error
|
28
|
+
def self.verify_service(options = {})
|
29
|
+
if options[:url]
|
30
|
+
uri = URI.parse(options[:url])
|
31
|
+
host = uri.host
|
32
|
+
port = uri.port
|
33
|
+
else
|
34
|
+
host = options[:host]
|
35
|
+
port = options[:port]
|
36
|
+
end
|
37
|
+
Timeout.timeout(1) do
|
38
|
+
s = TCPSocket.new(host, port)
|
39
|
+
s.close
|
40
|
+
return true
|
41
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
48
42
|
return false
|
49
43
|
end
|
44
|
+
rescue Timeout::Error
|
45
|
+
false
|
50
46
|
end
|
51
47
|
|
52
48
|
# class method (module) to help send notifiesby Sc4ry::Notifiers
|
53
49
|
# @param [Hash] options a Notifying structure
|
54
50
|
# @return [Boolean]
|
55
|
-
def
|
51
|
+
def self.notify(options = {})
|
56
52
|
Sc4ry::Notifiers.list.each do |record|
|
57
53
|
notifier = Sc4ry::Notifiers.get name: record
|
58
|
-
notifier[:class].notify(options) if options[:config][:notifiers].include? record
|
54
|
+
notifier[:class].notify(options) if options[:config][:notifiers].include? record
|
59
55
|
end
|
60
56
|
end
|
61
|
-
|
62
|
-
|
63
|
-
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/sc4ry/logger.rb
CHANGED
@@ -1,66 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Sc4ry module
|
2
4
|
# @note namespace
|
3
5
|
module Sc4ry
|
4
|
-
|
5
6
|
# Sc4ry loggers Factory/provider
|
6
7
|
# @note must be accessed by [Sc4ry::Circuits.loggers]
|
7
8
|
class Loggers
|
8
|
-
|
9
|
-
@@loggers = {:stdout => ::Logger.new(STDOUT)}
|
9
|
+
@@loggers = { stdout: ::Logger.new($stdout) }
|
10
10
|
@@current = :stdout
|
11
|
-
|
11
|
+
|
12
12
|
# give the list of available loggers (initially internal Sc4ry logger )
|
13
13
|
# @return [Array] of [symbol] the list of defined loggers
|
14
|
-
# @note default :stdout => ::Logger(
|
14
|
+
# @note default :stdout => ::Logger($stdout) from Ruby Stdlib
|
15
15
|
# @example usage
|
16
16
|
# include Sc4ry
|
17
17
|
# Circuits.loggers.list_available.each {|logger| puts logger }
|
18
|
-
def
|
19
|
-
|
18
|
+
def self.list_available
|
19
|
+
@@loggers.keys
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
# return the current logger name (initially :stdtout )
|
23
23
|
# @return [symbol] the name of the logger
|
24
24
|
# @example usage
|
25
25
|
# include Sc4ry
|
26
26
|
# puts Circuits.loggers.current
|
27
|
-
def
|
28
|
-
|
27
|
+
def self.current
|
28
|
+
@@current
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
# return the current logger Object (initially internal Sc4ry Stdlib Logger on STDOUT )
|
32
32
|
# @return [symbol] the name of the logger
|
33
33
|
# @example usage
|
34
34
|
# include Sc4ry
|
35
35
|
# Circuits.loggers.get :stdout
|
36
|
-
def
|
37
|
-
|
36
|
+
def self.get
|
37
|
+
@@loggers[@@current]
|
38
38
|
end
|
39
|
-
|
40
|
-
# Set the current logger
|
39
|
+
|
40
|
+
# Set the current logger
|
41
41
|
# @param [Symbol] sym the name of the logger
|
42
42
|
# @return [symbol] the name of the logger updated
|
43
43
|
# @example usage
|
44
44
|
# include Sc4ry
|
45
45
|
# Circuits.loggers.current = :newlogger
|
46
|
-
def
|
46
|
+
def self.current=(sym)
|
47
47
|
raise "Logger not define : #{sym}" unless @@loggers.keys.include? sym
|
48
|
+
|
48
49
|
@@current = sym
|
49
|
-
|
50
|
+
@@current
|
50
51
|
end
|
51
|
-
|
52
|
+
|
52
53
|
# register un new logger
|
53
54
|
# @param [Symbol] name the name of the new logger
|
54
55
|
# @param [Object] instance the new logger object
|
55
56
|
# raise Sc4ry::Exceptions::Sc4ryGenericError if name is not a Symbol
|
56
57
|
# @example usage
|
57
58
|
# include Sc4ry
|
58
|
-
# Circuits.loggers.register name: :newlogger, instance: Logger::new('/path/to/my.log')
|
59
|
-
def
|
60
|
-
raise Sc4ry::Exceptions::Sc4ryGenericError,
|
59
|
+
# Circuits.loggers.register name: :newlogger, instance: Logger::new('/path/to/my.log')
|
60
|
+
def self.register(name:, instance:)
|
61
|
+
raise Sc4ry::Exceptions::Sc4ryGenericError, 'name: keyword must be a Symbol' unless name.instance_of?(Symbol)
|
62
|
+
|
61
63
|
@@loggers[name] = instance
|
62
|
-
|
64
|
+
name
|
63
65
|
end
|
64
|
-
|
65
66
|
end
|
66
67
|
end
|