nxt_registry 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
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