nxt_registry 0.1.2 → 0.1.3
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/Gemfile.lock +1 -1
- data/README.md +123 -45
- data/lib/nxt_registry/registry.rb +8 -1
- data/lib/nxt_registry/version.rb +1 -1
- 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: a68b0acda862ba1abd86c05b6965258563e4c091bd0ae49012f92d5833ba1416
|
4
|
+
data.tar.gz: b6d55555232b4fc6fbbd842d538f0732fe5232369be6724525d6723465d6776b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25799005260cfb9bbda4264200c0cc1ea80e6fde0f7671048413f8835d1035f4fa27179a0ec047ca5d555600ec7f0d82cc9ee15a58934159d8b382896300e6af
|
7
|
+
data.tar.gz: 994fda385124d529b3edc72bfd4c2e2a2186e8e79918b0e1029f0f7ed20bc921024d30f60c0d4df6cc8227fe6738a31a049dc1ff29ad814c1b71a9ba9b60ef4e
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# NxtRegistry
|
2
2
|
|
3
|
-
NxtRegistry is a simple implementation of the container pattern. It allows you to register and resolve values
|
4
|
-
|
3
|
+
NxtRegistry is a simple implementation of the container pattern. It allows you to register and resolve values in nested
|
4
|
+
structures by allowing nesting registries into each other. In theory this can be indefinitely deep.
|
5
5
|
|
6
6
|
## Installation
|
7
7
|
|
@@ -21,80 +21,158 @@ Or install it yourself as:
|
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
24
|
+
```ruby
|
25
|
+
class Example
|
26
|
+
include NxtRegistry
|
27
|
+
|
28
|
+
def passengers
|
29
|
+
@passengers ||= begin
|
30
|
+
registry :from do
|
31
|
+
nested :to do
|
32
|
+
nested :via, memoize: true, call: true, default: -> { [] } do
|
33
|
+
attrs %i[train car plane horse] # restrict the attributes that can be registered
|
34
|
+
resolver ->(value) { value } # do something with your registered value here
|
35
|
+
transform_keys ->(key) { key.upcase } # transform keys
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
example = Example.new
|
44
|
+
# Based on the naming of the registry and its nesting you are provided with a simple interface
|
45
|
+
# that allows you to resolve and register values by name
|
46
|
+
|
47
|
+
# Register an array with a value by calling the accessor with a key, value pair
|
48
|
+
example.passengers.from(:a).to(:b).via(:train, ['Andy']) # => ['Andy']
|
49
|
+
|
50
|
+
# In case you try to register the same key again you will get an error
|
51
|
+
example.passengers.from(:a).to(:b).via(:train, ['Andy'])
|
52
|
+
# => NxtRegistry::Errors::KeyAlreadyRegisteredError
|
53
|
+
# (Key 'train' already registered in registry 'from.to.via')
|
54
|
+
# NxtRegistry::Errors::KeyAlreadyRegisteredError inherits from KeyError
|
55
|
+
|
56
|
+
# You can force values on the registry by using the bang method
|
57
|
+
example.passengers.from(:a).to(:b).via!(:train, ['Andreas'])
|
58
|
+
|
59
|
+
# Similarly you can try to resolve values softly
|
60
|
+
# (meaning no KeyNotRegisteredError will be raised when nothing was registered)
|
61
|
+
example.passengers.from(:a).to(:b).via!(:train)
|
62
|
+
# Since there is a default defined for this registry, it does not make any sense
|
63
|
+
# since there is always a value. But you get the point...
|
64
|
+
|
65
|
+
# Resolve values by calling the accessor with the key only
|
66
|
+
# In this case the default is returned because nothing was registered yet
|
67
|
+
example.passengers.from(:a).to(:b).via(:hyperloop) # []
|
68
|
+
|
69
|
+
# Appending values to a default array
|
70
|
+
example.passengers.from(:a).to(:b).via(:car) << 'Lütfi' # => ['Lütif']
|
71
|
+
example.passengers.from(:a).to(:b).via(:plane) += %w[Nils Rapha]
|
72
|
+
example.passengers.from(:a).to(:b).via(:plane) # => ['Nils', 'Rapha']
|
73
|
+
|
74
|
+
```
|
75
|
+
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
class OtherExample
|
79
|
+
extend NxtRegistry
|
80
|
+
|
81
|
+
# By passing a block to :registry you can directly register your values inline
|
82
|
+
REGISTRY = registry(:errors) do
|
83
|
+
# procs are called directly if not defined otherwise
|
84
|
+
register(KeyError, ->(error) { puts 'KeyError handler' } )
|
85
|
+
register(ArgumentError, ->(error) { puts 'ArgumentError handler' } )
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# Instead of using the name of the registry, you can also always call register and resolve on the
|
90
|
+
# level where you want to register or resolve values. Equivalently to the named interface you can
|
91
|
+
# use register! and resolve! to softly resolve or forcfully register values.
|
92
|
+
OtherExample::REGISTRY.resolve(KeyError)
|
93
|
+
# KeyError handler
|
94
|
+
# => nil
|
95
|
+
|
96
|
+
```
|
97
|
+
|
24
98
|
### Restrict attributes to a certain set
|
25
99
|
|
26
100
|
Use `attrs` to restrict which attributes can be registered on a specific level.
|
27
101
|
|
102
|
+
```ruby
|
103
|
+
registry :example, attrs: %w[one two three]
|
104
|
+
```
|
105
|
+
|
28
106
|
### Default values
|
29
107
|
|
30
108
|
Use `default` to register a default value that will be resolved in case an attribute was not registered.
|
31
109
|
|
110
|
+
```ruby
|
111
|
+
registry :example, default: ->(value) { 'default' }
|
112
|
+
```
|
113
|
+
|
32
114
|
### Blocks
|
33
115
|
|
34
116
|
When you register a block value that can be called, tt will automatically be called when you resolve the value.
|
35
117
|
If that's not what you want, you can configure your registry (on each level) not to call blocks directly by defining `call false`
|
36
118
|
|
119
|
+
```ruby
|
120
|
+
registry :example, call: false do
|
121
|
+
register(:one, ->(value) { 'Not called when resolved' } )
|
122
|
+
end
|
123
|
+
```
|
124
|
+
|
37
125
|
### Memoize
|
38
126
|
|
39
127
|
Values are memoized per default. Switch it off with `default false`
|
40
128
|
|
129
|
+
```ruby
|
130
|
+
registry :example, memoize: false do
|
131
|
+
register(:one, -> { Time.current } )
|
132
|
+
end
|
133
|
+
|
134
|
+
registry.resolve(:one)
|
135
|
+
# => 2020-01-02 23:56:15 +0100
|
136
|
+
registry.resolve(:one)
|
137
|
+
# => 2020-01-02 23:56:17 +0100
|
138
|
+
registry.resolve(:one)
|
139
|
+
# => 2020-01-02 23:56:18 +0100
|
140
|
+
```
|
141
|
+
|
41
142
|
### Resolver
|
42
143
|
|
43
144
|
You can register a resolver block if you want to lay hands on your values after they have been resolved.
|
44
145
|
|
146
|
+
```ruby
|
147
|
+
registry :example do
|
148
|
+
resolver ->(value) { value * 2 }
|
149
|
+
register(:one, 1)
|
150
|
+
end
|
151
|
+
|
152
|
+
registry.resolve(:one)
|
153
|
+
# => 2
|
154
|
+
```
|
155
|
+
|
45
156
|
### Transform keys
|
46
157
|
|
47
158
|
NxtRegistry uses a plain ruby hash to store values internally. Per default all keys used are transformed with `&:to_s`.
|
48
159
|
Thus you can use symbols or strings to register and resolve values. If it's not what you want, switch it off with `transform_keys false`
|
49
|
-
or define your own key transformer by assigning a block `transform_keys ->(key) { key.upcase }`
|
50
|
-
|
51
|
-
### Customize :raise_key_already_registered_error and :raise_key_not_registered_error
|
52
|
-
|
53
|
-
Customize what kind of errors are being raised in case a of a key was not registered or was already registered.
|
54
|
-
|
160
|
+
or define your own key transformer by assigning a block to transform_keys: `transform_keys ->(key) { key.upcase }`
|
55
161
|
|
56
162
|
```ruby
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
def passengers
|
61
|
-
@passengers ||= begin
|
62
|
-
registry :from do
|
63
|
-
nested :to do
|
64
|
-
nested :via, memoize: true, call: true, default: -> { [] }, attrs: %i[train car plane horse] do
|
65
|
-
resolver ->(value) { value } # do something with your registered value here
|
66
|
-
transform_keys ->(key) { key.upcase } # transform keys
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
163
|
+
registry :example do
|
164
|
+
transform_keys ->(key) { key.to_s.downcase }
|
165
|
+
register(:bombshell, 'hanna')
|
72
166
|
end
|
73
167
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
subject.passengers.from(:a).to(:b).via(:car) << 'Lütfi'
|
78
|
-
subject.passengers.from(:a).to(:b).via(:plane) << 'Nils'
|
79
|
-
subject.passengers.from(:a).to(:b).via(:plane) << 'Rapha'
|
80
|
-
subject.passengers.from(:a).to(:b).via(:plane) # => ['Nils', 'Rapha']
|
81
|
-
|
82
|
-
subject.passengers.from(:a).to(:b).via(:hyperloop) # => KeyError
|
83
|
-
|
84
|
-
|
85
|
-
class MyClass
|
86
|
-
extend NxtRegistry
|
87
|
-
|
88
|
-
REGISTRY = registry(:errors) do
|
89
|
-
register(KeyError, ->(error) { puts 'KeyError handler' } )
|
90
|
-
end
|
91
|
-
end
|
168
|
+
registry.resolve('BOMBSHELL')
|
169
|
+
# => 'hanna'
|
170
|
+
```
|
92
171
|
|
93
|
-
|
94
|
-
# KeyError handler
|
95
|
-
# => nil
|
172
|
+
### Customize registry errors
|
96
173
|
|
97
|
-
|
174
|
+
You can also customize what kind of errors are being raised in case a of a key was not registered or was already registered.
|
175
|
+
by providing values for `raise_key_already_registered_error` and `raise_key_not_registered_error`
|
98
176
|
|
99
177
|
## Development
|
100
178
|
|
@@ -4,7 +4,7 @@ module NxtRegistry
|
|
4
4
|
@name = name
|
5
5
|
@parent = options[:parent]
|
6
6
|
@is_leaf = true
|
7
|
-
@namespace =
|
7
|
+
@namespace = parent ? name.to_s.prepend("#{parent.send(:namespace)}.") : name.to_s
|
8
8
|
@config = config
|
9
9
|
@options = options
|
10
10
|
@store = {}
|
@@ -17,6 +17,7 @@ module NxtRegistry
|
|
17
17
|
attr_reader :name
|
18
18
|
|
19
19
|
def nested(name, **options, &config)
|
20
|
+
# TODO: Ensure that nesting is included in defined attrs
|
20
21
|
options = options.merge(parent: self)
|
21
22
|
|
22
23
|
if default.is_a?(Blank)
|
@@ -112,6 +113,12 @@ module NxtRegistry
|
|
112
113
|
end
|
113
114
|
end
|
114
115
|
|
116
|
+
def to_s
|
117
|
+
"Registry[#{name}] -> #{store.to_s}"
|
118
|
+
end
|
119
|
+
|
120
|
+
alias_method :inspect, :to_s
|
121
|
+
|
115
122
|
private
|
116
123
|
|
117
124
|
attr_reader :namespace, :parent, :config, :store, :options
|
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.1.
|
4
|
+
version: 0.1.3
|
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-01-
|
14
|
+
date: 2020-01-03 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activesupport
|