smart_ioc 0.3.2 → 0.3.5

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
- SHA1:
3
- metadata.gz: 9f440eaa9c2c4bfa7c178c6dd2d77ed762cb67ab
4
- data.tar.gz: 50a40a15cfda928ebff9d12489e5e1149b44ccf5
2
+ SHA256:
3
+ metadata.gz: de564b00fb136146fd0f4d4182fe58f7cd9f1bd56c01a23ccc7aca185befc7e8
4
+ data.tar.gz: d9cb0e43111c988b77d8454fc3b7f45cf4aa2109a76839f2da17135eaef57e52
5
5
  SHA512:
6
- metadata.gz: 2ff9c4aa242a0e223f252331b317377742b8e848800b8011b15e71cb5f558f6664e36fcad10808500404044004e73f16cf1becca35906001cd1914b82d66ea77
7
- data.tar.gz: a0239ffda9a42ac306d0eec4f7ddcb5764ac4207e3ce33e973e7c2e77b51e6fdc89286fb093fd3a3c1c163b4ef208edd51fb7df136e98bfff326e4d10282ce9c
6
+ metadata.gz: 4a5a9d63019c4a0fabda18691014bbaf510ef703e1592a00a97bae1a582f523cfa8328c826a331764602664346771033ef3bf2d49bb3b27a98d9830e2f465f98
7
+ data.tar.gz: 9ae3b6e48602c173ca5ef0544c587c156d10e89616bbcdfb53ae293c98a4b6d047a3d2e01712b072ecfdc6bd519391735b20b12425ce513c9ebd6abb8d87d118
@@ -1,45 +1,44 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_ioc (0.3.2)
4
+ smart_ioc (0.3.5)
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
+ 1.17.2
@@ -73,7 +73,7 @@ module SmartIoC
73
73
  Container.get_instance
74
74
  end
75
75
 
76
- [:register_bean, :get_bean_definition_by_class,
76
+ [:register_bean, :get_bean_definition,
77
77
  :set_extra_context_for_package, :get_bean, :clear_scopes,
78
78
  :force_clear_scopes, :set_load_proc].each do |name|
79
79
  define_method name do |*args, &block|
@@ -82,3 +82,5 @@ module SmartIoC
82
82
  end
83
83
  end
84
84
  end
85
+
86
+ require 'smart_ioc/bean'
@@ -0,0 +1,29 @@
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
+ klass.instance_exec do
13
+ bean(
14
+ bean_name,
15
+ scope: instance_variable_get(:@scope) || nil,
16
+ package: instance_variable_get(:@package) || nil,
17
+ instance: instance_variable_get(:@instance) || false,
18
+ factory_method: instance_variable_get(:@factory_method) || nil,
19
+ context: instance_variable_get(:@context) || nil,
20
+ after_init: instance_variable_get(:@after_init) || nil
21
+ )
22
+ end
23
+
24
+ (klass.instance_variable_get(:@injects) || []).each do |inject|
25
+ klass.register_inject(inject[:bean_name], ref: inject[:ref], from: inject[:from])
26
+ end
27
+
28
+ klass
29
+ 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}"
@@ -46,8 +46,16 @@ Existing bean details:
46
46
  # @param klass [Class] bean class
47
47
  # @return bean definition [BeanDefinition] or nil
48
48
  def find_by_class(klass)
49
- klass_str = klass.to_s
50
- @collection.detect {|bd| bd.klass.to_s == klass_str}
49
+ @collection.detect {|bd| bd.klass == klass}
50
+ end
51
+
52
+ # Returns bean definition for specific class
53
+ # @param bean_name [Symbol]
54
+ # @param package [Symbol]
55
+ # @param context [Symbol]
56
+ # @return bean definition [BeanDefinition] or nil
57
+ def find_bean(bean_name, package, context)
58
+ @collection.detect {|bd| bd.name == bean_name && bd.package == package && bd.context == context}
51
59
  end
52
60
 
53
61
  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)
85
+ bean_definition = autodetect_bean_definition(bean_name, package, parent_bean_package, parent_bean_name)
86
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)
@@ -120,8 +120,10 @@ class SmartIoC::BeanFactory
120
120
  end
121
121
 
122
122
  if smart_bds.size > 1
123
+ require 'byebug'
124
+ debugger
123
125
  raise ArgumentError.new(
124
- %Q(Unable to autodetect bean :#{bean}.
126
+ %Q(Unable to autodetect bean :#{bean}#{parent_bean_name ? " for bean :#{parent_bean_name}" : ''}.
125
127
  Several definitions were found:\n
126
128
  #{smart_bds.map(&:inspect).join("\n\n")}.
127
129
  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
 
@@ -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]
@@ -33,8 +66,9 @@ module SmartIoC::Iocify
33
66
  # @return nil
34
67
  def bean(bean_name, scope: nil, package: nil, instance: true, factory_method: nil, context: nil, after_init: nil)
35
68
  file_path = caller[0].split(':').first
36
-
37
- bean_definition = SmartIoC.get_bean_definition_by_class(self)
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
@@ -1,3 +1,3 @@
1
1
  module SmartIoC
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.5"
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
 
@@ -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) }
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.2
4
+ version: 0.3.5
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-09 00:00:00.000000000 Z
11
+ date: 2020-08-15 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
@@ -133,8 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
134
  - !ruby/object:Gem::Version
134
135
  version: '0'
135
136
  requirements: []
136
- rubyforge_project:
137
- rubygems_version: 2.5.2
137
+ rubygems_version: 3.0.3
138
138
  signing_key:
139
139
  specification_version: 4
140
140
  summary: Inversion of Control Container