smart_container 0.3.0 → 0.8.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/.rubocop.yml +2 -2
- data/.travis.yml +7 -13
- data/CHANGELOG.md +31 -0
- data/Gemfile.lock +46 -31
- data/README.md +280 -1
- data/Rakefile +2 -1
- data/lib/smart_core/container.rb +137 -6
- data/lib/smart_core/container/{arbitary_lock.rb → arbitrary_lock.rb} +1 -1
- data/lib/smart_core/container/definition_dsl.rb +2 -2
- data/lib/smart_core/container/definition_dsl/command_set.rb +1 -1
- data/lib/smart_core/container/definition_dsl/commands/definition/register.rb +1 -1
- data/lib/smart_core/container/dependency_resolver.rb +79 -8
- data/lib/smart_core/container/dependency_resolver/route.rb +5 -8
- data/lib/smart_core/container/dependency_watcher.rb +149 -0
- data/lib/smart_core/container/dependency_watcher/observer.rb +46 -0
- data/lib/smart_core/container/entities/memoized_dependency.rb +1 -1
- data/lib/smart_core/container/entities/namespace.rb +1 -1
- data/lib/smart_core/container/errors.rb +2 -1
- data/lib/smart_core/container/mixin.rb +2 -2
- data/lib/smart_core/container/registry.rb +92 -5
- data/lib/smart_core/container/version.rb +2 -2
- data/smart_container.gemspec +5 -5
- metadata +14 -12
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.8.0
|
5
|
+
class SmartCore::Container::DependencyWatcher::Observer
|
6
|
+
# @param container [SmartCore::Container]
|
7
|
+
# @param dependency_path [String]
|
8
|
+
# @param callback [Proc]
|
9
|
+
# @return [void]
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
# @since 0.8.0
|
13
|
+
def initialize(container, dependency_path, callback)
|
14
|
+
@container = container
|
15
|
+
@dependency_path = dependency_path
|
16
|
+
@callback = callback
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [void]
|
20
|
+
#
|
21
|
+
# @api private
|
22
|
+
# @since 0.8.0
|
23
|
+
def notify!
|
24
|
+
callback.call(dependency_path, container)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# @return [SmartCore::Container]
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
# @since 0.8.0
|
33
|
+
attr_reader :container
|
34
|
+
|
35
|
+
# @return [String]
|
36
|
+
#
|
37
|
+
# @api private
|
38
|
+
# @since 0.8.0
|
39
|
+
attr_reader :dependency_path
|
40
|
+
|
41
|
+
# @return [Proc]
|
42
|
+
#
|
43
|
+
# @api private
|
44
|
+
# @since 0.8.0
|
45
|
+
attr_reader :callback
|
46
|
+
end
|
@@ -12,7 +12,7 @@ module SmartCore::Container::Entities
|
|
12
12
|
# @since 0.2.0
|
13
13
|
def initialize(dependency_name, dependency_definition)
|
14
14
|
super(dependency_name, dependency_definition)
|
15
|
-
@lock = SmartCore::Container::
|
15
|
+
@lock = SmartCore::Container::ArbitraryLock.new
|
16
16
|
end
|
17
17
|
|
18
18
|
# @return [Any]
|
@@ -18,7 +18,7 @@ class SmartCore::Container::Entities::Namespace < SmartCore::Container::Entities
|
|
18
18
|
super(namespace_name)
|
19
19
|
@container_klass = Class.new(SmartCore::Container)
|
20
20
|
@container_instance = nil
|
21
|
-
@lock = SmartCore::Container::
|
21
|
+
@lock = SmartCore::Container::ArbitraryLock.new
|
22
22
|
end
|
23
23
|
|
24
24
|
# @return [SmartCore::Container]
|
@@ -11,7 +11,7 @@ module SmartCore::Container::Mixin
|
|
11
11
|
# @since 0.1.0
|
12
12
|
def included(base_klass)
|
13
13
|
# rubocop:disable Layout/LineLength
|
14
|
-
base_klass.instance_variable_set(:@__smart_core_container_access_lock__, SmartCore::Container::
|
14
|
+
base_klass.instance_variable_set(:@__smart_core_container_access_lock__, SmartCore::Container::ArbitraryLock.new)
|
15
15
|
base_klass.instance_variable_set(:@__smart_core_container_klass__, Class.new(SmartCore::Container))
|
16
16
|
base_klass.instance_variable_set(:@__smart_core_container__, nil)
|
17
17
|
# rubocop:enable Layout/LineLength
|
@@ -34,7 +34,7 @@ module SmartCore::Container::Mixin
|
|
34
34
|
inherited_container_klass = Class.new(@__smart_core_container_klass__)
|
35
35
|
|
36
36
|
# rubocop:disable Layout/LineLength
|
37
|
-
child_klass.instance_variable_set(:@__smart_core_container_access_lock__, SmartCore::Container::
|
37
|
+
child_klass.instance_variable_set(:@__smart_core_container_access_lock__, SmartCore::Container::ArbitraryLock.new)
|
38
38
|
child_klass.instance_variable_set(:@__smart_core_container_klass__, inherited_container_klass)
|
39
39
|
child_klass.instance_variable_set(:@__smart_core_container__, nil)
|
40
40
|
# rubocop:enable Layout/LineLength
|
@@ -13,6 +13,18 @@ class SmartCore::Container::Registry
|
|
13
13
|
# @since 0.3.0
|
14
14
|
DEFAULT_MEMOIZATION_BEHAVIOR = false
|
15
15
|
|
16
|
+
# @return [Boolean]
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
# @since 0.4.0
|
20
|
+
DEFAULT_ITERATION_YIELD_BEHAVIOUR = false
|
21
|
+
|
22
|
+
# @return [Boolean]
|
23
|
+
#
|
24
|
+
# @api private
|
25
|
+
# @since 0.4.0
|
26
|
+
DEFAULT_KEY_EXTRACTION_BEHAVIOUR = false
|
27
|
+
|
16
28
|
# @return [Hash<Symbol,SmartCore::Container::Entity>]
|
17
29
|
#
|
18
30
|
# @api private
|
@@ -25,7 +37,7 @@ class SmartCore::Container::Registry
|
|
25
37
|
# @since 0.1.0
|
26
38
|
def initialize
|
27
39
|
@registry = {}
|
28
|
-
@access_lock = SmartCore::Container::
|
40
|
+
@access_lock = SmartCore::Container::ArbitraryLock.new
|
29
41
|
end
|
30
42
|
|
31
43
|
# @param entity_path [String, Symbol]
|
@@ -45,7 +57,7 @@ class SmartCore::Container::Registry
|
|
45
57
|
# @api private
|
46
58
|
# @since 0.1.0
|
47
59
|
# @version 0.3.0
|
48
|
-
def register_dependency(name, memoize
|
60
|
+
def register_dependency(name, memoize: DEFAULT_MEMOIZATION_BEHAVIOR, &dependency_definition)
|
49
61
|
thread_safe { add_dependency(name, dependency_definition, memoize) }
|
50
62
|
end
|
51
63
|
|
@@ -84,6 +96,30 @@ class SmartCore::Container::Registry
|
|
84
96
|
thread_safe { enumerate(&block) }
|
85
97
|
end
|
86
98
|
|
99
|
+
# @param root_dependency_name [NilClass, String]
|
100
|
+
# @option yield_all [Boolean]
|
101
|
+
# @param block [Block]
|
102
|
+
# @return [Enumerable]
|
103
|
+
#
|
104
|
+
# @api private
|
105
|
+
# @since 0.4.0
|
106
|
+
def each_dependency(
|
107
|
+
root_dependency_name = nil,
|
108
|
+
yield_all: DEFAULT_ITERATION_YIELD_BEHAVIOUR,
|
109
|
+
&block
|
110
|
+
)
|
111
|
+
thread_safe { iterate(root_dependency_name, yield_all: yield_all, &block) }
|
112
|
+
end
|
113
|
+
|
114
|
+
# @option all_variants [Boolean]
|
115
|
+
# @return [Array<String>]
|
116
|
+
#
|
117
|
+
# @api private
|
118
|
+
# @since 0.4.0
|
119
|
+
def keys(all_variants: DEFAULT_KEY_EXTRACTION_BEHAVIOUR)
|
120
|
+
thread_safe { extract_keys(all_variants: all_variants) }
|
121
|
+
end
|
122
|
+
|
87
123
|
# @return [Hash<String|Symbol,SmartCore::Container::Entities::Base|Any>]
|
88
124
|
#
|
89
125
|
# @api private
|
@@ -158,9 +194,8 @@ class SmartCore::Container::Registry
|
|
158
194
|
dependency_name = indifferently_accessable_name(entity_path)
|
159
195
|
registry.fetch(dependency_name)
|
160
196
|
rescue KeyError
|
161
|
-
|
162
|
-
|
163
|
-
MESSAGE
|
197
|
+
error_message = "Entity with \"#{dependency_name}\" name does not exist"
|
198
|
+
raise(SmartCore::Container::ResolvingError.new(error_message, path_part: dependency_name))
|
164
199
|
end
|
165
200
|
|
166
201
|
# @param dependency_name [String, Symbol]
|
@@ -215,6 +250,58 @@ class SmartCore::Container::Registry
|
|
215
250
|
namespace_entity.tap { namespace_entity.append_definitions(dependencies_definition) }
|
216
251
|
end
|
217
252
|
|
253
|
+
# @param root_dependency_name [String, NilClass]
|
254
|
+
# @param block [Block]
|
255
|
+
# @option yield_all [Boolean]
|
256
|
+
# @yield [dependency_name, dependency]
|
257
|
+
# @yield_param dependency_name [String]
|
258
|
+
# @yield_param dependency [Any]
|
259
|
+
# @return [Enumerable]
|
260
|
+
#
|
261
|
+
# @api private
|
262
|
+
# @since 0.4.0
|
263
|
+
def iterate(root_dependency_name = nil, yield_all: DEFAULT_ITERATION_YIELD_BEHAVIOUR, &block)
|
264
|
+
enumerator = Enumerator.new do |yielder|
|
265
|
+
registry.each_pair do |dependency_name, dependency|
|
266
|
+
final_dependency_name =
|
267
|
+
if root_dependency_name
|
268
|
+
"#{root_dependency_name}" \
|
269
|
+
"#{SmartCore::Container::DependencyResolver::PATH_PART_SEPARATOR}" \
|
270
|
+
"#{dependency_name}"
|
271
|
+
else
|
272
|
+
dependency_name
|
273
|
+
end
|
274
|
+
|
275
|
+
case dependency
|
276
|
+
when SmartCore::Container::Entities::Dependency
|
277
|
+
yielder.yield(final_dependency_name, dependency.reveal)
|
278
|
+
when SmartCore::Container::Entities::Namespace
|
279
|
+
yielder.yield(final_dependency_name, dependency.reveal) if yield_all
|
280
|
+
dependency.reveal.registry.each_dependency(
|
281
|
+
final_dependency_name,
|
282
|
+
yield_all: yield_all,
|
283
|
+
&block
|
284
|
+
)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
block_given? ? enumerator.each(&block) : enumerator.each
|
290
|
+
end
|
291
|
+
|
292
|
+
# @option all_variants [Boolean]
|
293
|
+
# @return [Array<String>]
|
294
|
+
#
|
295
|
+
# @api private
|
296
|
+
# @since 0.4.0
|
297
|
+
def extract_keys(all_variants: DEFAULT_KEY_EXTRACTION_BEHAVIOUR)
|
298
|
+
Set.new.tap do |dependency_names|
|
299
|
+
iterate(yield_all: all_variants) do |dependency_name, _dependency|
|
300
|
+
dependency_names << dependency_name
|
301
|
+
end
|
302
|
+
end.to_a
|
303
|
+
end
|
304
|
+
|
218
305
|
# @param name [String, Symbol]
|
219
306
|
# @return [void]
|
220
307
|
#
|
data/smart_container.gemspec
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require_relative 'lib/smart_core/container/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
|
-
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.
|
6
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.10')
|
7
7
|
|
8
8
|
spec.name = 'smart_container'
|
9
9
|
spec.version = SmartCore::Container::VERSION
|
@@ -27,12 +27,12 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
28
|
spec.require_paths = ['lib']
|
29
29
|
|
30
|
-
spec.add_dependency 'smart_engine', '~> 0.
|
30
|
+
spec.add_dependency 'smart_engine', '~> 0.5'
|
31
31
|
|
32
32
|
spec.add_development_dependency 'bundler', '~> 2.1'
|
33
33
|
spec.add_development_dependency 'rake', '~> 13.0'
|
34
34
|
spec.add_development_dependency 'rspec', '~> 3.9'
|
35
|
-
spec.add_development_dependency 'armitage-rubocop', '~> 0.
|
36
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
37
|
-
spec.add_development_dependency 'pry', '~> 0.
|
35
|
+
spec.add_development_dependency 'armitage-rubocop', '~> 0.81'
|
36
|
+
spec.add_development_dependency 'simplecov', '~> 0.18'
|
37
|
+
spec.add_development_dependency 'pry', '~> 0.13'
|
38
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smart_container
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
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-
|
11
|
+
date: 2020-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: smart_engine
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.5'
|
20
20
|
type: :runtime
|
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: '0.
|
26
|
+
version: '0.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,42 +72,42 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
75
|
+
version: '0.81'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0.
|
82
|
+
version: '0.81'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
89
|
+
version: '0.18'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0.
|
96
|
+
version: '0.18'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: pry
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0.
|
103
|
+
version: '0.13'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0.
|
110
|
+
version: '0.13'
|
111
111
|
description: Thread-safe semanticaly-defined IoC/DI Container
|
112
112
|
email:
|
113
113
|
- iamdaiver@gmail.com
|
@@ -129,7 +129,7 @@ files:
|
|
129
129
|
- bin/console
|
130
130
|
- bin/setup
|
131
131
|
- lib/smart_core/container.rb
|
132
|
-
- lib/smart_core/container/
|
132
|
+
- lib/smart_core/container/arbitrary_lock.rb
|
133
133
|
- lib/smart_core/container/definition_dsl.rb
|
134
134
|
- lib/smart_core/container/definition_dsl/command_set.rb
|
135
135
|
- lib/smart_core/container/definition_dsl/commands.rb
|
@@ -149,6 +149,8 @@ files:
|
|
149
149
|
- lib/smart_core/container/dependency_resolver.rb
|
150
150
|
- lib/smart_core/container/dependency_resolver/route.rb
|
151
151
|
- lib/smart_core/container/dependency_resolver/route/cursor.rb
|
152
|
+
- lib/smart_core/container/dependency_watcher.rb
|
153
|
+
- lib/smart_core/container/dependency_watcher/observer.rb
|
152
154
|
- lib/smart_core/container/entities.rb
|
153
155
|
- lib/smart_core/container/entities/base.rb
|
154
156
|
- lib/smart_core/container/entities/dependency.rb
|
@@ -178,7 +180,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
178
180
|
requirements:
|
179
181
|
- - ">="
|
180
182
|
- !ruby/object:Gem::Version
|
181
|
-
version: 2.4.
|
183
|
+
version: 2.4.10
|
182
184
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
185
|
requirements:
|
184
186
|
- - ">="
|