smart_ioc 0.3.1 → 0.3.8

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
- SHA1:
3
- metadata.gz: 8afa36b74a66cb6082823684679f4fd9d5f974f0
4
- data.tar.gz: 715809ca8d2dcbb7020acad09ba3a6f39e4883f1
2
+ SHA256:
3
+ metadata.gz: 935f8126a232eeb46445b817709b70a45d99c2212cd81fbc81782a217fbe409b
4
+ data.tar.gz: 6f433ae8f0514505f08eeb3cadda7856b456f28ed4d61f774bb7fee327914ce3
5
5
  SHA512:
6
- metadata.gz: 4badf8cf4a9da4a48909e7d827f1881d50c003415f50cb1d763976f4e2d8ece131c4b2b4f4860dd3338d0cf1d5bf8d41d2e5bce343f3612b0b9f4c46ba1d30f0
7
- data.tar.gz: cb8e5693a785030019776cbabf90f9d5abeeed5cb0726efb96292cb20f078ed5d9cd51bbe7edf1fd9af707890387db0328eef7efc05add950e3a279cd8f22f52
6
+ metadata.gz: 9d1c0b83f8b812e062332d65756e90a6566f3e9934086dce23c6c163b52fb9e002eabcd746b3a757012bb3ee172728ccc72d0698078ae4fcee7f9790a28f5245
7
+ data.tar.gz: 27c53e6c7d8772fba4e21281c6dd89d9bc3f22431e6740ab484f1af6f705e21db0d1b53fd6e890b66b5c037b66cbe64031b7fe62068df554660a294677901d3e
@@ -1,45 +1,44 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_ioc (0.3.1)
4
+ smart_ioc (0.3.8)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- byebug (10.0.2)
10
- codecov (0.1.10)
9
+ byebug (11.1.3)
10
+ codecov (0.2.5)
11
+ colorize
11
12
  json
12
13
  simplecov
13
- url
14
- diff-lcs (1.3)
15
- docile (1.1.5)
16
- json (2.0.3)
17
- rake (12.0.0)
18
- rspec (3.5.0)
19
- rspec-core (~> 3.5.0)
20
- rspec-expectations (~> 3.5.0)
21
- rspec-mocks (~> 3.5.0)
22
- rspec-core (3.5.4)
23
- rspec-support (~> 3.5.0)
24
- rspec-expectations (3.5.0)
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.5.0)
27
- rspec-mocks (3.5.0)
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.5.0)
30
- rspec-support (3.5.0)
31
- simplecov (0.14.1)
32
- docile (~> 1.1.0)
33
- json (>= 1.8, < 3)
34
- simplecov-html (~> 0.10.0)
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 (~> 1.3)
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.16.1
50
+ 2.1.2
@@ -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, :get_bean_definition_by_class,
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.klass == @klass
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
- error_msg =
24
- %Q(Not able to add bean to definitions storage.
25
- Bean definition already exists.
26
- New bean details:
27
- #{bean_definition.inspect}
28
- Existing bean details:
29
- #{existing_bd.inspect})
30
-
31
- raise ArgumentError, error_msg
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
- klass_str = klass.to_s
50
- @collection.detect {|bd| bd.klass.to_s == klass_str}
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.context
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
@@ -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 klass [Class] class name
89
+ # @param bean_name [Symbol]
90
+ # @param package [Symbol]
91
+ # @param context [Symbol]
92
92
  # return [BeanDefinition]
93
- def get_bean_definition_by_class(klass)
94
- bean_definitions_storage.find_by_class(klass)
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
 
@@ -14,6 +14,10 @@ class SmartIoC::ExtraPackageContexts
14
14
  @data[package_name] = context
15
15
  end
16
16
 
17
+ def package_context(package_name)
18
+ @data[package_name]
19
+ end
20
+
17
21
  def get_context(package_name)
18
22
  @data[package_name] || SmartIoC::Container::DEFAULT_CONTEXT
19
23
  end
@@ -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 = caller[0].split(':').first
36
-
37
- bean_definition = SmartIoC.get_bean_definition_by_class(self)
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 inject(bean_name, ref: nil, from: nil)
83
- bean_definition = SmartIoC::Container.get_instance.get_bean_definition_by_class(self)
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.add_dependency(
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: 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 bean_definition.is_instance?
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
@@ -1,3 +1,3 @@
1
1
  module SmartIoC
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.8"
3
3
  end
@@ -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', '~> 1.3'
21
+ spec.add_development_dependency 'bundler'
22
22
  spec.add_development_dependency 'rake'
23
23
  spec.add_development_dependency "codecov"
24
24
  end
@@ -16,8 +16,7 @@ describe SmartIoC::BeanDefinition do
16
16
  )
17
17
 
18
18
  str =
19
- "class: Object
20
- name: :test_bean
19
+ "name: :test_bean
21
20
  package: :test_package
22
21
  context: :default
23
22
  path: current_dir
@@ -4,27 +4,42 @@ describe SmartIoC::BeanFactory do
4
4
  before :all do
5
5
  SmartIoC.clear
6
6
 
7
- class Repo
8
- include SmartIoC::Iocify
9
- bean :repo, context: :default, package: :bean_factory
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
- class TestRepo
13
- include SmartIoC::Iocify
14
- bean :repo, context: :test, package: :bean_factory
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
- class DAO
18
- include SmartIoC::Iocify
19
- bean :dao, context: :default, package: :bean_factory
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
- class Factory
26
- include SmartIoC::Iocify
27
- bean :factory, factory_method: :build_bean, package: :bean_factory
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 be_a(TestRepo)
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 be_a(Repo)
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 be_a(DAO)
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
 
@@ -1,7 +1,5 @@
1
- class AdminsDAO
2
- include SmartIoC::Iocify
3
-
4
- bean :dao, instance: false, after_init: :setup
1
+ bean :dao do
2
+ after_init :setup
5
3
 
6
4
  inject :config
7
5
 
@@ -1,13 +1,7 @@
1
- class AdminsRepository
2
- include SmartIoC::Iocify
3
-
4
- bean :repository
5
-
1
+ bean :repository do
6
2
  inject :dao
7
3
  inject :users_creator
8
4
 
9
- public :users_creator
10
-
11
5
  def put(user)
12
6
  dao.insert(user)
13
7
  end
@@ -32,7 +32,7 @@ describe Object do
32
32
  factory_method: :my_method, context: :test
33
33
  end
34
34
 
35
- @bean_definition = SmartIoC.get_bean_definition_by_class(BeanClass)
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(AdminsRepository)
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.1
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: 2018-09-03 00:00:00.000000000 Z
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: '1.3'
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: '1.3'
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
- rubyforge_project:
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