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
data/carioca.gemspec
CHANGED
@@ -1,33 +1,46 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/carioca/constants"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "carioca"
|
7
|
+
spec.version = Carioca::Constants::VERSION
|
8
|
+
spec.authors = ["Romain GEORGES"]
|
9
|
+
spec.email = ["romain@ultragreen.net"]
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
spec.license = "BSD-3-Clause"
|
15
|
+
|
16
|
+
spec.summary = %q{Carioca : Container And Registry with Inversion Of Control for your Applications}
|
17
|
+
spec.homepage = %q{https://github.com/Ultragreen/carioca}
|
18
|
+
spec.description = %q{Carioca 2: is a complete rewrite who provide a full IoC/DI light Container and a services registry, build with logs, config and Internationalization facilities for designing your applications}
|
19
|
+
|
20
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
21
|
+
|
22
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
23
|
+
|
24
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
25
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
26
|
+
spec.metadata["changelog_uri"] = spec.homepage
|
27
|
+
|
28
|
+
|
29
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
30
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
31
|
+
end
|
32
|
+
spec.bindir = "exe"
|
33
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
34
|
+
spec.require_paths = ["lib"]
|
35
|
+
|
36
|
+
# Uncomment to register a new dependency of your gem
|
37
|
+
spec.add_dependency "tty-prompt", "~>0.23.1"
|
38
|
+
spec.add_dependency "pastel", "~>0.8.0"
|
39
|
+
spec.add_dependency 'i18n', "~> 1.10"
|
40
|
+
spec.add_dependency 'locale', "~> 2.1"
|
41
|
+
spec.add_dependency "deep_merge", "~> 1.2"
|
42
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
43
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
44
|
+
|
45
|
+
|
33
46
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
en:
|
2
|
+
service:
|
3
|
+
adding: "Adding service %{name}"
|
4
|
+
starting: "Starting service %{name}"
|
5
|
+
getting: "Getting service %{name}"
|
6
|
+
depends: "Dependencie service %{name}"
|
7
|
+
notify:
|
8
|
+
locale: "Preloaded service :i18n on locale : %{loc}"
|
9
|
+
logger: "Preloaded service :logger ready on %{target}"
|
10
|
+
useless_entry: "Useless entry in registry (builtin service) %{altered} in %{filename}"
|
11
|
+
init:
|
12
|
+
carioca: "Initializing Carioca registry"
|
13
|
+
builtins: "Preparing builtins services"
|
14
|
+
registry:
|
15
|
+
processing: "Initializing registry from file : %{filename}"
|
16
|
+
success: "Registry initialized successfully"
|
17
|
+
config:
|
18
|
+
load:
|
19
|
+
error: "Config file ignored, error : %{message}"
|
@@ -0,0 +1,19 @@
|
|
1
|
+
fr:
|
2
|
+
service:
|
3
|
+
adding: "Service %{name} Ajouté"
|
4
|
+
starting: "Démarrage du service %{name}"
|
5
|
+
getting: "Appel du service %{name}"
|
6
|
+
depends: "Dépendence du service %{name}"
|
7
|
+
notify:
|
8
|
+
locale: "Service pré-chargé :i18n sur la locale : %{loc}"
|
9
|
+
logger: "Service pré-chargé :logger sur la cible : %{target}"
|
10
|
+
useless_entry: "Entrée inutile dans le registre (service pré-defini) %{altered} dans %{filename}"
|
11
|
+
init:
|
12
|
+
carioca: "Initialisation du registre Carioca"
|
13
|
+
builtins: "Préparation des services pré-définis"
|
14
|
+
registry:
|
15
|
+
processing: "Initialisation du registre depuis le fichier : %{filename}"
|
16
|
+
success: "Registre initialisé avec succès"
|
17
|
+
config:
|
18
|
+
load:
|
19
|
+
error: "Fichier de configuration ignoré, erreur : %{message}"
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Carioca
|
2
|
+
class Configuration
|
3
|
+
include Carioca::Constants
|
4
|
+
include Carioca::Helpers
|
5
|
+
attr_accessor :filename, :name, :builtins, :log_target, :default_locale, :locales_load_path
|
6
|
+
attr_accessor :config_file, :config_root, :environment, :supported_environment, :output_mode, :log_level
|
7
|
+
attr_writer :debug, :init_from_file, :output_colors, :output_emoji
|
8
|
+
attr_reader :log_file, :locales_availables
|
9
|
+
def initialize
|
10
|
+
@init_from_file = true
|
11
|
+
@filename = DEFAULT_REGISTRY_FILE.dup
|
12
|
+
@debug = false
|
13
|
+
@name = 'Carioca'
|
14
|
+
@builtins = BUILTINS
|
15
|
+
@log_file = ''
|
16
|
+
@log_level = DEFAULT_LOG_LEVEL.dup
|
17
|
+
@log_level = :info if @debug == false and @log_level == :debug
|
18
|
+
@config_file = DEFAULT_CONFIG_FILE.dup
|
19
|
+
@environment = DEFAULT_ENVIRONMENT.dup
|
20
|
+
@config_root = DEFAULT_CONFIG_ROOT.dup
|
21
|
+
@log_target = '::Logger::new(STDOUT)'
|
22
|
+
@supported_environment = DEFAULT_ENVIRONMENTS_LIST.dup
|
23
|
+
@default_locale = DEFAULT_LOCALE
|
24
|
+
@locales_availables = []
|
25
|
+
@output_mode = DEFAULT_OUTPUT_MODE.dup
|
26
|
+
@output_colors = DEFAULT_COLORS_STATUS.dup
|
27
|
+
@output_emoji = DEFAULT_EMOJI_STATUS.dup
|
28
|
+
path = search_file_in_gem('carioca',"config/locales")
|
29
|
+
@locales_load_path = Dir[File.expand_path(path) + "/*.yml"]
|
30
|
+
Dir[path + '/*.yml'].sort.each do |file|
|
31
|
+
@locales_availables.push File::basename(file,'.yml').to_sym
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def debug?
|
36
|
+
return @debug
|
37
|
+
end
|
38
|
+
|
39
|
+
def output_colors?
|
40
|
+
return @output_colors
|
41
|
+
end
|
42
|
+
|
43
|
+
def output_emoji?
|
44
|
+
return @output_emoji
|
45
|
+
end
|
46
|
+
|
47
|
+
def init_from_file?
|
48
|
+
return @init_from_file
|
49
|
+
end
|
50
|
+
|
51
|
+
def log_file?
|
52
|
+
return !@log_file.empty?
|
53
|
+
end
|
54
|
+
|
55
|
+
def log_file=(name)
|
56
|
+
@log_file = name
|
57
|
+
@log_target = "::Logger::new('#{name}')"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Carioca
|
2
|
+
module Constants
|
3
|
+
|
4
|
+
VERSION = '2.0.2'
|
5
|
+
DEFAULT_REGISTRY_FILE = './config/carioca.registry'
|
6
|
+
DEFAULT_CONFIG_FILE = './config/settings.yml'
|
7
|
+
DEFAULT_ENVIRONMENT = :development
|
8
|
+
DEFAULT_CONFIG_ROOT = :carioca
|
9
|
+
DEFAULT_LOCALE = :en
|
10
|
+
|
11
|
+
|
12
|
+
DEFAULT_OUTPUT_MODE = :mono
|
13
|
+
DEFAULT_EMOJI_STATUS = true
|
14
|
+
DEFAULT_COLORS_STATUS = true
|
15
|
+
DEFAULT_LOG_LEVEL = :info
|
16
|
+
|
17
|
+
# service definitions specs
|
18
|
+
SERVICES_MANDATORY_SPECS = {type: Symbol, service: String}
|
19
|
+
SERVICES_FULL_LIST_SPECS = SERVICES_MANDATORY_SPECS.merge({depends: Array, description: String, resource: String })
|
20
|
+
SERVICES_SPECS_DETAIL = {type: [:gem, :stdlib, :file, :internal]}
|
21
|
+
|
22
|
+
DEFAULT_ENVIRONMENTS_LIST = [:production, :staging, :test, :development]
|
23
|
+
|
24
|
+
BUILTINS = {
|
25
|
+
configuration: {
|
26
|
+
type: :internal,
|
27
|
+
depends: [:logger],
|
28
|
+
description: "The configuration service of Carioca",
|
29
|
+
service: "Carioca::Services::Config::Factory::new(
|
30
|
+
config_filename: Carioca::Registry.config.config_file,
|
31
|
+
stage: Carioca::Registry.config.environment,
|
32
|
+
root: Carioca::Registry.config.config_root)" },
|
33
|
+
logger: {
|
34
|
+
type: :stdlib,
|
35
|
+
resource: "logger",
|
36
|
+
description: "The Logger service of Carioca",
|
37
|
+
depends: [:i18n]
|
38
|
+
},
|
39
|
+
i18n:{
|
40
|
+
type: :internal,
|
41
|
+
description: "The Internalisation service of Carocia",
|
42
|
+
service: "Carioca::Services::I18n.get(
|
43
|
+
default_locale: Carioca::Registry.config.default_locale,
|
44
|
+
load_path: Carioca::Registry.config.locales_load_path,
|
45
|
+
locales_availables: Carioca::Registry.config.locales_availables)"
|
46
|
+
},
|
47
|
+
output:{
|
48
|
+
type: :internal,
|
49
|
+
description: "The Output serice of Carioca",
|
50
|
+
service: "Carioca::Services::Output::Provider::new(
|
51
|
+
mode: Carioca::Registry.config.output_mode,
|
52
|
+
emoji: Carioca::Registry.config.output_emoji?,
|
53
|
+
colors: Carioca::Registry.config.output_colors?,
|
54
|
+
level: Carioca::Registry.config.log_level
|
55
|
+
)"
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'forwardable'
|
3
|
+
require 'singleton'
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'i18n'
|
7
|
+
require 'locale'
|
8
|
+
require 'deep_merge'
|
9
|
+
require 'pastel'
|
10
|
+
|
11
|
+
require_relative 'constants'
|
12
|
+
require_relative 'validator'
|
13
|
+
require_relative 'mixin'
|
14
|
+
require_relative 'container'
|
15
|
+
require_relative 'helpers'
|
16
|
+
require_relative 'configuration'
|
17
|
+
|
18
|
+
require_relative 'registry_file'
|
19
|
+
require_relative 'registry'
|
20
|
+
require_relative 'services/init'
|
data/lib/carioca/helpers.rb
CHANGED
@@ -1,35 +1,48 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# Author : Romain GEORGES
|
4
|
-
# type : gem component library
|
5
|
-
# obj : Carioca Helpers definition Module
|
6
|
-
#---
|
1
|
+
module Carioca
|
2
|
+
module Helpers
|
7
3
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def preload_service(_options = {})
|
12
|
-
Carioca::Services::Registry.init.start_service _options
|
13
|
-
end
|
4
|
+
def log
|
5
|
+
return self.get_service name: :logger
|
6
|
+
end
|
14
7
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
options.specify_default_value_of :with_file => 'services/registry.yml'
|
19
|
-
options.merge
|
20
|
-
options.validate!
|
21
|
-
Carioca::Services::Registry.init.start_service :name => 'configuration', :params => { :config_file => options[:with_file]}
|
22
|
-
end
|
23
|
-
end
|
8
|
+
def i18n
|
9
|
+
return self.get_service name: :i18n
|
10
|
+
end
|
24
11
|
|
12
|
+
def debug(message: )
|
13
|
+
log.debug(self.config.name) { "#{message}" }
|
14
|
+
end
|
25
15
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
16
|
+
# facility to find a file in gem path
|
17
|
+
# @param [String] _gem a Gem name
|
18
|
+
# @param [String] _file a file relative path in the gem
|
19
|
+
# @return [String] the path of the file, if found.
|
20
|
+
# @return [False] if not found
|
21
|
+
def search_file_in_gem(_gem,_file)
|
22
|
+
if Gem::Specification.respond_to?(:find_by_name)
|
23
|
+
begin
|
24
|
+
spec = Gem::Specification.find_by_name(_gem)
|
25
|
+
rescue LoadError
|
26
|
+
spec = nil
|
27
|
+
end
|
28
|
+
else
|
29
|
+
spec = Gem.searcher.find(_gem)
|
30
|
+
end
|
31
|
+
if spec then
|
32
|
+
if Gem::Specification.respond_to?(:find_by_name)
|
33
|
+
res = spec.lib_dirs_glob.split('/')
|
34
|
+
else
|
35
|
+
res = Gem.searcher.lib_dirs_for(spec).split('/')
|
36
|
+
end
|
37
|
+
res.pop
|
38
|
+
services_path = res.join('/').concat("/#{_file}")
|
39
|
+
return services_path if File::exist?(services_path)
|
40
|
+
return false
|
41
|
+
else
|
42
|
+
return false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Carioca
|
2
|
+
module Injector
|
3
|
+
def inject(service: )
|
4
|
+
self.create_methods(service){return Carioca::Registry.get.get_service name: service }
|
5
|
+
end
|
6
|
+
|
7
|
+
def register(service: , definition:)
|
8
|
+
Carioca::Registry.get.add service: service, definition: definition
|
9
|
+
end
|
10
|
+
|
11
|
+
def services
|
12
|
+
Carioca::Registry.get.services
|
13
|
+
end
|
14
|
+
|
15
|
+
def active_services
|
16
|
+
Carioca::Registry.get.active_services
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_methods(name, &block)
|
20
|
+
self.define_method name, &block
|
21
|
+
self.class.send(:define_method, name, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.extended(base)
|
25
|
+
base.include self
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'rake'
|
2
|
-
require 'rubygems'
|
3
|
+
require 'rubygems'
|
3
4
|
require 'carioca'
|
4
5
|
|
5
6
|
$VERBOSE = nil
|
@@ -16,8 +17,5 @@ else
|
|
16
17
|
end
|
17
18
|
|
18
19
|
res.pop
|
19
|
-
tasks_path = res.join('/').concat('/lib/carioca/tasks/')
|
20
|
-
|
21
|
-
|
22
|
-
Dir["#{tasks_path}/*.rake"].each { |ext| load ext }
|
23
|
-
|
20
|
+
tasks_path = res.join('/').concat('/lib/carioca/rake/tasks/')
|
21
|
+
Dir["#{tasks_path}/*.task*"].each { |ext| load ext }
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "tty-prompt"
|
2
|
+
require "pastel"
|
3
|
+
|
4
|
+
namespace :carioca do
|
5
|
+
namespace :registry do
|
6
|
+
desc "Adding service to Carioca Registry file"
|
7
|
+
task :add_service do
|
8
|
+
begin
|
9
|
+
puts "Carioca : registering service :"
|
10
|
+
config = Carioca::Configuration::new
|
11
|
+
prompt = TTY::Prompt.new
|
12
|
+
pastel = Pastel.new
|
13
|
+
filename = prompt.ask("Registry File path ?", default: config.filename)
|
14
|
+
registry_file = Carioca::RegistryFile::new filename: filename
|
15
|
+
name = prompt.ask("Service name ?") { |q| q.required true }.to_sym
|
16
|
+
if config.builtins.include? name or registry_file.validated.include? name then
|
17
|
+
puts 'Carioca : service already defined or Builtins'
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
definition = {
|
21
|
+
:type => prompt.select("Choose the service type ?", [:gem, :stdlib, :file, :internal]),
|
22
|
+
:description => prompt.ask("Description ?", default: "The #{name} service"),
|
23
|
+
:service => prompt.ask("Service [#{name}] inline Proc Ruby code ?", default: name.to_s.capitalize)
|
24
|
+
}
|
25
|
+
map = {:gem => "Rubygem name", :stdlib => "StdLib name", :file => "absolut path of the Ruby file"}
|
26
|
+
definition[:resource] = prompt.ask("Give the #{map[definition[:type]]} ? ", default: name.to_s ) if map.keys.include? definition[:type]
|
27
|
+
have_depends = prompt.yes?("Did this service have dependencies ? ")
|
28
|
+
if have_depends then
|
29
|
+
potentials = config.builtins.merge(registry_file.validated).keys
|
30
|
+
definition[:depends] = prompt.multi_select("Choose your depends ?", potentials, min: 1)
|
31
|
+
end
|
32
|
+
puts "\n => Service : #{name}"
|
33
|
+
puts "Definition "
|
34
|
+
definition.each do |key,value|
|
35
|
+
puts " * #{key}: #{value}"
|
36
|
+
end
|
37
|
+
is_correct = prompt.yes?("Is it correct ? ")
|
38
|
+
rescue TTY::Reader::InputInterrupt
|
39
|
+
puts 'Carioca : interrupted'
|
40
|
+
exit 5
|
41
|
+
end
|
42
|
+
if is_correct then
|
43
|
+
begin
|
44
|
+
registry_file.add service: name, definition: definition
|
45
|
+
registry_file.save!
|
46
|
+
rescue => e
|
47
|
+
puts "Carioca: Can't save : #{e}"
|
48
|
+
exit 10
|
49
|
+
end
|
50
|
+
|
51
|
+
puts "Carioca : Registry saved"
|
52
|
+
else
|
53
|
+
puts 'Carioca : Nothing saved'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Carioca
|
2
|
+
class Registry
|
3
|
+
include Carioca::Helpers
|
4
|
+
include Singleton
|
5
|
+
@@config = Configuration::new
|
6
|
+
|
7
|
+
def Registry.config
|
8
|
+
return @@config
|
9
|
+
end
|
10
|
+
|
11
|
+
def Registry.configure(&block)
|
12
|
+
yield(@@config)
|
13
|
+
end
|
14
|
+
|
15
|
+
class << self
|
16
|
+
alias_method :get, :instance
|
17
|
+
alias_method :init, :instance
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_accessor :services
|
22
|
+
attr_accessor :active_services
|
23
|
+
|
24
|
+
def get_service(name: )
|
25
|
+
|
26
|
+
raise "Service not found: #{name}" unless @services.include? name
|
27
|
+
if @active_services.include? name then
|
28
|
+
debug message: i18n.t('service.getting', name: name) if @active_services.include? :logger and ![:logger, :i18n].include? name and @@config.debug?
|
29
|
+
else
|
30
|
+
service = @services[name]
|
31
|
+
service[:depends].each do|dep|
|
32
|
+
debug message: i18n.t('service.depends', name: dep) if @active_services.include? :logger and ![:logger, :i18n].include? dep and @@config.debug?
|
33
|
+
get_service(name: dep) unless @active_services.include? dep
|
34
|
+
end if service.include? :depends
|
35
|
+
debug message: i18n.t('service.starting', name: name) if @active_services.include? :logger and ![:logger, :i18n].include? name and @@config.debug?
|
36
|
+
require service[:resource] if [:gem, :file, :stdlib].include? service[:type]
|
37
|
+
@active_services[name] ||= eval("lambda { #{service[:service]} }").call
|
38
|
+
end
|
39
|
+
return @active_services[name]
|
40
|
+
end
|
41
|
+
|
42
|
+
def config
|
43
|
+
return @@config
|
44
|
+
end
|
45
|
+
|
46
|
+
def add(service: , definition:, skip_validation: false )
|
47
|
+
mess =
|
48
|
+
raise "Service #{service} already exist." if @services.include? service and skip_validation == false
|
49
|
+
debug message: i18n.t('service.adding', name: service) if @active_services.include? :logger and @@config.debug?
|
50
|
+
checker = Carioca::Services::Validator::new service: service , definition: definition
|
51
|
+
checker.validate! unless skip_validation
|
52
|
+
@services[service] = checker.definition
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def prepare_logger
|
57
|
+
conf_i18n = @@config.builtins[:i18n]
|
58
|
+
add service: :i18n, definition: @@config.builtins[:i18n], skip_validation: true
|
59
|
+
conf_logger = @@config.builtins[:logger]
|
60
|
+
conf_logger[:service] = @@config.log_target
|
61
|
+
add service: :logger, definition: @@config.builtins[:logger], skip_validation: true
|
62
|
+
log = get_service name: :logger
|
63
|
+
log.level = @@config.log_level
|
64
|
+
end
|
65
|
+
|
66
|
+
def initialize
|
67
|
+
@services = Hash::new
|
68
|
+
@active_services = Hash::new
|
69
|
+
prepare_logger
|
70
|
+
locale = @@config.default_locale
|
71
|
+
target = (@@config.log_file?)? @@config.log_file : "STDOUT"
|
72
|
+
debug message: i18n.t('notify.locale', loc: locale) if @@config.debug?
|
73
|
+
debug message: i18n.t('notify.logger', target: target) if @@config.debug?
|
74
|
+
debug message: i18n.t('init.carioca') if @@config.debug?
|
75
|
+
debug message: i18n.t('init.builtins') if @@config.debug?
|
76
|
+
@@config.builtins.each do |service, spec|
|
77
|
+
add service: service, definition: spec, skip_validation: true unless service == :logger
|
78
|
+
end
|
79
|
+
open_registry_file if File::exist? @@config.filename and @@config.init_from_file?
|
80
|
+
end
|
81
|
+
|
82
|
+
def open_registry_file
|
83
|
+
debug message: i18n.t('init.registry.processing', filename: @@config.filename) if @@config.debug?
|
84
|
+
registry_file = Carioca::RegistryFile::new filename: @@config.filename
|
85
|
+
debug message: i18n.t('notify.useless_entry', altered: registry_file.altered.to_s, file_name: @@config.filename ) if registry_file.altered? and @@config.debug?
|
86
|
+
registry_file.validated.each do |service,spec|
|
87
|
+
add service: service, definition: spec
|
88
|
+
end
|
89
|
+
debug message: i18n.t('init.registry.success') if @@config.debug?
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Carioca
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
class RegistryFile
|
7
|
+
|
8
|
+
attr_accessor :validated, :altered
|
9
|
+
include Carioca::Constants
|
10
|
+
|
11
|
+
def initialize(filename:)
|
12
|
+
@filename = filename
|
13
|
+
@candidates = Hash::new
|
14
|
+
@validated = Hash::new
|
15
|
+
@altered = []
|
16
|
+
open
|
17
|
+
end
|
18
|
+
|
19
|
+
def altered?
|
20
|
+
return !@altered.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
def create!(force: false)
|
24
|
+
write_ok = true
|
25
|
+
write_ok = force if File::exist? @filename
|
26
|
+
File.open(@filename, 'w') { |file| file.write(@validated.to_yaml) } if write_ok
|
27
|
+
end
|
28
|
+
|
29
|
+
def save!
|
30
|
+
create! force: true
|
31
|
+
end
|
32
|
+
|
33
|
+
def add(service:, definition: )
|
34
|
+
checker = Carioca::Services::Validator::new service: service , definition: definition
|
35
|
+
checker.validate!
|
36
|
+
@validated[service] = checker.definition
|
37
|
+
end
|
38
|
+
|
39
|
+
def open
|
40
|
+
if File::exist?(@filename) then
|
41
|
+
@candidates = YAML.load_file(@filename)
|
42
|
+
else
|
43
|
+
create!
|
44
|
+
end
|
45
|
+
prepare!
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def prepare!
|
50
|
+
save = @candidates.dup
|
51
|
+
@candidates.delete_if {|key, value| BUILTINS.keys.include? key }
|
52
|
+
@altered = save.keys - @candidates.keys
|
53
|
+
@candidates.each do |service, definition|
|
54
|
+
checker = Carioca::Services::Validator::new service: service , definition: definition
|
55
|
+
checker.validate!
|
56
|
+
@validated[service] = checker.definition
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|