carioca 1.3 → 2.0.2
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/.github/workflows/main.yml +18 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +44 -40
- data/README.md +123 -190
- data/Rakefile +5 -59
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/carioca.gemspec +45 -32
- data/config/locales/en.yml +19 -0
- data/config/locales/fr.yml +19 -0
- data/lib/carioca/configuration.rb +60 -0
- data/lib/carioca/constants.rb +60 -0
- data/lib/carioca/container.rb +16 -0
- data/lib/carioca/dependencies.rb +20 -0
- data/lib/carioca/helpers.rb +44 -31
- data/lib/carioca/mixin.rb +32 -0
- data/lib/carioca/{tasks/rake.rb → rake/manage.rb} +4 -6
- data/lib/carioca/rake/tasks/registry.tasks +57 -0
- data/lib/carioca/registry.rb +94 -0
- data/lib/carioca/registry_file.rb +62 -0
- data/lib/carioca/services/config.rb +140 -0
- data/lib/carioca/services/i18n.rb +20 -0
- data/lib/carioca/services/init.rb +2 -0
- data/lib/carioca/services/output.rb +175 -0
- data/lib/carioca/validator.rb +49 -0
- data/lib/carioca.rb +2 -319
- data/samples/Rakefile +2 -0
- data/samples/config/carioca.registry +22 -0
- data/samples/config/locales/en.yml +2 -0
- data/samples/config/locales/es.yml +2 -0
- data/samples/config/locales/fr.yml +2 -0
- data/samples/config/settings.yml +24 -0
- data/samples/test.rb +98 -0
- metadata +76 -168
- data/AUTHORS +0 -8
- data/COPYRIGHT +0 -24
- data/ChangeLog +0 -7
- data/INSTALL +0 -7
- data/doc/manual.rdoc +0 -225
- data/lib/carioca/exceptions.rb +0 -9
- data/lib/carioca/private.rb +0 -170
- data/lib/carioca/services/configuration.rb +0 -201
- data/lib/carioca/services/debug.rb +0 -73
- data/lib/carioca/services/logger.rb +0 -58
- data/lib/carioca/services.rb +0 -143
- data/lib/carioca/tasks/registry_init.rake +0 -11
- data/spec/carioca_spec.rb +0 -474
- data/spec/config/services.registry +0 -55
- data/spec/init_spec.rb +0 -1
- data/spec/samples/dummy.rb +0 -10
- data/spec/samples/otherdummy.rb +0 -10
- data/spec/samples/requireddummy.rb +0 -10
- data/spec/spec_helper.rb +0 -18
- data/test.rb +0 -12
- data/ultragreen_roodi_coding_convention.yml +0 -25
@@ -0,0 +1,140 @@
|
|
1
|
+
class Hash
|
2
|
+
# monkey patching
|
3
|
+
def deep_symbolize
|
4
|
+
target = dup
|
5
|
+
target.inject({}) do |memo, (key, value)|
|
6
|
+
value = value.deep_symbolize if value.is_a?(Hash)
|
7
|
+
memo[key.to_sym] = value
|
8
|
+
memo
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(name, *args, &block)
|
13
|
+
if name.to_s =~ /(.+)=$/
|
14
|
+
self[$1.to_sym] = args.first
|
15
|
+
else
|
16
|
+
self[name.to_sym]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
module Carioca
|
25
|
+
module Services
|
26
|
+
module Config
|
27
|
+
|
28
|
+
class ConfigFile
|
29
|
+
include Carioca::Constants
|
30
|
+
attr_accessor :filename, :data
|
31
|
+
attr_reader :error
|
32
|
+
|
33
|
+
def initialize(filename:)
|
34
|
+
@filename = filename
|
35
|
+
@data = {}
|
36
|
+
@error = ""
|
37
|
+
open
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def error?
|
42
|
+
return !@error.empty?
|
43
|
+
end
|
44
|
+
|
45
|
+
def create!(force: false)
|
46
|
+
write_ok = true
|
47
|
+
write_ok = force if File::exist? @filename
|
48
|
+
File.open(@filename, 'w') { |file| file.write(@data.to_yaml) } if write_ok
|
49
|
+
end
|
50
|
+
|
51
|
+
def open
|
52
|
+
if File::exist?(@filename) then
|
53
|
+
begin
|
54
|
+
@data = YAML.load_file(@filename)
|
55
|
+
rescue Exception => e
|
56
|
+
@error = e.message
|
57
|
+
@data = {}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
prepare!
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def prepare!
|
65
|
+
config = Carioca::Registry.config
|
66
|
+
@data = {} unless @data.class == Hash
|
67
|
+
@data.delete_if {|key,value| config.config_root != key }
|
68
|
+
@data[config.config_root] = {} unless @data.include? config.config_root
|
69
|
+
config.supported_environment.each do |evt|
|
70
|
+
@data[config.config_root][evt] = {} unless @data[config.config_root].include? evt
|
71
|
+
end
|
72
|
+
@data[config.config_root][:default] = {} unless @data[config.config_root].include? :default
|
73
|
+
create!
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
class Settings < Hash
|
78
|
+
|
79
|
+
attr_accessor :config_file
|
80
|
+
attr_accessor :stage
|
81
|
+
|
82
|
+
include Carioca::Helpers
|
83
|
+
|
84
|
+
def initialize(config_filename: , stage:, root:)
|
85
|
+
registry = Carioca::Registry.get
|
86
|
+
@logger = registry.get_service name: :logger
|
87
|
+
@i18n = registry.get_service name: :i18n
|
88
|
+
|
89
|
+
@stage = stage
|
90
|
+
@root = root
|
91
|
+
@config_file = Carioca::Services::Config::ConfigFile::new filename: config_filename
|
92
|
+
initconf
|
93
|
+
end
|
94
|
+
|
95
|
+
def refresh
|
96
|
+
initconf
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
private
|
102
|
+
def initconf
|
103
|
+
newsets = {}
|
104
|
+
@logger.debug("Carioca->Config") { @i18n.t('config.load.error', message: @config_file.error) } if @config_file.error?
|
105
|
+
@content = @config_file.data
|
106
|
+
|
107
|
+
unless @stage then
|
108
|
+
newsets = @content
|
109
|
+
else
|
110
|
+
self.merge! @content[@root][:default]
|
111
|
+
data = @content[@root][@stage]
|
112
|
+
self.deep_merge! data
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
class Factory
|
125
|
+
extend Forwardable
|
126
|
+
|
127
|
+
attr_accessor :settings
|
128
|
+
def_delegators :@settings, :refresh
|
129
|
+
|
130
|
+
|
131
|
+
def initialize(**keywords)
|
132
|
+
@settings = Carioca::Services::Config::Settings.new(**keywords)
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Carioca
|
2
|
+
module Services
|
3
|
+
class I18n
|
4
|
+
|
5
|
+
def I18n.get(default_locale: , load_path:, locales_availables: )
|
6
|
+
::I18n::Backend::Simple.include(::I18n::Backend::Fallbacks)
|
7
|
+
::I18n.load_path << load_path
|
8
|
+
::I18n.default_locale = default_locale
|
9
|
+
::I18n.fallbacks = locales_availables
|
10
|
+
return ::I18n
|
11
|
+
end
|
12
|
+
|
13
|
+
def I18n.get_system_locale
|
14
|
+
return ::Locale.candidates.to_s.split('_').first.to_sym
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
module Carioca
|
2
|
+
module Services
|
3
|
+
module Output
|
4
|
+
|
5
|
+
module FormatsMapping
|
6
|
+
COLORS = {
|
7
|
+
:unknown => :red,
|
8
|
+
:fatal => :red,
|
9
|
+
:error => :red,
|
10
|
+
:ko => :yellow,
|
11
|
+
:warn => :yellow,
|
12
|
+
:item => :white,
|
13
|
+
:arrow => :white,
|
14
|
+
:sending => :white,
|
15
|
+
:calling => :white,
|
16
|
+
:scheduling => :white,
|
17
|
+
:trigger => :white,
|
18
|
+
:receive => :white,
|
19
|
+
:info => :cyan,
|
20
|
+
:ok => :green,
|
21
|
+
:success => :green,
|
22
|
+
:debug => :magenta,
|
23
|
+
:flat => :white
|
24
|
+
}
|
25
|
+
|
26
|
+
EMOJI = {
|
27
|
+
:unknown => {:value => "\u{1F4A5}", :alt => '[!!]', :text => "(UNKNOWN)"},
|
28
|
+
:fatal => {:value => "\u{26D4}", :alt => '[!!]', :text => "(FATAL)"},
|
29
|
+
:error => {:value => "\u{1F6AB}", :alt => '[!]', :text => "(ERROR)"},
|
30
|
+
:ko => {:value => "\u{1F44E}", :alt => '[-]', :text => "(KO)"},
|
31
|
+
:warn => {:value => "\u{26A0}", :alt => '[/!\]', :text => "(WARNING)"},
|
32
|
+
:info => {:value => "\u{2139}", :alt => '[i]', :text => "(INFO)"},
|
33
|
+
:item => {:value => " \u{1F539}", :alt => '', :text => " *"},
|
34
|
+
:arrow => {:value => " \u{27A1}", :alt => '', :text => " =>"},
|
35
|
+
:calling => {:value => "\u{1F4DE}" , :alt => '[C]', :text => "(CALLING)"},
|
36
|
+
:scheduling => {:value => "\u{23F2}" , :alt => '[S]', :text => "{SCHEDULING})"},
|
37
|
+
:trigger => {:value => "\u{23F0}", :alt => '[T]', :text => "(TRIGGER)"},
|
38
|
+
:sending => {:value => "\u{1F4E4}", :alt => '[>]', :text => "(SENDING)"},
|
39
|
+
:receive => {:value => "\u{1F4E5}" , :alt => '[<]', :text => "(RECEIVE)"},
|
40
|
+
:ok => {:value => "\u{1F44D}" , :alt => '[+]', :text => "(OK)"},
|
41
|
+
:success => {:value => "\u{1F4AA}" , :alt => '[+]', :text => "(SUCCESS)"},
|
42
|
+
:debug => {:value => "\u{1F41B}" , :alt => '[D]', :text => "(DEBUG)"},
|
43
|
+
:flat => {:value => "", :alt => ""}
|
44
|
+
}
|
45
|
+
LEVELS = [:debug, :info, :warn, :error, :fatal, :unknown ]
|
46
|
+
ALIAS = {
|
47
|
+
:flat => :info,
|
48
|
+
:item => :info,
|
49
|
+
:ok => :info,
|
50
|
+
:ko => :error,
|
51
|
+
:trigger => :info,
|
52
|
+
:scheduling => :info,
|
53
|
+
:arrow => :info,
|
54
|
+
:sending => :info,
|
55
|
+
:calling => :info,
|
56
|
+
:receive => :info,
|
57
|
+
:success => :info
|
58
|
+
|
59
|
+
}
|
60
|
+
end
|
61
|
+
class Provider
|
62
|
+
include FormatsMapping
|
63
|
+
|
64
|
+
attr_accessor :mode, :emoji, :color
|
65
|
+
|
66
|
+
@@alias = ALIAS.dup
|
67
|
+
@@colors = COLORS.dup
|
68
|
+
@@emoji = EMOJI.dup
|
69
|
+
|
70
|
+
MODE = [:mono, :dual]
|
71
|
+
|
72
|
+
LEVELS.each do |method|
|
73
|
+
define_method(method) do |message, session = ''|
|
74
|
+
self.display(level: method, message: message, session: session)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
@@alias.keys.each do |method|
|
78
|
+
define_method(method) do |message, session = ''|
|
79
|
+
self.display( level: method, message: message, session: session)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def map_color(color: , analias: )
|
84
|
+
raise "Color must be a Symbol" unless color.class == Symbol
|
85
|
+
raise "Missing alias : #{analias}" unless LEVELS.include? analias
|
86
|
+
@@alias[analias] = color
|
87
|
+
end
|
88
|
+
|
89
|
+
def map_emoji(emoji: , analias: )
|
90
|
+
raise "Emoji must be a String" unless color.class == String
|
91
|
+
raise "Missing alias : #{analias}" unless LEVELS.include? analias
|
92
|
+
@@alias[analias] = emoji
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
def add_alias(newalias:, level:)
|
97
|
+
raise "Alias must be a Symbol" unless newalias.class == Symbol
|
98
|
+
raise "Bad Level : #{level}" unless LEVELS.include? level
|
99
|
+
self.class.define_method(newalias) do |message, session = ''|
|
100
|
+
self.display({ level: newalias, message: message, session: session})
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
# constructor
|
106
|
+
def initialize(level: :debug, mode: :mono , emoji: true, colors: true)
|
107
|
+
self.level = level
|
108
|
+
@mode = mode
|
109
|
+
@emoji = emoji
|
110
|
+
@color = colors
|
111
|
+
if @mode == :dual then
|
112
|
+
registry = Carioca::Registry.get
|
113
|
+
@logger = registry.get_service name: :logger
|
114
|
+
end
|
115
|
+
raise "Unknown output mode : #{@mode}" unless MODE.include? @mode
|
116
|
+
end
|
117
|
+
|
118
|
+
# build a session number
|
119
|
+
# @return [String] Session number
|
120
|
+
def get_session
|
121
|
+
return "#{Time.now.to_i.to_s}#{rand(999)}"
|
122
|
+
end
|
123
|
+
|
124
|
+
# getter for the current level
|
125
|
+
# @return [Symbol] level
|
126
|
+
def level
|
127
|
+
return @active_levels.first
|
128
|
+
end
|
129
|
+
|
130
|
+
# virtual setter for level, set the current level
|
131
|
+
# @raise a badLevel in case of bad level
|
132
|
+
# @param [Symbol] level
|
133
|
+
def level=(level)
|
134
|
+
raise "Bad Level : #{level}" unless LEVELS.include? level
|
135
|
+
@active_levels = LEVELS.dup
|
136
|
+
@active_levels.shift(LEVELS.index(level))
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
# abstract method for log wrapper
|
141
|
+
# @param [Hash] params
|
142
|
+
# @option params [Symbol] :level, a valid level in LEVELS or ALIAS
|
143
|
+
# @option params [String] :message text
|
144
|
+
def display(level: , message: , session:)
|
145
|
+
save = message.dup
|
146
|
+
target_level = (@@alias.keys.include? level)? @@alias[level] : level
|
147
|
+
if @active_levels.include? target_level then
|
148
|
+
if @color then
|
149
|
+
pastel = ::Pastel.new
|
150
|
+
message = pastel.send @@colors[level], message
|
151
|
+
end
|
152
|
+
if @@emoji.include? level
|
153
|
+
pattern = (@emoji)? @@emoji[level][:value] : @@emoji[level][:alt]
|
154
|
+
pattern = "#{pattern} #{@@emoji[level][:text]}" if @@emoji[level].include? :text and !@emoji
|
155
|
+
message = pattern + " " + message unless pattern.empty?
|
156
|
+
end
|
157
|
+
if @mode == :dual
|
158
|
+
|
159
|
+
pattern = @@emoji[level][:alt]
|
160
|
+
unless LEVELS.include? level
|
161
|
+
save = "#{@@emoji[level][:text]} #{save}" if @@emoji[level].include? :text
|
162
|
+
end
|
163
|
+
@logger.send target_level, save
|
164
|
+
end
|
165
|
+
puts message
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Carioca
|
2
|
+
module Services
|
3
|
+
class Validator
|
4
|
+
|
5
|
+
attr_reader :definition
|
6
|
+
|
7
|
+
include Carioca::Constants
|
8
|
+
|
9
|
+
def initialize(definition: , service: )
|
10
|
+
@definition = definition
|
11
|
+
@service = service
|
12
|
+
end
|
13
|
+
|
14
|
+
def validate!
|
15
|
+
validate_mandatories
|
16
|
+
validate_full_and_type
|
17
|
+
validate_not_builtins
|
18
|
+
fill_content
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def validate_not_builtins
|
23
|
+
|
24
|
+
raise "Builtins reserved name #{@service.to_s}" if BUILTINS.keys.include? @service
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate_mandatories
|
28
|
+
SERVICES_MANDATORY_SPECS.keys.each do |spec|
|
29
|
+
raise "Key : :#{spec} is mandatory in a service definition" unless @definition.include? spec
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def validate_full_and_type
|
34
|
+
@definition.each do |spec,value|
|
35
|
+
raise "Key : :#{spec} is not allowed in a service definition" unless SERVICES_FULL_LIST_SPECS.include? spec
|
36
|
+
raise "key : #{spec} must be a : #{SERVICES_FULL_LIST_SPECS[spec].to_s}" unless value.class == SERVICES_FULL_LIST_SPECS[spec]
|
37
|
+
if SERVICES_SPECS_DETAIL.include? spec then
|
38
|
+
raise "key : #{spec} must be in : #{SERVICES_SPECS_DETAIL[spec].to_s}" unless SERVICES_SPECS_DETAIL[spec].include? value
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def fill_content
|
44
|
+
@definition[:description] = @service.to_s unless @definition.include? :description
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|