smart_injection 0.0.0.alpha2 → 0.0.0.alpha3

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
  SHA256:
3
- metadata.gz: 47305dc4c0d594df95939793e44ddecb0292fa3c81f8c6c8f7077a181b76a44f
4
- data.tar.gz: '094e2d7c0b6030076856b3eb97c1b5a67bc01ab81ec61314d12ac44ed933ca1b'
3
+ metadata.gz: d6f87bba0170853c09fc72fd200054365cc4653d76bf7c3e2347af9d5c8a3e59
4
+ data.tar.gz: 9f09cbfca987d5a0423f8ff0100d4c1a2732b1f9051ec689fa8106dc5bde2678
5
5
  SHA512:
6
- metadata.gz: 36467e0302f3404d16a21e11d949d30a8d1dfff2afc3e82f2f86364ee7ffa88f55cdc8d0acbedf6244df25da93211fecda6921d519e7d2a1121f2908aa36aa7b
7
- data.tar.gz: 8774c415a69c2ce02c8675172aa914c97f21b31ef1a140dcd4435c4d6921a33a55265526b4a5c107f888d738934b608c46e04b5a35f684d9ea2c1e95b3e08498
6
+ metadata.gz: de681417379858196fad5b211b065e226c1744c20472d592b479697ff82a309ba111b9a460c5b4484ca81499c486848bfa445567c95ba32100b0d1112def7cd1
7
+ data.tar.gz: 15d6cfd72927a2d46c9d71465b1650666cb81f5bc112d1abb3710ff4f397718b49debb4a1c821259e118ffeb09d34b8173c1b4e4359d4342018ed46db20f3f27
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_injection (0.0.0.alpha)
5
- smart_container (~> 0.7)
4
+ smart_injection (0.0.0.alpha2)
5
+ smart_container (~> 0.8, >= 0.8.1)
6
6
  smart_engine (~> 0.7)
7
7
 
8
8
  GEM
@@ -79,7 +79,7 @@ GEM
79
79
  docile (~> 1.1)
80
80
  simplecov-html (~> 0.11)
81
81
  simplecov-html (0.12.2)
82
- smart_container (0.7.0)
82
+ smart_container (0.8.1)
83
83
  smart_engine (~> 0.5)
84
84
  smart_engine (0.7.0)
85
85
  thread_safe (0.3.6)
data/README.md CHANGED
@@ -8,7 +8,7 @@ Dependency injection principles and idioms realized in scope of Ruby.
8
8
 
9
9
  - `method-injection` strategy
10
10
  - `soon:` constructor injection strategy;
11
- - `soon:` attribute injection strategy;
11
+ - `soon:` property injection strategy;
12
12
  - realized as a mixin;
13
13
  - instance-method dependency injection;
14
14
  - class-method dependency injection;
@@ -80,18 +80,18 @@ class MiniService
80
80
  include SmartCore::Injection(AppContainer, ServiceContainer)
81
81
 
82
82
  # --- or ---
83
- include SmartCore::Container
83
+ include SmartCore::Injection
84
84
  register_container(AppContainer, ServiceContainer)
85
85
 
86
86
  # import dependencies to an instance
87
- import { db: 'data_storage.main' }, bind: :dynamic, access: :private
88
- import { rnd: 'rands.alphanum' }, bind: :static, memoize: true
87
+ import({ db: 'data_storage.main' }, bind: :dynamic, access: :private)
88
+ import({ rnd: 'rands.alphanum' }, bind: :static, memoize: true)
89
89
 
90
90
  # import dependencies to a class
91
- import_static { cache: 'data_storage.cache', hexer: 'rands.hex' }, bind: :static
91
+ import_static({ cache: 'data_storage.cache', hexer: 'rands.hex' }, bind: :static)
92
92
 
93
93
  # import from a non-registered container
94
- import { phone_client: 'phone_clients.nexmo' }, from: GlobalContainer
94
+ import({ phone_client: 'phone_clients.nexmo' }, from: GlobalContainer)
95
95
 
96
96
  def call
97
97
  db # => returns data_storage.main
@@ -3,6 +3,8 @@
3
3
  # @api private
4
4
  # @since 0.1.0
5
5
  class SmartCore::Injection::Injector::ContainerSet
6
+ require_relative 'container_set/adding_listener'
7
+
6
8
  # @since 0.1.0
7
9
  include Enumerable
8
10
 
@@ -12,6 +14,7 @@ class SmartCore::Injection::Injector::ContainerSet
12
14
  # @since 0.1.0
13
15
  def initialize
14
16
  @containers = [] # NOTE: we use Array cuz we need an ordered set
17
+ @adding_listeners = []
15
18
  @access_lock = SmartCore::Engine::Lock.new
16
19
  end
17
20
 
@@ -25,6 +28,17 @@ class SmartCore::Injection::Injector::ContainerSet
25
28
  end
26
29
  alias_method :<<, :add
27
30
 
31
+ # @param listener [Block]
32
+ # @yield [container]
33
+ # @yieldparam container [SmartCore::Container]
34
+ # @return [void]
35
+ #
36
+ # @api private
37
+ # @since 0.1.0
38
+ def listen_addings(&listener)
39
+ thread_safe { add_adding_listener(listener) }
40
+ end
41
+
28
42
  # @param block [Block]
29
43
  # @yield [container]
30
44
  # @yieldparam container [SmartCore::Container]
@@ -63,6 +77,18 @@ class SmartCore::Injection::Injector::ContainerSet
63
77
  # @since 0.1.0
64
78
  attr_reader :containers
65
79
 
80
+ # @return [Array<SmartCore::Injection::Injector::ContainerSet::AddingListener>]
81
+ attr_reader :adding_listeners
82
+
83
+ # @param listener [Proc]
84
+ # @return [void]
85
+ #
86
+ # @api private
87
+ # @since 0.1.0
88
+ def add_adding_listener(listener)
89
+ adding_listeners << SmartCore::Injection::Injector::ContainerSet::AddingListener.new(listener)
90
+ end
91
+
66
92
  # @param container [SmartCore::Container]
67
93
  # @return [void]
68
94
  #
@@ -73,6 +99,7 @@ class SmartCore::Injection::Injector::ContainerSet
73
99
  # - #concant is used to prevent container duplications in ordered set;
74
100
  # - @containers should have an ordered unified container list;
75
101
  containers.concat([container])
102
+ adding_listeners.each { |listener| listener.notify(container) }
76
103
  end
77
104
 
78
105
  # @param block [Block]
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ # @since 0.1.0
5
+ class SmartCore::Injection::Injector::ContainerSet::AddingListener
6
+ # @param listener [Proc]
7
+ # @return [void]
8
+ #
9
+ # @api private
10
+ # @since 0.1.0
11
+ def initialize(listener)
12
+ @listener = listener
13
+ end
14
+
15
+ # @param cotnainer [SmartCore::Container]
16
+ #
17
+ # @api private
18
+ # @since 0.1.0
19
+ def notify(container)
20
+ listener.call(container)
21
+ end
22
+
23
+ private
24
+
25
+ # @return [Proc]
26
+ #
27
+ # @api private
28
+ # @since 0.1.0
29
+ attr_reader :listener
30
+ end
@@ -39,7 +39,7 @@ class SmartCore::Injection::Locator
39
39
  # @api private
40
40
  # @since 0.1.0
41
41
  def rebind_dependency
42
- dependency.rebind { container_proxy.resolve(import_path) }
42
+ dependency.rebind { container_proxy.resolve_dependency(import_path) }
43
43
  end
44
44
  alias_method :rebind!, :rebind_dependency
45
45
 
@@ -12,6 +12,8 @@ class SmartCore::Injection::Locator::ContainerProxy
12
12
  def initialize(registered_containers, explicitly_passed_container)
13
13
  @registered_containers = registered_containers
14
14
  @explicitly_passed_container = explicitly_passed_container
15
+ @observers = Hash.new { |h, k| h[k] = [] }
16
+ registered_containers.listen_addings { |container| listen_changes(container) }
15
17
  end
16
18
 
17
19
  # @param dependency_path [String]
@@ -49,11 +51,21 @@ class SmartCore::Injection::Locator::ContainerProxy
49
51
  # @api private
50
52
  # @since 0.1.0
51
53
  def observe(import_path, &observer)
52
- # TODO: implement
54
+ register_observer(import_path, observer)
55
+
56
+ each_container do |container|
57
+ container.observe(import_path) { |path, cntr| process_changement(cntr, path) }
58
+ end
53
59
  end
54
60
 
55
61
  private
56
62
 
63
+ # @return [Hash<String,Proc>]
64
+ #
65
+ # @api private
66
+ # @since 0.1.0
67
+ attr_reader :observers
68
+
57
69
  # @return [SmartCore::Injection::Injector::ContainerSet]
58
70
  #
59
71
  # @api private
@@ -66,15 +78,65 @@ class SmartCore::Injection::Locator::ContainerProxy
66
78
  # @since 0.1.0
67
79
  attr_reader :explicitly_passed_container
68
80
 
81
+ # @param import_path [NilClass, String]
82
+ # @param container [SmartCore::Container]
83
+ # @return [void]
84
+ #
85
+ # @api private
86
+ # @since 0.1.0
87
+ def process_changement(container, import_path = nil)
88
+ observed_pathes = import_path ? [import_path] : observed_import_pathes
89
+
90
+ observed_pathes.each do |observed_path|
91
+ suitable_container = each_container.find { |cntr| cntr.key?(observed_path) }
92
+ break unless suitable_container
93
+ notify_observers(observed_path) if suitable_container == container
94
+ end
95
+ end
96
+
97
+ # @param import_path [String]
98
+ # @param observer [SmartCore::Container]
99
+ # @return [void]
100
+ #
101
+ # @api private
102
+ # @since 0.1.0
103
+ def register_observer(import_path, observer)
104
+ observers[import_path] << observer
105
+ end
106
+
107
+ # @return [Array<String>]
108
+ #
109
+ # @api private
110
+ # @since 0.1.0
111
+ def observed_import_pathes
112
+ observers.keys
113
+ end
114
+
115
+ # @param import_pathes [String]
116
+ # @return [void]
117
+ #
118
+ # @api private
119
+ # @since 0.1.0
120
+ def notify_observers(*import_pathes)
121
+ import_pathes.each { |import_path| observers.fetch(import_path).each(&:call) }
122
+ end
123
+
69
124
  # @param block [Block]
70
125
  # @yield [container]
71
126
  # @yieldparam container [SmartCore::Container]
72
- # @return [void]
127
+ # @return [Enumerable]
73
128
  #
74
129
  # @api private
75
130
  # @since 0.1.0
76
131
  def each_container(&block)
77
- yield(explicitly_passed_container) if explicitly_passed_container
78
- registered_containers.reverse_each(&block)
132
+ enumerator = Enumerator.new do |yielder|
133
+ if explicitly_passed_container
134
+ yielder.yield(explicitly_passed_container)
135
+ else
136
+ registered_containers.reverse_each(&yielder)
137
+ end
138
+ end
139
+
140
+ block_given? ? enumerator.each(&block) : enumerator.each
79
141
  end
80
142
  end
@@ -20,7 +20,7 @@ class SmartCore::Injection::Locator::Dependency
20
20
  # @since 0.1.0
21
21
  def rebind(&block)
22
22
  with_barrier do
23
- @bind = false
23
+ @binded = false
24
24
  bind(&block)
25
25
  end
26
26
  end
@@ -36,7 +36,7 @@ class SmartCore::Injection::Locator::Dependency
36
36
  @value
37
37
  else
38
38
  @binded = true
39
- @value = yield(@value)
39
+ @value = yield
40
40
  end
41
41
  end
42
42
  end
@@ -11,8 +11,8 @@ module SmartCore::Injection::Locator::Factory
11
11
  # @since 0.1.0
12
12
  def create(injection_settings, import_key, import_path)
13
13
  container_proxy = create_container_proxy(injection_settings)
14
- locator = create_locator(import_path, container_proxy).tap do
15
- control_inection_memoization(injection_settings, container_proxy, locator, import_path)
14
+ create_locator(import_path, container_proxy).tap do |locator|
15
+ control_injection_memoization(injection_settings, container_proxy, locator, import_path)
16
16
  end
17
17
  end
18
18
 
@@ -46,8 +46,10 @@ module SmartCore::Injection::Locator::Factory
46
46
  #
47
47
  # @api private
48
48
  # @since 0.1.0
49
- def control_inection_memoization(injection_settings, container_proxy, locator, import_path)
50
- container_proxy.observe(import_path) { locator.rebind! } unless injection_settings.memoize
49
+ def control_injection_memoization(injection_settings, container_proxy, locator, import_path)
50
+ container_proxy.observe(import_path) do
51
+ locator.rebind!
52
+ end unless injection_settings.memoize
51
53
  end
52
54
  end
53
55
  end
@@ -6,6 +6,6 @@ module SmartCore
6
6
  #
7
7
  # @api public
8
8
  # @since 0.1.0
9
- VERSION = '0.0.0.alpha2'
9
+ VERSION = '0.0.0.alpha3'
10
10
  end
11
11
  end
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.require_paths = ['lib']
32
32
 
33
33
  spec.add_runtime_dependency 'smart_engine', '~> 0.7'
34
- spec.add_runtime_dependency 'smart_container', '~> 0.7'
34
+ spec.add_runtime_dependency 'smart_container', '~> 0.8', '>= 0.8.1'
35
35
 
36
36
  spec.add_development_dependency 'bundler', '~> 2.1'
37
37
  spec.add_development_dependency 'rake', '~> 13.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_injection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.alpha2
4
+ version: 0.0.0.alpha3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-06 00:00:00.000000000 Z
11
+ date: 2020-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: smart_engine
@@ -30,14 +30,20 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.7'
33
+ version: '0.8'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 0.8.1
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
41
  - - "~>"
39
42
  - !ruby/object:Gem::Version
40
- version: '0.7'
43
+ version: '0.8'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.8.1
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: bundler
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -147,6 +153,7 @@ files:
147
153
  - lib/smart_core/injection/errors.rb
148
154
  - lib/smart_core/injection/injector.rb
149
155
  - lib/smart_core/injection/injector/container_set.rb
156
+ - lib/smart_core/injection/injector/container_set/adding_listener.rb
150
157
  - lib/smart_core/injection/injector/injection_settings.rb
151
158
  - lib/smart_core/injection/injector/injection_settings/incompatability_control.rb
152
159
  - lib/smart_core/injection/injector/modulizer.rb