smart_ioc 0.1.27 → 0.1.28

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: 7aee826a000111362583c955705c9b149d8592a9
4
- data.tar.gz: 082aa8f2db41f9597853157f7a868d8080efc210
3
+ metadata.gz: 241dbe4a31d95181db8b2604a570f5e0f244894e
4
+ data.tar.gz: 08434ffb62dd2727da1d82fa6919f69263593117
5
5
  SHA512:
6
- metadata.gz: 7af22bc69babb1cff296409a176949ed74ab07186c6e1878882246bc0722d621b4d4ec962d1ee54cd2de7e409f681cafb1483b80ea56d0f7033958534d86d1be
7
- data.tar.gz: e671933874cae7b256fcac77c4ebbe91f85136cf1f772dab51518f2e6e907eed64c9085aa29ebec93746d33504cf499fd304adb8c609c81fbf2a71615d1631db
6
+ metadata.gz: 164dde71578f2399b63af9af1fc173bc261c0ac19d4c2eccfb44a300e5cacbd1ce9e7f76ae3843a79734cae1333ba0a03fb0cbb599c08302af1c7122ea0443ff
7
+ data.tar.gz: a4d77468cfed50a70dbeecd23366ac05e4f7ac93a76ba8453336a298ea9e2ef9d8885a00b059500464a1c691133f87d54d9f685cbc88ec0768c6272dfafb4bad
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_ioc (0.1.27)
4
+ smart_ioc (0.1.28)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -5,6 +5,14 @@ class SmartIoC::BeanDefinitionsStorage
5
5
  @collection = []
6
6
  end
7
7
 
8
+ def clear_dependencies
9
+ @collection.each do |bd|
10
+ bd.dependencies.each do |dependency|
11
+ dependency.bean_definition = nil
12
+ end
13
+ end
14
+ end
15
+
8
16
  # @param bean_definition [BeanDefinition]
9
17
  def push(bean_definition)
10
18
  existing_bd = @collection.detect do |bd|
@@ -58,12 +58,11 @@ class SmartIoC::BeanFactory
58
58
  raise LoadRecursion.new(bean_definition)
59
59
  end
60
60
 
61
- dependency_cache = {}
62
- beans_cache = init_bean_definition_cache(bean_definition)
61
+ beans_cache = init_bean_definition_cache(bean_definition)
63
62
 
64
- autodetect_bean_definitions_for_dependencies(bean_definition, dependency_cache)
65
- preload_beans(bean_definition, dependency_cache, beans_cache[bean_definition])
66
- load_bean(bean_definition, dependency_cache, beans_cache)
63
+ autodetect_bean_definitions_for_dependencies(bean_definition)
64
+ preload_beans(bean_definition, beans_cache[bean_definition])
65
+ load_bean(bean_definition, beans_cache)
67
66
  end
68
67
  end
69
68
 
@@ -115,19 +114,17 @@ class SmartIoC::BeanFactory
115
114
  end
116
115
  end
117
116
 
118
- def autodetect_bean_definitions_for_dependencies(bean_definition, dependency_cache)
117
+ def autodetect_bean_definitions_for_dependencies(bean_definition)
119
118
  bean_definition.dependencies.each do |dependency|
120
- next if dependency_cache.has_key?(dependency)
119
+ next if dependency.bean_definition
121
120
 
122
121
  @bean_file_loader.require_bean(dependency.ref)
123
122
 
124
- bd = autodetect_bean_definition(
123
+ dependency.bean_definition = autodetect_bean_definition(
125
124
  dependency.ref, dependency.package, bean_definition.package
126
125
  )
127
126
 
128
- dependency_cache[dependency] = bd
129
-
130
- autodetect_bean_definitions_for_dependencies(bd, dependency_cache)
127
+ autodetect_bean_definitions_for_dependencies(dependency.bean_definition)
131
128
  end
132
129
  end
133
130
 
@@ -174,7 +171,7 @@ class SmartIoC::BeanFactory
174
171
  return smart_bds.first
175
172
  end
176
173
 
177
- def preload_beans(bean_definition, dependency_cache, beans_cache)
174
+ def preload_beans(bean_definition, beans_cache)
178
175
  scope = get_scope(bean_definition)
179
176
 
180
177
  if scope_bean = scope.get_bean(bean_definition.klass)
@@ -184,13 +181,13 @@ class SmartIoC::BeanFactory
184
181
  end
185
182
 
186
183
  bean_definition.dependencies.each do |dependency|
187
- bd = dependency_cache[dependency]
184
+ bd = dependency.bean_definition
188
185
 
189
186
  next if beans_cache[:dependencies].has_key?(bd)
190
187
 
191
188
  dep_bean_cache = init_bean_definition_cache(bd)
192
189
  beans_cache[:dependencies].merge!(dep_bean_cache)
193
- preload_beans(bd, dependency_cache, dep_bean_cache[bd])
190
+ preload_beans(bd, dep_bean_cache[bd])
194
191
  end
195
192
  end
196
193
 
@@ -229,8 +226,12 @@ class SmartIoC::BeanFactory
229
226
 
230
227
  def init_zero_dep_factory_beans(beans_cache)
231
228
  beans_cache.each do |bean_definition, bd_opts|
232
- if bean_definition.has_factory_method? && bean_definition.dependencies.size == 0
233
- init_factory_bean(bean_definition, bd_opts)
229
+ if bean_definition.has_factory_method?
230
+ has_factory_dependencies = !!bean_definition.dependencies.detect {|dep| dep.bean_definition.has_factory_method?}
231
+
232
+ if bean_definition.dependencies.size == 0 || !has_factory_dependencies
233
+ init_factory_bean(bean_definition, bd_opts)
234
+ end
234
235
  end
235
236
  init_zero_dep_factory_beans(bd_opts[:dependencies]) if !bd_opts[:dependencies].empty?
236
237
  end
@@ -247,44 +248,50 @@ class SmartIoC::BeanFactory
247
248
  collection
248
249
  end
249
250
 
250
- def init_dependent_factory_beans(beans_cache, dependency_cache)
251
+ def init_dependent_factory_beans(beans_cache)
251
252
  dependent_factory_beans = collect_dependent_factory_beans(beans_cache, [])
252
253
 
253
254
  dependent_factory_beans.each do |bean_definition|
254
- if cross_refference_bd = get_cross_refference(dependent_factory_beans, bean_definition, dependency_cache)
255
- raise ArgumentError, "Factory method beans should not cross refference each other. Bean :#{bean_definition.name} cross refferences bean :#{cross_refference_bd.name}."
255
+ cross_refference_bd = get_cross_refference(dependent_factory_beans, bean_definition)
256
+
257
+ if cross_refference_bd
258
+ has_factory_dependencies = !!cross_refference_bd.dependencies.detect {|dep| dep.bean_definition.has_factory_method?}
259
+
260
+ if has_factory_dependencies
261
+ raise ArgumentError, "Factory method beans should not cross refference each other. Bean :#{bean_definition.name} cross refferences bean :#{cross_refference_bd.name}."
262
+ end
256
263
  end
257
264
  end
258
265
 
259
266
  beans_cache.each do |bean_definition, bd_opts|
260
267
  if bean_definition.has_factory_method? && bean_definition.dependencies.size > 0
261
- inject_beans(bean_definition, dependency_cache, bd_opts)
268
+ inject_beans(bean_definition, bd_opts)
262
269
  init_factory_bean(bean_definition, bd_opts)
263
270
  end
264
- init_dependent_factory_beans(bd_opts[:dependencies], dependency_cache)
271
+ init_dependent_factory_beans(bd_opts[:dependencies])
265
272
  end
266
273
  end
267
274
 
268
- def load_bean(bean_definition, dependency_cache, beans_cache)
275
+ def load_bean(bean_definition, beans_cache)
269
276
  init_zero_dep_factory_beans(beans_cache)
270
- init_dependent_factory_beans(beans_cache, dependency_cache)
271
- inject_beans(bean_definition, dependency_cache, beans_cache[bean_definition])
277
+ init_dependent_factory_beans(beans_cache)
278
+ inject_beans(bean_definition, beans_cache[bean_definition])
272
279
  beans_cache[bean_definition][:scope_bean].bean
273
280
  end
274
281
 
275
- def inject_beans(bean_definition, dependency_cache, beans_cache)
282
+ def inject_beans(bean_definition, beans_cache)
276
283
  bean = beans_cache[:scope_bean].bean
277
284
  bean_definition.dependencies.each do |dependency|
278
- bd = dependency_cache[dependency]
285
+ bd = dependency.bean_definition
279
286
  dep_bean = beans_cache[:dependencies][bd][:scope_bean].bean
280
287
  bean.instance_variable_set(:"@#{dependency.bean}", dep_bean)
281
- inject_beans(bd, dependency_cache, beans_cache[:dependencies][bd])
288
+ inject_beans(bd, beans_cache[:dependencies][bd])
282
289
  end
283
290
  end
284
291
 
285
- def get_cross_refference(refer_bean_definitions, current_bean_definition, dependency_cache, seen_bean_definitions = [])
292
+ def get_cross_refference(refer_bean_definitions, current_bean_definition, seen_bean_definitions = [])
286
293
  current_bean_definition.dependencies.each do |dependency|
287
- bd = dependency_cache[dependency]
294
+ bd = dependency.bean_definition
288
295
 
289
296
  next if seen_bean_definitions.include?(bd)
290
297
 
@@ -292,7 +299,7 @@ class SmartIoC::BeanFactory
292
299
  return bd
293
300
  end
294
301
 
295
- if crbd = get_cross_refference(refer_bean_definitions, bd, dependency_cache, seen_bean_definitions + [bd])
302
+ if crbd = get_cross_refference(refer_bean_definitions, bd, seen_bean_definitions + [bd])
296
303
  return crbd
297
304
  end
298
305
  end
@@ -111,6 +111,7 @@ module SmartIoC
111
111
  # @param context [Symbol] context (ex: :test)
112
112
  def set_extra_context_for_package(package_name, context)
113
113
  extra_package_contexts.set_context(package_name, context)
114
+ bean_definitions_storage.clear_dependencies
114
115
  end
115
116
 
116
117
  # @param bean_name [Symbol] bean name
@@ -1,3 +1,3 @@
1
1
  module SmartIoC
2
- VERSION = "0.1.27"
2
+ VERSION = "0.1.28"
3
3
  end
@@ -46,4 +46,46 @@ describe 'Factory Method' do
46
46
  it 'assigns bean with factory method' do
47
47
  expect(@other_service.test_config).to be_a(TestConfig::Config)
48
48
  end
49
+
50
+ context 'cross refference factory method beans' do
51
+ before :all do
52
+ class SingletonBean
53
+ include SmartIoC::Iocify
54
+
55
+ bean :singleton_bean, package: :cross_refference
56
+ end
57
+
58
+ class FactoryConfig
59
+ include SmartIoC::Iocify
60
+
61
+ bean :factory_config, factory_method: :build, package: :cross_refference
62
+
63
+ inject :singleton_bean
64
+
65
+ def build
66
+ Object.new
67
+ end
68
+ end
69
+
70
+ class FactoryLogger
71
+ include SmartIoC::Iocify
72
+
73
+ bean :factory_logger, factory_method: :build, package: :cross_refference
74
+
75
+ inject :factory_config
76
+
77
+ def build
78
+ Object.new
79
+ end
80
+ end
81
+ end
82
+
83
+ it 'creates factory_logger bean' do
84
+ expect(SmartIoC.get_bean(:factory_logger, package: :cross_refference)).to be_a(Object)
85
+ end
86
+
87
+ it 'creates factory_config bean' do
88
+ expect(SmartIoC.get_bean(:factory_config, package: :cross_refference)).to be_a(Object)
89
+ end
90
+ end
49
91
  end
@@ -34,7 +34,7 @@ describe SmartIoC do
34
34
  it 'sets beans with extra package context' do
35
35
  SmartIoC.set_extra_context_for_package(:admins, :test)
36
36
  SmartIoC.force_clear_scopes
37
-
37
+
38
38
  users_creator = @container.get_bean(:users_creator)
39
39
  users_creator.create(1, 'test@test.com')
40
40
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_ioc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.27
4
+ version: 0.1.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-07 00:00:00.000000000 Z
11
+ date: 2017-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler