nxt_registry 0.3.1 → 0.3.6

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: 121af631fa49f89d2b47599adcf3122401409299f65d755f7ba3cb418734cdf4
4
- data.tar.gz: e6d94a93edf4bb250186242e5892f0dcda7df9c71c23be5a4b8ddca5420eed0d
3
+ metadata.gz: f951682f16517cd63a1424d95c52f0db75271bebc61c7fe2cde5a72821f3381e
4
+ data.tar.gz: 1fd0496e6736a35e2a489c8791b9dfbf932fb5ba08c99d9213b908748b2a67e3
5
5
  SHA512:
6
- metadata.gz: b0601a25a8325fe3fb21f2cfdf25e8710c3b219c135999fea2bc0bc325713bf3f20f321f4aadbdffcc50f4d03557c0fc4ba1008d52efe69e3f38400e4dfdf0b9
7
- data.tar.gz: 770c75ffca22aa1c7de4af1de955abf2044d9dca121b566e277f5d0fd637e41bc58231ae1edfd38a11af69279c05928f001e98561edae77edd060499bcf9bdf4
6
+ metadata.gz: 30d0f4d39292e592b6622d4f670a004ba5a801730b2e21f03bad0214615076ac5bba6d40b9849f1413f22c5463336e371f79bb60f74df40d19bdcdded743b8d5
7
+ data.tar.gz: 29ba8e6fd7cae939e5e3ac171b5810153867c0a2c3da15f709d63ca536c3f90beff8c1e62cb5d29da7560152d55c73316b0e6921afe0b96ec7a06630163947ad
@@ -1,3 +1,24 @@
1
+ # v0.3.5 2020-12-23
2
+
3
+ - Allow to inherit options in nested registries
4
+
5
+ # v0.3.5 2020-12-04
6
+
7
+ - Allow patterns as keys
8
+
9
+ # v0.3.4 2020-12-04
10
+
11
+ - Bring back Singleton
12
+ - Fix mistakes in readme
13
+
14
+ # v0.3.3 2020-11-24
15
+
16
+ - Fix: Pass key to resolver instead of value
17
+
18
+ # v0.3.2 2020-09-29
19
+
20
+ - Fix interface definition
21
+
1
22
  # v0.3.1 2020-09-23
2
23
 
3
24
  - Allow to define custom accessors for registries
@@ -1,18 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nxt_registry (0.3.1)
4
+ nxt_registry (0.3.6)
5
5
  activesupport
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activesupport (6.0.3.3)
10
+ activesupport (6.1.0)
11
11
  concurrent-ruby (~> 1.0, >= 1.0.2)
12
- i18n (>= 0.7, < 2)
13
- minitest (~> 5.1)
14
- tzinfo (~> 1.1)
15
- zeitwerk (~> 2.2, >= 2.2.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
17
  concurrent-ruby (1.1.7)
18
18
  diff-lcs (1.4.4)
@@ -24,28 +24,28 @@ GEM
24
24
  coderay (~> 1.1)
25
25
  method_source (~> 1.0)
26
26
  rake (12.3.3)
27
- rspec (3.9.0)
28
- rspec-core (~> 3.9.0)
29
- rspec-expectations (~> 3.9.0)
30
- rspec-mocks (~> 3.9.0)
31
- rspec-core (3.9.2)
32
- rspec-support (~> 3.9.3)
33
- rspec-expectations (3.9.2)
27
+ rspec (3.10.0)
28
+ rspec-core (~> 3.10.0)
29
+ rspec-expectations (~> 3.10.0)
30
+ rspec-mocks (~> 3.10.0)
31
+ rspec-core (3.10.0)
32
+ rspec-support (~> 3.10.0)
33
+ rspec-expectations (3.10.0)
34
34
  diff-lcs (>= 1.2.0, < 2.0)
35
- rspec-support (~> 3.9.0)
36
- rspec-mocks (3.9.1)
35
+ rspec-support (~> 3.10.0)
36
+ rspec-mocks (3.10.0)
37
37
  diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.9.0)
39
- rspec-support (3.9.3)
38
+ rspec-support (~> 3.10.0)
39
+ rspec-support (3.10.0)
40
40
  rspec_junit_formatter (0.4.1)
41
41
  rspec-core (>= 2, < 4, != 2.12.0)
42
- thread_safe (0.3.6)
43
- tzinfo (1.2.7)
44
- thread_safe (~> 0.1)
45
- zeitwerk (2.4.0)
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.1.4
59
+ 2.2.0
data/README.md CHANGED
@@ -27,24 +27,23 @@ Or install it yourself as:
27
27
 
28
28
  ## Instance Level
29
29
 
30
- To use `NxtRegistry` on an instance level simply include it and build registries like so:
30
+ If you simply need a single global instance of a registry include `NxtRegistry::Singleton`:
31
31
 
32
32
  ```ruby
33
33
  class Example
34
- include NxtRegistry
34
+ include NxtRegistry::Singleton
35
35
 
36
- registry :languages do
36
+ registry do
37
37
  register(:ruby, 'Stone')
38
38
  register(:python, 'Snake')
39
39
  register(:javascript, 'undefined')
40
40
  end
41
41
  end
42
42
 
43
- example = Example.new
44
- example.registry(:languages).resolve(:ruby) # => 'Stone'
43
+ Example.resolve(:ruby) # => 'Stone'
45
44
  ```
46
45
 
47
- Alternatively you can also create instances of `NxtRegistry::Registry`
46
+ Alternatively you can simply create instances of `NxtRegistry::Registry`:
48
47
 
49
48
  ```ruby
50
49
  registry = NxtRegistry::Registry.new do
@@ -59,7 +58,7 @@ registry.resolve(:aki) # => 'Aki'
59
58
 
60
59
  ## Class Level
61
60
 
62
- You can add registries on the class level simply by extending your class with `NxtRegistry`
61
+ You can also add registries on the class level simply by extending your class with `NxtRegistry`
63
62
 
64
63
  ```ruby
65
64
  class OtherExample
@@ -83,6 +82,30 @@ OtherExample.registry(:errors).resolve(KeyError)
83
82
  OtherExample.registry(:country_codes).resolve(:germany)
84
83
  # => :de
85
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
+
86
109
  ### Readers
87
110
 
88
111
  Access your defined registries with the `registry(:country_code)` method.
@@ -112,6 +135,23 @@ Nested.registry(:developers).resolve(:frontend, :igor)
112
135
  # => 'Igor'
113
136
  ```
114
137
 
138
+ #### Inherit options in nested registries
139
+
140
+ ```ruby
141
+ class Nested
142
+ extend NxtRegistry
143
+
144
+ registry :developers, default: 'options can be inherited' do
145
+ register(:frontend, inherit_options: true) do
146
+ register(:igor, 'Igor')
147
+ register(:ben, 'Ben')
148
+ end
149
+ end
150
+ end
151
+
152
+ Nested.registry(:developers).resolve(:frontend, :blank)
153
+ # => 'options can be inherited'
154
+ ```
115
155
 
116
156
  ### Defining specific nesting levels of a registry
117
157
 
@@ -1,3 +1,4 @@
1
+ require 'active_support'
1
2
  require 'active_support/core_ext'
2
3
  require 'nxt_registry/version'
3
4
  require 'nxt_registry/blank'
@@ -6,6 +7,7 @@ require 'nxt_registry/errors'
6
7
  require 'nxt_registry/registry_builder'
7
8
  require 'nxt_registry/registry'
8
9
  require 'nxt_registry/recursive_registry'
10
+ require 'nxt_registry/singleton'
9
11
 
10
12
  module NxtRegistry
11
13
  def registry(name, **options, &config)
@@ -19,17 +21,17 @@ module NxtRegistry
19
21
  private
20
22
 
21
23
  def build_registry(registry_class, name, **options, &config)
22
- if registries.key?(name)
23
- registry = registries.fetch(name)
24
+ registry = registries.resolve(name)
25
+
26
+ if registry.present?
24
27
  if registry.configured
25
- registry
28
+ return registry
26
29
  else
27
30
  raise_unconfigured_registry_accessed(name)
28
31
  end
29
32
  else
30
33
  registry = registry_class.new(name, **options, &config)
31
- registries[name] ||= registry
32
- registry
34
+ registries.register(name, registry)
33
35
  end
34
36
  end
35
37
 
@@ -38,6 +40,6 @@ module NxtRegistry
38
40
  end
39
41
 
40
42
  def registries
41
- @registries ||= {}
43
+ @registries ||= Registry.new(:registries)
42
44
  end
43
45
  end
@@ -10,9 +10,10 @@ module NxtRegistry
10
10
  @store = {}
11
11
  @attrs = nil
12
12
  @configured = false
13
+ @patterns = []
13
14
 
14
15
  setup_defaults(options)
15
- configure(&config) if block_given? || parent
16
+ configure(&config)
16
17
  end
17
18
 
18
19
  attr_reader :name
@@ -38,12 +39,12 @@ module NxtRegistry
38
39
  end
39
40
 
40
41
  def registry(name, **options, &config)
41
- opts = options.merge(parent: self)
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.merge(parent: self)
47
+ opts = conditionally_inherit_options(options)
47
48
  register!(name, Registry.new(name, **opts, &config))
48
49
  end
49
50
 
@@ -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,15 +157,25 @@ module NxtRegistry
155
157
 
156
158
  private
157
159
 
158
- attr_reader :namespace, :parent, :config, :store, :options, :accessor
159
- attr_accessor :is_leaf
160
+ attr_reader :namespace, :parent, :config, :store, :options, :accessor, :patterns
161
+ attr_accessor :is_leaf, :interface_defined
162
+
163
+ def conditionally_inherit_options(opts)
164
+ base = opts.delete(:inherit_options) ? options : {}
165
+ base.merge(opts).merge(parent: self)
166
+ end
160
167
 
161
168
  def is_leaf?
162
169
  @is_leaf
163
170
  end
164
171
 
165
172
  def __register(key, value, raise_on_key_already_registered: true)
166
- key = transformed_key(key)
173
+ key = if key.is_a?(Regexp)
174
+ patterns << key
175
+ key
176
+ else
177
+ transformed_key(key)
178
+ end
167
179
 
168
180
  raise ArgumentError, "Not allowed to register values in a registry that contains nested registries" unless is_leaf
169
181
  raise KeyError, "Keys are restricted to #{attrs.keys}" if attribute_not_allowed?(key)
@@ -179,6 +191,8 @@ module NxtRegistry
179
191
  value = if is_leaf?
180
192
  if store.key?(key)
181
193
  store.fetch(key)
194
+ elsif (pattern = matching_pattern(key))
195
+ store.fetch(pattern)
182
196
  else
183
197
  if is_a_blank?(default)
184
198
  return unless raise_on_key_not_registered
@@ -195,11 +209,7 @@ module NxtRegistry
195
209
  store[key] ||= default.call
196
210
  end
197
211
 
198
- value = if value.respond_to?(:call) && call && !value.is_a?(NxtRegistry::Registry)
199
- value.call(*[value].take(value.arity))
200
- else
201
- value
202
- end
212
+ value = call_or_value(value, key)
203
213
 
204
214
  if resolver
205
215
  resolver.call(value)
@@ -208,12 +218,35 @@ module NxtRegistry
208
218
  end
209
219
  end
210
220
 
221
+ def matching_key(key)
222
+ key = transformed_key(key)
223
+ # if key is present it always wins over patterns
224
+ return key if store.key?(key)
225
+
226
+ matching_pattern(key) || key
227
+ end
228
+
229
+ def call_or_value(value, key)
230
+ return value unless call
231
+ return value if value.is_a?(NxtRegistry::Registry)
232
+ return value unless value.respond_to?(:call)
233
+
234
+ args = [key, value]
235
+ value.call(*args.take(value.arity))
236
+ end
237
+
238
+ def matching_pattern(key)
239
+ patterns.find { |pattern| key.match?(pattern) }
240
+ end
241
+
211
242
  def define_interface
212
- raise_invalid_accessor_name(accessor) if respond_to?(accessor)
243
+ return if interface_defined
244
+
245
+ raise_invalid_accessor_name(accessor) if respond_to?(accessor.to_s)
213
246
  accessor_with_bang = "#{accessor}!"
214
247
  raise_invalid_accessor_name(accessor_with_bang) if respond_to?(accessor_with_bang)
215
248
 
216
- define_singleton_method accessor do |key = Blank.new, value = Blank.new|
249
+ define_singleton_method accessor.to_s do |key = Blank.new, value = Blank.new|
217
250
  return self if is_a_blank?(key)
218
251
 
219
252
  key = transformed_key(key)
@@ -236,6 +269,8 @@ module NxtRegistry
236
269
  register!(key, value)
237
270
  end
238
271
  end
272
+
273
+ self.interface_defined = true
239
274
  end
240
275
 
241
276
  def setup_defaults(options)
@@ -243,7 +278,7 @@ module NxtRegistry
243
278
  @memoize = options.fetch(:memoize) { true }
244
279
  @call = options.fetch(:call) { true }
245
280
  @resolver = options.fetch(:resolver, false)
246
- @transform_keys = options.fetch(:transform_keys) { ->(key) { key.to_s } }
281
+ @transform_keys = options.fetch(:transform_keys) { ->(key) { key.is_a?(Regexp) ? key : key.to_s } }
247
282
  @accessor = options.fetch(:accessor) { name }
248
283
 
249
284
  @on_key_already_registered = options.fetch(:on_key_already_registered) { ->(key) { raise_key_already_registered_error(key) } }
@@ -305,6 +340,7 @@ module NxtRegistry
305
340
  super
306
341
  @store = original.send(:store).deep_dup
307
342
  @options = original.send(:options).deep_dup
343
+ @patterns = original.send(:patterns).dup
308
344
  end
309
345
 
310
346
  def build_namespace
@@ -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
@@ -1,3 +1,3 @@
1
1
  module NxtRegistry
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.6"
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.1
4
+ version: 0.3.6
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: 2020-09-25 00:00:00.000000000 Z
14
+ date: 2020-12-23 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport
@@ -112,6 +112,7 @@ files:
112
112
  - lib/nxt_registry/recursive_registry.rb
113
113
  - lib/nxt_registry/registry.rb
114
114
  - lib/nxt_registry/registry_builder.rb
115
+ - lib/nxt_registry/singleton.rb
115
116
  - lib/nxt_registry/version.rb
116
117
  - nxt_registry.gemspec
117
118
  homepage: https://github.com/nxt-insurance