smart_ioc 0.3.0 → 0.3.1

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
2
  SHA1:
3
- metadata.gz: cf89316b5fdc41e85e9cadcf0d5d4c0793aba48e
4
- data.tar.gz: 52767b97eecaf1fba1141e3741139ba8871ecde5
3
+ metadata.gz: 8afa36b74a66cb6082823684679f4fd9d5f974f0
4
+ data.tar.gz: 715809ca8d2dcbb7020acad09ba3a6f39e4883f1
5
5
  SHA512:
6
- metadata.gz: 81d0b186ff1b8922d06add551b86376def059037bb49e890d1153986826125ff49ca2991103a63074a63daf96e85b31b680dc677c1943791ade889e7ad940909
7
- data.tar.gz: ed5f32ac7c938c24100e7ab4c6560fd493117fc8798285aa7142004ec4afb07b03c9bac6c7a4dba168235c5d8d054866f67188d644fd88843e4114191850c4e4
6
+ metadata.gz: 4badf8cf4a9da4a48909e7d827f1881d50c003415f50cb1d763976f4e2d8ece131c4b2b4f4860dd3338d0cf1d5bf8d41d2e5bce343f3612b0b9f4c46ba1d30f0
7
+ data.tar.gz: cb8e5693a785030019776cbabf90f9d5abeeed5cb0726efb96292cb20f078ed5d9cd51bbe7edf1fd9af707890387db0328eef7efc05add950e3a279cd8f22f52
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_ioc (0.3.0)
4
+ smart_ioc (0.3.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,7 +1,7 @@
1
1
  module SmartIoC::Args
2
2
  def check_arg(value, name, klass)
3
3
  if !value.is_a?(klass)
4
- raise ArgumentError, ":#{name} should be a #{klass}"
4
+ raise ArgumentError, ":#{name} should be a #{klass}. Got #{value.class}: #{value.inspect}"
5
5
  end
6
6
  end
7
7
 
@@ -73,10 +73,21 @@ Existing bean details:
73
73
  # @bean_name [Symbol] bean name
74
74
  # @package [Symbol, nil] package name
75
75
  # @context [Symbol, nil] context
76
+ # @package [Symbol, nil] parent_package name of parent package
76
77
  # @raises AmbiguousBeanDefinition if multiple bean definitions are found
77
- def find(bean_name, package = nil, context = nil)
78
+ def find(bean_name, package = nil, context = nil, parent_package = nil)
78
79
  bds = filter_by_with_drop_to_default_context(bean_name, package, context)
79
80
 
81
+ if bds.size > 1 && parent_package
82
+ bean_definition = bds.detect do |bd|
83
+ bd.package == parent_package
84
+ end
85
+
86
+ if bean_definition
87
+ bds = [bean_definition]
88
+ end
89
+ end
90
+
80
91
  if bds.size > 1
81
92
  raise AmbiguousBeanDefinition.new(bean_name, bds)
82
93
  elsif bds.size == 0
@@ -26,19 +26,22 @@ class SmartIoC::BeanFactory
26
26
  # Get bean from the container by it's name, package, context
27
27
  # @param bean_name [Symbol] bean name
28
28
  # @param package [Symbol] package name
29
+ # @param parent_bean_definition [SmartIoC::BeanDefinition] parent bean definition
29
30
  # @param context [Symbol] context
30
31
  # @return bean instance
31
32
  # @raise [ArgumentError] if bean is not found
32
33
  # @raise [ArgumentError] if ambiguous bean definition was found
33
- def get_bean(bean_name, package: nil, context: nil)
34
+ def get_bean(bean_name, package: nil, parent_bean_definition: nil, context: nil)
34
35
  check_arg(bean_name, :bean_name, Symbol)
35
36
  check_arg(package, :package, Symbol) if package
37
+ check_arg(parent_bean_definition, :parent_bean_definition, SmartIoC::BeanDefinition) if parent_bean_definition
36
38
  check_arg(context, :context, Symbol) if context
37
39
 
38
40
  @bean_file_loader.require_bean(bean_name)
39
41
 
40
- context = autodetect_context(bean_name, package, context)
41
- bean_definition = @bean_definitions_storage.find(bean_name, package, context)
42
+ parent_package_name = parent_bean_definition ? parent_bean_definition.package : nil
43
+ context = autodetect_context(bean_name, package, parent_package_name, context)
44
+ bean_definition = @bean_definitions_storage.find(bean_name, package, context, parent_package_name)
42
45
  scope = get_scope(bean_definition)
43
46
  bean = scope.get_bean(bean_definition.klass)
44
47
 
@@ -48,6 +51,9 @@ class SmartIoC::BeanFactory
48
51
 
49
52
  scope.save_bean(bean_definition.klass, bean)
50
53
  bean
54
+ rescue SmartIoC::Errors::AmbiguousBeanDefinition => e
55
+ e.parent_bean_definition = parent_bean_definition
56
+ raise e
51
57
  end
52
58
 
53
59
  private
@@ -70,13 +76,13 @@ class SmartIoC::BeanFactory
70
76
  bean
71
77
  end
72
78
 
73
- def autodetect_context(bean_name, package, context)
79
+ def autodetect_context(bean_name, package, parent_bean_package, context)
74
80
  return context if context
75
81
 
76
82
  if package
77
83
  @extra_package_contexts.get_context(package)
78
84
  else
79
- bean_definition = autodetect_bean_definition(bean_name, package, nil)
85
+ bean_definition = autodetect_bean_definition(bean_name, package, parent_bean_package)
80
86
  bean_definition.context
81
87
  end
82
88
  end
@@ -13,10 +13,6 @@ module SmartIoC
13
13
  def clear
14
14
  @container = nil
15
15
  end
16
-
17
- def get_bean(bean_name, package = nil, context = nil)
18
- get_instance.get_bean(bean_name, package: package, context: context)
19
- end
20
16
  end
21
17
 
22
18
  def initialize
@@ -118,10 +114,16 @@ module SmartIoC
118
114
 
119
115
  # @param bean_name [Symbol] bean name
120
116
  # @param optional package [Symbol] package name
117
+ # @param optional parent_bean_definition [SmartIoc::BeanDefinition] bean definition of parent bean
121
118
  # @param optional context [Symbol] package context
122
119
  # @return bean instance from container
123
- def get_bean(bean_name, package: nil, context: nil)
124
- bean_factory.get_bean(bean_name, package: package, context: context)
120
+ def get_bean(bean_name, package: nil, context: nil, parent_bean_definition: nil)
121
+ bean_factory.get_bean(
122
+ bean_name,
123
+ package: package,
124
+ parent_bean_definition: parent_bean_definition,
125
+ context: context,
126
+ )
125
127
  end
126
128
 
127
129
  def clear_scopes
@@ -6,12 +6,20 @@ module SmartIoC::Errors
6
6
  end
7
7
 
8
8
  class AmbiguousBeanDefinition < StandardError
9
+ attr_accessor :parent_bean_definition
10
+
9
11
  def initialize(bean_name, bean_definitions)
10
- super(%Q(
11
- Unable to create bean :#{bean_name}.
12
- Several definitions were found.
13
- #{bean_definitions.map(&:inspect).join("\n\n")}
14
- ))
12
+ @bean_name = bean_name
13
+ @bean_definitions = bean_definitions
14
+ end
15
+
16
+ def message
17
+ <<~EOS
18
+ Unable to inject bean :#{@bean_name}#{@parent_bean_definition ? " into :#{@parent_bean_definition.name} (package: #{@parent_bean_definition.package})" : ""}.
19
+ Several bean definitions with name :#{@bean_name} were found:
20
+
21
+ #{@bean_definitions.map(&:inspect).join("\n\n")}
22
+ EOS
15
23
  end
16
24
  end
17
25
  end
@@ -95,7 +95,17 @@ module SmartIoC::Iocify
95
95
  bean_method = Proc.new do
96
96
  bean = instance_variable_get(:"@#{bean_name}")
97
97
  return bean if bean
98
- instance_variable_set(:"@#{bean_name}", SmartIoC::Container.get_bean(ref || bean_name, from))
98
+
99
+ klass = self.is_a?(Class) ? self : self.class
100
+ bean_definition = SmartIoC::Container.get_instance.get_bean_definition_by_class(klass)
101
+
102
+ bean = SmartIoC::Container.get_instance.get_bean(
103
+ ref || bean_name,
104
+ package: from,
105
+ parent_bean_definition: bean_definition
106
+ )
107
+
108
+ instance_variable_set(:"@#{bean_name}", bean)
99
109
  end
100
110
 
101
111
  if bean_definition.is_instance?
@@ -1,3 +1,3 @@
1
1
  module SmartIoC
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -3,7 +3,7 @@ class AdminsRepository
3
3
 
4
4
  bean :repository
5
5
 
6
- inject :dao, from: :admins
6
+ inject :dao
7
7
  inject :users_creator
8
8
 
9
9
  public :users_creator
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.3.0
4
+ version: 0.3.1
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-01 00:00:00.000000000 Z
11
+ date: 2018-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler