smart_ioc 0.3.1 → 0.3.8
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 +5 -5
- data/Gemfile.lock +26 -27
- data/lib/smart_ioc.rb +4 -1
- data/lib/smart_ioc/bean.rb +59 -0
- data/lib/smart_ioc/bean_definition.rb +1 -2
- data/lib/smart_ioc/bean_definitions_storage.rb +22 -11
- data/lib/smart_ioc/bean_factory.rb +7 -7
- data/lib/smart_ioc/container.rb +7 -6
- data/lib/smart_ioc/extra_package_contexts.rb +4 -0
- data/lib/smart_ioc/iocify.rb +57 -12
- data/lib/smart_ioc/string_utils.rb +13 -0
- data/lib/smart_ioc/version.rb +1 -1
- data/smart_ioc.gemspec +1 -1
- data/spec/smart_ioc/bean_definition_spec.rb +1 -2
- data/spec/smart_ioc/bean_factory_spec.rb +32 -17
- data/spec/smart_ioc/example/admins/repository/admins_dao.rb +2 -4
- data/spec/smart_ioc/example/admins/repository/admins_repository.rb +1 -7
- data/spec/smart_ioc/object_spec.rb +1 -1
- data/spec/smart_ioc/recursive_spec.rb +1 -1
- data/spec/smart_ioc/smart_ioc_spec.rb +4 -2
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 935f8126a232eeb46445b817709b70a45d99c2212cd81fbc81782a217fbe409b
|
4
|
+
data.tar.gz: 6f433ae8f0514505f08eeb3cadda7856b456f28ed4d61f774bb7fee327914ce3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d1c0b83f8b812e062332d65756e90a6566f3e9934086dce23c6c163b52fb9e002eabcd746b3a757012bb3ee172728ccc72d0698078ae4fcee7f9790a28f5245
|
7
|
+
data.tar.gz: 27c53e6c7d8772fba4e21281c6dd89d9bc3f22431e6740ab484f1af6f705e21db0d1b53fd6e890b66b5c037b66cbe64031b7fe62068df554660a294677901d3e
|
data/Gemfile.lock
CHANGED
@@ -1,45 +1,44 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
smart_ioc (0.3.
|
4
|
+
smart_ioc (0.3.8)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
-
byebug (
|
10
|
-
codecov (0.
|
9
|
+
byebug (11.1.3)
|
10
|
+
codecov (0.2.5)
|
11
|
+
colorize
|
11
12
|
json
|
12
13
|
simplecov
|
13
|
-
|
14
|
-
diff-lcs (1.
|
15
|
-
docile (1.
|
16
|
-
json (2.
|
17
|
-
rake (
|
18
|
-
rspec (3.
|
19
|
-
rspec-core (~> 3.
|
20
|
-
rspec-expectations (~> 3.
|
21
|
-
rspec-mocks (~> 3.
|
22
|
-
rspec-core (3.
|
23
|
-
rspec-support (~> 3.
|
24
|
-
rspec-expectations (3.
|
14
|
+
colorize (0.8.1)
|
15
|
+
diff-lcs (1.4.4)
|
16
|
+
docile (1.3.2)
|
17
|
+
json (2.3.1)
|
18
|
+
rake (13.0.1)
|
19
|
+
rspec (3.9.0)
|
20
|
+
rspec-core (~> 3.9.0)
|
21
|
+
rspec-expectations (~> 3.9.0)
|
22
|
+
rspec-mocks (~> 3.9.0)
|
23
|
+
rspec-core (3.9.2)
|
24
|
+
rspec-support (~> 3.9.3)
|
25
|
+
rspec-expectations (3.9.2)
|
25
26
|
diff-lcs (>= 1.2.0, < 2.0)
|
26
|
-
rspec-support (~> 3.
|
27
|
-
rspec-mocks (3.
|
27
|
+
rspec-support (~> 3.9.0)
|
28
|
+
rspec-mocks (3.9.1)
|
28
29
|
diff-lcs (>= 1.2.0, < 2.0)
|
29
|
-
rspec-support (~> 3.
|
30
|
-
rspec-support (3.
|
31
|
-
simplecov (0.
|
32
|
-
docile (~> 1.1
|
33
|
-
|
34
|
-
|
35
|
-
simplecov-html (0.10.0)
|
36
|
-
url (0.3.2)
|
30
|
+
rspec-support (~> 3.9.0)
|
31
|
+
rspec-support (3.9.3)
|
32
|
+
simplecov (0.18.5)
|
33
|
+
docile (~> 1.1)
|
34
|
+
simplecov-html (~> 0.11)
|
35
|
+
simplecov-html (0.12.2)
|
37
36
|
|
38
37
|
PLATFORMS
|
39
38
|
ruby
|
40
39
|
|
41
40
|
DEPENDENCIES
|
42
|
-
bundler
|
41
|
+
bundler
|
43
42
|
byebug
|
44
43
|
codecov
|
45
44
|
rake
|
@@ -48,4 +47,4 @@ DEPENDENCIES
|
|
48
47
|
smart_ioc!
|
49
48
|
|
50
49
|
BUNDLED WITH
|
51
|
-
1.
|
50
|
+
2.1.2
|
data/lib/smart_ioc.rb
CHANGED
@@ -15,6 +15,7 @@ module SmartIoC
|
|
15
15
|
autoload :InjectMetadata, 'smart_ioc/inject_metadata'
|
16
16
|
autoload :Iocify, 'smart_ioc/iocify'
|
17
17
|
autoload :Scopes, 'smart_ioc/scopes'
|
18
|
+
autoload :StringUtils, 'smart_ioc/string_utils'
|
18
19
|
|
19
20
|
module Scopes
|
20
21
|
autoload :Bean, 'smart_ioc/scopes/bean'
|
@@ -73,7 +74,7 @@ module SmartIoC
|
|
73
74
|
Container.get_instance
|
74
75
|
end
|
75
76
|
|
76
|
-
[:register_bean, :
|
77
|
+
[:register_bean, :get_bean_definition,
|
77
78
|
:set_extra_context_for_package, :get_bean, :clear_scopes,
|
78
79
|
:force_clear_scopes, :set_load_proc].each do |name|
|
79
80
|
define_method name do |*args, &block|
|
@@ -82,3 +83,5 @@ module SmartIoC
|
|
82
83
|
end
|
83
84
|
end
|
84
85
|
end
|
86
|
+
|
87
|
+
require 'smart_ioc/bean'
|
@@ -0,0 +1,59 @@
|
|
1
|
+
def bean(bean_name, &proc)
|
2
|
+
raise ArgumentError, "name should be a Symbol" if !bean_name.is_a?(Symbol)
|
3
|
+
raise ArgumentError, "proc should be provided" if !block_given?
|
4
|
+
|
5
|
+
klass = Class.new do
|
6
|
+
include SmartIoC::Iocify
|
7
|
+
end
|
8
|
+
|
9
|
+
klass.instance_variable_set(:@anonymous_bean, true)
|
10
|
+
klass.instance_exec(&proc)
|
11
|
+
|
12
|
+
str = SmartIoC::StringUtils
|
13
|
+
file_path = caller[0].split(':').first
|
14
|
+
package = klass.instance_variable_get(:@package) || SmartIoC::BeanLocations.get_bean_package(file_path)
|
15
|
+
context = klass.instance_variable_get(:@context) || :default
|
16
|
+
|
17
|
+
if package.nil?
|
18
|
+
raise ArgumentError, "package is not defined for bean :#{bean_name}"
|
19
|
+
end
|
20
|
+
|
21
|
+
package_mod = str.camelize(package)
|
22
|
+
context_mod = str.camelize(context || :default)
|
23
|
+
|
24
|
+
class_name = str.camelize(bean_name)
|
25
|
+
klass_name = "#{package_mod}::#{context_mod}::#{class_name}"
|
26
|
+
|
27
|
+
eval(
|
28
|
+
%Q(
|
29
|
+
module #{package_mod}
|
30
|
+
module #{context_mod}
|
31
|
+
if constants.include?(:"#{class_name}")
|
32
|
+
remove_const :"#{class_name}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
#{klass_name} = klass
|
38
|
+
)
|
39
|
+
)
|
40
|
+
|
41
|
+
klass.instance_exec do
|
42
|
+
bean(
|
43
|
+
bean_name,
|
44
|
+
file_path: file_path,
|
45
|
+
scope: instance_variable_get(:@scope),
|
46
|
+
package: package,
|
47
|
+
instance: instance_variable_get(:@instance) || false,
|
48
|
+
factory_method: instance_variable_get(:@factory_method),
|
49
|
+
context: context,
|
50
|
+
after_init: instance_variable_get(:@after_init),
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
(klass.instance_variable_get(:@injects) || []).each do |inject|
|
55
|
+
klass.register_inject(inject[:bean_name], ref: inject[:ref], from: inject[:from])
|
56
|
+
end
|
57
|
+
|
58
|
+
klass
|
59
|
+
end
|
@@ -47,7 +47,7 @@ class SmartIoC::BeanDefinition
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def ==(bean_definition)
|
50
|
-
bean_definition.
|
50
|
+
bean_definition.name == @name && bean_definition.package == @package && bean_definition.context == @context
|
51
51
|
end
|
52
52
|
|
53
53
|
def singleton?
|
@@ -56,7 +56,6 @@ class SmartIoC::BeanDefinition
|
|
56
56
|
|
57
57
|
def inspect
|
58
58
|
str = []
|
59
|
-
str << "class: #{@klass}"
|
60
59
|
str << "name: :#{@name}"
|
61
60
|
str << "package: :#{@package}"
|
62
61
|
str << "context: :#{@context}"
|
@@ -20,15 +20,18 @@ class SmartIoC::BeanDefinitionsStorage
|
|
20
20
|
end
|
21
21
|
|
22
22
|
if existing_bd
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
@collection.reject! { |bd| bd == existing_bd }
|
24
|
+
|
25
|
+
message = <<~EOF
|
26
|
+
\nReplacing bean definition...
|
27
|
+
- New bean details:
|
28
|
+
#{bean_definition.inspect}
|
29
|
+
- Existing bean details:
|
30
|
+
#{existing_bd.inspect})
|
31
|
+
|
32
|
+
EOF
|
33
|
+
|
34
|
+
puts message
|
32
35
|
end
|
33
36
|
|
34
37
|
@collection.push(bean_definition)
|
@@ -46,8 +49,16 @@ Existing bean details:
|
|
46
49
|
# @param klass [Class] bean class
|
47
50
|
# @return bean definition [BeanDefinition] or nil
|
48
51
|
def find_by_class(klass)
|
49
|
-
|
50
|
-
|
52
|
+
@collection.detect {|bd| bd.klass == klass}
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns bean definition for specific class
|
56
|
+
# @param bean_name [Symbol]
|
57
|
+
# @param package [Symbol]
|
58
|
+
# @param context [Symbol]
|
59
|
+
# @return bean definition [BeanDefinition] or nil
|
60
|
+
def find_bean(bean_name, package, context)
|
61
|
+
@collection.detect {|bd| bd.name == bean_name && bd.package == package && bd.context == context}
|
51
62
|
end
|
52
63
|
|
53
64
|
def filter_by(bean_name, package = nil, context = nil)
|
@@ -31,7 +31,7 @@ class SmartIoC::BeanFactory
|
|
31
31
|
# @return bean instance
|
32
32
|
# @raise [ArgumentError] if bean is not found
|
33
33
|
# @raise [ArgumentError] if ambiguous bean definition was found
|
34
|
-
def get_bean(bean_name, package: nil, parent_bean_definition: nil, context: nil)
|
34
|
+
def get_bean(bean_name, package: nil, parent_bean_definition: nil, context: nil, parent_bean_name: nil)
|
35
35
|
check_arg(bean_name, :bean_name, Symbol)
|
36
36
|
check_arg(package, :package, Symbol) if package
|
37
37
|
check_arg(parent_bean_definition, :parent_bean_definition, SmartIoC::BeanDefinition) if parent_bean_definition
|
@@ -40,7 +40,7 @@ class SmartIoC::BeanFactory
|
|
40
40
|
@bean_file_loader.require_bean(bean_name)
|
41
41
|
|
42
42
|
parent_package_name = parent_bean_definition ? parent_bean_definition.package : nil
|
43
|
-
context = autodetect_context(bean_name, package, parent_package_name, context)
|
43
|
+
context = autodetect_context(bean_name, package, parent_package_name, context, parent_bean_name)
|
44
44
|
bean_definition = @bean_definitions_storage.find(bean_name, package, context, parent_package_name)
|
45
45
|
scope = get_scope(bean_definition)
|
46
46
|
bean = scope.get_bean(bean_definition.klass)
|
@@ -76,18 +76,18 @@ class SmartIoC::BeanFactory
|
|
76
76
|
bean
|
77
77
|
end
|
78
78
|
|
79
|
-
def autodetect_context(bean_name, package, parent_bean_package, context)
|
79
|
+
def autodetect_context(bean_name, package, parent_bean_package, context, parent_bean_name)
|
80
80
|
return context if context
|
81
81
|
|
82
82
|
if package
|
83
83
|
@extra_package_contexts.get_context(package)
|
84
84
|
else
|
85
|
-
bean_definition = autodetect_bean_definition(bean_name, package, parent_bean_package)
|
86
|
-
bean_definition.
|
85
|
+
bean_definition = autodetect_bean_definition(bean_name, package, parent_bean_package, parent_bean_name)
|
86
|
+
@extra_package_contexts.get_context(bean_definition.package)
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
def autodetect_bean_definition(bean, package, parent_bean_package)
|
90
|
+
def autodetect_bean_definition(bean, package, parent_bean_package, parent_bean_name)
|
91
91
|
if package
|
92
92
|
bean_context = @extra_package_contexts.get_context(package)
|
93
93
|
bds = @bean_definitions_storage.filter_by_with_drop_to_default_context(bean, package, bean_context)
|
@@ -121,7 +121,7 @@ class SmartIoC::BeanFactory
|
|
121
121
|
|
122
122
|
if smart_bds.size > 1
|
123
123
|
raise ArgumentError.new(
|
124
|
-
%Q(Unable to autodetect bean :#{bean}.
|
124
|
+
%Q(Unable to autodetect bean :#{bean}#{parent_bean_name ? " for bean :#{parent_bean_name}" : ''}.
|
125
125
|
Several definitions were found:\n
|
126
126
|
#{smart_bds.map(&:inspect).join("\n\n")}.
|
127
127
|
Set package directly for injected dependency
|
data/lib/smart_ioc/container.rb
CHANGED
@@ -57,8 +57,6 @@ module SmartIoC
|
|
57
57
|
raise ArgumentError, "bean scope should be one of #{allowed_scopes.inspect}"
|
58
58
|
end
|
59
59
|
|
60
|
-
package_name ||= SmartIoC::BeanLocations.get_bean_package(path)
|
61
|
-
|
62
60
|
if !package_name
|
63
61
|
raise ArgumentError, %Q(
|
64
62
|
Package name should be given for bean :#{bean_name}.
|
@@ -88,10 +86,12 @@ module SmartIoC
|
|
88
86
|
end
|
89
87
|
|
90
88
|
# Returns bean definition for specific class
|
91
|
-
# @param
|
89
|
+
# @param bean_name [Symbol]
|
90
|
+
# @param package [Symbol]
|
91
|
+
# @param context [Symbol]
|
92
92
|
# return [BeanDefinition]
|
93
|
-
def
|
94
|
-
bean_definitions_storage.
|
93
|
+
def get_bean_definition(bean_name, package, context)
|
94
|
+
bean_definitions_storage.find_bean(bean_name, package, context)
|
95
95
|
end
|
96
96
|
|
97
97
|
# Sets new load proc
|
@@ -117,12 +117,13 @@ module SmartIoC
|
|
117
117
|
# @param optional parent_bean_definition [SmartIoc::BeanDefinition] bean definition of parent bean
|
118
118
|
# @param optional context [Symbol] package context
|
119
119
|
# @return bean instance from container
|
120
|
-
def get_bean(bean_name, package: nil, context: nil, parent_bean_definition: nil)
|
120
|
+
def get_bean(bean_name, package: nil, context: nil, parent_bean_definition: nil, parent_bean_name: nil)
|
121
121
|
bean_factory.get_bean(
|
122
122
|
bean_name,
|
123
123
|
package: package,
|
124
124
|
parent_bean_definition: parent_bean_definition,
|
125
125
|
context: context,
|
126
|
+
parent_bean_name: parent_bean_name,
|
126
127
|
)
|
127
128
|
end
|
128
129
|
|
data/lib/smart_ioc/iocify.rb
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
# Example of usage:
|
3
3
|
# class Bar
|
4
4
|
# bean :bar
|
5
|
+
#
|
6
|
+
# def call
|
7
|
+
# end
|
5
8
|
# end
|
6
9
|
#
|
7
10
|
# class Foo
|
@@ -12,6 +15,7 @@
|
|
12
15
|
# inject :some_bar, ref: bar, from: :repository
|
13
16
|
#
|
14
17
|
# def hello_world
|
18
|
+
# some_bar.call
|
15
19
|
# puts 'Hello world'
|
16
20
|
# end
|
17
21
|
# end
|
@@ -23,6 +27,35 @@ module SmartIoC::Iocify
|
|
23
27
|
end
|
24
28
|
|
25
29
|
module ClassMethods
|
30
|
+
def package(name)
|
31
|
+
raise ArgumentError, "name should be a Symbol" if !name.is_a?(Symbol)
|
32
|
+
@package = name
|
33
|
+
end
|
34
|
+
|
35
|
+
def context(name)
|
36
|
+
raise ArgumentError, "name should be a Symbol" if !name.is_a?(Symbol)
|
37
|
+
@context = name
|
38
|
+
end
|
39
|
+
|
40
|
+
def factory_method(name)
|
41
|
+
raise ArgumentError, "name should be a Symbol" if !name.is_a?(Symbol)
|
42
|
+
@factory_method = name
|
43
|
+
end
|
44
|
+
|
45
|
+
def scope(name)
|
46
|
+
raise ArgumentError, "name should be a Symbol" if !name.is_a?(Symbol)
|
47
|
+
@scope = name
|
48
|
+
end
|
49
|
+
|
50
|
+
def instance
|
51
|
+
@instance = true
|
52
|
+
end
|
53
|
+
|
54
|
+
def after_init(name)
|
55
|
+
raise ArgumentError, "name should be a Symbol" if !name.is_a?(Symbol)
|
56
|
+
@after_init = name
|
57
|
+
end
|
58
|
+
|
26
59
|
# @param bean_name [Symbol] bean name
|
27
60
|
# @param scope [Symbol] bean scope (defaults to :singleton)
|
28
61
|
# @param package [nil or Symbol]
|
@@ -31,10 +64,11 @@ module SmartIoC::Iocify
|
|
31
64
|
# @param context [Symbol] set bean context (ex: :test)
|
32
65
|
# @param after_init [Symbol] name of bean method that will be called after bean initialization (ex: :test)
|
33
66
|
# @return nil
|
34
|
-
def bean(bean_name, scope: nil, package: nil, instance: true, factory_method: nil, context: nil, after_init: nil)
|
35
|
-
file_path
|
36
|
-
|
37
|
-
|
67
|
+
def bean(bean_name, scope: nil, package: nil, instance: true, factory_method: nil, context: nil, after_init: nil, file_path: nil)
|
68
|
+
file_path ||= caller[0].split(':').first
|
69
|
+
package ||= SmartIoC::BeanLocations.get_bean_package(file_path)
|
70
|
+
context ||= SmartIoC::Container::DEFAULT_CONTEXT
|
71
|
+
bean_definition = SmartIoC.get_bean_definition(bean_name, package, context)
|
38
72
|
|
39
73
|
if bean_definition
|
40
74
|
if bean_definition.path == file_path
|
@@ -68,9 +102,20 @@ module SmartIoC::Iocify
|
|
68
102
|
)
|
69
103
|
end
|
70
104
|
|
105
|
+
self.instance_variable_set(:@bean_definition, bean_definition)
|
106
|
+
|
71
107
|
nil
|
72
108
|
end
|
73
109
|
|
110
|
+
def inject(bean_name, ref: nil, from: nil)
|
111
|
+
if @anonymous_bean
|
112
|
+
@injects ||= []
|
113
|
+
@injects.push({bean_name: bean_name, ref: ref, from: from})
|
114
|
+
else
|
115
|
+
register_inject(bean_name, ref: ref, from: from)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
74
119
|
# @param bean_name [Symbol] injected bean name
|
75
120
|
# @param ref [Symbol] refferece bean to be sef as bean_name
|
76
121
|
# @param from [Symbol] package name
|
@@ -79,14 +124,14 @@ module SmartIoC::Iocify
|
|
79
124
|
# @raise [ArgumentError] if ref provided and ref is not a Symbol
|
80
125
|
# @raise [ArgumentError] if from provided and from is not a Symbol
|
81
126
|
# @raise [ArgumentError] if bean with same name was injected before
|
82
|
-
def
|
83
|
-
bean_definition
|
84
|
-
|
85
|
-
if bean_definition.nil?
|
127
|
+
def register_inject(bean_name, ref: nil, from: nil)
|
128
|
+
if !@bean_definition
|
86
129
|
raise ArgumentError, "#{self.to_s} is not registered as bean. Add `bean :bean_name` declaration"
|
87
130
|
end
|
88
131
|
|
89
|
-
bean_definition
|
132
|
+
bd = @bean_definition
|
133
|
+
|
134
|
+
bd.add_dependency(
|
90
135
|
bean_name: bean_name,
|
91
136
|
ref: ref,
|
92
137
|
package: from
|
@@ -97,18 +142,18 @@ module SmartIoC::Iocify
|
|
97
142
|
return bean if bean
|
98
143
|
|
99
144
|
klass = self.is_a?(Class) ? self : self.class
|
100
|
-
bean_definition = SmartIoC::Container.get_instance.get_bean_definition_by_class(klass)
|
101
145
|
|
102
146
|
bean = SmartIoC::Container.get_instance.get_bean(
|
103
147
|
ref || bean_name,
|
104
148
|
package: from,
|
105
|
-
parent_bean_definition:
|
149
|
+
parent_bean_definition: bd,
|
150
|
+
parent_bean_name: bd.name,
|
106
151
|
)
|
107
152
|
|
108
153
|
instance_variable_set(:"@#{bean_name}", bean)
|
109
154
|
end
|
110
155
|
|
111
|
-
if
|
156
|
+
if bd.is_instance?
|
112
157
|
define_method bean_name, &bean_method
|
113
158
|
private bean_name
|
114
159
|
else
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module SmartIoC
|
2
|
+
class StringUtils
|
3
|
+
class << self
|
4
|
+
def camelize(term)
|
5
|
+
string = term.to_s
|
6
|
+
string = string.sub(/^[a-z\d]*/) { |match| match.capitalize }
|
7
|
+
string.gsub!(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }
|
8
|
+
string.gsub!("/".freeze, "::".freeze)
|
9
|
+
string
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/smart_ioc/version.rb
CHANGED
data/smart_ioc.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(spec)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency 'bundler'
|
21
|
+
spec.add_development_dependency 'bundler'
|
22
22
|
spec.add_development_dependency 'rake'
|
23
23
|
spec.add_development_dependency "codecov"
|
24
24
|
end
|
@@ -4,27 +4,42 @@ describe SmartIoC::BeanFactory do
|
|
4
4
|
before :all do
|
5
5
|
SmartIoC.clear
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
bean :repo do
|
8
|
+
context :default
|
9
|
+
package :bean_factory
|
10
|
+
|
11
|
+
def call
|
12
|
+
'default'
|
13
|
+
end
|
10
14
|
end
|
11
15
|
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
bean :repo do
|
17
|
+
context :test
|
18
|
+
package :bean_factory
|
19
|
+
|
20
|
+
inject :dao
|
21
|
+
|
22
|
+
def call
|
23
|
+
dao.call
|
24
|
+
'test'
|
25
|
+
end
|
15
26
|
end
|
16
27
|
|
17
|
-
|
18
|
-
|
19
|
-
|
28
|
+
bean :dao do
|
29
|
+
context :default
|
30
|
+
package :bean_factory
|
31
|
+
|
32
|
+
def call
|
33
|
+
'dao'
|
34
|
+
end
|
20
35
|
end
|
21
36
|
|
22
37
|
class TestObject
|
23
38
|
end
|
24
39
|
|
25
|
-
|
26
|
-
|
27
|
-
|
40
|
+
bean :factory do
|
41
|
+
factory_method :build_bean
|
42
|
+
package :bean_factory
|
28
43
|
|
29
44
|
def build_bean
|
30
45
|
TestObject.new
|
@@ -56,17 +71,17 @@ describe SmartIoC::BeanFactory do
|
|
56
71
|
|
57
72
|
it 'returns proper bean for test context' do
|
58
73
|
SmartIoC.set_extra_context_for_package(:bean_factory, :test)
|
59
|
-
expect(SmartIoC.get_bean(:repo)).to
|
74
|
+
expect(SmartIoC.get_bean(:repo).call).to eq('test')
|
60
75
|
end
|
61
76
|
|
62
77
|
it 'returns proper bean for default context' do
|
63
78
|
SmartIoC.set_extra_context_for_package(:bean_factory, :default)
|
64
|
-
expect(SmartIoC.get_bean(:repo)).to
|
79
|
+
expect(SmartIoC.get_bean(:repo).call).to eq('default')
|
65
80
|
end
|
66
81
|
|
67
82
|
it 'returns proper bean for test context with fallback to default context' do
|
68
83
|
SmartIoC.set_extra_context_for_package(:bean_factory, :test)
|
69
|
-
expect(SmartIoC.get_bean(:dao)).to
|
84
|
+
expect(SmartIoC.get_bean(:dao).call).to eq('dao')
|
70
85
|
end
|
71
86
|
|
72
87
|
it 'updates dependencies' do
|
@@ -154,7 +169,7 @@ describe SmartIoC::BeanFactory do
|
|
154
169
|
end
|
155
170
|
|
156
171
|
it 'injects prototype beans with different object id' do
|
157
|
-
prototype_bean = SmartIoC.get_bean(:prototype_bean)
|
172
|
+
prototype_bean = SmartIoC.get_bean(:prototype_bean, package: :prototype)
|
158
173
|
repo1_object_id = prototype_bean.prototype_service1.prototype_repo.object_id
|
159
174
|
repo2_object_id = prototype_bean.prototype_service2.prototype_repo.object_id
|
160
175
|
|
@@ -162,7 +177,7 @@ describe SmartIoC::BeanFactory do
|
|
162
177
|
end
|
163
178
|
|
164
179
|
it 'injects singleton beans with same object id' do
|
165
|
-
prototype_bean = SmartIoC.get_bean(:prototype_bean)
|
180
|
+
prototype_bean = SmartIoC.get_bean(:prototype_bean, package: :prototype)
|
166
181
|
repo1_object_id = prototype_bean.prototype_service1.singleton_repo.object_id
|
167
182
|
repo2_object_id = prototype_bean.prototype_service2.singleton_repo.object_id
|
168
183
|
|
@@ -32,7 +32,7 @@ describe Object do
|
|
32
32
|
factory_method: :my_method, context: :test
|
33
33
|
end
|
34
34
|
|
35
|
-
@bean_definition = SmartIoC.
|
35
|
+
@bean_definition = SmartIoC.get_bean_definition(:my_bean, :my_package, :test)
|
36
36
|
end
|
37
37
|
|
38
38
|
it { expect(@bean_definition.name).to eq(:my_bean) }
|
@@ -18,7 +18,7 @@ describe SmartIoC::Container do
|
|
18
18
|
|
19
19
|
it 'loads recursive beans' do
|
20
20
|
users_creator = @container.get_bean(:users_creator)
|
21
|
-
uc2 = users_creator.send(:repository).users_creator
|
21
|
+
uc2 = users_creator.send(:repository).send(:users_creator)
|
22
22
|
expect(users_creator).to eq(uc2)
|
23
23
|
end
|
24
24
|
end
|
@@ -27,14 +27,16 @@ describe SmartIoC do
|
|
27
27
|
repository = @container.get_bean(:repository, package: :admins)
|
28
28
|
|
29
29
|
expect(repository.get(1)).to be_a(User)
|
30
|
-
expect(users_creator.send(:repository)).to be_a(
|
30
|
+
expect(users_creator.send(:repository)).to be_a(Class)
|
31
|
+
expect(users_creator.send(:repository).methods).to include(:put)
|
32
|
+
expect(users_creator.send(:repository).methods).to include(:get)
|
31
33
|
expect(users_creator.send(:logger)).to be_a(LoggerFactory::SmartIoCLogger)
|
32
34
|
end
|
33
35
|
|
34
36
|
it 'sets beans with extra package context' do
|
35
37
|
SmartIoC.set_extra_context_for_package(:admins, :test)
|
36
38
|
SmartIoC.force_clear_scopes
|
37
|
-
|
39
|
+
|
38
40
|
users_creator = @container.get_bean(:users_creator)
|
39
41
|
users_creator.create(1, 'test@test.com')
|
40
42
|
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smart_ioc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruslan Gatiyatov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,6 +73,7 @@ files:
|
|
73
73
|
- docs/index.md
|
74
74
|
- lib/smart_ioc.rb
|
75
75
|
- lib/smart_ioc/args.rb
|
76
|
+
- lib/smart_ioc/bean.rb
|
76
77
|
- lib/smart_ioc/bean_definition.rb
|
77
78
|
- lib/smart_ioc/bean_definitions_storage.rb
|
78
79
|
- lib/smart_ioc/bean_dependency.rb
|
@@ -90,6 +91,7 @@ files:
|
|
90
91
|
- lib/smart_ioc/scopes/prototype.rb
|
91
92
|
- lib/smart_ioc/scopes/request.rb
|
92
93
|
- lib/smart_ioc/scopes/singleton.rb
|
94
|
+
- lib/smart_ioc/string_utils.rb
|
93
95
|
- lib/smart_ioc/version.rb
|
94
96
|
- smart_ioc.gemspec
|
95
97
|
- spec/smart_ioc/bean_definition_spec.rb
|
@@ -133,8 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
135
|
- !ruby/object:Gem::Version
|
134
136
|
version: '0'
|
135
137
|
requirements: []
|
136
|
-
|
137
|
-
rubygems_version: 2.5.2
|
138
|
+
rubygems_version: 3.1.2
|
138
139
|
signing_key:
|
139
140
|
specification_version: 4
|
140
141
|
summary: Inversion of Control Container
|