dependency_injection 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0a4efb8f1e9100648b5f0b63615f783523c84173
4
- data.tar.gz: e90d72986360efd613cb027bf3446a247a1ecc58
3
+ metadata.gz: bee91995df1f5fc2220d223c7387a9e4c384e9fe
4
+ data.tar.gz: 15be55e7503b817ee7d3d79d1e88eb143c752485
5
5
  SHA512:
6
- metadata.gz: 58fa9d7f5421a2037c3d8d14a8a6ac0f302befdeaa472141c0b90b7626437fabbb1cc3e4d8a9eda078721fd020e344fd1436bb89fe6545347352793fe4ed2cdf
7
- data.tar.gz: 3beddb5b426c1dd99025f0bbf88f5bfea2079e5ca7166d4fd6882aadfe4e3cc1d0991b35d39a64a15dd235b9e1ebd98147482be62f1400d2f501f058b0517635
6
+ metadata.gz: a519c2ff82347e5ea4718adde01b6b87fc80b29d8409b4e2f4e1567ffbe551923a8ad79351271ffb6d83036360cf868c2342d7cfd8f5817da242df71928d7215
7
+ data.tar.gz: 1d12edeafb9daa99ffc1919f9f9f834fff87043681cb3572086413345f4b2076a85cce1b5886468e8e63530ddc2bf306cab356ba8460f48dd446c5263078aba9
@@ -1,3 +1,9 @@
1
+ # 0.4.0 (2014-02-23)
2
+
3
+ * Fix an error when a service use another service
4
+ * Add ERB support in YAML loader
5
+ * Add file_path option
6
+
1
7
  # 0.3.1 (2013-09-17)
2
8
 
3
9
  * Nothing adding/removed. Just fix the Gemfile.lock
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dependency_injection (0.3.1)
4
+ dependency_injection (0.4.0)
5
5
  activesupport
6
6
 
7
7
  GEM
@@ -17,7 +17,7 @@ GEM
17
17
  rest-client
18
18
  simplecov (>= 0.7)
19
19
  thor
20
- i18n (0.6.4)
20
+ i18n (0.6.9)
21
21
  metaclass (0.0.1)
22
22
  mime-types (1.23)
23
23
  minitest (5.0.6)
data/README.md CHANGED
@@ -172,6 +172,8 @@ And here's some more details about each keyword:
172
172
 
173
173
  * `calls`: An array containing an array of each instance method and its parameters. Note that you only need to define the methods during your class instantiation.
174
174
 
175
+ * `file_path`: A string containing the file path to require to load the class.
176
+
175
177
  * `lazy`: Returns a Proxy Object if true. The _real_ object will only be instantiated at the first method call.
176
178
 
177
179
  * `alias`: A string containing the target service name.
@@ -15,8 +15,12 @@ module DependencyInjection
15
15
  @parameters[name] = value
16
16
  end
17
17
 
18
+ def find(name)
19
+ @definitions[name]
20
+ end
21
+
18
22
  def get(name)
19
- if (definition = @definitions[name])
23
+ if (definition = self.find(name))
20
24
  definition.object
21
25
  end
22
26
  end
@@ -3,11 +3,12 @@ require 'dependency_injection/scope_widening_injection_error'
3
3
 
4
4
  module DependencyInjection
5
5
  class Definition
6
- attr_accessor :arguments, :configurator, :klass_name, :method_calls, :scope
6
+ attr_accessor :arguments, :configurator, :file_path, :klass_name, :method_calls, :scope
7
7
 
8
8
  def initialize(klass_name, container)
9
9
  @container = container
10
10
  self.arguments = []
11
+ self.file_path = nil
11
12
  self.klass_name = klass_name
12
13
  self.method_calls = {}
13
14
  self.scope = :container
@@ -50,6 +51,7 @@ module DependencyInjection
50
51
  end
51
52
 
52
53
  def initialize_object
54
+ require_object
53
55
  object = self.klass.new(*resolve(self.arguments))
54
56
  self.method_calls.each { |method_name, arguments| object.send(method_name, *resolve(arguments)) }
55
57
  if self.configurator
@@ -61,10 +63,26 @@ module DependencyInjection
61
63
  object
62
64
  end
63
65
 
66
+ def object_already_required?
67
+ true if Kernel.const_get(self.klass_name)
68
+ rescue
69
+ false
70
+ end
71
+
64
72
  def prototype_scoped_object
65
73
  initialize_object
66
74
  end
67
75
 
76
+ def require_object
77
+ return if object_already_required?
78
+
79
+ if self.file_path
80
+ require self.file_path
81
+ else
82
+ require self.klass_name.underscore
83
+ end
84
+ end
85
+
68
86
  def resolve(arguments)
69
87
  resolve_references(resolve_container_parameters(arguments))
70
88
  end
@@ -82,8 +100,9 @@ module DependencyInjection
82
100
  def resolve_references(arguments)
83
101
  arguments.map do |argument|
84
102
  if /^@(?<reference_name>.*)/ =~ argument
85
- reference = @container.get(reference_name)
86
- raise ScopeWideningInjectionError if reference.scope == :prototype && scope == :container
103
+ reference_definition = @container.find(reference_name)
104
+ reference = reference_definition.object
105
+ raise ScopeWideningInjectionError if reference_definition.scope == :prototype && scope == :container
87
106
 
88
107
  reference
89
108
  else
@@ -1,3 +1,4 @@
1
+ require 'erb'
1
2
  require 'yaml'
2
3
 
3
4
  module DependencyInjection
@@ -8,7 +9,7 @@ module DependencyInjection
8
9
  end
9
10
 
10
11
  def load(filename)
11
- file = YAML::load_file(filename)
12
+ file = load_file(filename)
12
13
  add_parameters(file['parameters']) if file['parameters']
13
14
  add_services(file['services']) if file['services']
14
15
  end
@@ -38,7 +39,8 @@ module DependencyInjection
38
39
  def add_standard_service(name, parameters)
39
40
  lazy_load = parameters['lazy'] || false
40
41
  definition = @container.register(name, parameters['class'], lazy_load)
41
- definition.scope = parameters['scope'] if parameters['scope']
42
+ definition.scope = parameters['scope'] if parameters['scope']
43
+ definition.file_path = parameters['file_path'] if parameters['file_path']
42
44
  definition.add_arguments(*parameters['arguments']) if parameters['arguments']
43
45
  if (configurator = parameters['configurator'])
44
46
  definition.add_configurator(configurator[0], configurator[1])
@@ -47,6 +49,10 @@ module DependencyInjection
47
49
  parameters['calls'].each { |method_name, arguments| definition.add_method_call(method_name, *arguments) }
48
50
  end
49
51
  end
52
+
53
+ def load_file(filename)
54
+ YAML::load(ERB.new(IO.read(filename)).result)
55
+ end
50
56
  end
51
57
  end
52
58
  end
@@ -1,3 +1,3 @@
1
1
  module DependencyInjection
2
- VERSION = '0.3.1'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -8,28 +8,28 @@ class TestYaml < Minitest::Test
8
8
  end
9
9
 
10
10
  def test_loading_file_without_parameters
11
- YAML.stubs(:load_file).with('services.yml').returns({ 'services' => [] })
11
+ @yaml_loader.stubs(:load_file).with('services.yml').returns({ 'services' => [] })
12
12
  @yaml_loader.expects(:add_parameters).never
13
13
 
14
14
  @yaml_loader.load('services.yml')
15
15
  end
16
16
 
17
17
  def test_loading_file_with_parameters
18
- YAML.stubs(:load_file).with('services.yml').returns({'parameters' => { 'key_1' => 'value_1' }, 'services' => [] })
18
+ @yaml_loader.stubs(:load_file).with('services.yml').returns({'parameters' => { 'key_1' => 'value_1' }, 'services' => [] })
19
19
  @yaml_loader.expects(:add_parameters).with({ 'key_1' => 'value_1' })
20
20
 
21
21
  @yaml_loader.load('services.yml')
22
22
  end
23
23
 
24
24
  def test_loading_file_without_services
25
- YAML.stubs(:load_file).with('services.yml').returns({ 'parameters' => [] })
25
+ @yaml_loader.stubs(:load_file).with('services.yml').returns({ 'parameters' => [] })
26
26
  @yaml_loader.expects(:add_services).never
27
27
 
28
28
  @yaml_loader.load('services.yml')
29
29
  end
30
30
 
31
31
  def test_loading_file_with_services
32
- YAML.stubs(:load_file).with('services.yml').returns({ 'parameters' => {}, 'services' => { 'service_1' => { 'class' => 'MyKlass' }}})
32
+ @yaml_loader.stubs(:load_file).with('services.yml').returns({ 'parameters' => {}, 'services' => { 'service_1' => { 'class' => 'MyKlass' }}})
33
33
  @yaml_loader.expects(:add_services).with({ 'service_1' => { 'class' => 'MyKlass' }})
34
34
 
35
35
  @yaml_loader.load('services.yml')
@@ -152,4 +152,12 @@ class TestYaml < Minitest::Test
152
152
 
153
153
  @yaml_loader.send(:add_standard_service, 'key_1', { 'class' => 'MyKlass', 'configurator' => ['ConfiguratorKlass', 'method_name'] })
154
154
  end
155
+
156
+ def test_adding_standard_service_with_file_path
157
+ definition = mock
158
+ @container.stubs(:register).with('key_1', 'MyKlass', false).returns(definition)
159
+ definition.expects(:file_path=).with('path/to/file')
160
+
161
+ @yaml_loader.send(:add_standard_service, 'key_1', { 'class' => 'MyKlass', 'file_path' => 'path/to/file' })
162
+ end
155
163
  end
@@ -29,6 +29,15 @@ class TestContainer < Minitest::Test
29
29
  assert_equal({ 'my.parameter' => 'other value' }, @container.parameters)
30
30
  end
31
31
 
32
+ def test_find_a_registered_definition_returns_a_definition
33
+ @container.register('my_definition', 'MyDefinition')
34
+ assert_equal(@definition, @container.find('my_definition'))
35
+ end
36
+
37
+ def test_find_a_not_registered_definition_returns_nil
38
+ assert_equal(nil, @container.find('my_definition'))
39
+ end
40
+
32
41
  def test_getting_a_registered_definition_returns_an_object
33
42
  @container.register('my_definition', 'MyDefinition')
34
43
  assert_equal(@final_object, @container.get('my_definition'))
@@ -71,6 +71,7 @@ class TestDefinition < Minitest::Test
71
71
  end
72
72
 
73
73
  def test_getting_object_with_arguments
74
+ @definition.stubs(:require_object).returns(mock)
74
75
  final_object = mock
75
76
  final_class = mock
76
77
  @definition.stubs(:klass).returns(final_class)
@@ -81,6 +82,7 @@ class TestDefinition < Minitest::Test
81
82
  end
82
83
 
83
84
  def test_getting_object_without_arguments
85
+ @definition.stubs(:require_object).returns(mock)
84
86
  final_object = mock
85
87
  final_class = mock
86
88
  @definition.stubs(:klass).returns(final_class)
@@ -90,6 +92,7 @@ class TestDefinition < Minitest::Test
90
92
  end
91
93
 
92
94
  def test_getting_object_with_method_calls
95
+ @definition.stubs(:require_object).returns(mock)
93
96
  final_object = mock
94
97
  final_class = mock
95
98
  @definition.stubs(:klass).returns(final_class)
@@ -104,6 +107,7 @@ class TestDefinition < Minitest::Test
104
107
  end
105
108
 
106
109
  def test_getting_object_without_configurator
110
+ @definition.stubs(:require_object).returns(mock)
107
111
  configurator_object = mock
108
112
  final_object = mock
109
113
  final_class = mock
@@ -117,6 +121,7 @@ class TestDefinition < Minitest::Test
117
121
  end
118
122
 
119
123
  def test_getting_object_with_configurator
124
+ @definition.stubs(:require_object).returns(mock)
120
125
  configurator_object = mock
121
126
  final_object = mock
122
127
  final_class = mock
@@ -189,38 +194,58 @@ class TestDefinition < Minitest::Test
189
194
  end
190
195
 
191
196
  def test_resolving_references_with_defintion_and_referenced_object_in_container_scope
192
- referenced_object = mock
193
- referenced_object.stubs(:scope).returns(:container)
197
+ referenced_definition = mock
198
+ referenced_object = mock
199
+ referenced_definition.stubs(:object).returns(referenced_object)
200
+ referenced_definition.stubs(:scope).returns(:container)
194
201
  @definition.scope= :container
195
- @container.stubs(:get).with('reference.name').returns(referenced_object)
202
+ @container.stubs(:find).with('reference.name').returns(referenced_definition)
196
203
 
197
204
  assert_equal(['first', referenced_object], @definition.send(:resolve_references, %w(first @reference.name)))
198
205
  end
199
206
 
200
207
  def test_resolving_references_with_defintion_and_referenced_object_in_prototype_scope
201
- referenced_object = mock
202
- referenced_object.stubs(:scope).returns(:prototype)
208
+ referenced_definition = mock
209
+ referenced_object = mock
210
+ referenced_definition.stubs(:object).returns(referenced_object)
211
+ referenced_definition.stubs(:scope).returns(:prototype)
203
212
  @definition.scope= :prototype
204
- @container.stubs(:get).with('reference.name').returns(referenced_object)
213
+ @container.stubs(:find).with('reference.name').returns(referenced_definition)
205
214
 
206
215
  assert_equal(['first', referenced_object], @definition.send(:resolve_references, %w(first @reference.name)))
207
216
  end
208
217
 
209
218
  def test_resolving_references_with_defintion_in_prototype_scope_and_referenced_object_in_container_scope
210
- referenced_object = mock
211
- referenced_object.stubs(:scope).returns(:container)
219
+ referenced_definition = mock
220
+ referenced_object = mock
221
+ referenced_definition.stubs(:object).returns(referenced_object)
222
+ referenced_definition.stubs(:scope).returns(:container)
212
223
  @definition.scope= :prototype
213
- @container.stubs(:get).with('reference.name').returns(referenced_object)
224
+ @container.stubs(:find).with('reference.name').returns(referenced_definition)
214
225
 
215
226
  assert_equal(['first', referenced_object], @definition.send(:resolve_references, %w(first @reference.name)))
216
227
  end
217
228
 
218
229
  def test_resolving_references_with_defintion_in_container_scope_and_referenced_object_in_prototype_scope
219
- referenced_object = mock
220
- referenced_object.stubs(:scope).returns(:prototype)
230
+ referenced_definition = mock
231
+ referenced_object = mock
232
+ referenced_definition.stubs(:object).returns(referenced_object)
233
+ referenced_definition.stubs(:scope).returns(:prototype)
221
234
  @definition.scope= :container
222
- @container.stubs(:get).with('reference.name').returns(referenced_object)
235
+ @container.stubs(:find).with('reference.name').returns(referenced_definition)
223
236
 
224
237
  assert_raises(ScopeWideningInjectionError) { @definition.send(:resolve_references, %w(first @reference.name)) }
225
238
  end
239
+
240
+ def test_require_object_with_file_path
241
+ @definition.expects(:require).with('/file/to/path').once
242
+ @definition.file_path = '/file/to/path'
243
+ @definition.send(:require_object)
244
+ end
245
+
246
+ def test_require_object_automatically
247
+ @definition.expects(:require).with('my_module/my_class').once
248
+ @definition.klass_name = 'MyModule::MyClass'
249
+ @definition.send(:require_object)
250
+ end
226
251
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependency_injection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Disneur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-17 00:00:00.000000000 Z
11
+ date: 2014-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
88
  version: '0'
89
89
  requirements: []
90
90
  rubyforge_project:
91
- rubygems_version: 2.0.6
91
+ rubygems_version: 2.0.14
92
92
  signing_key:
93
93
  specification_version: 4
94
94
  summary: Dependency Injection system for Ruby