nxt_registry 0.3.4 → 0.3.5

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: b3c4dec7379f1076565a8fa2306e9aba2bfbd12f1191648929635db61a7b4a94
4
- data.tar.gz: '081a471bb51c5e53089ee8341f439b8b70bdb22bb45c24add42673210ecacd0c'
3
+ metadata.gz: e3c1e56b8913dea9833ea5fac4b1b837389de5df7aa269f3b2f04977f2ddceb3
4
+ data.tar.gz: 782bcb6ecce2753f77b488c29806bf1b2127714fe82aeed8ab2564297a43b95b
5
5
  SHA512:
6
- metadata.gz: 7913f84e7bfea3f58efd487eb9bbdc34c988fb3297101aa52525e530c8a6bec5b2d5bc6dfc81bd188f4145c99a74dbbb65b556b6acf847b16df529a65b612999
7
- data.tar.gz: 59fe97c3fe3bbc653bd63f6e7bd835d08189136fc328d9ce0fa62e8199dcc311fa152d2d0ebedb1b7a580b3ef20a6253dfbb02c605a700f88a42076bd57935be
6
+ metadata.gz: 1e512d832f3d40ae60ffcfad8578589138c1f00479c2d2dab797c7e9faa6a37cec77da419d671715af55629e0efeac09ef5761bf39afcafe077c0d6f6af740a0
7
+ data.tar.gz: 3f17bfcc73233107e2daa4db54905115aea50e6f926b8e7ed10aea6d098ff418a4f39ced0e688b02a0a207e0562f02274bdfd9f59d568734485454afe7e1f06d
@@ -1,3 +1,7 @@
1
+ # v0.3.5 2020-12-04
2
+
3
+ - Allow patterns as keys
4
+
1
5
  # v0.3.4 2020-12-04
2
6
 
3
7
  - Bring back Singleton
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nxt_registry (0.3.4)
4
+ nxt_registry (0.3.5)
5
5
  activesupport
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -82,6 +82,30 @@ OtherExample.registry(:errors).resolve(KeyError)
82
82
  OtherExample.registry(:country_codes).resolve(:germany)
83
83
  # => :de
84
84
  ```
85
+
86
+ ## Register Patterns
87
+
88
+ You can also register values with patterns as keys. Non pattern keys are always evaluated first and then patterns
89
+ will be tried to match by definition sequence.
90
+
91
+ ```ruby
92
+ class Example
93
+ extend NxtRegistry
94
+
95
+ registry :status_codes do
96
+ register(/\A4\d{2}\z/, 'Client errors')
97
+ register(/\A5.*\z/, 'Server errors')
98
+ register('422', 'Unprocessable Entity')
99
+ register(:'503', 'Internal Server Error')
100
+ end
101
+ end
102
+
103
+ Example.registry(:status_codes).resolve('503') # => "Internal Server Error"
104
+ Example.registry(:status_codes).resolve(503) # => "Internal Server Error"
105
+ Example.registry(:status_codes).resolve(422) # => "Unprocessable Entity"
106
+ Example.registry(:status_codes).resolve(404) # => "Client Errors"
107
+ ```
108
+
85
109
  ### Readers
86
110
 
87
111
  Access your defined registries with the `registry(:country_code)` method.
@@ -10,6 +10,7 @@ module NxtRegistry
10
10
  @store = {}
11
11
  @attrs = nil
12
12
  @configured = false
13
+ @patterns = []
13
14
 
14
15
  setup_defaults(options)
15
16
  configure(&config)
@@ -126,7 +127,8 @@ module NxtRegistry
126
127
  end
127
128
 
128
129
  def fetch(key, *args, &block)
129
- store.fetch(transformed_key(key), *args, &block)
130
+ key = matching_key(key)
131
+ store.fetch(key, *args, &block)
130
132
  end
131
133
 
132
134
  delegate :size, :values, :each, :freeze, to: :store
@@ -155,7 +157,7 @@ module NxtRegistry
155
157
 
156
158
  private
157
159
 
158
- attr_reader :namespace, :parent, :config, :store, :options, :accessor
160
+ attr_reader :namespace, :parent, :config, :store, :options, :accessor, :patterns
159
161
  attr_accessor :is_leaf, :interface_defined
160
162
 
161
163
  def is_leaf?
@@ -163,7 +165,12 @@ module NxtRegistry
163
165
  end
164
166
 
165
167
  def __register(key, value, raise_on_key_already_registered: true)
166
- key = transformed_key(key)
168
+ key = if key.is_a?(Regexp)
169
+ patterns << key
170
+ key
171
+ else
172
+ transformed_key(key)
173
+ end
167
174
 
168
175
  raise ArgumentError, "Not allowed to register values in a registry that contains nested registries" unless is_leaf
169
176
  raise KeyError, "Keys are restricted to #{attrs.keys}" if attribute_not_allowed?(key)
@@ -179,6 +186,8 @@ module NxtRegistry
179
186
  value = if is_leaf?
180
187
  if store.key?(key)
181
188
  store.fetch(key)
189
+ elsif (pattern = matching_pattern(key))
190
+ store.fetch(pattern)
182
191
  else
183
192
  if is_a_blank?(default)
184
193
  return unless raise_on_key_not_registered
@@ -195,11 +204,7 @@ module NxtRegistry
195
204
  store[key] ||= default.call
196
205
  end
197
206
 
198
- value = if value.respond_to?(:call) && call && !value.is_a?(NxtRegistry::Registry)
199
- value.call(*[key].take(value.arity))
200
- else
201
- value
202
- end
207
+ value = call_or_value(value, key)
203
208
 
204
209
  if resolver
205
210
  resolver.call(value)
@@ -208,14 +213,35 @@ module NxtRegistry
208
213
  end
209
214
  end
210
215
 
216
+ def matching_key(key)
217
+ key = transformed_key(key)
218
+ # if key is present it always wins over patterns
219
+ return key if store.key?(key)
220
+
221
+ matching_pattern(key) || key
222
+ end
223
+
224
+ def call_or_value(value, key)
225
+ return value unless call
226
+ return value if value.is_a?(NxtRegistry::Registry)
227
+ return value unless value.respond_to?(:call)
228
+
229
+ args = [key, value]
230
+ value.call(*args.take(value.arity))
231
+ end
232
+
233
+ def matching_pattern(key)
234
+ patterns.find { |pattern| key.match?(pattern) }
235
+ end
236
+
211
237
  def define_interface
212
238
  return if interface_defined
213
239
 
214
- raise_invalid_accessor_name(accessor) if respond_to?(accessor)
240
+ raise_invalid_accessor_name(accessor) if respond_to?(accessor.to_s)
215
241
  accessor_with_bang = "#{accessor}!"
216
242
  raise_invalid_accessor_name(accessor_with_bang) if respond_to?(accessor_with_bang)
217
243
 
218
- define_singleton_method accessor do |key = Blank.new, value = Blank.new|
244
+ define_singleton_method accessor.to_s do |key = Blank.new, value = Blank.new|
219
245
  return self if is_a_blank?(key)
220
246
 
221
247
  key = transformed_key(key)
@@ -247,7 +273,7 @@ module NxtRegistry
247
273
  @memoize = options.fetch(:memoize) { true }
248
274
  @call = options.fetch(:call) { true }
249
275
  @resolver = options.fetch(:resolver, false)
250
- @transform_keys = options.fetch(:transform_keys) { ->(key) { key.to_s } }
276
+ @transform_keys = options.fetch(:transform_keys) { ->(key) { key.is_a?(Regexp) ? key : key.to_s } }
251
277
  @accessor = options.fetch(:accessor) { name }
252
278
 
253
279
  @on_key_already_registered = options.fetch(:on_key_already_registered) { ->(key) { raise_key_already_registered_error(key) } }
@@ -309,6 +335,7 @@ module NxtRegistry
309
335
  super
310
336
  @store = original.send(:store).deep_dup
311
337
  @options = original.send(:options).deep_dup
338
+ @patterns = original.send(:patterns).dup
312
339
  end
313
340
 
314
341
  def build_namespace
@@ -1,3 +1,3 @@
1
1
  module NxtRegistry
2
- VERSION = "0.3.4"
2
+ VERSION = "0.3.5"
3
3
  end
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
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Robecke