dependency_injection 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ab031c6a6cfce9dd524b8f57851aa6b0ac19ed47
4
+ data.tar.gz: e3e3f3bf5b38432373e2352bca3e3790c342ce0c
5
+ SHA512:
6
+ metadata.gz: 8ab8a953e957e6578c159a09a648a2914447e35ed10153d67b8a7774bfd7479817b60bab6a2db733557e9dfec41daa3677f1090c9151ed48f09e6f59febb4ffb
7
+ data.tar.gz: 46c38816ad28d38c93ad1de72cc770e5113df3cc2900f71754dfeacf1b244093cf077d8ff6f4385c0fc78190a2eeaf6c4601ed98b2da2e22f3d33918460d4517
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ coverage
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ dependency_injection
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: 'ruby'
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - jruby-19mode
6
+ - rbx-19mode
7
+ - 2.0.0
8
+ script: 'bundle exec rake test'
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'coveralls'
6
+ gem 'minitest'
7
+ gem 'mocha'
8
+ gem 'rake'
data/Gemfile.lock ADDED
@@ -0,0 +1,44 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dependency_injection (0.1.0)
5
+ activesupport
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activesupport (3.2.14)
11
+ i18n (~> 0.6, >= 0.6.4)
12
+ multi_json (~> 1.0)
13
+ colorize (0.5.8)
14
+ coveralls (0.6.7)
15
+ colorize
16
+ multi_json (~> 1.3)
17
+ rest-client
18
+ simplecov (>= 0.7)
19
+ thor
20
+ i18n (0.6.4)
21
+ metaclass (0.0.1)
22
+ mime-types (1.23)
23
+ minitest (5.0.6)
24
+ mocha (0.14.0)
25
+ metaclass (~> 0.0.1)
26
+ multi_json (1.7.8)
27
+ rake (10.1.0)
28
+ rest-client (1.6.7)
29
+ mime-types (>= 1.16)
30
+ simplecov (0.7.1)
31
+ multi_json (~> 1.0)
32
+ simplecov-html (~> 0.7.1)
33
+ simplecov-html (0.7.1)
34
+ thor (0.18.1)
35
+
36
+ PLATFORMS
37
+ ruby
38
+
39
+ DEPENDENCIES
40
+ coveralls
41
+ dependency_injection!
42
+ minitest
43
+ mocha
44
+ rake
data/README.md ADDED
@@ -0,0 +1,6 @@
1
+ # Dependency Injection for Ruby
2
+ [![Build Status](https://travis-ci.org/kdisneur/dependency_injection-ruby.png?branch=master)](https://travis-ci.org/kdisneur/dependency_injection-ruby) [![Coverage Status](https://coveralls.io/repos/kdisneur/dependency_injection-ruby/badge.png?branch=master)](https://coveralls.io/r/kdisneur/dependency_injection-ruby?branch=master) [![Code Climate](https://codeclimate.com/github/kdisneur/dependency_injection-ruby.png)](https://codeclimate.com/github/kdisneur/dependency_injection-ruby)
3
+
4
+ It's a WIP for now.
5
+
6
+ You can find some examples in the [examples folder](https://github.com/kdisneur/dependency_injection-ruby/tree/master/examples)
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |test|
4
+ test.libs << 'test'
5
+ test.pattern = 'test/**/test_*.rb'
6
+ end
@@ -0,0 +1,18 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../lib', __FILE__))
2
+ require 'dependency_injection/version'
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = 'dependency_injection'
6
+ spec.version = DependencyInjection::VERSION
7
+ spec.summary = 'Dependency Injection system for Ruby'
8
+ spec.description = 'A fully customizable Dependency injection system for Ruby'
9
+ spec.homepage = 'https://github.com/kdisneur/dependency_injection'
10
+ spec.license = 'MIT'
11
+ spec.authors = ['Kevin Disneur']
12
+ spec.email = 'kevin@koboyz.org'
13
+ spec.files = `git ls-files`.split($/)
14
+ spec.require_paths = %w(lib)
15
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
+
17
+ spec.add_dependency('activesupport')
18
+ end
@@ -0,0 +1,63 @@
1
+ require 'dependency_injection/container'
2
+
3
+ c = DependencyInjection::Container.new
4
+
5
+ # 1 - No specific class initialization
6
+ class Mailer
7
+ def send_mail(message)
8
+ puts "mail sent: #{message}"
9
+ end
10
+ end
11
+
12
+ c.register('mailer', 'Mailer')
13
+ c.get('mailer').send_mail('Hello World')
14
+ # => mail sent: Hello World
15
+
16
+ Object.instance_eval { remove_const(:Mailer) }
17
+
18
+ # 2 - constructor specific class initialization
19
+ class Mailer
20
+ def initialize(transport)
21
+ @transport = transport
22
+ end
23
+
24
+ def send_mail(message)
25
+ puts "mail sent via #{@transport}: #{message}"
26
+ end
27
+ end
28
+
29
+ c.register('mailer', 'Mailer').add_argument('send_mail')
30
+ c.get('mailer').send_mail('Hello World')
31
+ # => mail sent via send_mail: Hello World
32
+
33
+ Object.instance_eval { remove_const(:Mailer) }
34
+
35
+ # 3 - method specific class initialization
36
+ class Mailer
37
+ attr_accessor :transport
38
+
39
+ def send_mail(message)
40
+ puts "mail sent via #{self.transport}: #{message}"
41
+ end
42
+ end
43
+
44
+ c.register('mailer', 'Mailer').add_method_call('transport=', 'send_mail')
45
+ c.get('mailer').send_mail('Hello World')
46
+ # => mail sent via send_mail: Hello World
47
+
48
+ # 4 - Mix of constructor and method specific class initialization
49
+ class Mailer
50
+ attr_accessor :transport
51
+
52
+ def initialize(from)
53
+ @from = from
54
+ end
55
+
56
+ def send_mail(message)
57
+ puts "mail sent by #{@from} via #{self.transport}: #{message}"
58
+ end
59
+ end
60
+
61
+ c.register('mailer', 'Mailer').add_argument('jon@doe.com').add_method_call('transport=', 'send_mail')
62
+ c.get('mailer').send_mail('Hello World')
63
+ # => mail sent by jon@doe.com via send_mail: Hello World
@@ -0,0 +1,35 @@
1
+ require 'dependency_injection/container'
2
+
3
+ c = DependencyInjection::Container.new
4
+ c.add_parameter('mailer.transport', 'sendmail')
5
+
6
+ class Mailer
7
+ attr_accessor :transport
8
+
9
+ def send_mail(message)
10
+ puts "mail sent via #{transport}: #{message}"
11
+ end
12
+ end
13
+
14
+ # 1 - Simple global parameter
15
+ c.register('mailer', 'Mailer').add_method_call('transport=', '%mailer.transport%')
16
+ c.get('mailer').send_mail('Hello World')
17
+ # => mail sent via send_mail: Hello World
18
+
19
+ # 2 - Complex global parameter
20
+ class NewsletterManager
21
+ def initialize(mailer)
22
+ @mailer = mailer
23
+ end
24
+
25
+ def send_mail(message)
26
+ puts 'newsletter'
27
+ @mailer.send_mail(message)
28
+ end
29
+ end
30
+
31
+ c.add_parameter('my.mailer', '@mailer')
32
+ c.register('newsletter', 'NewsletterManager').add_argument('%my.mailer%')
33
+ c.get('newsletter').send_mail('Hello World')
34
+ # => newsletter
35
+ # mail sent via send_mail: Hello World
@@ -0,0 +1,48 @@
1
+ require 'dependency_injection/container'
2
+
3
+ c = DependencyInjection::Container.new
4
+
5
+ # 1 - constructor specific class initialization
6
+ class NewsletterManager
7
+ def initialize(mailer)
8
+ @mailer = mailer
9
+ end
10
+
11
+ def send_mail(message)
12
+ @mailer.send_mail(message)
13
+ end
14
+ end
15
+
16
+ class Mailer
17
+ def send_mail(message)
18
+ puts "mail sent: #{message}"
19
+ end
20
+ end
21
+
22
+ c.register('my.mailer', 'Mailer')
23
+ c.register('newsletter', 'NewsletterManager').add_argument('@my.mailer')
24
+
25
+ c.get('newsletter').send_mail('Hello World')
26
+ # => mail sent: Hello World
27
+
28
+ Object.instance_eval { remove_const(:NewsletterManager) }
29
+
30
+ # 2 - method specific class initialization
31
+ class NewsletterManager
32
+ attr_accessor :mailer, :from
33
+
34
+ def send_mail(message)
35
+ puts "mail sent by #{@from}"
36
+ @mailer.send_mail(message)
37
+ end
38
+ end
39
+
40
+ c.register('my.mailer', 'Mailer')
41
+ c.register('newsletter', 'NewsletterManager')
42
+ .add_method_call('mailer=', '@my.mailer')
43
+ .add_method_call('from=', 'john@doe.com')
44
+
45
+ c.get('newsletter').send_mail('Hello World')
46
+ # => mail sent: Hello World
47
+
48
+ Object.instance_eval { remove_const(:Mailer) }
@@ -0,0 +1,11 @@
1
+ parameters:
2
+ mailer.transport: sendmail
3
+ services:
4
+ my.mailer:
5
+ class: Mailer
6
+ calls:
7
+ - ['transport=', '%mailer.transport%']
8
+ newsletter:
9
+ class: NewsletterManager
10
+ arguments:
11
+ - '@my.mailer'
@@ -0,0 +1,29 @@
1
+ require 'dependency_injection/container'
2
+ require 'dependency_injection/loaders/yaml'
3
+
4
+ c = DependencyInjection::Container.new
5
+ loader = DependencyInjection::Loaders::Yaml.new(c)
6
+ loader.load(File.join(File.dirname(File.expand_path(__FILE__)), 'services.yml'))
7
+
8
+ class NewsletterManager
9
+ def initialize(mailer)
10
+ @mailer = mailer
11
+ end
12
+
13
+ def send_mail(message)
14
+ puts 'newletter'
15
+ @mailer.send_mail(message)
16
+ end
17
+ end
18
+
19
+ class Mailer
20
+ attr_accessor :transport
21
+
22
+ def send_mail(message)
23
+ puts "mail sent via #{self.transport}: #{message}"
24
+ end
25
+ end
26
+
27
+ c.get('newsletter').send_mail('Hello World')
28
+ # => newletter
29
+ # mail sent via sendmail: Hello World
@@ -0,0 +1,26 @@
1
+ require 'dependency_injection/definition'
2
+
3
+ module DependencyInjection
4
+ class Container
5
+ attr_reader :definitions, :parameters
6
+
7
+ def initialize
8
+ @definitions = {}
9
+ @parameters = {}
10
+ end
11
+
12
+ def add_parameter(name, value)
13
+ @parameters[name] = value
14
+ end
15
+
16
+ def get(name)
17
+ if (definition = @definitions[name])
18
+ definition.object
19
+ end
20
+ end
21
+
22
+ def register(name, klass_name)
23
+ @definitions[name] = Definition.new(klass_name, self)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,69 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+
3
+ module DependencyInjection
4
+ class Definition
5
+ attr_accessor :klass_name, :arguments, :method_calls
6
+
7
+ def initialize(klass_name, container)
8
+ @container = container
9
+ self.arguments = []
10
+ self.klass_name = klass_name
11
+ self.method_calls = {}
12
+ end
13
+
14
+ def add_argument(argument)
15
+ self.add_arguments(argument)
16
+ end
17
+
18
+ def add_arguments(*arguments)
19
+ self.arguments += arguments
20
+
21
+ self
22
+ end
23
+
24
+ def add_method_call(method_name, *arguments)
25
+ self.method_calls[method_name] = arguments
26
+
27
+ self
28
+ end
29
+
30
+ def klass
31
+ self.klass_name.constantize
32
+ end
33
+
34
+ def object
35
+ return @object if @object
36
+
37
+ @object = self.klass.new(*resolve(self.arguments))
38
+ self.method_calls.each { |method_name, arguments| @object.send(method_name, *resolve(arguments)) }
39
+
40
+ @object
41
+ end
42
+
43
+ private
44
+
45
+ def resolve(arguments)
46
+ resolve_references(resolve_container_parameters(arguments))
47
+ end
48
+
49
+ def resolve_container_parameters(arguments)
50
+ arguments.map do |argument|
51
+ if /^%(?<parameter_name>.*)%$/ =~ argument
52
+ @container.parameters[parameter_name]
53
+ else
54
+ argument
55
+ end
56
+ end
57
+ end
58
+
59
+ def resolve_references(arguments)
60
+ arguments.map do |argument|
61
+ if /^@(?<reference_name>.*)/ =~ argument
62
+ @container.get(reference_name)
63
+ else
64
+ argument
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,35 @@
1
+ require 'yaml'
2
+
3
+ module DependencyInjection
4
+ module Loaders
5
+ class Yaml
6
+ def initialize(container)
7
+ @container = container
8
+ end
9
+
10
+ def load(filename)
11
+ file = YAML::load_file(filename)
12
+ add_parameters(file['parameters']) if file['parameters']
13
+ add_services(file['services']) if file['services']
14
+ end
15
+
16
+ private
17
+
18
+ def add_parameters(parameters)
19
+ parameters.each { |name, value| @container.add_parameter(name, value) }
20
+ end
21
+
22
+ def add_services(services)
23
+ services.each { |name, parameters| add_service(name, parameters) }
24
+ end
25
+
26
+ def add_service(name, parameters)
27
+ definition = @container.register(name, parameters['class'])
28
+ definition.add_arguments(*parameters['arguments']) if parameters['arguments']
29
+ if parameters['calls']
30
+ parameters['calls'].each { |method_name, arguments| definition.add_method_call(method_name, *arguments) }
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ module DependencyInjection
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,88 @@
1
+ require 'test_helper'
2
+ require 'dependency_injection/loaders/yaml'
3
+
4
+ class TestYaml < Minitest::Test
5
+ def setup
6
+ @container = mock
7
+ @yaml_loader = DependencyInjection::Loaders::Yaml.new(@container)
8
+ end
9
+
10
+ def test_loading_file_without_parameters
11
+ YAML.stubs(:load_file).with('services.yml').returns({ 'services' => [] })
12
+ @yaml_loader.expects(:add_parameters).never
13
+
14
+ @yaml_loader.load('services.yml')
15
+ end
16
+
17
+ def test_loading_file_with_parameters
18
+ YAML.stubs(:load_file).with('services.yml').returns({'parameters' => { 'key_1' => 'value_1' }, 'services' => [] })
19
+ @yaml_loader.expects(:add_parameters).with({ 'key_1' => 'value_1' })
20
+
21
+ @yaml_loader.load('services.yml')
22
+ end
23
+
24
+ def test_loading_file_without_services
25
+ YAML.stubs(:load_file).with('services.yml').returns({ 'parameters' => [] })
26
+ @yaml_loader.expects(:add_services).never
27
+
28
+ @yaml_loader.load('services.yml')
29
+ end
30
+
31
+ def test_loading_file_with_services
32
+ YAML.stubs(:load_file).with('services.yml').returns({ 'parameters' => {}, 'services' => { 'service_1' => { 'class' => 'MyKlass' }}})
33
+ @yaml_loader.expects(:add_services).with({ 'service_1' => { 'class' => 'MyKlass' }})
34
+
35
+ @yaml_loader.load('services.yml')
36
+ end
37
+
38
+ def test_adding_parameters
39
+ @container.expects(:add_parameter).with('key_1', 'value_1')
40
+ @container.expects(:add_parameter).with('key_2', 'value_2')
41
+
42
+ @yaml_loader.send(:add_parameters, { 'key_1' => 'value_1', 'key_2' => 'value_2' })
43
+ end
44
+
45
+ def test_adding_services
46
+ @yaml_loader.expects(:add_service).with('key_1', { 'param_1' => 'value_1', 'param_2' => 'value_2' })
47
+ @yaml_loader.expects(:add_service).with('key_2', { 'param_1' => 'value_1' })
48
+
49
+ @yaml_loader.send(:add_services, { 'key_1' => { 'param_1' => 'value_1', 'param_2' => 'value_2' },
50
+ 'key_2' => { 'param_1' => 'value_1' }})
51
+ end
52
+
53
+ def test_adding_service_without_parameters
54
+ definition = mock
55
+ @container.stubs(:register).with('key_1', 'MyKlass').returns(definition)
56
+ definition.expects(:add_arguments).never
57
+
58
+ @yaml_loader.send(:add_service, 'key_1', { 'class' => 'MyKlass' })
59
+ end
60
+
61
+ def test_adding_service_with_parameters
62
+ definition = mock
63
+ @container.stubs(:register).with('key_1', 'MyKlass').returns(definition)
64
+ definition.expects(:add_arguments).with('arg_1', 'arg_2')
65
+
66
+ @yaml_loader.send(:add_service, 'key_1', { 'class' => 'MyKlass', 'arguments' => ['arg_1', 'arg_2'] })
67
+ end
68
+
69
+ def test_adding_service_without_method_calls
70
+ definition = mock
71
+ @container.stubs(:register).with('key_1', 'MyKlass').returns(definition)
72
+ definition.expects(:add_method_call).never
73
+
74
+ @yaml_loader.send(:add_service, 'key_1', { 'class' => 'MyKlass' })
75
+ end
76
+
77
+ def test_adding_service_with_method_calls
78
+ definition = mock
79
+ @container.stubs(:register).with('key_1', 'MyKlass').returns(definition)
80
+ definition.expects(:add_method_call).with('method_1', 'arg_1')
81
+ definition.expects(:add_method_call).with('method_2', 'arg_1', 'arg_2')
82
+ definition.expects(:add_method_call).with('method_3', %w(arg_1 arg_2))
83
+
84
+ @yaml_loader.send(:add_service, 'key_1', { 'class' => 'MyKlass', 'calls' => { 'method_1' => ['arg_1'],
85
+ 'method_2' => ['arg_1', 'arg_2'],
86
+ 'method_3' => [['arg_1', 'arg_2']] }})
87
+ end
88
+ end
@@ -0,0 +1,54 @@
1
+ require 'test_helper'
2
+ require 'dependency_injection/container'
3
+
4
+ class TestContainer < Minitest::Test
5
+ def setup
6
+ @container = DependencyInjection::Container.new
7
+ @final_object = mock
8
+ @definition = mock
9
+ @definition.stubs(:object).returns(@final_object)
10
+ @another_definition = mock
11
+ DependencyInjection::Definition.stubs(:new).with('MyDefinition', @container).returns(@definition)
12
+ DependencyInjection::Definition.stubs(:new).with('MyOtherDefinition', @container).returns(@another_definition)
13
+ end
14
+
15
+ def test_adding_new_parameter
16
+ @container.add_parameter('my.parameter', 'value')
17
+ assert_equal({ 'my.parameter' => 'value' }, @container.parameters)
18
+ end
19
+
20
+ def test_adding_an_already_existing_parameter
21
+ @container.add_parameter('my.parameter', 'value')
22
+ assert_equal({ 'my.parameter' => 'value' }, @container.parameters)
23
+
24
+ @container.add_parameter('my.parameter', 'other value')
25
+ assert_equal({ 'my.parameter' => 'other value' }, @container.parameters)
26
+ end
27
+
28
+ def test_getting_a_registered_definition_returns_an_object
29
+ @container.register('my_definition', 'MyDefinition')
30
+ assert_equal(@final_object, @container.get('my_definition'))
31
+ end
32
+
33
+ def test_getting_a_not_registered_definition_returns_nil
34
+ assert_equal(nil, @container.get('my_definition'))
35
+ end
36
+
37
+ def test_registering_a_definition
38
+ @container.register('my_definition', 'MyDefinition')
39
+
40
+ assert_equal({ 'my_definition' => @definition }, @container.definitions)
41
+ end
42
+
43
+ def test_registering_a_class_return_a_definition_object
44
+ assert_equal(@definition, @container.register('my_definition', 'MyDefinition'))
45
+ end
46
+
47
+ def test_registering_an_already_existing_definition_replace_it
48
+ @container.register('my_definition', 'MyDefinition')
49
+ assert_equal({ 'my_definition' => @definition }, @container.definitions)
50
+
51
+ @container.register('my_definition', 'MyOtherDefinition')
52
+ assert_equal({ 'my_definition' => @another_definition }, @container.definitions)
53
+ end
54
+ end
@@ -0,0 +1,134 @@
1
+ require 'test_helper'
2
+ require 'dependency_injection/definition'
3
+
4
+ class TestDefinition < Minitest::Test
5
+ def setup
6
+ @container = mock
7
+ @definition = DependencyInjection::Definition.new('MyClass', @container)
8
+ end
9
+
10
+ def test_adding_an_argument
11
+ @definition.add_argument('new argument')
12
+
13
+ assert_equal(['new argument'], @definition.arguments)
14
+ end
15
+
16
+ def test_adding_an_argument_returns_definition_object
17
+ assert_equal(@definition, @definition.add_argument('new argument'))
18
+ end
19
+
20
+ def test_adding_several_arguments
21
+ @definition.add_arguments('first', 'second')
22
+
23
+ assert_equal(%w(first second), @definition.arguments)
24
+ end
25
+
26
+ def test_adding_several_arguments_returns_definition_object
27
+ assert_equal(@definition, @definition.add_arguments('first', 'second'))
28
+ end
29
+
30
+ def test_adding_additional_arguments
31
+ @definition.add_arguments('first')
32
+ assert_equal(%w(first), @definition.arguments)
33
+
34
+ @definition.add_arguments('second', 'third')
35
+ assert_equal(%w(first second third), @definition.arguments)
36
+ end
37
+
38
+ def test_adding_a_method_call_without_parameters
39
+ @definition.add_method_call('my_method')
40
+
41
+ assert_equal({ 'my_method' => [] }, @definition.method_calls)
42
+ end
43
+
44
+ def test_adding_a_method_call_with_parameters
45
+ @definition.add_method_call('my_method=', 'value')
46
+
47
+ assert_equal({ 'my_method=' => %w(value) }, @definition.method_calls)
48
+ end
49
+
50
+ def test_adding_a_method_call_returns_definition_object
51
+ assert_equal(@definition, @definition.add_method_call('my_method'))
52
+ end
53
+
54
+ def test_getting_klass
55
+ klass = mock
56
+ klass_name = 'MyClass'
57
+ @definition.stubs(:klass_name).returns(klass_name)
58
+ klass_name.stubs(:constantize).returns(klass)
59
+
60
+ assert_equal(klass, @definition.klass)
61
+ end
62
+
63
+ def test_getting_object_with_arguments
64
+ final_object = mock
65
+ final_class = mock
66
+ @definition.stubs(:klass).returns(final_class)
67
+ @definition.add_arguments('first', 'second')
68
+ final_class.stubs(:new).with('first', 'second').returns(final_object)
69
+
70
+ assert_equal(final_object, @definition.object)
71
+ end
72
+
73
+ def test_getting_object_without_arguments
74
+ final_object = mock
75
+ final_class = mock
76
+ @definition.stubs(:klass).returns(final_class)
77
+ final_class.stubs(:new).with.returns(final_object)
78
+
79
+ assert_equal(final_object, @definition.object)
80
+ end
81
+
82
+ def test_getting_object_with_method_calls
83
+ final_object = mock
84
+ final_class = mock
85
+ @definition.stubs(:klass).returns(final_class)
86
+ final_class.stubs(:new).with.returns(final_object)
87
+ final_object.expects(:method_1).with
88
+ final_object.expects(:method_2).with('value')
89
+
90
+ @definition.add_method_call('method_1')
91
+ @definition.add_method_call('method_2', 'value')
92
+
93
+ @definition.object
94
+ end
95
+
96
+ def test_resolving_first_container_parameters
97
+ changed_arguments = mock
98
+ arguments = mock
99
+ @definition.stubs(:resolve_references).returns(changed_arguments)
100
+ @definition.expects(:resolve_container_parameters).with(arguments)
101
+
102
+ @definition.send(:resolve, arguments)
103
+ end
104
+
105
+ def test_resolving_references_after_container_parameters
106
+ changed_arguments = mock
107
+ arguments = mock
108
+ @definition.stubs(:resolve_container_parameters).with(arguments).returns(changed_arguments)
109
+ @definition.expects(:resolve_references).with(changed_arguments)
110
+
111
+ @definition.send(:resolve, arguments)
112
+ end
113
+
114
+ def test_resolving_container_parameters_without_parameters
115
+ assert_equal(%w(first, second), @definition.send(:resolve_container_parameters, %w(first, second)))
116
+ end
117
+
118
+ def test_resolving_container_parameters_with_parameters
119
+ @container.stubs(:parameters).returns({ 'parameter' => 'value' })
120
+
121
+ assert_equal(['first', 'value'], @definition.send(:resolve_container_parameters, %w(first %parameter%)))
122
+ end
123
+
124
+ def test_resolving_references_without_references
125
+ assert_equal(%w(first second), @definition.send(:resolve_references, %w(first second)))
126
+ end
127
+
128
+ def test_resolving_references_with_references
129
+ referenced_object = mock
130
+ @container.stubs(:get).with('reference.name').returns(referenced_object)
131
+
132
+ assert_equal(['first', referenced_object], @definition.send(:resolve_references, %w(first @reference.name)))
133
+ end
134
+ end
@@ -0,0 +1,9 @@
1
+ require 'coveralls'
2
+ Coveralls.wear! do
3
+ add_filter '/test/'
4
+ end
5
+
6
+ require 'minitest/autorun'
7
+ require 'minitest/pride'
8
+ require 'mocha/setup'
9
+
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dependency_injection
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kevin Disneur
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: A fully customizable Dependency injection system for Ruby
28
+ email: kevin@koboyz.org
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .gitignore
34
+ - .ruby-gemset
35
+ - .ruby-version
36
+ - .travis.yml
37
+ - Gemfile
38
+ - Gemfile.lock
39
+ - README.md
40
+ - Rakefile
41
+ - dependency_injection.gemspec
42
+ - examples/basic_usage.rb
43
+ - examples/global_container_parameter.rb
44
+ - examples/inject_a_reference_to_another_dependency.rb
45
+ - examples/services.yml
46
+ - examples/yaml_configuration_file.rb
47
+ - lib/dependency_injection/container.rb
48
+ - lib/dependency_injection/definition.rb
49
+ - lib/dependency_injection/loaders/yaml.rb
50
+ - lib/dependency_injection/version.rb
51
+ - test/dependency_injection/loaders/test_yaml.rb
52
+ - test/dependency_injection/test_container.rb
53
+ - test/dependency_injection/test_definition.rb
54
+ - test/test_helper.rb
55
+ homepage: https://github.com/kdisneur/dependency_injection
56
+ licenses:
57
+ - MIT
58
+ metadata: {}
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project:
75
+ rubygems_version: 2.0.6
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: Dependency Injection system for Ruby
79
+ test_files:
80
+ - test/dependency_injection/loaders/test_yaml.rb
81
+ - test/dependency_injection/test_container.rb
82
+ - test/dependency_injection/test_definition.rb
83
+ - test/test_helper.rb