smart_injection 0.0.0.alpha2 → 0.0.0.alpha3

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
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