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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b8c5142f31e6c1d053ea403da1bdbe76b800afb40648a7660a245809cbd4b71
4
- data.tar.gz: 7bd26fcda427f8fb20033e0ee9d39783c84849fd26d9f70cbee5c32ef5676f72
3
+ metadata.gz: a68b0acda862ba1abd86c05b6965258563e4c091bd0ae49012f92d5833ba1416
4
+ data.tar.gz: b6d55555232b4fc6fbbd842d538f0732fe5232369be6724525d6723465d6776b
5
5
  SHA512:
6
- metadata.gz: 8ab7450365d3cb0ece3ae837f42c981d986441ce571cf5122d2cda68925192e20da3fa6fff1e33b379270459edb63715c76e1049043346d423471702df038f38
7
- data.tar.gz: dd6a35358dc963e63751ac3f34c80ab3c7a665c9551968f8eb8d336d0be6db0aa4c4ce4723af50e06dc79b129b7f310e6fe402e4667c509a80a102265821bd59
6
+ metadata.gz: 25799005260cfb9bbda4264200c0cc1ea80e6fde0f7671048413f8835d1035f4fa27179a0ec047ca5d555600ec7f0d82cc9ee15a58934159d8b382896300e6af
7
+ data.tar.gz: 994fda385124d529b3edc72bfd4c2e2a2186e8e79918b0e1029f0f7ed20bc921024d30f60c0d4df6cc8227fe6738a31a049dc1ff29ad814c1b71a9ba9b60ef4e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nxt_registry (0.1.2)
4
+ nxt_registry (0.1.3)
5
5
  activesupport
6
6
 
7
7
  GEM
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
- It allows to register and resolve values in nested structures by allowing to nest registries into each other.
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
- class MyClass
58
- include NxtRegistry
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
- subject = MyClass.new
75
- subject.passengers.from(:a).to(:b).via(:train) # => []
76
- subject.passengers.from(:a).to(:b).via(:train) << 'Andy'
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
- MyClass::REGISTRY.resolve(KeyError)
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 = [parent, self].compact.map(&:name).join('.')
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
@@ -1,3 +1,3 @@
1
1
  module NxtRegistry
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
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.1.2
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-02 00:00:00.000000000 Z
14
+ date: 2020-01-03 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport