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