smart_container 0.4.0 → 0.5.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/CHANGELOG.md +4 -0
- data/README.md +49 -0
- data/lib/smart_core/container/dependency_resolver.rb +70 -4
- data/lib/smart_core/container/version.rb +2 -2
- data/lib/smart_core/container.rb +28 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92746ed446b181dc165a597563edc69b62b41550974023342c4693f2c17dee6a
|
4
|
+
data.tar.gz: 1cf3862c40c1044510a11e09f19df542a8d0b3a255bd0df5593ad9c531b9f10b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec6db288f98f769d0bbe96dd4d35186d1a199f6e046edf1de83a50c4b76149366c94a7c172a005378be88c8e8503436b9dad7e2518bcbae1de939b2a37204600
|
7
|
+
data.tar.gz: 9124de765215847cb7bd135a19524043652b9f9d7580027106a43cc6fa8f61a3bfd22c982cf07b1f46ea196b6fdae978d0973682a9c24511eb679d7c310b33a7
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [0.5.0] - 2020-01-07
|
5
|
+
### Added
|
6
|
+
- Key predicates (`#key?(key)`, `#dependency?(path, memoized: nil/true/false)`, `#namespace?(path)`);
|
7
|
+
|
4
8
|
## [0.4.0] - 2020-01-06
|
5
9
|
### Added
|
6
10
|
- `#keys(all_variants: false)` - return a list of dependency keys
|
data/README.md
CHANGED
@@ -70,6 +70,19 @@ container.fetch('database') # => SmartCore::Container (nested container)
|
|
70
70
|
container.fetch('database.resolver') # => #<SomeDatabaseResolver:0x00007f0f0f1d6332>
|
71
71
|
```
|
72
72
|
|
73
|
+
- runtime-level dependency/namespace registration:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
container.namespace(:api) do
|
77
|
+
register(:provider) { GoogleProvider }
|
78
|
+
end
|
79
|
+
|
80
|
+
container.register('game_api') { 'overwatch' }
|
81
|
+
|
82
|
+
container['api.provider'] # => GoogleProvider
|
83
|
+
container['game_api'] # => 'overwatch'
|
84
|
+
```
|
85
|
+
|
73
86
|
- container keys (dependency names):
|
74
87
|
|
75
88
|
```ruby
|
@@ -99,6 +112,42 @@ container.keys(all_variants: true)
|
|
99
112
|
]
|
100
113
|
```
|
101
114
|
|
115
|
+
- key predicates:
|
116
|
+
- `key?(key)` - has dependency or namespace?
|
117
|
+
- `namespace?(path)` - has namespace?
|
118
|
+
- `dependency?(path)` - has dependency?
|
119
|
+
- `dependency?(path, memoized: true)` - has memoized dependency?
|
120
|
+
- `dependency?(path, memoized: false)` - has non-memoized dependency?
|
121
|
+
|
122
|
+
```ruby
|
123
|
+
container.key?('database') # => true
|
124
|
+
container.key?('database.cache.memcached') # => true
|
125
|
+
|
126
|
+
container.dependency?('database') # => false
|
127
|
+
container.dependency?('database.resolver') # => true
|
128
|
+
|
129
|
+
container.namespace?('database') # => true
|
130
|
+
container.namespace?('database.resolver') # => false
|
131
|
+
|
132
|
+
container.dependency?('database.resolver', memoized: true) # => true
|
133
|
+
container.dependency?('database.resolver', memoized: false) # => false
|
134
|
+
|
135
|
+
container.dependency?('random', memoized: true) # => false
|
136
|
+
container.dependency?('random', memoized: false) # => true
|
137
|
+
```
|
138
|
+
|
139
|
+
- state freeze:
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
# documentation is coming;
|
143
|
+
```
|
144
|
+
|
145
|
+
- reloading:
|
146
|
+
|
147
|
+
```ruby
|
148
|
+
# documentation is coming;
|
149
|
+
```
|
150
|
+
|
102
151
|
---
|
103
152
|
|
104
153
|
## Contributing
|
@@ -26,6 +26,54 @@ module SmartCore::Container::DependencyResolver
|
|
26
26
|
container.registry.resolve(dependency_path).reveal
|
27
27
|
end
|
28
28
|
|
29
|
+
# @param container [SmartCore::Container]
|
30
|
+
# @param key [String, Symbol]
|
31
|
+
# @return [Boolean]
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
# @since 0.5.0
|
35
|
+
def key?(container, key)
|
36
|
+
extract(container, key)
|
37
|
+
true
|
38
|
+
rescue SmartCore::Container::ResolvingError
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
# @param container [SmartCore::Container]
|
43
|
+
# @param namespace_path [String, Symbol]
|
44
|
+
# @return [Boolean]
|
45
|
+
#
|
46
|
+
# @api private
|
47
|
+
# @since 0.5.0
|
48
|
+
def namespace?(container, namespace_path)
|
49
|
+
extract(container, namespace_path).is_a?(SmartCore::Container::Entities::Namespace)
|
50
|
+
rescue SmartCore::Container::ResolvingError
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
# @param container [SmartCore::Container]
|
55
|
+
# @param dependency_path [String, Symbol]
|
56
|
+
# @option memoized [NilClass, Boolean]
|
57
|
+
# @return [Boolean]
|
58
|
+
#
|
59
|
+
# @api private
|
60
|
+
# @since 0.5.0
|
61
|
+
def dependency?(container, dependency_path, memoized: nil)
|
62
|
+
entity = extract(container, dependency_path)
|
63
|
+
|
64
|
+
case
|
65
|
+
when memoized.nil?
|
66
|
+
entity.is_a?(SmartCore::Container::Entities::Dependency)
|
67
|
+
when !!memoized == true
|
68
|
+
entity.is_a?(SmartCore::Container::Entities::MemoizedDependency)
|
69
|
+
when !!memoized == false
|
70
|
+
entity.is_a?(SmartCore::Container::Entities::Dependency) &&
|
71
|
+
!entity.is_a?(SmartCore::Container::Entities::MemoizedDependency)
|
72
|
+
end
|
73
|
+
rescue SmartCore::Container::ResolvingError
|
74
|
+
false
|
75
|
+
end
|
76
|
+
|
29
77
|
# @param container [SmartCore::Container]
|
30
78
|
# @param dependency_path [String, Symbol]
|
31
79
|
# @return [SmartCore::Container, Any]
|
@@ -38,12 +86,11 @@ module SmartCore::Container::DependencyResolver
|
|
38
86
|
#
|
39
87
|
# @api private
|
40
88
|
# @since 0.1.0
|
41
|
-
# @version 0.1.0
|
42
89
|
def resolve(container, dependency_path)
|
43
90
|
entity = container
|
44
91
|
Route.build(dependency_path).each do |cursor|
|
45
92
|
entity = entity.registry.resolve(cursor.current_path)
|
46
|
-
|
93
|
+
prevent_ambiguous_resolving!(cursor, entity)
|
47
94
|
entity = entity.reveal
|
48
95
|
end
|
49
96
|
entity
|
@@ -53,6 +100,25 @@ module SmartCore::Container::DependencyResolver
|
|
53
100
|
|
54
101
|
private
|
55
102
|
|
103
|
+
# @param container [SmartCore::Container]
|
104
|
+
# @param entity_path [String, Symbol]
|
105
|
+
# @return [SmartCore::Container::Entities::Base]
|
106
|
+
#
|
107
|
+
# @api private
|
108
|
+
# @since 0.5.0
|
109
|
+
def extract(container, entity_path)
|
110
|
+
resolved_entity = container
|
111
|
+
extracted_entity = container
|
112
|
+
|
113
|
+
Route.build(entity_path).each do |cursor|
|
114
|
+
resolved_entity = resolved_entity.registry.resolve(cursor.current_path)
|
115
|
+
extracted_entity = resolved_entity
|
116
|
+
resolved_entity = resolved_entity.reveal
|
117
|
+
end
|
118
|
+
|
119
|
+
extracted_entity
|
120
|
+
end
|
121
|
+
|
56
122
|
# @param cursor [SmartCore::Container::DependencyResolver::Route::Cursor]
|
57
123
|
# @param entity [SmartCore::Container::Entities::Base]
|
58
124
|
# @return [void]
|
@@ -60,8 +126,8 @@ module SmartCore::Container::DependencyResolver
|
|
60
126
|
# @raise [SmartCore::Container::ResolvingError]
|
61
127
|
#
|
62
128
|
# @api private
|
63
|
-
# @since 0.
|
64
|
-
def
|
129
|
+
# @since 0.5.0
|
130
|
+
def prevent_ambiguous_resolving!(cursor, entity)
|
65
131
|
if cursor.last? && entity.is_a?(SmartCore::Container::Entities::Namespace)
|
66
132
|
raise(
|
67
133
|
SmartCore::Container::ResolvingError.new(
|
data/lib/smart_core/container.rb
CHANGED
@@ -114,6 +114,34 @@ module SmartCore
|
|
114
114
|
thread_safe { registry.keys(all_variants: all_variants) }
|
115
115
|
end
|
116
116
|
|
117
|
+
# @param key [String, Symbol]
|
118
|
+
# @return [Boolean]
|
119
|
+
#
|
120
|
+
# @api public
|
121
|
+
# @since 0.5.0
|
122
|
+
def key?(key)
|
123
|
+
thread_safe { DependencyResolver.key?(self, key) }
|
124
|
+
end
|
125
|
+
|
126
|
+
# @param namespace_path [String, Symbol]
|
127
|
+
# @return [Boolean]
|
128
|
+
#
|
129
|
+
# @api public
|
130
|
+
# @since 0.5.0
|
131
|
+
def namespace?(namespace_path)
|
132
|
+
thread_safe { DependencyResolver.namespace?(self, namespace_path) }
|
133
|
+
end
|
134
|
+
|
135
|
+
# @param dependency_path [String, Symbol]
|
136
|
+
# @option memoized [NilClass, Boolean]
|
137
|
+
# @return [Boolean]
|
138
|
+
#
|
139
|
+
# @api public
|
140
|
+
# @since 0.5.0
|
141
|
+
def dependency?(dependency_path, memoized: nil)
|
142
|
+
thread_safe { DependencyResolver.dependency?(self, dependency_path, memoized: memoized) }
|
143
|
+
end
|
144
|
+
|
117
145
|
# @option yield_all [Boolean]
|
118
146
|
# @param block [Block]
|
119
147
|
# @yield [dependency_name, dependency_value]
|
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.5.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-01-
|
11
|
+
date: 2020-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: smart_engine
|