smart_ioc 0.1.29 → 0.1.30

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c643b23f10b8d4ab31f241f8705fac4cb4abb7d
4
- data.tar.gz: d77b6c7528997f199c2dbdc144a95ca76c59e6a5
3
+ metadata.gz: 0146809a105a5135977a543956a5929d6dca9951
4
+ data.tar.gz: 51c86019fa338d8008bdf120dd17acc5be8e9f95
5
5
  SHA512:
6
- metadata.gz: 1b118126120252e9dc398c40063f8dfbea966fc70b450318677366a8d4111456d96f18bfd452fa39ded0df02cfdc90863dc3658b6f6725f3d69d7ccbd7d2fc4e
7
- data.tar.gz: b9be1f2e720ca0cb179b1ab64aeeeab706774def06716abc025f20febc6b808b15f56d678f250061ef267a804aa01ecc1e51f94abd5a03eb8d425ef977e1d19c
6
+ metadata.gz: fb68c1a7b8e4b7844ea8fb39f1cf7cb5711251d64e7b73516066b9aae85b3de013577ccfb2f742f136fb86d38318d6b72546862df4d2ae5e3c9a941110eddee6
7
+ data.tar.gz: 13b01014967f0c0677aca18cc06556e6a7a1bbc7265cb7e5f6aeb6e9165f6602112594b0f6876b3d10d94a08346abfb089df4c6ceaffc6a1c5ef5727609d0eb9
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_ioc (0.1.29)
4
+ smart_ioc (0.1.30)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -66,6 +66,36 @@ class SmartIoC::BeanFactory
66
66
  end
67
67
  end
68
68
 
69
+ def load_bean(bean_definition, beans_cache)
70
+ bd_opts = beans_cache[bean_definition]
71
+ scope_bean = bd_opts[:scope_bean]
72
+
73
+ bean_definition.dependencies.each do |dependency|
74
+ bd = dependency.bean_definition
75
+ dep_db_opts = bd_opts[:dependencies][dependency.bean_definition]
76
+ dep_scope_bean = dep_db_opts[:scope_bean]
77
+ dep_bean = load_bean(bd, bd_opts[:dependencies])
78
+
79
+ scope_bean.bean.instance_variable_set(:"@#{dependency.bean}", dep_bean)
80
+ end
81
+
82
+ if !scope_bean.loaded
83
+ scope_bean.set_bean(scope_bean.bean.send(bean_definition.factory_method), true)
84
+ end
85
+
86
+ scope_bean.bean
87
+ end
88
+
89
+ def inject_beans(bean_definition, beans_cache)
90
+ bean = beans_cache[:scope_bean].bean
91
+ bean_definition.dependencies.each do |dependency|
92
+ bd = dependency.bean_definition
93
+ dep_bean = beans_cache[:dependencies][bd][:scope_bean].bean
94
+ bean.instance_variable_set(:"@#{dependency.bean}", dep_bean)
95
+ inject_beans(bd, beans_cache[:dependencies][bd])
96
+ end
97
+ end
98
+
69
99
  def init_bean_definition_cache(bean_definition)
70
100
  {
71
101
  bean_definition => {
@@ -224,71 +254,6 @@ class SmartIoC::BeanFactory
224
254
  end
225
255
  end
226
256
 
227
- def init_zero_dep_factory_beans(beans_cache)
228
- beans_cache.each do |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
235
- end
236
- init_zero_dep_factory_beans(bd_opts[:dependencies]) if !bd_opts[:dependencies].empty?
237
- end
238
- end
239
-
240
- def collect_dependent_factory_beans(beans_cache, collection)
241
- beans_cache.each do |bean_definition, bd_opts|
242
- if bean_definition.has_factory_method? && bean_definition.dependencies.size > 0
243
- collection << bean_definition
244
- end
245
- collect_dependent_factory_beans(bd_opts[:dependencies], collection)
246
- end
247
-
248
- collection
249
- end
250
-
251
- def init_dependent_factory_beans(beans_cache)
252
- dependent_factory_beans = collect_dependent_factory_beans(beans_cache, [])
253
-
254
- dependent_factory_beans.each do |bean_definition|
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
263
- end
264
- end
265
-
266
- beans_cache.each do |bean_definition, bd_opts|
267
- if bean_definition.has_factory_method? && bean_definition.dependencies.size > 0
268
- inject_beans(bean_definition, bd_opts)
269
- init_factory_bean(bean_definition, bd_opts)
270
- end
271
- init_dependent_factory_beans(bd_opts[:dependencies])
272
- end
273
- end
274
-
275
- def load_bean(bean_definition, beans_cache)
276
- init_zero_dep_factory_beans(beans_cache)
277
- init_dependent_factory_beans(beans_cache)
278
- inject_beans(bean_definition, beans_cache[bean_definition])
279
- beans_cache[bean_definition][:scope_bean].bean
280
- end
281
-
282
- def inject_beans(bean_definition, beans_cache)
283
- bean = beans_cache[:scope_bean].bean
284
- bean_definition.dependencies.each do |dependency|
285
- bd = dependency.bean_definition
286
- dep_bean = beans_cache[:dependencies][bd][:scope_bean].bean
287
- bean.instance_variable_set(:"@#{dependency.bean}", dep_bean)
288
- inject_beans(bd, beans_cache[:dependencies][bd])
289
- end
290
- end
291
-
292
257
  def get_cross_refference(refer_bean_definitions, current_bean_definition, seen_bean_definitions = [])
293
258
  current_bean_definition.dependencies.each do |dependency|
294
259
  bd = dependency.bean_definition
@@ -1,3 +1,3 @@
1
1
  module SmartIoC
2
- VERSION = "0.1.29"
2
+ VERSION = "0.1.30"
3
3
  end
@@ -54,6 +54,12 @@ describe 'Factory Method' do
54
54
 
55
55
  bean :singleton_bean, package: :cross_refference
56
56
  end
57
+
58
+ class OtherSingletonBean
59
+ include SmartIoC::Iocify
60
+
61
+ bean :other_singleton_bean, package: :cross_refference
62
+ end
57
63
 
58
64
  class FactoryConfig
59
65
  include SmartIoC::Iocify
@@ -61,6 +67,7 @@ describe 'Factory Method' do
61
67
  bean :factory_config, factory_method: :build, package: :cross_refference
62
68
 
63
69
  inject :singleton_bean
70
+ inject :other_singleton_bean
64
71
 
65
72
  class Config
66
73
  attr_reader :singleton_bean
@@ -81,23 +88,28 @@ describe 'Factory Method' do
81
88
  bean :factory_logger, factory_method: :build, package: :cross_refference
82
89
 
83
90
  inject :factory_config
91
+ inject :singleton_bean
84
92
 
85
93
  class Logger
86
- attr_reader :factory_config
94
+ attr_reader :factory_config, :singleton_bean
87
95
 
88
- def initialize(factory_config)
96
+ def initialize(factory_config, singleton_bean)
89
97
  @factory_config = factory_config
98
+ @singleton_bean = singleton_bean
90
99
  end
91
100
  end
92
101
 
93
102
  def build
94
- Logger.new(factory_config)
103
+ Logger.new(factory_config, singleton_bean)
95
104
  end
96
105
  end
97
106
  end
98
107
 
99
108
  it 'creates factory_logger bean' do
100
- expect(SmartIoC.get_bean(:factory_logger, package: :cross_refference)).to be_a(FactoryLogger::Logger)
109
+ logger = SmartIoC.get_bean(:factory_logger, package: :cross_refference)
110
+ expect(logger).to be_a(FactoryLogger::Logger)
111
+ expect(logger.factory_config).to be_a(FactoryConfig::Config)
112
+ expect(logger.factory_config.singleton_bean).to be_a(SingletonBean)
101
113
  end
102
114
 
103
115
  it 'creates factory_config bean' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_ioc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.29
4
+ version: 0.1.30
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov