smart_ioc 0.2.5 → 0.3.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 +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +3 -1
- data/lib/smart_ioc.rb +20 -2
- data/lib/smart_ioc/bean_definition.rb +7 -2
- data/lib/smart_ioc/bean_factory.rb +26 -173
- data/lib/smart_ioc/container.rb +7 -5
- data/lib/smart_ioc/errors.rb +0 -10
- data/lib/smart_ioc/iocify.rb +15 -8
- data/lib/smart_ioc/version.rb +1 -1
- data/spec/smart_ioc/bean_definition_spec.rb +9 -8
- data/spec/smart_ioc/bean_factory_spec.rb +17 -6
- data/spec/smart_ioc/benchmark_mode_spec.rb +13 -0
- data/spec/smart_ioc/example/admins/repository/admins_dao.rb +7 -5
- data/spec/smart_ioc/example/admins/repository/admins_repository.rb +4 -1
- data/spec/smart_ioc/example/users/repository/users_dao.rb +5 -3
- data/spec/smart_ioc/example/users/repository/users_repository.rb +2 -0
- data/spec/smart_ioc/example/utils/config.rb +5 -1
- data/spec/smart_ioc/factory_method_spec.rb +7 -7
- data/spec/smart_ioc/recursive_spec.rb +24 -0
- metadata +6 -3
- data/lib/smart_ioc/scopes/bean.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf89316b5fdc41e85e9cadcf0d5d4c0793aba48e
|
4
|
+
data.tar.gz: 52767b97eecaf1fba1141e3741139ba8871ecde5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81d0b186ff1b8922d06add551b86376def059037bb49e890d1153986826125ff49ca2991103a63074a63daf96e85b31b680dc677c1943791ade889e7ad940909
|
7
|
+
data.tar.gz: ed5f32ac7c938c24100e7ab4c6560fd493117fc8798285aa7142004ec4afb07b03c9bac6c7a4dba168235c5d8d054866f67188d644fd88843e4114191850c4e4
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
smart_ioc (0.
|
4
|
+
smart_ioc (0.3.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
+
byebug (10.0.2)
|
9
10
|
codecov (0.1.10)
|
10
11
|
json
|
11
12
|
simplecov
|
@@ -39,6 +40,7 @@ PLATFORMS
|
|
39
40
|
|
40
41
|
DEPENDENCIES
|
41
42
|
bundler (~> 1.3)
|
43
|
+
byebug
|
42
44
|
codecov
|
43
45
|
rake
|
44
46
|
rspec
|
data/lib/smart_ioc.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'smart_ioc/version'
|
2
|
+
require 'benchmark'
|
2
3
|
|
3
4
|
module SmartIoC
|
4
5
|
autoload :Args, 'smart_ioc/args'
|
@@ -29,15 +30,32 @@ module SmartIoC
|
|
29
30
|
require 'smart_ioc/railtie' if defined?(Rails)
|
30
31
|
|
31
32
|
class << self
|
33
|
+
def is_benchmark_mode
|
34
|
+
@benchmark_mode
|
35
|
+
end
|
36
|
+
|
32
37
|
# @param package_name [String or Symbol] package name for bean definitions
|
33
38
|
# @param dir [String] absolute path with bean definitions
|
34
39
|
# @return nil
|
35
40
|
def find_package_beans(package_name, dir)
|
36
|
-
|
37
|
-
|
41
|
+
time = Benchmark.realtime do
|
42
|
+
bean_locator = SmartIoC::BeanLocator.new
|
43
|
+
bean_locator.locate_beans(package_name.to_sym, dir)
|
44
|
+
end
|
45
|
+
|
46
|
+
time *= 1000
|
47
|
+
|
48
|
+
if is_benchmark_mode
|
49
|
+
puts "Search finished for '#{package_name}'. Time taken: #{"%.2f ms" % time}"
|
50
|
+
end
|
51
|
+
|
38
52
|
nil
|
39
53
|
end
|
40
54
|
|
55
|
+
def benchmark_mode(flag)
|
56
|
+
@benchmark_mode = !!flag
|
57
|
+
end
|
58
|
+
|
41
59
|
# Load all beans (usually required for production env)
|
42
60
|
def load_all_beans
|
43
61
|
BeanLocations.all_bean_names.each do |bean|
|
@@ -2,9 +2,9 @@ class SmartIoC::BeanDefinition
|
|
2
2
|
include SmartIoC::Args
|
3
3
|
|
4
4
|
attr_reader :name, :package, :path, :klass, :scope, :instance, :factory_method,
|
5
|
-
:context, :dependencies
|
5
|
+
:context, :dependencies, :after_init
|
6
6
|
|
7
|
-
def initialize(name:, package:, path:, klass:, scope:, context:, instance:, factory_method:)
|
7
|
+
def initialize(name:, package:, path:, klass:, scope:, context:, instance:, factory_method:, after_init:)
|
8
8
|
not_nil(name, :name)
|
9
9
|
not_nil(package, :package)
|
10
10
|
not_nil(path, :path)
|
@@ -20,6 +20,7 @@ class SmartIoC::BeanDefinition
|
|
20
20
|
@scope = scope
|
21
21
|
@instance = instance
|
22
22
|
@factory_method = factory_method
|
23
|
+
@after_init = after_init
|
23
24
|
@context = context
|
24
25
|
|
25
26
|
@dependencies = []
|
@@ -49,6 +50,10 @@ class SmartIoC::BeanDefinition
|
|
49
50
|
bean_definition.klass == @klass
|
50
51
|
end
|
51
52
|
|
53
|
+
def singleton?
|
54
|
+
SmartIoC::Scopes::Singleton::VALUE == @scope
|
55
|
+
end
|
56
|
+
|
52
57
|
def inspect
|
53
58
|
str = []
|
54
59
|
str << "class: #{@klass}"
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'thread'
|
2
|
-
|
3
1
|
# Instantiates beans according to their scopes
|
4
2
|
class SmartIoC::BeanFactory
|
5
3
|
include SmartIoC::Errors
|
@@ -37,105 +35,39 @@ class SmartIoC::BeanFactory
|
|
37
35
|
check_arg(package, :package, Symbol) if package
|
38
36
|
check_arg(context, :context, Symbol) if context
|
39
37
|
|
40
|
-
@semaphore.synchronize do
|
41
|
-
result = get_or_build_bean(bean_name, package, context)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
def get_or_build_bean(bean_name, package, context, history = Set.new)
|
48
38
|
@bean_file_loader.require_bean(bean_name)
|
49
39
|
|
50
|
-
context
|
40
|
+
context = autodetect_context(bean_name, package, context)
|
51
41
|
bean_definition = @bean_definitions_storage.find(bean_name, package, context)
|
52
|
-
scope
|
53
|
-
|
54
|
-
is_recursive = history.include?(bean_name)
|
55
|
-
|
56
|
-
history << bean_name
|
57
|
-
|
58
|
-
if scope_bean && scope_bean.loaded
|
59
|
-
update_dependencies(scope_bean.bean, bean_definition)
|
60
|
-
scope_bean.bean
|
61
|
-
else
|
62
|
-
if is_recursive
|
63
|
-
raise LoadRecursion.new(bean_definition)
|
64
|
-
end
|
65
|
-
|
66
|
-
beans_cache = init_bean_definition_cache(bean_definition)
|
42
|
+
scope = get_scope(bean_definition)
|
43
|
+
bean = scope.get_bean(bean_definition.klass)
|
67
44
|
|
68
|
-
|
69
|
-
|
70
|
-
load_bean(bean_definition, beans_cache)
|
45
|
+
if !bean
|
46
|
+
bean = init_bean(bean_definition)
|
71
47
|
end
|
72
|
-
end
|
73
48
|
|
74
|
-
|
75
|
-
|
76
|
-
|
49
|
+
scope.save_bean(bean_definition.klass, bean)
|
50
|
+
bean
|
51
|
+
end
|
77
52
|
|
78
|
-
|
79
|
-
bd = dependency.bean_definition
|
80
|
-
dep_db_opts = bd_opts[:dependencies][dependency.bean_definition]
|
81
|
-
dep_scope_bean = dep_db_opts[:scope_bean]
|
82
|
-
dep_bean = load_bean(bd, bd_opts[:dependencies])
|
53
|
+
private
|
83
54
|
|
84
|
-
|
55
|
+
def init_bean(bean_definition)
|
56
|
+
bean = if bean_definition.is_instance?
|
57
|
+
bean_definition.klass.allocate
|
58
|
+
else
|
59
|
+
bean_definition.klass
|
85
60
|
end
|
86
61
|
|
87
|
-
if
|
88
|
-
|
62
|
+
if bean_definition.has_factory_method?
|
63
|
+
bean = bean.send(bean_definition.factory_method)
|
89
64
|
end
|
90
65
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
def inject_beans(bean_definition, beans_cache)
|
95
|
-
bean = beans_cache[:scope_bean].bean
|
96
|
-
bean_definition.dependencies.each do |dependency|
|
97
|
-
bd = dependency.bean_definition
|
98
|
-
dep_bean = beans_cache[:dependencies][bd][:scope_bean].bean
|
99
|
-
bean.instance_variable_set(:"@#{dependency.bean}", dep_bean)
|
100
|
-
inject_beans(bd, beans_cache[:dependencies][bd])
|
66
|
+
if bean_definition.after_init
|
67
|
+
bean.send(bean_definition.after_init)
|
101
68
|
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def init_bean_definition_cache(bean_definition)
|
105
|
-
{
|
106
|
-
bean_definition => {
|
107
|
-
scope_bean: nil,
|
108
|
-
dependencies: {
|
109
|
-
}
|
110
|
-
}
|
111
|
-
}
|
112
|
-
end
|
113
|
-
|
114
|
-
def update_dependencies(bean, bean_definition, updated_beans = {})
|
115
|
-
bean_definition.dependencies.each do |dependency|
|
116
|
-
bd = autodetect_bean_definition(
|
117
|
-
dependency.ref, dependency.package, bean_definition.package
|
118
|
-
)
|
119
|
-
|
120
|
-
scope = get_scope(bean_definition)
|
121
|
-
dep_bean = updated_beans[bd]
|
122
|
-
|
123
|
-
if !dep_bean && scope_bean = scope.get_bean(bd.klass)
|
124
|
-
dep_bean = scope_bean.bean
|
125
|
-
end
|
126
|
-
|
127
|
-
if !dep_bean
|
128
|
-
dep_bean = get_or_build_bean(bd.name, bd.package, bd.context)
|
129
69
|
|
130
|
-
|
131
|
-
|
132
|
-
if !scope.is_a?(SmartIoC::Scopes::Prototype)
|
133
|
-
updated_beans[bd] = dep_bean
|
134
|
-
end
|
135
|
-
else
|
136
|
-
update_dependencies(dep_bean, bd, updated_beans)
|
137
|
-
end
|
138
|
-
end
|
70
|
+
bean
|
139
71
|
end
|
140
72
|
|
141
73
|
def autodetect_context(bean_name, package, context)
|
@@ -149,20 +81,6 @@ class SmartIoC::BeanFactory
|
|
149
81
|
end
|
150
82
|
end
|
151
83
|
|
152
|
-
def autodetect_bean_definitions_for_dependencies(bean_definition)
|
153
|
-
bean_definition.dependencies.each do |dependency|
|
154
|
-
next if dependency.bean_definition
|
155
|
-
|
156
|
-
@bean_file_loader.require_bean(dependency.ref)
|
157
|
-
|
158
|
-
dependency.bean_definition = autodetect_bean_definition(
|
159
|
-
dependency.ref, dependency.package, bean_definition.package
|
160
|
-
)
|
161
|
-
|
162
|
-
autodetect_bean_definitions_for_dependencies(dependency.bean_definition)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
84
|
def autodetect_bean_definition(bean, package, parent_bean_package)
|
167
85
|
if package
|
168
86
|
bean_context = @extra_package_contexts.get_context(package)
|
@@ -196,7 +114,13 @@ class SmartIoC::BeanFactory
|
|
196
114
|
end
|
197
115
|
|
198
116
|
if smart_bds.size > 1
|
199
|
-
raise ArgumentError
|
117
|
+
raise ArgumentError.new(
|
118
|
+
%Q(Unable to autodetect bean :#{bean}.
|
119
|
+
Several definitions were found:\n
|
120
|
+
#{smart_bds.map(&:inspect).join("\n\n")}.
|
121
|
+
Set package directly for injected dependency
|
122
|
+
)
|
123
|
+
)
|
200
124
|
end
|
201
125
|
|
202
126
|
if smart_bds.size == 0
|
@@ -206,77 +130,6 @@ class SmartIoC::BeanFactory
|
|
206
130
|
return smart_bds.first
|
207
131
|
end
|
208
132
|
|
209
|
-
def preload_beans(bean_definition, beans_cache)
|
210
|
-
scope = get_scope(bean_definition)
|
211
|
-
|
212
|
-
if scope_bean = scope.get_bean(bean_definition.klass)
|
213
|
-
beans_cache[:scope_bean] = scope_bean
|
214
|
-
else
|
215
|
-
preload_bean_instance(bean_definition, beans_cache)
|
216
|
-
end
|
217
|
-
|
218
|
-
bean_definition.dependencies.each do |dependency|
|
219
|
-
bd = dependency.bean_definition
|
220
|
-
|
221
|
-
next if beans_cache[:dependencies].has_key?(bd)
|
222
|
-
|
223
|
-
dep_bean_cache = init_bean_definition_cache(bd)
|
224
|
-
beans_cache[:dependencies].merge!(dep_bean_cache)
|
225
|
-
preload_beans(bd, dep_bean_cache[bd])
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
def preload_bean_instance(bean_definition, beans_cache)
|
230
|
-
return if beans_cache[:scope_bean]
|
231
|
-
|
232
|
-
scope = get_scope(bean_definition)
|
233
|
-
scope_bean = scope.get_bean(bean_definition.klass)
|
234
|
-
|
235
|
-
if scope_bean
|
236
|
-
beans_cache[:scope_bean] = scope_bean
|
237
|
-
return scope_bean
|
238
|
-
end
|
239
|
-
|
240
|
-
bean = if bean_definition.is_instance?
|
241
|
-
bean_definition.klass.allocate
|
242
|
-
else
|
243
|
-
bean_definition.klass
|
244
|
-
end
|
245
|
-
|
246
|
-
scope_bean = SmartIoC::Scopes::Bean.new(bean, !bean_definition.has_factory_method?)
|
247
|
-
|
248
|
-
scope.save_bean(bean_definition.klass, scope_bean)
|
249
|
-
beans_cache[:scope_bean] = scope_bean
|
250
|
-
|
251
|
-
scope_bean
|
252
|
-
end
|
253
|
-
|
254
|
-
def init_factory_bean(bean_definition, bd_opts)
|
255
|
-
scope_bean = bd_opts[:scope_bean]
|
256
|
-
|
257
|
-
if !scope_bean.loaded
|
258
|
-
scope_bean.set_bean(scope_bean.bean.send(bean_definition.factory_method), true)
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
def get_cross_refference(refer_bean_definitions, current_bean_definition, seen_bean_definitions = [])
|
263
|
-
current_bean_definition.dependencies.each do |dependency|
|
264
|
-
bd = dependency.bean_definition
|
265
|
-
|
266
|
-
next if seen_bean_definitions.include?(bd)
|
267
|
-
|
268
|
-
if refer_bean_definitions.include?(bd)
|
269
|
-
return bd
|
270
|
-
end
|
271
|
-
|
272
|
-
if crbd = get_cross_refference(refer_bean_definitions, bd, seen_bean_definitions + [bd])
|
273
|
-
return crbd
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
nil
|
278
|
-
end
|
279
|
-
|
280
133
|
def all_scopes
|
281
134
|
[@singleton_scope, @prototype_scope, @thread_scope]
|
282
135
|
end
|
data/lib/smart_ioc/container.rb
CHANGED
@@ -14,7 +14,7 @@ module SmartIoC
|
|
14
14
|
@container = nil
|
15
15
|
end
|
16
16
|
|
17
|
-
def get_bean(bean_name, package
|
17
|
+
def get_bean(bean_name, package = nil, context = nil)
|
18
18
|
get_instance.get_bean(bean_name, package: package, context: context)
|
19
19
|
end
|
20
20
|
end
|
@@ -36,8 +36,9 @@ module SmartIoC
|
|
36
36
|
# @param path [String] bean file absolute path
|
37
37
|
# @param scope [Symbol] scope value
|
38
38
|
# @param context [Symbol] bean context
|
39
|
+
# @param after_init [Symbol] name of bean method that will be called after bean initialization
|
39
40
|
# @return [SmartIoC::BeanDefinition] bean definition
|
40
|
-
def register_bean(bean_name:, klass:, context:, scope:, path:,
|
41
|
+
def register_bean(bean_name:, klass:, context:, scope:, path:, after_init:,
|
41
42
|
factory_method: nil, package_name: nil, instance: true)
|
42
43
|
context ||= DEFAULT_CONTEXT
|
43
44
|
|
@@ -81,7 +82,8 @@ module SmartIoC
|
|
81
82
|
instance: instance,
|
82
83
|
factory_method: factory_method,
|
83
84
|
context: context,
|
84
|
-
scope: scope
|
85
|
+
scope: scope,
|
86
|
+
after_init: after_init,
|
85
87
|
)
|
86
88
|
|
87
89
|
bean_definitions_storage.push(bean_definition)
|
@@ -136,9 +138,9 @@ module SmartIoC
|
|
136
138
|
def require_bean(bean_name)
|
137
139
|
bean_factory.bean_file_loader.require_bean(bean_name)
|
138
140
|
end
|
139
|
-
|
141
|
+
|
140
142
|
private
|
141
|
-
|
143
|
+
|
142
144
|
def bean_factory
|
143
145
|
@bean_factory ||= SmartIoC::BeanFactory.new(bean_definitions_storage, extra_package_contexts)
|
144
146
|
end
|
data/lib/smart_ioc/errors.rb
CHANGED
@@ -5,16 +5,6 @@ module SmartIoC::Errors
|
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
8
|
-
class LoadRecursion < StandardError
|
9
|
-
def initialize(bean_definition)
|
10
|
-
super(%Q(
|
11
|
-
Unable to create bean :#{bean_definitions.name}.
|
12
|
-
Recursion found during bean load.
|
13
|
-
#{bean_definition.inspect}
|
14
|
-
))
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
8
|
class AmbiguousBeanDefinition < StandardError
|
19
9
|
def initialize(bean_name, bean_definitions)
|
20
10
|
super(%Q(
|
data/lib/smart_ioc/iocify.rb
CHANGED
@@ -29,8 +29,9 @@ module SmartIoC::Iocify
|
|
29
29
|
# @param factory_method [nil or Symbol] factory method to get bean
|
30
30
|
# @param instance [Boolean] instance based bean or class-based
|
31
31
|
# @param context [Symbol] set bean context (ex: :test)
|
32
|
+
# @param after_init [Symbol] name of bean method that will be called after bean initialization (ex: :test)
|
32
33
|
# @return nil
|
33
|
-
def bean(bean_name, scope: nil, package: nil, instance: true, factory_method: nil, context: nil)
|
34
|
+
def bean(bean_name, scope: nil, package: nil, instance: true, factory_method: nil, context: nil, after_init: nil)
|
34
35
|
file_path = caller[0].split(':').first
|
35
36
|
|
36
37
|
bean_definition = SmartIoC.get_bean_definition_by_class(self)
|
@@ -55,7 +56,8 @@ module SmartIoC::Iocify
|
|
55
56
|
package_name: package,
|
56
57
|
instance: instance,
|
57
58
|
factory_method: factory_method,
|
58
|
-
context: context
|
59
|
+
context: context,
|
60
|
+
after_init: after_init,
|
59
61
|
)
|
60
62
|
|
61
63
|
if bean_definition.is_instance?
|
@@ -90,16 +92,21 @@ module SmartIoC::Iocify
|
|
90
92
|
package: from
|
91
93
|
)
|
92
94
|
|
95
|
+
bean_method = Proc.new do
|
96
|
+
bean = instance_variable_get(:"@#{bean_name}")
|
97
|
+
return bean if bean
|
98
|
+
instance_variable_set(:"@#{bean_name}", SmartIoC::Container.get_bean(ref || bean_name, from))
|
99
|
+
end
|
100
|
+
|
93
101
|
if bean_definition.is_instance?
|
94
|
-
|
95
|
-
|
96
|
-
attr_reader :#{bean_name}
|
97
|
-
)
|
102
|
+
define_method bean_name, &bean_method
|
103
|
+
private bean_name
|
98
104
|
else
|
105
|
+
define_singleton_method bean_name, &bean_method
|
106
|
+
|
99
107
|
class_eval %Q(
|
100
108
|
class << self
|
101
|
-
private
|
102
|
-
attr_reader :#{bean_name}
|
109
|
+
private :#{bean_name}
|
103
110
|
end
|
104
111
|
)
|
105
112
|
end
|
data/lib/smart_ioc/version.rb
CHANGED
@@ -4,14 +4,15 @@ describe SmartIoC::BeanDefinition do
|
|
4
4
|
describe "::inspect" do
|
5
5
|
it {
|
6
6
|
bd = SmartIoC::BeanDefinition.new(
|
7
|
-
name:
|
8
|
-
package:
|
9
|
-
path:
|
10
|
-
klass:
|
11
|
-
scope:
|
12
|
-
context:
|
13
|
-
instance:
|
14
|
-
factory_method: nil
|
7
|
+
name: :test_bean,
|
8
|
+
package: :test_package,
|
9
|
+
path: 'current_dir',
|
10
|
+
klass: Object,
|
11
|
+
scope: :singleton,
|
12
|
+
context: :default,
|
13
|
+
instance: false,
|
14
|
+
factory_method: nil,
|
15
|
+
after_init: nil,
|
15
16
|
)
|
16
17
|
|
17
18
|
str =
|
@@ -32,6 +32,15 @@ describe SmartIoC::BeanFactory do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
it 'returns benchmark time to load bean' do
|
36
|
+
SmartIoC.benchmark_mode(true)
|
37
|
+
|
38
|
+
SmartIoC.set_extra_context_for_package(:bean_factory, :test)
|
39
|
+
SmartIoC.get_bean(:repo)
|
40
|
+
|
41
|
+
SmartIoC.benchmark_mode(false)
|
42
|
+
end
|
43
|
+
|
35
44
|
it 'returns same instance for singleton scope' do
|
36
45
|
SmartIoC.set_extra_context_for_package(:bean_factory, :test)
|
37
46
|
instance1 = SmartIoC.get_bean(:repo)
|
@@ -67,7 +76,7 @@ describe SmartIoC::BeanFactory do
|
|
67
76
|
|
68
77
|
inject :prototype_bean
|
69
78
|
|
70
|
-
|
79
|
+
public :prototype_bean
|
71
80
|
end
|
72
81
|
|
73
82
|
class SecondSingletonBean
|
@@ -81,7 +90,7 @@ describe SmartIoC::BeanFactory do
|
|
81
90
|
|
82
91
|
inject :second_singleton_bean
|
83
92
|
|
84
|
-
|
93
|
+
public :second_singleton_bean
|
85
94
|
end
|
86
95
|
|
87
96
|
bean1 = SmartIoC.get_bean(:singleton_bean, package: :test)
|
@@ -95,7 +104,7 @@ describe SmartIoC::BeanFactory do
|
|
95
104
|
second_singleton_bean2_object_id = bean2.prototype_bean.second_singleton_bean.object_id
|
96
105
|
|
97
106
|
expect(bean1_object_id).to eq(bean2_object_id)
|
98
|
-
expect(prototype_bean1_object_id).
|
107
|
+
expect(prototype_bean1_object_id).to eq(prototype_bean2_object_id)
|
99
108
|
expect(second_singleton_bean1_object_id).to eq(second_singleton_bean2_object_id)
|
100
109
|
end
|
101
110
|
|
@@ -108,7 +117,7 @@ describe SmartIoC::BeanFactory do
|
|
108
117
|
inject :prototype_service1
|
109
118
|
inject :prototype_service2
|
110
119
|
|
111
|
-
|
120
|
+
public :prototype_service1, :prototype_service2
|
112
121
|
end
|
113
122
|
|
114
123
|
class PrototypeService1
|
@@ -118,7 +127,7 @@ describe SmartIoC::BeanFactory do
|
|
118
127
|
inject :prototype_repo
|
119
128
|
inject :singleton_repo
|
120
129
|
|
121
|
-
|
130
|
+
public :prototype_repo, :singleton_repo
|
122
131
|
end
|
123
132
|
|
124
133
|
class PrototypeService2
|
@@ -128,16 +137,18 @@ describe SmartIoC::BeanFactory do
|
|
128
137
|
inject :prototype_repo
|
129
138
|
inject :singleton_repo
|
130
139
|
|
131
|
-
|
140
|
+
public :prototype_repo, :singleton_repo
|
132
141
|
end
|
133
142
|
|
134
143
|
class PrototypeRepo
|
135
144
|
include SmartIoC::Iocify
|
145
|
+
|
136
146
|
bean :prototype_repo, scope: :prototype, package: :prototype
|
137
147
|
end
|
138
148
|
|
139
149
|
class SingletonRepo
|
140
150
|
include SmartIoC::Iocify
|
151
|
+
|
141
152
|
bean :singleton_repo, scope: :singleton, package: :prototype
|
142
153
|
end
|
143
154
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SmartIoC do
|
4
|
+
it {
|
5
|
+
SmartIoC.clear
|
6
|
+
SmartIoC.benchmark_mode(true)
|
7
|
+
|
8
|
+
dir_path = File.join(File.expand_path(File.dirname(__FILE__)), 'example/admins')
|
9
|
+
SmartIoC.find_package_beans(:admins, dir_path)
|
10
|
+
|
11
|
+
SmartIoC.benchmark_mode(false)
|
12
|
+
}
|
13
|
+
end
|
@@ -1,20 +1,22 @@
|
|
1
|
-
$data ||= {}
|
2
|
-
|
3
1
|
class AdminsDAO
|
4
2
|
include SmartIoC::Iocify
|
5
3
|
|
6
|
-
bean :dao, instance: false
|
4
|
+
bean :dao, instance: false, after_init: :setup
|
7
5
|
|
8
6
|
inject :config
|
9
7
|
|
10
8
|
class << self
|
9
|
+
def setup
|
10
|
+
@data = {}
|
11
|
+
end
|
12
|
+
|
11
13
|
def insert(entity)
|
12
14
|
config.app_name
|
13
|
-
|
15
|
+
@data[entity.id] = entity
|
14
16
|
end
|
15
17
|
|
16
18
|
def get(id)
|
17
|
-
|
19
|
+
@data[id]
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
class UsersDAO
|
2
2
|
include SmartIoC::Iocify
|
3
3
|
|
4
|
-
bean :dao, instance: false
|
5
|
-
|
6
|
-
@data = {}
|
4
|
+
bean :dao, instance: false, after_init: :setup
|
7
5
|
|
8
6
|
class << self
|
7
|
+
def setup
|
8
|
+
@data = {}
|
9
|
+
end
|
10
|
+
|
9
11
|
def insert(entity)
|
10
12
|
@data[entity.id] = entity
|
11
13
|
end
|
@@ -1,9 +1,13 @@
|
|
1
1
|
class Config
|
2
2
|
include SmartIoC::Iocify
|
3
3
|
|
4
|
-
bean :config, factory_method: :get_config
|
4
|
+
bean :config, factory_method: :get_config, after_init: :setup
|
5
5
|
|
6
6
|
class TestConfig
|
7
|
+
def setup
|
8
|
+
# do nothing; only for testing purposes
|
9
|
+
end
|
10
|
+
|
7
11
|
def app_name
|
8
12
|
'SmartIoC'
|
9
13
|
end
|
@@ -9,7 +9,7 @@ describe 'Factory Method' do
|
|
9
9
|
|
10
10
|
inject :test_config
|
11
11
|
|
12
|
-
|
12
|
+
public :test_config
|
13
13
|
end
|
14
14
|
|
15
15
|
|
@@ -20,7 +20,7 @@ describe 'Factory Method' do
|
|
20
20
|
|
21
21
|
inject :test_config
|
22
22
|
|
23
|
-
|
23
|
+
public :test_config
|
24
24
|
end
|
25
25
|
|
26
26
|
class TestConfig
|
@@ -52,7 +52,7 @@ describe 'Factory Method' do
|
|
52
52
|
before :all do
|
53
53
|
class SingletonBean
|
54
54
|
include SmartIoC::Iocify
|
55
|
-
|
55
|
+
|
56
56
|
bean :singleton_bean, package: :cross_refference
|
57
57
|
end
|
58
58
|
|
@@ -61,10 +61,10 @@ describe 'Factory Method' do
|
|
61
61
|
|
62
62
|
bean :other_singleton_bean, package: :cross_refference
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
class FactoryConfig
|
66
66
|
include SmartIoC::Iocify
|
67
|
-
|
67
|
+
|
68
68
|
bean :factory_config, factory_method: :build, package: :cross_refference
|
69
69
|
|
70
70
|
inject :singleton_bean
|
@@ -85,7 +85,7 @@ describe 'Factory Method' do
|
|
85
85
|
|
86
86
|
class FactoryLogger
|
87
87
|
include SmartIoC::Iocify
|
88
|
-
|
88
|
+
|
89
89
|
bean :factory_logger, factory_method: :build, package: :cross_refference
|
90
90
|
|
91
91
|
inject :factory_config
|
@@ -99,7 +99,7 @@ describe 'Factory Method' do
|
|
99
99
|
@singleton_bean = singleton_bean
|
100
100
|
end
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
def build
|
104
104
|
Logger.new(factory_config, singleton_bean)
|
105
105
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SmartIoC::Container do
|
4
|
+
before :all do
|
5
|
+
SmartIoC.clear
|
6
|
+
|
7
|
+
dir_path = File.join(File.expand_path(File.dirname(__FILE__)), 'example/admins')
|
8
|
+
SmartIoC.find_package_beans(:admins, dir_path)
|
9
|
+
|
10
|
+
dir_path = File.join(File.expand_path(File.dirname(__FILE__)), 'example/utils')
|
11
|
+
SmartIoC.find_package_beans(:utils, dir_path)
|
12
|
+
|
13
|
+
dir_path = File.join(File.expand_path(File.dirname(__FILE__)), 'example/users')
|
14
|
+
SmartIoC.find_package_beans(:users, dir_path)
|
15
|
+
|
16
|
+
@container = SmartIoC.container
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'loads recursive beans' do
|
20
|
+
users_creator = @container.get_bean(:users_creator)
|
21
|
+
uc2 = users_creator.send(:repository).users_creator
|
22
|
+
expect(users_creator).to eq(uc2)
|
23
|
+
end
|
24
|
+
end
|
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.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruslan Gatiyatov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -87,7 +87,6 @@ files:
|
|
87
87
|
- lib/smart_ioc/iocify.rb
|
88
88
|
- lib/smart_ioc/railtie.rb
|
89
89
|
- lib/smart_ioc/scopes.rb
|
90
|
-
- lib/smart_ioc/scopes/bean.rb
|
91
90
|
- lib/smart_ioc/scopes/prototype.rb
|
92
91
|
- lib/smart_ioc/scopes/request.rb
|
93
92
|
- lib/smart_ioc/scopes/singleton.rb
|
@@ -98,6 +97,7 @@ files:
|
|
98
97
|
- spec/smart_ioc/bean_file_loader_spec.rb
|
99
98
|
- spec/smart_ioc/bean_locations_spec.rb
|
100
99
|
- spec/smart_ioc/bean_locator_spec.rb
|
100
|
+
- spec/smart_ioc/benchmark_mode_spec.rb
|
101
101
|
- spec/smart_ioc/container_spec.rb
|
102
102
|
- spec/smart_ioc/example/admins/repository/admins_dao.rb
|
103
103
|
- spec/smart_ioc/example/admins/repository/admins_repository.rb
|
@@ -111,6 +111,7 @@ files:
|
|
111
111
|
- spec/smart_ioc/factory_method_spec.rb
|
112
112
|
- spec/smart_ioc/iocify_spec.rb
|
113
113
|
- spec/smart_ioc/object_spec.rb
|
114
|
+
- spec/smart_ioc/recursive_spec.rb
|
114
115
|
- spec/smart_ioc/smart_ioc_spec.rb
|
115
116
|
- spec/spec_helper.rb
|
116
117
|
homepage: http://github.com/droidlabs/smart_ioc
|
@@ -143,6 +144,7 @@ test_files:
|
|
143
144
|
- spec/smart_ioc/bean_file_loader_spec.rb
|
144
145
|
- spec/smart_ioc/bean_locations_spec.rb
|
145
146
|
- spec/smart_ioc/bean_locator_spec.rb
|
147
|
+
- spec/smart_ioc/benchmark_mode_spec.rb
|
146
148
|
- spec/smart_ioc/container_spec.rb
|
147
149
|
- spec/smart_ioc/example/admins/repository/admins_dao.rb
|
148
150
|
- spec/smart_ioc/example/admins/repository/admins_repository.rb
|
@@ -156,5 +158,6 @@ test_files:
|
|
156
158
|
- spec/smart_ioc/factory_method_spec.rb
|
157
159
|
- spec/smart_ioc/iocify_spec.rb
|
158
160
|
- spec/smart_ioc/object_spec.rb
|
161
|
+
- spec/smart_ioc/recursive_spec.rb
|
159
162
|
- spec/smart_ioc/smart_ioc_spec.rb
|
160
163
|
- spec/spec_helper.rb
|