nxt_registry 0.3.3 → 0.3.9
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 +19 -0
- data/Gemfile.lock +19 -19
- data/README.md +69 -19
- data/lib/nxt_registry.rb +8 -7
- data/lib/nxt_registry/errors.rb +2 -0
- data/lib/nxt_registry/registry.rb +116 -58
- data/lib/nxt_registry/singleton.rb +15 -0
- data/lib/nxt_registry/version.rb +1 -1
- metadata +3 -3
- data/lib/nxt_registry/attribute.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d8d5b1247dfc045e077ccf9d79cf3ea010c9c56434133f8210f3b77af439d0d
|
4
|
+
data.tar.gz: 9bd0fc656681a64856f6f21996914ebdeca063ea7cd5585746c29840c4f9694e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c136e4279f1fe2907e43ff24f96a28bdec6cf3b095842831c6a1834b468d174e138a370ede137cd318f879c23579c5664a93c5820e7409b6985d4829f7905f30
|
7
|
+
data.tar.gz: 2793ac826854219b0e5017e84264ce3908b28c1c9148cddef1dd37dc70b761445ab07d7bd7185f5f2cd58a220cdc1bcb065f6fe49e359a1716922db85fe4532f
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
# v0.3.9 2021-03-10
|
2
|
+
|
3
|
+
- Synchronize access with Mutex
|
4
|
+
- Add key_resolver
|
5
|
+
- Fix: Inherit options set through accessors
|
6
|
+
|
7
|
+
# v0.3.5 2020-12-23
|
8
|
+
|
9
|
+
- Allow to inherit options in nested registries
|
10
|
+
|
11
|
+
# v0.3.5 2020-12-04
|
12
|
+
|
13
|
+
- Allow patterns as keys
|
14
|
+
|
15
|
+
# v0.3.4 2020-12-04
|
16
|
+
|
17
|
+
- Bring back Singleton
|
18
|
+
- Fix mistakes in readme
|
19
|
+
|
1
20
|
# v0.3.3 2020-11-24
|
2
21
|
|
3
22
|
- Fix: Pass key to resolver instead of value
|
data/Gemfile.lock
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
nxt_registry (0.3.
|
4
|
+
nxt_registry (0.3.9)
|
5
5
|
activesupport
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activesupport (6.
|
10
|
+
activesupport (6.1.3)
|
11
11
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
|
-
i18n (>=
|
13
|
-
minitest (
|
14
|
-
tzinfo (~>
|
15
|
-
zeitwerk (~> 2.
|
12
|
+
i18n (>= 1.6, < 2)
|
13
|
+
minitest (>= 5.1)
|
14
|
+
tzinfo (~> 2.0)
|
15
|
+
zeitwerk (~> 2.3)
|
16
16
|
coderay (1.1.3)
|
17
|
-
concurrent-ruby (1.1.
|
17
|
+
concurrent-ruby (1.1.8)
|
18
18
|
diff-lcs (1.4.4)
|
19
|
-
i18n (1.8.
|
19
|
+
i18n (1.8.9)
|
20
20
|
concurrent-ruby (~> 1.0)
|
21
21
|
method_source (1.0.0)
|
22
|
-
minitest (5.14.
|
23
|
-
pry (0.
|
22
|
+
minitest (5.14.4)
|
23
|
+
pry (0.14.0)
|
24
24
|
coderay (~> 1.1)
|
25
25
|
method_source (~> 1.0)
|
26
26
|
rake (12.3.3)
|
@@ -28,24 +28,24 @@ GEM
|
|
28
28
|
rspec-core (~> 3.10.0)
|
29
29
|
rspec-expectations (~> 3.10.0)
|
30
30
|
rspec-mocks (~> 3.10.0)
|
31
|
-
rspec-core (3.10.
|
31
|
+
rspec-core (3.10.1)
|
32
32
|
rspec-support (~> 3.10.0)
|
33
|
-
rspec-expectations (3.10.
|
33
|
+
rspec-expectations (3.10.1)
|
34
34
|
diff-lcs (>= 1.2.0, < 2.0)
|
35
35
|
rspec-support (~> 3.10.0)
|
36
|
-
rspec-mocks (3.10.
|
36
|
+
rspec-mocks (3.10.1)
|
37
37
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
38
|
rspec-support (~> 3.10.0)
|
39
|
-
rspec-support (3.10.
|
39
|
+
rspec-support (3.10.1)
|
40
40
|
rspec_junit_formatter (0.4.1)
|
41
41
|
rspec-core (>= 2, < 4, != 2.12.0)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
zeitwerk (2.4.1)
|
42
|
+
tzinfo (2.0.4)
|
43
|
+
concurrent-ruby (~> 1.0)
|
44
|
+
zeitwerk (2.4.2)
|
46
45
|
|
47
46
|
PLATFORMS
|
48
47
|
ruby
|
48
|
+
x86_64-darwin-19
|
49
49
|
|
50
50
|
DEPENDENCIES
|
51
51
|
bundler (~> 2.0)
|
@@ -56,4 +56,4 @@ DEPENDENCIES
|
|
56
56
|
rspec_junit_formatter
|
57
57
|
|
58
58
|
BUNDLED WITH
|
59
|
-
2.
|
59
|
+
2.2.4
|
data/README.md
CHANGED
@@ -2,8 +2,7 @@
|
|
2
2
|
|
3
3
|
# NxtRegistry
|
4
4
|
|
5
|
-
`NxtRegistry` is a simple
|
6
|
-
structures.
|
5
|
+
`NxtRegistry` is a simple container that allows you to register and resolve values in nested structures.
|
7
6
|
|
8
7
|
## Installation
|
9
8
|
|
@@ -27,24 +26,23 @@ Or install it yourself as:
|
|
27
26
|
|
28
27
|
## Instance Level
|
29
28
|
|
30
|
-
|
29
|
+
If you simply need a single global instance of a registry include `NxtRegistry::Singleton`:
|
31
30
|
|
32
31
|
```ruby
|
33
32
|
class Example
|
34
|
-
include NxtRegistry
|
33
|
+
include NxtRegistry::Singleton
|
35
34
|
|
36
|
-
registry
|
35
|
+
registry do
|
37
36
|
register(:ruby, 'Stone')
|
38
37
|
register(:python, 'Snake')
|
39
38
|
register(:javascript, 'undefined')
|
40
39
|
end
|
41
40
|
end
|
42
41
|
|
43
|
-
|
44
|
-
example.registry(:languages).resolve(:ruby) # => 'Stone'
|
42
|
+
Example.resolve(:ruby) # => 'Stone'
|
45
43
|
```
|
46
44
|
|
47
|
-
Alternatively you can
|
45
|
+
Alternatively you can simply create instances of `NxtRegistry::Registry`:
|
48
46
|
|
49
47
|
```ruby
|
50
48
|
registry = NxtRegistry::Registry.new do
|
@@ -59,7 +57,7 @@ registry.resolve(:aki) # => 'Aki'
|
|
59
57
|
|
60
58
|
## Class Level
|
61
59
|
|
62
|
-
You can add registries on the class level simply by extending your class with `NxtRegistry`
|
60
|
+
You can also add registries on the class level simply by extending your class with `NxtRegistry`
|
63
61
|
|
64
62
|
```ruby
|
65
63
|
class OtherExample
|
@@ -83,6 +81,30 @@ OtherExample.registry(:errors).resolve(KeyError)
|
|
83
81
|
OtherExample.registry(:country_codes).resolve(:germany)
|
84
82
|
# => :de
|
85
83
|
```
|
84
|
+
|
85
|
+
## Register Patterns
|
86
|
+
|
87
|
+
You can also register values with patterns as keys. Non pattern keys are always evaluated first and then patterns
|
88
|
+
will be tried to match by definition sequence.
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
class Example
|
92
|
+
extend NxtRegistry
|
93
|
+
|
94
|
+
registry :status_codes do
|
95
|
+
register(/\A4\d{2}\z/, 'Client errors')
|
96
|
+
register(/\A5.*\z/, 'Server errors')
|
97
|
+
register('422', 'Unprocessable Entity')
|
98
|
+
register(:'503', 'Internal Server Error')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
Example.registry(:status_codes).resolve('503') # => "Internal Server Error"
|
103
|
+
Example.registry(:status_codes).resolve(503) # => "Internal Server Error"
|
104
|
+
Example.registry(:status_codes).resolve(422) # => "Unprocessable Entity"
|
105
|
+
Example.registry(:status_codes).resolve(404) # => "Client Errors"
|
106
|
+
```
|
107
|
+
|
86
108
|
### Readers
|
87
109
|
|
88
110
|
Access your defined registries with the `registry(:country_code)` method.
|
@@ -112,6 +134,23 @@ Nested.registry(:developers).resolve(:frontend, :igor)
|
|
112
134
|
# => 'Igor'
|
113
135
|
```
|
114
136
|
|
137
|
+
#### Inherit options in nested registries
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
class Nested
|
141
|
+
extend NxtRegistry
|
142
|
+
|
143
|
+
registry :developers, default: 'options can be inherited' do
|
144
|
+
register(:frontend, inherit_options: true) do
|
145
|
+
register(:igor, 'Igor')
|
146
|
+
register(:ben, 'Ben')
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
Nested.registry(:developers).resolve(:frontend, :blank)
|
152
|
+
# => 'options can be inherited'
|
153
|
+
```
|
115
154
|
|
116
155
|
### Defining specific nesting levels of a registry
|
117
156
|
|
@@ -165,12 +204,21 @@ Layer.registry(:path).from(:munich).to(:amsterdam).via(:train) # => 'train'
|
|
165
204
|
|
166
205
|
*Note that this feature is also available for registries with a single level only.*
|
167
206
|
|
168
|
-
### Restrict
|
207
|
+
### Restrict keys to a certain set
|
169
208
|
|
170
|
-
Use `
|
209
|
+
Use `allowed_keys` to restrict which keys can be registered on a specific level.
|
171
210
|
|
172
211
|
```ruby
|
173
|
-
registry :example,
|
212
|
+
registry :example, allowed_keys: %w[one two three]
|
213
|
+
```
|
214
|
+
|
215
|
+
### Require a certain set of keys to be registered
|
216
|
+
|
217
|
+
Use `required_keys` to enforce a certain set of keys to be registered on a specific level. This is especially helpful
|
218
|
+
if you use registries in multiple places and you want to ensure they all register the same set of keys.
|
219
|
+
|
220
|
+
```ruby
|
221
|
+
registry :example, required_keys: %w[one two three]
|
174
222
|
```
|
175
223
|
|
176
224
|
### Default values
|
@@ -209,19 +257,21 @@ registry.resolve(:one)
|
|
209
257
|
# => 2020-01-02 23:56:18 +0100
|
210
258
|
```
|
211
259
|
|
212
|
-
###
|
260
|
+
### Resolve callbacks
|
213
261
|
|
214
|
-
You can
|
215
|
-
A
|
262
|
+
You can hook into the before and after resolver callbacks in case you need to lay hands on your values
|
263
|
+
before and / or after resolving. A callback can be anything that implements `:call` to which the value is passed.
|
216
264
|
|
217
265
|
```ruby
|
218
266
|
registry :example do
|
219
|
-
|
220
|
-
|
267
|
+
key_resolver ->(key) { key.strip }
|
268
|
+
resolver ->(value) { value.upcase }
|
269
|
+
|
270
|
+
register(:input, 'output')
|
221
271
|
end
|
222
272
|
|
223
|
-
registry.resolve(
|
224
|
-
# =>
|
273
|
+
registry.resolve(' input ')
|
274
|
+
# => 'OUTPUT'
|
225
275
|
```
|
226
276
|
|
227
277
|
### Transform keys
|
data/lib/nxt_registry.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
+
require 'active_support'
|
1
2
|
require 'active_support/core_ext'
|
2
3
|
require 'nxt_registry/version'
|
3
4
|
require 'nxt_registry/blank'
|
4
|
-
require 'nxt_registry/attribute'
|
5
5
|
require 'nxt_registry/errors'
|
6
6
|
require 'nxt_registry/registry_builder'
|
7
7
|
require 'nxt_registry/registry'
|
8
8
|
require 'nxt_registry/recursive_registry'
|
9
|
+
require 'nxt_registry/singleton'
|
9
10
|
|
10
11
|
module NxtRegistry
|
11
12
|
def registry(name, **options, &config)
|
@@ -19,17 +20,17 @@ module NxtRegistry
|
|
19
20
|
private
|
20
21
|
|
21
22
|
def build_registry(registry_class, name, **options, &config)
|
22
|
-
|
23
|
-
|
23
|
+
registry = registries.resolve(name)
|
24
|
+
|
25
|
+
if registry.present?
|
24
26
|
if registry.configured
|
25
|
-
registry
|
27
|
+
return registry
|
26
28
|
else
|
27
29
|
raise_unconfigured_registry_accessed(name)
|
28
30
|
end
|
29
31
|
else
|
30
32
|
registry = registry_class.new(name, **options, &config)
|
31
|
-
registries
|
32
|
-
registry
|
33
|
+
registries.register(name, registry)
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
@@ -38,6 +39,6 @@ module NxtRegistry
|
|
38
39
|
end
|
39
40
|
|
40
41
|
def registries
|
41
|
-
@registries ||=
|
42
|
+
@registries ||= Registry.new(:registries)
|
42
43
|
end
|
43
44
|
end
|
data/lib/nxt_registry/errors.rb
CHANGED
@@ -8,14 +8,15 @@ module NxtRegistry
|
|
8
8
|
@namespace = build_namespace
|
9
9
|
@config = config
|
10
10
|
@store = {}
|
11
|
-
@attrs = nil
|
12
11
|
@configured = false
|
12
|
+
@patterns = []
|
13
|
+
@config = config
|
14
|
+
@mutex = Mutex.new
|
13
15
|
|
14
|
-
setup_defaults(options)
|
15
16
|
configure(&config)
|
16
17
|
end
|
17
18
|
|
18
|
-
attr_reader :name
|
19
|
+
attr_reader :name, :mutex
|
19
20
|
attr_accessor :configured
|
20
21
|
|
21
22
|
def level(name, **options, &config)
|
@@ -38,27 +39,33 @@ module NxtRegistry
|
|
38
39
|
end
|
39
40
|
|
40
41
|
def registry(name, **options, &config)
|
41
|
-
opts = options
|
42
|
+
opts = conditionally_inherit_options(options)
|
42
43
|
register(name, Registry.new(name, **opts, &config))
|
43
44
|
end
|
44
45
|
|
45
46
|
def registry!(name, **options, &config)
|
46
|
-
opts = options
|
47
|
+
opts = conditionally_inherit_options(options)
|
47
48
|
register!(name, Registry.new(name, **opts, &config))
|
48
49
|
end
|
49
50
|
|
50
|
-
def
|
51
|
-
|
52
|
-
|
51
|
+
def required_keys(*keys)
|
52
|
+
@required_keys ||= []
|
53
|
+
return @required_keys if keys.empty?
|
54
|
+
|
55
|
+
@required_keys += keys.map { |key| transformed_key(key) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def allowed_keys(*keys)
|
59
|
+
@allowed_keys ||= []
|
60
|
+
return @allowed_keys if keys.empty?
|
53
61
|
|
54
|
-
|
62
|
+
@allowed_keys += keys.map { |key| transformed_key(key) }
|
55
63
|
end
|
56
64
|
|
57
|
-
|
58
|
-
@attrs ||= {}
|
59
|
-
return @attrs unless args.any?
|
65
|
+
alias attrs allowed_keys # @deprecated
|
60
66
|
|
61
|
-
|
67
|
+
def attr(key)
|
68
|
+
allowed_keys(key) # @deprecated
|
62
69
|
end
|
63
70
|
|
64
71
|
def register(key = Blank.new, value = Blank.new, **options, &block)
|
@@ -126,15 +133,18 @@ module NxtRegistry
|
|
126
133
|
end
|
127
134
|
|
128
135
|
def fetch(key, *args, &block)
|
129
|
-
|
136
|
+
key = matching_key(key)
|
137
|
+
store.fetch(key, *args, &block)
|
130
138
|
end
|
131
139
|
|
132
140
|
delegate :size, :values, :each, :freeze, to: :store
|
133
141
|
|
134
142
|
def configure(&block)
|
143
|
+
setup_defaults(options)
|
135
144
|
define_accessors
|
136
145
|
define_interface
|
137
|
-
|
146
|
+
allowed_keys(*Array(options.fetch(:allowed_keys, [])))
|
147
|
+
required_keys(*Array(options.fetch(:required_keys, [])))
|
138
148
|
|
139
149
|
if block.present?
|
140
150
|
if block.arity == 1
|
@@ -144,6 +154,7 @@ module NxtRegistry
|
|
144
154
|
end
|
145
155
|
end
|
146
156
|
|
157
|
+
validate_required_keys_given
|
147
158
|
self.configured = true
|
148
159
|
end
|
149
160
|
|
@@ -151,71 +162,110 @@ module NxtRegistry
|
|
151
162
|
"Registry[#{name}] -> #{store.to_s}"
|
152
163
|
end
|
153
164
|
|
154
|
-
|
165
|
+
alias inspect to_s
|
155
166
|
|
156
167
|
private
|
157
168
|
|
158
|
-
attr_reader :namespace, :parent, :config, :store, :options, :accessor
|
169
|
+
attr_reader :namespace, :parent, :config, :store, :options, :accessor, :patterns
|
159
170
|
attr_accessor :is_leaf, :interface_defined
|
160
171
|
|
172
|
+
def conditionally_inherit_options(opts)
|
173
|
+
base = opts.delete(:inherit_options) ? options : {}
|
174
|
+
base.merge(opts).merge(parent: self)
|
175
|
+
end
|
176
|
+
|
177
|
+
def validate_required_keys_given
|
178
|
+
required_keys.each do |key|
|
179
|
+
next if store.key?(key)
|
180
|
+
|
181
|
+
raise Errors::RequiredKeyMissing, "Required key '#{key}' missing in #{self}"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
161
185
|
def is_leaf?
|
162
186
|
@is_leaf
|
163
187
|
end
|
164
188
|
|
165
189
|
def __register(key, value, raise_on_key_already_registered: true)
|
166
|
-
|
190
|
+
mutex.synchronize do
|
191
|
+
key = if key.is_a?(Regexp)
|
192
|
+
patterns << key
|
193
|
+
key
|
194
|
+
else
|
195
|
+
transformed_key(key)
|
196
|
+
end
|
167
197
|
|
168
|
-
|
169
|
-
|
198
|
+
raise ArgumentError, "Not allowed to register values in a registry that contains nested registries" unless is_leaf
|
199
|
+
raise KeyError, "Keys are restricted to #{allowed_keys}" if key_not_allowed?(key)
|
170
200
|
|
171
|
-
|
201
|
+
on_key_already_registered && on_key_already_registered.call(key) if store[key] && raise_on_key_already_registered
|
172
202
|
|
173
|
-
|
203
|
+
store[key] = value
|
204
|
+
end
|
174
205
|
end
|
175
206
|
|
176
207
|
def __resolve(key, raise_on_key_not_registered: true)
|
177
|
-
|
208
|
+
mutex.synchronize do
|
209
|
+
key = transformed_key(key)
|
178
210
|
|
179
|
-
|
180
|
-
|
181
|
-
store.fetch(key)
|
182
|
-
else
|
183
|
-
if is_a_blank?(default)
|
184
|
-
return unless raise_on_key_not_registered
|
211
|
+
value = if is_leaf?
|
212
|
+
resolved_key = key_resolver.call(key)
|
185
213
|
|
186
|
-
|
214
|
+
if store.key?(resolved_key)
|
215
|
+
store.fetch(resolved_key)
|
216
|
+
elsif (pattern = matching_pattern(resolved_key))
|
217
|
+
store.fetch(pattern)
|
187
218
|
else
|
188
|
-
|
189
|
-
|
219
|
+
if is_a_blank?(default)
|
220
|
+
return unless raise_on_key_not_registered
|
221
|
+
|
222
|
+
on_key_not_registered && on_key_not_registered.call(key)
|
223
|
+
else
|
224
|
+
value = resolve_default(key)
|
225
|
+
return value unless memoize
|
190
226
|
|
191
|
-
|
227
|
+
store[key] ||= value
|
228
|
+
end
|
192
229
|
end
|
230
|
+
else
|
231
|
+
store[key] ||= default.call
|
193
232
|
end
|
194
|
-
else
|
195
|
-
store[key] ||= default.call
|
196
|
-
end
|
197
233
|
|
198
|
-
|
199
|
-
value.call(*[key].take(value.arity))
|
200
|
-
else
|
201
|
-
value
|
202
|
-
end
|
234
|
+
value = call_or_value(value, key)
|
203
235
|
|
204
|
-
if resolver
|
205
236
|
resolver.call(value)
|
206
|
-
else
|
207
|
-
value
|
208
237
|
end
|
209
238
|
end
|
210
239
|
|
240
|
+
def matching_key(key)
|
241
|
+
key = transformed_key(key)
|
242
|
+
# if key is present it always wins over patterns
|
243
|
+
return key if store.key?(key)
|
244
|
+
|
245
|
+
matching_pattern(key) || key
|
246
|
+
end
|
247
|
+
|
248
|
+
def call_or_value(value, key)
|
249
|
+
return value unless call
|
250
|
+
return value if value.is_a?(NxtRegistry::Registry)
|
251
|
+
return value unless value.respond_to?(:call)
|
252
|
+
|
253
|
+
args = [key, value]
|
254
|
+
value.call(*args.take(value.arity))
|
255
|
+
end
|
256
|
+
|
257
|
+
def matching_pattern(key)
|
258
|
+
patterns.find { |pattern| key.match?(pattern) }
|
259
|
+
end
|
260
|
+
|
211
261
|
def define_interface
|
212
262
|
return if interface_defined
|
213
263
|
|
214
|
-
raise_invalid_accessor_name(accessor) if respond_to?(accessor)
|
264
|
+
raise_invalid_accessor_name(accessor) if respond_to?(accessor.to_s)
|
215
265
|
accessor_with_bang = "#{accessor}!"
|
216
266
|
raise_invalid_accessor_name(accessor_with_bang) if respond_to?(accessor_with_bang)
|
217
267
|
|
218
|
-
define_singleton_method accessor do |key = Blank.new, value = Blank.new|
|
268
|
+
define_singleton_method accessor.to_s do |key = Blank.new, value = Blank.new|
|
219
269
|
return self if is_a_blank?(key)
|
220
270
|
|
221
271
|
key = transformed_key(key)
|
@@ -246,8 +296,9 @@ module NxtRegistry
|
|
246
296
|
@default = options.fetch(:default) { Blank.new }
|
247
297
|
@memoize = options.fetch(:memoize) { true }
|
248
298
|
@call = options.fetch(:call) { true }
|
249
|
-
@resolver = options.fetch(:resolver,
|
250
|
-
@
|
299
|
+
@resolver = options.fetch(:resolver, ->(val) { val })
|
300
|
+
@key_resolver = options.fetch(:key_resolver, ->(val) { val })
|
301
|
+
@transform_keys = options.fetch(:transform_keys) { ->(key) { key.is_a?(Regexp) ? key : key.to_s } }
|
251
302
|
@accessor = options.fetch(:accessor) { name }
|
252
303
|
|
253
304
|
@on_key_already_registered = options.fetch(:on_key_already_registered) { ->(key) { raise_key_already_registered_error(key) } }
|
@@ -255,27 +306,29 @@ module NxtRegistry
|
|
255
306
|
end
|
256
307
|
|
257
308
|
def define_accessors
|
258
|
-
%w[default memoize call resolver transform_keys on_key_already_registered on_key_not_registered].each do |attribute|
|
309
|
+
%w[default memoize call resolver key_resolver transform_keys on_key_already_registered on_key_not_registered].each do |attribute|
|
259
310
|
define_singleton_method attribute do |value = Blank.new, &block|
|
260
311
|
value = block if block
|
261
312
|
|
262
313
|
if is_a_blank?(value)
|
263
314
|
instance_variable_get("@#{attribute}")
|
264
315
|
else
|
316
|
+
options[attribute.to_sym] ||= value
|
265
317
|
instance_variable_set("@#{attribute}", value)
|
266
318
|
end
|
267
319
|
end
|
268
320
|
|
269
321
|
define_singleton_method "#{attribute}=" do |value|
|
322
|
+
options[attribute.to_sym] ||= value
|
270
323
|
instance_variable_set("@#{attribute}", value)
|
271
324
|
end
|
272
325
|
end
|
273
326
|
end
|
274
327
|
|
275
|
-
def
|
276
|
-
return if
|
328
|
+
def key_not_allowed?(key)
|
329
|
+
return if allowed_keys.empty?
|
277
330
|
|
278
|
-
|
331
|
+
allowed_keys.exclude?(transformed_key(key))
|
279
332
|
end
|
280
333
|
|
281
334
|
def resolve_default(key)
|
@@ -305,12 +358,6 @@ module NxtRegistry
|
|
305
358
|
end
|
306
359
|
end
|
307
360
|
|
308
|
-
def initialize_copy(original)
|
309
|
-
super
|
310
|
-
@store = original.send(:store).deep_dup
|
311
|
-
@options = original.send(:options).deep_dup
|
312
|
-
end
|
313
|
-
|
314
361
|
def build_namespace
|
315
362
|
parent ? name.to_s.prepend("#{parent.send(:namespace)}.") : name.to_s
|
316
363
|
end
|
@@ -326,5 +373,16 @@ module NxtRegistry
|
|
326
373
|
def raise_invalid_accessor_name(name)
|
327
374
|
raise ArgumentError, "#{self} already implements a method named: #{name}. Please choose a different accessor name"
|
328
375
|
end
|
376
|
+
|
377
|
+
def initialize_copy(original)
|
378
|
+
super
|
379
|
+
|
380
|
+
@mutex = Mutex.new
|
381
|
+
containers = %i[store options]
|
382
|
+
variables = %i[patterns required_keys allowed_keys namespace on_key_already_registered on_key_not_registered]
|
383
|
+
|
384
|
+
containers.each { |c| instance_variable_set("@#{c}", original.send(c).deep_dup) }
|
385
|
+
variables.each { |v| instance_variable_set("@#{v}", original.send(v).dup) }
|
386
|
+
end
|
329
387
|
end
|
330
388
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module NxtRegistry
|
2
|
+
module Singleton
|
3
|
+
include NxtRegistry
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.extend(self)
|
7
|
+
end
|
8
|
+
|
9
|
+
def registry(type = Registry, **options, &config)
|
10
|
+
@registry ||= build_registry(type, self.class.name, **options, &config)
|
11
|
+
end
|
12
|
+
|
13
|
+
delegate_missing_to :registry
|
14
|
+
end
|
15
|
+
end
|
data/lib/nxt_registry/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nxt_registry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Robecke
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: exe
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2021-03-10 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activesupport
|
@@ -106,12 +106,12 @@ files:
|
|
106
106
|
- bin/console
|
107
107
|
- bin/setup
|
108
108
|
- lib/nxt_registry.rb
|
109
|
-
- lib/nxt_registry/attribute.rb
|
110
109
|
- lib/nxt_registry/blank.rb
|
111
110
|
- lib/nxt_registry/errors.rb
|
112
111
|
- lib/nxt_registry/recursive_registry.rb
|
113
112
|
- lib/nxt_registry/registry.rb
|
114
113
|
- lib/nxt_registry/registry_builder.rb
|
114
|
+
- lib/nxt_registry/singleton.rb
|
115
115
|
- lib/nxt_registry/version.rb
|
116
116
|
- nxt_registry.gemspec
|
117
117
|
homepage: https://github.com/nxt-insurance
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module NxtRegistry
|
2
|
-
class Attribute
|
3
|
-
def initialize(name, registry, **options)
|
4
|
-
@name = name
|
5
|
-
@registry = registry
|
6
|
-
@namespace = [name, registry.send(:namespace)].join('.')
|
7
|
-
end
|
8
|
-
|
9
|
-
def eql?(other)
|
10
|
-
{ name => registry.object_id } == { other.send(:name) => other.send(:registry).object_id }
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
attr_reader :name, :registry
|
16
|
-
end
|
17
|
-
end
|