carioca 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/AUTHORS ADDED
@@ -0,0 +1,8 @@
1
+ Author :
2
+ Romain GEORGES <romain@ultragreen.net>
3
+ - code
4
+ - inline documentation
5
+ - specs
6
+ - Documentation
7
+ Ruby Gem maintener :
8
+ Romain GEORGES <romain@ultragreen.net>
@@ -0,0 +1,24 @@
1
+ carioca Copyright (c) 2013 Ultragreen Software, Romain GEORGES
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions
6
+ are met:
7
+ 1. Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright
10
+ notice, this list of conditions and the following disclaimer in the
11
+ documentation and/or other materials provided with the distribution.
12
+
13
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23
+ SUCH DAMAGE.
24
+
@@ -0,0 +1,4 @@
1
+ carioca :
2
+ - initial dev. version
3
+ - version 0.1 (unstable)
4
+ Romain GEORGES
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+ gem "yard-rspec"
3
+ gem "rspec", :require => "spec"
4
+ gem "rake"
5
+ gem "yard"
6
+ gem "rdoc"
7
+ gem "rcov"
8
+ gem "roodi"
9
+ gem "uuid"
@@ -0,0 +1,41 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ diff-lcs (1.1.3)
5
+ json (1.6.5)
6
+ macaddr (1.0.0)
7
+ rake (0.9.2.2)
8
+ rcov (1.0.0)
9
+ rdoc (3.12)
10
+ json (~> 1.4)
11
+ roodi (2.2.0)
12
+ ruby_parser (~> 2.3.0)
13
+ rspec (2.9.0)
14
+ rspec-core (~> 2.9.0)
15
+ rspec-expectations (~> 2.9.0)
16
+ rspec-mocks (~> 2.9.0)
17
+ rspec-core (2.9.0)
18
+ rspec-expectations (2.9.0)
19
+ diff-lcs (~> 1.1.3)
20
+ rspec-mocks (2.9.0)
21
+ ruby_parser (2.3.1)
22
+ sexp_processor (~> 3.0)
23
+ sexp_processor (3.2.0)
24
+ uuid (2.3.1)
25
+ macaddr (~> 1.0)
26
+ yard (0.7.5)
27
+ yard-rspec (0.1)
28
+ yard
29
+
30
+ PLATFORMS
31
+ ruby
32
+
33
+ DEPENDENCIES
34
+ rake
35
+ rcov
36
+ rdoc
37
+ roodi
38
+ rspec
39
+ uuid
40
+ yard
41
+ yard-rspec
data/INSTALL ADDED
@@ -0,0 +1,7 @@
1
+ How to install carioca ?
2
+ =========================
3
+
4
+ Please install the gem version via RubyGems :
5
+
6
+ $ su -
7
+ # gem ins carioca
@@ -0,0 +1,63 @@
1
+ require 'rubygems'
2
+
3
+ require 'rspec'
4
+ require 'rake'
5
+ require "rake/clean"
6
+ require "rubygems/package_task"
7
+ require "rdoc/task"
8
+ require 'code_statistics'
9
+ require 'rspec/core/rake_task'
10
+ require 'yard'
11
+ require 'yard/rake/yardoc_task.rb'
12
+ require "rake/tasklib"
13
+ require "roodi"
14
+ require "roodi_task"
15
+
16
+
17
+ RoodiTask.new() do | t |
18
+ t.patterns = %w(lib/**/*.rb)
19
+ t.config = "ultragreen_roodi_coding_convention.yml"
20
+ end
21
+
22
+
23
+ CLEAN.include('*.tmp','*.old')
24
+ CLOBBER.include('*.tmp', 'build/*','#*#')
25
+
26
+
27
+ content = File::readlines(File.join(File.dirname(__FILE__), 'carioca.gemspec')).join
28
+ spec = eval(content)
29
+
30
+ RSpec::Core::RakeTask.new('spec')
31
+
32
+
33
+
34
+ YARD::Rake::YardocTask.new do |t|
35
+ t.files = [ 'lib/**/*.rb', '-', 'doc/**/*','spec/**/*_spec.rb']
36
+ t.options += ['--title', "Gem Documentation"]
37
+ t.options += ['-o', "yardoc"]
38
+ t.options += ['-r', "doc/manual.rdoc"]
39
+ end
40
+ YARD::Config.load_plugin('yard-rspec')
41
+
42
+ namespace :yardoc do
43
+ task :clobber do
44
+ rm_r "yardoc" rescue nil
45
+ rm_r ".yardoc" rescue nil
46
+ end
47
+ end
48
+ task :clobber => "yardoc:clobber"
49
+
50
+
51
+ Gem::PackageTask.new(spec) do |pkg|
52
+ pkg.need_tar = true
53
+ pkg.need_zip = true
54
+ end
55
+
56
+ Rake::RDocTask.new('rdoc') do |d|
57
+ d.rdoc_files.include('doc/**/*','bin/*')
58
+ d.main = 'doc/manual.rdoc'
59
+ d.title = 'Uglibs : Ultragreen libraries'
60
+ d.options << '--line-numbers' << '--diagram' << '-SHN'
61
+ end
62
+
63
+ task :default => [:gem]
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{carioca}
3
+ s.author = "Romain GEORGES"
4
+ s.version = "0.1"
5
+ s.date = %q{2013-02-18}
6
+ s.summary = %q{Carioca : Configuration Agent and Registry with Inversion Of Control for your Applications}
7
+ s.email = %q{romain@ultragreen.net}
8
+ s.homepage = %q{http://www.ultragreen.net}
9
+ s.description = %q{Carioca : provide a full IoC light Container for designing your applications}
10
+ s.has_rdoc = true
11
+ s.files = Dir['*/*/*/*'] + Dir['*/*/*'] + Dir['*/*'] + Dir['*']
12
+ s.bindir = nil
13
+ s.required_ruby_version = '>= 1.8.1'
14
+ s.add_development_dependency "rspec", ">= 2.0.0"
15
+ s.rdoc_options << '--title' << 'Carioca : Gem documentation' << '--main' << 'doc/manual.rdoc' << '--line-numbers'
16
+ # << '--diagram'
17
+ s.rubyforge_project = "nowarning"
18
+ end
@@ -0,0 +1,36 @@
1
+ = Carioca
2
+
3
+ == Content
4
+
5
+ Author:: Romain GEORGES <romain@ultragreen.net>
6
+ Version:: 1.2
7
+ WWW:: http://www.ultragreen.net/projects/methodic
8
+
9
+ == Description
10
+
11
+ CARIOCA is Configuration Agent and Registry with Inversion Of Control for your Applications
12
+ Carioca provide a full IoC light Container for designing your applications
13
+ Carioca provide :
14
+ - a complete Configuration Agent
15
+ - A service Registry (base on IOC/DI pattern)
16
+
17
+
18
+ == Installation
19
+
20
+ In a valid Ruby environment :
21
+
22
+ $ sudo zsh
23
+ # gem ins carioca
24
+
25
+ == Implementation
26
+
27
+ * [Carioca]
28
+
29
+
30
+ == Example
31
+
32
+
33
+ == Copyright
34
+
35
+ <pre>carioca (c) 2012-2013 Romain GEORGES <romain@ultragreen.net> for Ultragreen Software </pre>
36
+
@@ -0,0 +1,228 @@
1
+ require 'yaml'
2
+ require 'rubygems'
3
+ require 'methodic'
4
+ require 'services'
5
+ require 'daemons'
6
+
7
+ module Carioca
8
+
9
+ module Services
10
+ class Registry
11
+
12
+
13
+ private_class_method :new
14
+ @@inst = nil
15
+ def Registry.init(_options = {})
16
+ options = Methodic::get_options(_options) do |m|
17
+ m.specify_defaults_value :file => './services.registry', :debug => false
18
+ m.merge!
19
+ end
20
+
21
+ @@inst = new(options) if @@inst.nil?
22
+
23
+
24
+ return @@inst
25
+
26
+ end
27
+
28
+
29
+ attr_reader :list
30
+ attr_reader :loaded_services
31
+ attr_reader :debug
32
+
33
+
34
+ def debug=(_value)
35
+ @log.level =(_value)? Logger::DEBUG : Logger::INFO
36
+ end
37
+
38
+
39
+ def stop_service(_options)
40
+ options = Methodic.get_options(_options)
41
+ options.specify_class_of :name => String
42
+ options.specify_presence_of([:name])
43
+ options.validate!
44
+ if @loaded_services.include?(options[:name]) then
45
+ @loaded_engines[options[:name]].garbage if @loaded_services[options[:name]].respond_to? :garbage
46
+ @loaded_services.delete(options[:name])
47
+ @log.debug('Carioca') { "Service #{options[:name]} stopped" } if @log
48
+ return true
49
+ else
50
+ @log.debug('Carioca') { "Service #{options[:name]} not loaded" } if @log
51
+ return false
52
+ end
53
+
54
+ end
55
+
56
+ def register_service(_options)
57
+ options = Methodic.get_options(_options)
58
+ options.specify_classes_of({:name => String, :resource => String, :description => String, :type => Symbol, :init_options => Hash, :service => String })
59
+ options.specify_presences_of([:name,:type,:resource,:service])
60
+ options.validate!
61
+ _name = _options.delete(:name)
62
+ @list[_name] = _options
63
+ return true
64
+ end
65
+
66
+ def unregister_service(_options)
67
+ options = Methodic.get_options(_options = {})
68
+ options.specify_class_of :name => String
69
+ options.specify_presence_of :name
70
+ options.validate!
71
+ raise RegistryError::new("FONDATION : Can't unregistered the logger service" ) if options[:name] == 'logger'
72
+ raise RegistryError::new("Can't unregistered a loaded service" ) if @loaded_services.include?(options[:name])
73
+ @list.delete(options[:name])
74
+ return true
75
+ end
76
+
77
+ def discover_builtin
78
+ Carioca::Services::discover_builtin
79
+ end
80
+
81
+ def save!
82
+ res = false
83
+ File.open(@registry_filename, "w") do |f|
84
+ res = true if f.write(@list.to_yaml)
85
+ end
86
+ return res
87
+ end
88
+
89
+ def start_service(_options)
90
+ options = Methodic.get_options(_options)
91
+ options.specify_classes_of :name => String, :params => Hash
92
+ options.specify_presences_of([:name])
93
+ options.validate!
94
+ @log.debug('Carioca') { "getting service #{options[:name]}"} if @log
95
+ self.restart_service(options) unless @loaded_services.include? options[:name]
96
+ return @loaded_services[options[:name]]
97
+ end
98
+
99
+ alias :get_service :start_service
100
+
101
+ def restart_service(_options)
102
+ options = Methodic.get_options(_options)
103
+ options.specify_classes_of :name => String, :params => Hash
104
+ options.specify_presences_of [:name]
105
+ options.validate!
106
+ self.stop_service :name => options[:name] if @loaded_services.include? options[:name]
107
+ if options[:name] =~ /.*_.*/ then
108
+ (options[:instance],options[:shortname]) = options[:name].split(/_/)
109
+ else
110
+ options[:shortname] = options[:name]
111
+ end
112
+ verify_requires_dependancies(options)
113
+ require_service(options)
114
+ return instanciate_service(options)
115
+ end
116
+
117
+ def close
118
+ @log.debug('Carioca') { "closing Registry ..." }
119
+ @loaded_services.keys.each do |service|
120
+ next if service == 'logger'
121
+ @log.debug('Carioca') { "Stopping service #{service} ..."}
122
+ self.stop_service :name => service
123
+ end
124
+ @log.debug('Carioca') { "Registry services closed, logger will be closed asynchronously" }
125
+ self.stop_service :name => 'logger'
126
+ end
127
+
128
+
129
+ private
130
+ # private initializer
131
+ # @param [String] _filename default = '/data/config/service.registry' filename of the service Registry
132
+ # @return [Registry] Singleton
133
+ def initialize(_options)
134
+ @logger_not_in_reg = false
135
+ @debug = _options[:debug]
136
+ @registry_filename = _options[:file]
137
+ @list = Hash::new
138
+ load if File::exist?(@registry_filename)
139
+ unless @list.include?('logger') then
140
+ self.register_service({:name => 'logger',
141
+ :service => 'Carioca::Services::InternalLogger',
142
+ :resource => 'logger',
143
+ :description => "The standard ruby Logger internal wrapper Service",
144
+ :type => :builtin,
145
+ :init_options => { :target => "/tmp/log.file"}})
146
+ @logger_not_in_reg = true
147
+ end
148
+
149
+ @loaded_services = Hash::new
150
+
151
+ @log = self.start_service :name => 'logger'
152
+ @log.level =(@debug)? Logger::DEBUG : Logger::INFO
153
+ @log.debug('Carioca') { "Registry started, service logger preloaded" }
154
+ @log.debug('Carioca') { "Logger registered, not in configured registry" } if @logger_not_in_reg
155
+ end
156
+
157
+ def load
158
+ @list = YAML.load_file(@registry_filename)
159
+ end
160
+
161
+ private
162
+
163
+ def verify_requires_dependancies(options)
164
+ _name = options[:shortname]
165
+ if @list[_name].include?(:requires) then
166
+ @list[_name][:requires].each do |service|
167
+ unless @loaded_services.include?(service) then
168
+ @log.debug('Carioca') { "Registry dependancy found and not loaded : #{service}" }
169
+ restart_service :name => service
170
+ end
171
+ end
172
+ end
173
+ end
174
+
175
+ def require_service(options)
176
+ _name = options[:shortname]
177
+ sym = ":#{@list[_name][:service].split('::').last}"
178
+ case @list[_name][:type]
179
+ when :file then
180
+ require @list[_name][:resource]
181
+ when :builtin then
182
+ _file = Carioca::Services::search_builtins _name
183
+ if _file then
184
+ require _file
185
+ else
186
+ raise RegistryError::new("Config failed")
187
+ end
188
+ when :gem then
189
+ eval("require '#{@list[_name][:resource]}'")
190
+ else
191
+ raise RegistryError::new("Config failed")
192
+ end
193
+ end
194
+
195
+ def instanciate_service(options)
196
+ _name = options[:shortname]
197
+ @list[_name][:init_options] = options[:params] unless options[:params].nil?
198
+ if @list[_name][:init_options].nil? then
199
+ eval("@loaded_services[options[:name]] = #{@list[_name][:service]}::new")
200
+ else
201
+ eval("@loaded_services[options[:name]] = #{@list[_name][:service]}::new(@list[_name][:init_options])")
202
+ end
203
+ @log.debug('Carioca') { "Service #{options[:name]} started" } if @log
204
+ return @loaded_services[options[:name]]
205
+ end
206
+
207
+
208
+ end
209
+ end
210
+
211
+
212
+
213
+ end
214
+
215
+
216
+ class RegistryError < Exception; end
217
+
218
+
219
+ Module.class_eval do
220
+ def init_registry _options={}
221
+ options = Methodic.get_options(_options)
222
+ options.specify_classes_of :with_file => String
223
+ options.specify_default_value_of :with_file => './services.registry'
224
+ options.merge
225
+ options.validate!
226
+ Carioca::Services::Registry.init options[:with_file]
227
+ end
228
+ end
@@ -0,0 +1,26 @@
1
+ module Carioca
2
+ module Services
3
+ def Services::search_builtins(_name)
4
+ asearch = Gem.searcher
5
+ spec = asearch.find('carioca')
6
+ if spec then
7
+ res = asearch.lib_dirs_for(spec).split('/')
8
+ res.pop
9
+ services_path = res.join('/').concat('/lib/services')
10
+ else
11
+ services_path = "lib/services"
12
+ end
13
+ _file ="#{services_path}/#{_name}.rb"
14
+ if File::exist? _file then
15
+ return _file
16
+ else
17
+ return false
18
+ end
19
+ end
20
+
21
+ def Services::discover_builtin
22
+ end
23
+
24
+
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright Ultragreen (c) 2005
3
+ #---
4
+ # Author : Romain GEORGES
5
+ # type : class definition Ruby
6
+ # obj : Generic config library
7
+ #---
8
+ # $Id$
9
+
10
+
11
+ require 'rubygems'
12
+ require 'methodic'
13
+ require 'services'
14
+
15
+ module Carioca
16
+ module Services
17
+
18
+ class Configuration
19
+
20
+ private
21
+ # constructor type could be a section name in <get_sections> result
22
+ # override could be true of false and precise if the block of the application have
23
+ # to override the main config hash result, default is true
24
+ def initialize(_options)
25
+ options = Methodic.get_options(_options)
26
+ options.specify_classes_of :config_file => String
27
+ options.validate!
28
+
29
+
30
+
31
+
32
+
33
+ end
34
+
35
+ def test(params)
36
+ return 'toto'
37
+ end
38
+
39
+ end
40
+ end
41
+
42
+
43
+
44
+ end
45
+
46
+
47
+ # interactive hacks
48
+ if $0 == __FILE__ then
49
+ puts "#{File::basename(__FILE__)}:"
50
+ puts 'this is a RUBY library file'
51
+ puts "Copyright (c) Ultragreen"
52
+ end
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright Ultragreen (c) 2012
3
+ #---
4
+ # Author : Romain GEORGES
5
+ # type : class definition Ruby
6
+ # obj : Generic Debugs tools library
7
+ #---
8
+
9
+
10
+ require 'rubygems'
11
+ require 'methodic'
12
+
13
+
14
+ module Carioca
15
+ module Services
16
+
17
+ # standard RAA dependency
18
+
19
+
20
+ class ProxyDebug
21
+
22
+ def initialize(_options)
23
+ options = Methodic.get_options(_options)
24
+ options.specify_classes_of :service => String, :params => Hash
25
+ options.specify_presence_of([:service])
26
+ options.validate!
27
+ if options[:params] then
28
+ @obj = Registry.init.start_service :name => options[:service], :params => options[:params]
29
+ else
30
+ @obj = Registry.init.start_service :name => options[:service]
31
+ end
32
+ @log = Registry.init.get_service :name => 'logger'
33
+ @mapped_service = options[:service]
34
+ end
35
+
36
+ def method_missing(methodname, *args,&block)
37
+ @log.debug("ProxyDebug") { "BEGIN CALL for mapped service #{@mapped_service} "}
38
+ @log.debug("ProxyDebug") { "called: #{methodname} " }
39
+ @log.debug("ProxyDebug") { "args : #{args}" }
40
+
41
+ if block_given? then
42
+ @log.debug("ProxyDebug") { "block given" }
43
+ a = @obj.send(methodname, *args,&block)
44
+ else
45
+
46
+ a = @obj.send(methodname, *args)
47
+ end
48
+
49
+ @log.debug("ProxyDebug") { "=> returned: #{a} " }
50
+ @log.debug("ProxyDebug") { 'END CALL' }
51
+ return a
52
+ end
53
+ end
54
+
55
+
56
+ end
57
+ end
58
+
59
+ # protection for loading libs
60
+ if $0 == __FILE__ then
61
+ puts "#{File::basename(__FILE__)}:"
62
+ puts 'this is a RUBY library file'
63
+ puts "Copyright (c) Ultragreen"
64
+ puts "Version : #{Agents::LIB_VERSION}"
65
+ puts "Author : #{Agents::AUTHOR}"
66
+ puts "Date release : #{Agents::DATE}"
67
+ puts "Observation : #{Agents::OBS}"
68
+ end
69
+
70
+
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright Ultragreen (c) 2005
3
+ #---
4
+ # Author : Romain GEORGES
5
+ # type : class definition Ruby
6
+ # obj : Generic config library
7
+ #---
8
+ # $Id$
9
+
10
+
11
+ require 'rubygems'
12
+ require 'logger'
13
+ require 'methodic'
14
+
15
+ module Carioca
16
+ module Services
17
+
18
+ class InternalLogger < Logger
19
+
20
+ private
21
+ # constructor type could be a section name in <get_sections> result
22
+ # override could be true of false and precise if the block of the application have
23
+ # to override the main config hash result, default is true
24
+ def initialize(_options)
25
+ options = Methodic.get_options(_options)
26
+ options.specify_default_value_of :target => STDOUT
27
+ options.validate!
28
+
29
+ super(options[:target])
30
+
31
+
32
+
33
+ end
34
+
35
+ def garbage
36
+ self.close
37
+ end
38
+
39
+ end
40
+ end
41
+
42
+
43
+
44
+ end
45
+
46
+
47
+ # interactive hacks
48
+ if $0 == __FILE__ then
49
+ puts "#{File::basename(__FILE__)}:"
50
+ puts 'this is a RUBY library file'
51
+ puts "Copyright (c) Ultragreen"
52
+ end
@@ -0,0 +1,230 @@
1
+ require'rubygems'
2
+ require'rspec'
3
+ require 'carioca'
4
+
5
+ $debug = true
6
+
7
+ describe Carioca do
8
+ before :all do
9
+ FileUtils.rm_rf("/tmp/log.file")
10
+ $carioca = Carioca::Services::Registry.init :file => 'spec/config/services.registry', :debug => $debug
11
+ end
12
+
13
+ subject { Carioca }
14
+ it { should be_an_instance_of Module}
15
+ context "Carioca::Services" do
16
+ subject { Carioca::Services }
17
+ it { should be_an_instance_of Module }
18
+ end
19
+
20
+ context "Carioca::Services::Registry" do
21
+ subject { $carioca }
22
+ context "#init" do
23
+ it { should be_an_instance_of Carioca::Services::Registry }
24
+ it { $carioca.list.keys.should include "logger" }
25
+ it "should log Registry starting and logger init if debug mode", :if => $debug do
26
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Registry started, service logger preloaded/).size.should eq 1
27
+ end
28
+ it "should not log Registry starting and logger init if not debug mode", :unless => $debug do
29
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Registry started, service logger preloaded/).size.should eq 0
30
+ end
31
+
32
+
33
+ it "should be possible to log with this primary service" do
34
+ $logger = subject.get_service :name => 'logger'
35
+ $logger.info("test").should eq true
36
+ open('/tmp/log.file').grep(/INFO -- : test/).size.should eq 1
37
+ $logger.warn("test").should eq true
38
+ open('/tmp/log.file').grep(/WARN -- : test/).size.should eq 1
39
+ $logger.error("test").should eq true
40
+ open('/tmp/log.file').grep(/ERROR -- : test/).size.should eq 1
41
+ $logger.fatal("test").should eq true
42
+ open('/tmp/log.file').grep(/FATAL -- : test/).size.should eq 1
43
+ $logger.info("Program") { "running" }
44
+ open('/tmp/log.file').grep(/INFO -- Program: running/).size.should eq 1
45
+ end
46
+ end
47
+
48
+ context "attributs" do
49
+ context "#debug (RW)" do
50
+ it { should respond_to :debug }
51
+ it { should respond_to :debug= }
52
+ it "should be true if debug mode", :if => $debug do
53
+ subject.debug.should eq true
54
+ end
55
+ it "should be false if not debug mode", :unless => $debug do
56
+ subject.debug.should eq false
57
+ end
58
+ end
59
+
60
+
61
+ context "#list (RO)" do
62
+ it { should respond_to :list }
63
+ it { should_not respond_to :list= }
64
+ it { subject.list.should be_an_instance_of Hash }
65
+ it { $carioca.list.keys.sort.should eq ["configuration", "debug", "dummy", "logger", "uuid"] }
66
+ end
67
+
68
+ context "#loaded_services (RO)" do
69
+ it { should respond_to :loaded_services }
70
+ it { should_not respond_to :loaded_services= }
71
+ it { subject.loaded_services.should be_an_instance_of Hash }
72
+ it { $carioca.loaded_services.keys.should eq ["logger"] }
73
+ end
74
+ end
75
+
76
+ context "#start_service" do
77
+ it { should respond_to :start_service }
78
+ it { should respond_to :get_service }
79
+
80
+ context "Builtin services" do
81
+ context "Logger service" do
82
+ it "should be possible to get the logger service" do
83
+ $logger = subject.get_service :name => 'logger'
84
+ end
85
+ it "should log if debug mode", :if => $debug do
86
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: getting service logger/).size.should >= 1
87
+ end
88
+ it "should not log if debug mode", :unless => $debug do
89
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: getting service logger/).size.should eq 0
90
+ end
91
+ end
92
+
93
+
94
+ context "Debug Proxy Service" do
95
+ it "should start the registry with a service debug" do
96
+ myservice = subject.start_service :name => 'debug' , :params => {:service => 'configuration'}
97
+ myservice.test 'titi'
98
+ end
99
+ it { subject.list.keys.should include "debug" }
100
+ it "should log a proxy service log sequence" do
101
+ open('/tmp/log.file').grep(/DEBUG -- ProxyDebug: BEGIN CALL for mapped service configuration/).size.should eq 1
102
+ open('/tmp/log.file').grep(/DEBUG -- ProxyDebug: called: test/).size.should eq 1
103
+ open('/tmp/log.file').grep(/DEBUG -- ProxyDebug: args : titi/).size.should eq 1
104
+ open('/tmp/log.file').grep(/DEBUG -- ProxyDebug: => returned: toto/).size.should eq 1
105
+ open('/tmp/log.file').grep(/DEBUG -- ProxyDebug: END CALL/).size.should eq 1
106
+ end
107
+
108
+ end
109
+ end
110
+ context "External services" do
111
+
112
+ it "should start a dummy service precised in registry YAML configuration" do
113
+
114
+ $dummy = subject.start_service :name => 'dummy'
115
+ $dummy.should be_an_instance_of ExternalServices::Dummy
116
+ end
117
+ it { subject.list.keys.should include "dummy" }
118
+ it "should be possible to use test method of the dummy service, and return 'OK'" do
119
+ $dummy.test.should eq 'OK'
120
+ end
121
+ it "should start a gem service precised in registry YAML configuration" do
122
+ $uuid = subject.start_service :name => 'uuid'
123
+ $uuid.should be_an_instance_of UUID
124
+ end
125
+ it { subject.list.keys.should include "uuid" }
126
+ it "should be possible to execute a method with the gem service" do
127
+ $uuid.generate.should be_a_kind_of String
128
+ end
129
+ end
130
+ end
131
+
132
+
133
+ context "#stop_service" do
134
+ it { should respond_to :stop_service }
135
+ it "should raise ArgumentError if the option hash argument passed not include :name" do
136
+ lambda { subject.stop_service }.should raise_error ArgumentError
137
+ lambda { subject.stop_service(:notname => 'debug') }.should raise_error ArgumentError
138
+ end
139
+ it "should return true if service really stop" do
140
+ subject.stop_service({:name => 'dummy'}).should eq true
141
+ end
142
+ it "should log if debug mode", :if => $debug do
143
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Service dummy stopped/).size.should >= 1
144
+ end
145
+ it "should not log if debug mode", :unless => $debug do
146
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Service dummy stopped/).size.should = 0
147
+ end
148
+ it "should return false if service not already running" do
149
+ subject.stop_service({:name => 'dum'}).should eq false
150
+ end
151
+ it "should log if debug mode and service not loaded", :if => $debug do
152
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Service dum not loaded/).size.should >= 1
153
+ end
154
+ it "should not log if debug mode and service not loaded", :unless => $debug do
155
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Service dum not loaded/).size.should = 0
156
+ end
157
+
158
+
159
+ end
160
+
161
+ context "#restart_service" do
162
+ pending
163
+ end
164
+
165
+
166
+
167
+
168
+ context "#discover_builtin" do
169
+ pending
170
+ end
171
+ context "#register_service" do
172
+ pending
173
+ end
174
+ context "#unregister_service" do
175
+ pending
176
+ end
177
+
178
+
179
+
180
+ context "#save!" do
181
+ it { should respond_to :save! }
182
+ it "should save the config" do
183
+ subject.save!.should eq true
184
+ end
185
+ end
186
+
187
+
188
+
189
+ context "#close" do
190
+ context "Closing the Carioca registry" do
191
+ it { should respond_to :close }
192
+ it "should close" do
193
+ subject.close.should eq true
194
+ end
195
+ it "should log a registry closing notification if debug mode", :if => $debug do
196
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: closing Registry .../).size.should eq 1
197
+ end
198
+ it "should not log a registry closing notification if not debug mode", :unless => $debug do
199
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: closing Registry .../).size.should eq 0
200
+ end
201
+ it "should log a stopping notification for each services if debug mode", :if => $debug do
202
+ ['debug','uuid','configuration'].each do |service|
203
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Stopping service #{service} .../).size.should eq 1
204
+ end
205
+ end
206
+ it "should not log a stopping notification for each services if not debug mode", :unless => $debug do
207
+ ['debug','uuid','configuration'].each do |service|
208
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Stopping service #{service} .../).size.should eq 0
209
+ end
210
+ end
211
+ it "should log a registry closing confirmation if debug mode", :if => $debug do
212
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Registry services closed, logger will be closed asynchronously/).size.should eq 1
213
+ end
214
+ it "should not log a registry closing confirmation if not debug mode", :unless => $debug do
215
+ open('/tmp/log.file').grep(/DEBUG -- Carioca: Registry services closed, logger will be closed asynchronously/).size.should eq 0
216
+ end
217
+ it "should loaded services empty" do
218
+ subject.loaded_services.empty?.should eq true
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+
225
+
226
+
227
+
228
+
229
+
230
+
@@ -0,0 +1,32 @@
1
+ ---
2
+ uuid:
3
+ :type: :gem
4
+ :service: UUID
5
+ :description: a Rubygems called uuid to build UUID ids.
6
+ :resource: uuid
7
+ logger:
8
+ :type: :builtin
9
+ :service: Carioca::Services::InternalLogger
10
+ :description: The standard ruby Logger internal wrapper Service
11
+ :resource: logger
12
+ :init_options:
13
+ :target: /tmp/log.file
14
+ dummy:
15
+ :type: :file
16
+ :service: ExternalServices::Dummy
17
+ :description: a dummy test service
18
+ :resource: spec/samples/dummy.rb
19
+ debug:
20
+ :type: :builtin
21
+ :service: Carioca::Services::ProxyDebug
22
+ :description: Class Proxy debug logger Service
23
+ :resource: debug
24
+ :init_options:
25
+ :service: configuration
26
+ configuration:
27
+ :type: :builtin
28
+ :service: Carioca::Services::Configuration
29
+ :description: Configuration Agent Service
30
+ :resource: configuration
31
+ :init_options:
32
+ :config_file: ./.config
@@ -0,0 +1 @@
1
+ require "spec_helper"
@@ -0,0 +1,10 @@
1
+ module ExternalServices
2
+ class Dummy
3
+ def initialize
4
+ end
5
+
6
+ def test
7
+ return 'OK'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper.rb"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ # config.filter_run :focus
11
+ end
@@ -0,0 +1,25 @@
1
+ AssignmentInConditionalCheck:
2
+ CaseMissingElseCheck:
3
+ ClassLineCountCheck:
4
+ line_count: 300
5
+ ClassNameCheck:
6
+ pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/
7
+ #ClassVariableCheck:
8
+ CyclomaticComplexityBlockCheck:
9
+ complexity: 4
10
+ CyclomaticComplexityMethodCheck:
11
+ complexity: 10
12
+ EmptyRescueBodyCheck:
13
+ ForLoopCheck:
14
+ MethodLineCountCheck:
15
+ line_count: 30
16
+ MethodNameCheck:
17
+ pattern: !ruby/regexp /^[_a-z<>=\[|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
18
+ # MissingForeignKeyIndexCheck:
19
+ ModuleLineCountCheck:
20
+ line_count: 500
21
+ ModuleNameCheck:
22
+ pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/
23
+ ParameterNumberCheck:
24
+ parameter_count: 5
25
+
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: carioca
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ version: "0.1"
9
+ platform: ruby
10
+ authors:
11
+ - Romain GEORGES
12
+ autorequire:
13
+ bindir:
14
+ cert_chain: []
15
+
16
+ date: 2013-02-18 00:00:00 +01:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: rspec
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ segments:
27
+ - 2
28
+ - 0
29
+ - 0
30
+ version: 2.0.0
31
+ type: :development
32
+ version_requirements: *id001
33
+ description: "Carioca : provide a full IoC light Container for designing your applications"
34
+ email: romain@ultragreen.net
35
+ executables: []
36
+
37
+ extensions: []
38
+
39
+ extra_rdoc_files: []
40
+
41
+ files:
42
+ - spec/samples/dummy.rb
43
+ - spec/config/services.registry
44
+ - lib/services/configuration.rb
45
+ - lib/services/debug.rb
46
+ - lib/services/logger.rb
47
+ - spec/init_spec.rb
48
+ - spec/spec_helper.rb
49
+ - spec/carioca_spec.rb
50
+ - lib/carioca.rb
51
+ - lib/services.rb
52
+ - doc/manual.rdoc
53
+ - carioca.gemspec
54
+ - Rakefile
55
+ - INSTALL
56
+ - Gemfile.lock
57
+ - Gemfile
58
+ - ChangeLog
59
+ - COPYRIGHT
60
+ - ultragreen_roodi_coding_convention.yml
61
+ - AUTHORS
62
+ has_rdoc: true
63
+ homepage: http://www.ultragreen.net
64
+ licenses: []
65
+
66
+ post_install_message:
67
+ rdoc_options:
68
+ - --title
69
+ - "Carioca : Gem documentation"
70
+ - --main
71
+ - doc/manual.rdoc
72
+ - --line-numbers
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ segments:
80
+ - 1
81
+ - 8
82
+ - 1
83
+ version: 1.8.1
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ requirements: []
92
+
93
+ rubyforge_project: nowarning
94
+ rubygems_version: 1.3.6
95
+ signing_key:
96
+ specification_version: 3
97
+ summary: "Carioca : Configuration Agent and Registry with Inversion Of Control for your Applications"
98
+ test_files: []
99
+