smart_injection 0.0.0.alpha3 → 0.0.0
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 +4 -4
- data/Gemfile.lock +18 -29
- data/README.md +0 -85
- data/lib/smart_core/injection/version.rb +1 -1
- data/lib/smart_core/injection.rb +0 -33
- data/smart_injection.gemspec +3 -7
- metadata +4 -66
- data/lib/smart_core/injection/dsl.rb +0 -107
- data/lib/smart_core/injection/errors.rb +0 -15
- data/lib/smart_core/injection/injector/container_set/adding_listener.rb +0 -30
- data/lib/smart_core/injection/injector/container_set.rb +0 -113
- data/lib/smart_core/injection/injector/injection_settings/incompatability_control.rb +0 -113
- data/lib/smart_core/injection/injector/injection_settings.rb +0 -173
- data/lib/smart_core/injection/injector/modulizer.rb +0 -55
- data/lib/smart_core/injection/injector/strategies/method_injection.rb +0 -92
- data/lib/smart_core/injection/injector/strategies.rb +0 -7
- data/lib/smart_core/injection/injector.rb +0 -165
- data/lib/smart_core/injection/locator/container_proxy.rb +0 -142
- data/lib/smart_core/injection/locator/dependency.rb +0 -54
- data/lib/smart_core/injection/locator/factory.rb +0 -55
- data/lib/smart_core/injection/locator.rb +0 -59
@@ -1,142 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.1.0
|
5
|
-
class SmartCore::Injection::Locator::ContainerProxy
|
6
|
-
# @param registered_containers [SmartCore::Injection::Injector::ContainerSet]
|
7
|
-
# @param explicitly_passed_container [NilClass, SmartCore::Container]
|
8
|
-
# @return [void]
|
9
|
-
#
|
10
|
-
# @api private
|
11
|
-
# @since 0.1.0
|
12
|
-
def initialize(registered_containers, explicitly_passed_container)
|
13
|
-
@registered_containers = registered_containers
|
14
|
-
@explicitly_passed_container = explicitly_passed_container
|
15
|
-
@observers = Hash.new { |h, k| h[k] = [] }
|
16
|
-
registered_containers.listen_addings { |container| listen_changes(container) }
|
17
|
-
end
|
18
|
-
|
19
|
-
# @param dependency_path [String]
|
20
|
-
# @return [Any]
|
21
|
-
#
|
22
|
-
# @raise [SmartCore::Injection::NoRegisteredContainersError]
|
23
|
-
# @raise [SmartCore::Container::ResolvingError]
|
24
|
-
#
|
25
|
-
# @api private
|
26
|
-
# @since 0.1.0
|
27
|
-
def resolve_dependency(dependency_path)
|
28
|
-
resolving_error = nil
|
29
|
-
|
30
|
-
each_container do |container|
|
31
|
-
begin # rubocop:disable Style/RedundantBegin
|
32
|
-
return container.resolve(dependency_path)
|
33
|
-
rescue SmartCore::Container::ResolvingError => error
|
34
|
-
resolving_error = error
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
unless resolving_error
|
39
|
-
raise(SmartCore::Injection::NoRegisteredContainersError, <<~ERROR_MESSAGE)
|
40
|
-
You haven't registered any containers for import.
|
41
|
-
ERROR_MESSAGE
|
42
|
-
else
|
43
|
-
raise(resolving_error)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# @param import_path [String]
|
48
|
-
# @param observer [Block]
|
49
|
-
# @return [void]
|
50
|
-
#
|
51
|
-
# @api private
|
52
|
-
# @since 0.1.0
|
53
|
-
def observe(import_path, &observer)
|
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
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
# @return [Hash<String,Proc>]
|
64
|
-
#
|
65
|
-
# @api private
|
66
|
-
# @since 0.1.0
|
67
|
-
attr_reader :observers
|
68
|
-
|
69
|
-
# @return [SmartCore::Injection::Injector::ContainerSet]
|
70
|
-
#
|
71
|
-
# @api private
|
72
|
-
# @since 0.1.0
|
73
|
-
attr_reader :registered_containers
|
74
|
-
|
75
|
-
# @return [NilClass, SmartCore::Container]
|
76
|
-
#
|
77
|
-
# @api private
|
78
|
-
# @since 0.1.0
|
79
|
-
attr_reader :explicitly_passed_container
|
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
|
-
|
124
|
-
# @param block [Block]
|
125
|
-
# @yield [container]
|
126
|
-
# @yieldparam container [SmartCore::Container]
|
127
|
-
# @return [Enumerable]
|
128
|
-
#
|
129
|
-
# @api private
|
130
|
-
# @since 0.1.0
|
131
|
-
def each_container(&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
|
141
|
-
end
|
142
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.1.0
|
5
|
-
class SmartCore::Injection::Locator::Dependency
|
6
|
-
# @return [void]
|
7
|
-
#
|
8
|
-
# @api private
|
9
|
-
# @since 0.1.0
|
10
|
-
def initialize
|
11
|
-
@binded = false
|
12
|
-
@value = nil
|
13
|
-
@barrier = SmartCore::Engine::Lock.new
|
14
|
-
end
|
15
|
-
|
16
|
-
# @param block [Block]
|
17
|
-
# @return [Any]
|
18
|
-
#
|
19
|
-
# @api private
|
20
|
-
# @since 0.1.0
|
21
|
-
def rebind(&block)
|
22
|
-
with_barrier do
|
23
|
-
@binded = false
|
24
|
-
bind(&block)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# @param block [Block]
|
29
|
-
# @return [Any]
|
30
|
-
#
|
31
|
-
# @api public
|
32
|
-
# @since 0.7.0
|
33
|
-
def bind(&block)
|
34
|
-
with_barrier do
|
35
|
-
if @binded
|
36
|
-
@value
|
37
|
-
else
|
38
|
-
@binded = true
|
39
|
-
@value = yield
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
# @param block [Block]
|
47
|
-
# @return [Any]
|
48
|
-
#
|
49
|
-
# @api private
|
50
|
-
# @since 0.1.0
|
51
|
-
def with_barrier(&block)
|
52
|
-
@barrier.synchronize(&block)
|
53
|
-
end
|
54
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.1.0
|
5
|
-
module SmartCore::Injection::Locator::Factory
|
6
|
-
class << self
|
7
|
-
# @param injection_settings [SmartCore::Injection::Injector::InjectionSettings]
|
8
|
-
# @return [SmartCore::Injection::Locator]
|
9
|
-
#
|
10
|
-
# @api private
|
11
|
-
# @since 0.1.0
|
12
|
-
def create(injection_settings, import_key, import_path)
|
13
|
-
container_proxy = create_container_proxy(injection_settings)
|
14
|
-
create_locator(import_path, container_proxy).tap do |locator|
|
15
|
-
control_injection_memoization(injection_settings, container_proxy, locator, import_path)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
# @return [SmartCore::Injection::Locator::ContainerProxy]
|
22
|
-
#
|
23
|
-
# @api private
|
24
|
-
# @since 0.1.0
|
25
|
-
def create_container_proxy(injection_settings)
|
26
|
-
SmartCore::Injection::Locator::ContainerProxy.new(
|
27
|
-
injection_settings.container_set,
|
28
|
-
injection_settings.from
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
|
-
# @param import_path [String]
|
33
|
-
# @param container_proxy [SmartCore::Injection::Locator::ContainerProxy]
|
34
|
-
# @return [SmartCore::Injection::Locator]
|
35
|
-
#
|
36
|
-
# @api private
|
37
|
-
# @since 0.1.0
|
38
|
-
def create_locator(import_path, container_proxy)
|
39
|
-
SmartCore::Injection::Locator.new(import_path, container_proxy)
|
40
|
-
end
|
41
|
-
|
42
|
-
# @param injection_settings [SmartCore::Injection::Injector::InjectionSettings]
|
43
|
-
# @param locator [SmartCore::Injection::Locator]
|
44
|
-
# @param import_path [String]
|
45
|
-
# @return [void]
|
46
|
-
#
|
47
|
-
# @api private
|
48
|
-
# @since 0.1.0
|
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
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @api private
|
4
|
-
# @since 0.1.0
|
5
|
-
class SmartCore::Injection::Locator
|
6
|
-
require_relative 'locator/container_proxy'
|
7
|
-
require_relative 'locator/dependency'
|
8
|
-
require_relative 'locator/factory'
|
9
|
-
|
10
|
-
# @return [String]
|
11
|
-
#
|
12
|
-
# @api private
|
13
|
-
# @since 0.1.0
|
14
|
-
attr_reader :import_path
|
15
|
-
|
16
|
-
# @param import_path [String]
|
17
|
-
# @param container_proxy [SmartCore::Injection::Locator::ContainerProxy]
|
18
|
-
# @return [void]
|
19
|
-
#
|
20
|
-
# @api private
|
21
|
-
# @since 0.1.0
|
22
|
-
def initialize(import_path, container_proxy)
|
23
|
-
@import_path = import_path
|
24
|
-
@container_proxy = container_proxy
|
25
|
-
@dependency = SmartCore::Injection::Locator::Dependency.new
|
26
|
-
end
|
27
|
-
|
28
|
-
# @return [Any]
|
29
|
-
#
|
30
|
-
# @api private
|
31
|
-
# @since 0.1.0
|
32
|
-
def resolve_dependency
|
33
|
-
dependency.bind { container_proxy.resolve_dependency(import_path) }
|
34
|
-
end
|
35
|
-
alias_method :bind!, :resolve_dependency
|
36
|
-
|
37
|
-
# @return [Any]
|
38
|
-
#
|
39
|
-
# @api private
|
40
|
-
# @since 0.1.0
|
41
|
-
def rebind_dependency
|
42
|
-
dependency.rebind { container_proxy.resolve_dependency(import_path) }
|
43
|
-
end
|
44
|
-
alias_method :rebind!, :rebind_dependency
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
# @return [SmartCore::Injection::Locator::Dependency]
|
49
|
-
#
|
50
|
-
# @api private
|
51
|
-
# @since 0.1.0
|
52
|
-
attr_reader :dependency
|
53
|
-
|
54
|
-
# @return [SmartCore::Injection::Locator::ContainerProxy]
|
55
|
-
#
|
56
|
-
# @api private
|
57
|
-
# @since 0.1.0
|
58
|
-
attr_reader :container_proxy
|
59
|
-
end
|