nrser 0.0.25 → 0.0.26

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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +39 -11
  3. data/lib/nrser.rb +5 -1
  4. data/lib/nrser/array.rb +10 -53
  5. data/lib/nrser/enumerable.rb +21 -0
  6. data/lib/nrser/hash.rb +13 -476
  7. data/lib/nrser/hash/bury.rb +154 -0
  8. data/lib/nrser/hash/deep_merge.rb +57 -0
  9. data/lib/nrser/hash/except_keys.rb +42 -0
  10. data/lib/nrser/hash/guess_label_key_type.rb +37 -0
  11. data/lib/nrser/hash/slice_keys.rb +41 -0
  12. data/lib/nrser/hash/stringify_keys.rb +37 -0
  13. data/lib/nrser/hash/symbolize_keys.rb +41 -0
  14. data/lib/nrser/hash/transform_keys.rb +45 -0
  15. data/lib/nrser/merge_by.rb +26 -0
  16. data/lib/nrser/message.rb +125 -0
  17. data/lib/nrser/meta/props.rb +2 -2
  18. data/lib/nrser/meta/props/prop.rb +5 -2
  19. data/lib/nrser/object.rb +5 -0
  20. data/lib/nrser/object/as_array.rb +37 -0
  21. data/lib/nrser/object/as_hash.rb +101 -0
  22. data/lib/nrser/{truthy.rb → object/truthy.rb} +0 -0
  23. data/lib/nrser/proc.rb +132 -0
  24. data/lib/nrser/refinements.rb +1 -2
  25. data/lib/nrser/refinements/array.rb +94 -5
  26. data/lib/nrser/refinements/enumerable.rb +5 -0
  27. data/lib/nrser/refinements/hash.rb +43 -6
  28. data/lib/nrser/refinements/object.rb +22 -2
  29. data/lib/nrser/refinements/symbol.rb +12 -0
  30. data/lib/nrser/refinements/tree.rb +41 -0
  31. data/lib/nrser/rspex.rb +329 -0
  32. data/lib/nrser/string.rb +3 -0
  33. data/lib/nrser/string/looks_like.rb +51 -0
  34. data/lib/nrser/temp/where.rb +52 -0
  35. data/lib/nrser/tree.rb +86 -0
  36. data/lib/nrser/tree/leaves.rb +92 -0
  37. data/lib/nrser/tree/map_leaves.rb +63 -0
  38. data/lib/nrser/tree/transform.rb +30 -0
  39. data/lib/nrser/types.rb +9 -4
  40. data/lib/nrser/types/any.rb +1 -1
  41. data/lib/nrser/types/array.rb +167 -25
  42. data/lib/nrser/types/{hash.rb → hashes.rb} +19 -5
  43. data/lib/nrser/types/in.rb +47 -0
  44. data/lib/nrser/types/is_a.rb +2 -2
  45. data/lib/nrser/types/labels.rb +49 -0
  46. data/lib/nrser/types/numbers.rb +63 -27
  47. data/lib/nrser/types/pairs.rb +109 -0
  48. data/lib/nrser/types/responds.rb +2 -3
  49. data/lib/nrser/types/strings.rb +17 -18
  50. data/lib/nrser/types/symbols.rb +39 -0
  51. data/lib/nrser/types/trees.rb +93 -0
  52. data/lib/nrser/types/tuples.rb +116 -0
  53. data/lib/nrser/types/type.rb +26 -2
  54. data/lib/nrser/version.rb +1 -1
  55. data/spec/nrser/hash/{guess_name_type_spec.rb → guess_label_key_type_spec.rb} +3 -3
  56. data/spec/nrser/hash_spec.rb +0 -20
  57. data/spec/nrser/merge_by_spec.rb +73 -0
  58. data/spec/nrser/meta/props_spec.rb +136 -43
  59. data/spec/nrser/op/message_spec.rb +62 -0
  60. data/spec/nrser/refinements/array_spec.rb +36 -0
  61. data/spec/nrser/refinements/hash_spec.rb +34 -0
  62. data/spec/nrser/string/looks_like_spec.rb +31 -0
  63. data/spec/nrser/tree/each_branch_spec.rb +82 -0
  64. data/spec/nrser/tree/leaves_spec.rb +112 -0
  65. data/spec/nrser/tree/transform_spec.rb +165 -0
  66. data/spec/nrser/types/array_spec.rb +82 -0
  67. data/spec/nrser/types/attrs_spec.rb +4 -4
  68. data/spec/nrser/types/pairs_spec.rb +41 -0
  69. data/spec/nrser/types/paths_spec.rb +3 -3
  70. data/spec/nrser/types/strings_spec.rb +66 -0
  71. data/spec/nrser/types/symbols_spec.rb +38 -0
  72. data/spec/nrser/types/tuples_spec.rb +37 -0
  73. data/spec/nrser/types_spec.rb +0 -13
  74. data/spec/spec_helper.rb +71 -22
  75. metadata +58 -10
  76. data/lib/nrser/spex.rb +0 -68
  77. data/lib/nrser/types/symbol.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 150628e4ec282944b3bfa4d667e0c678cfe9b6e3
4
- data.tar.gz: d31edbf013cde3c160d3105e0ac0770efae26e88
3
+ metadata.gz: 5695621d94d38882e9dcce612c022ac723febf5e
4
+ data.tar.gz: 825fe26548e53f4f8a72138fabb9554832392c8a
5
5
  SHA512:
6
- metadata.gz: d170a8aeba6ed6940aa53a0d92a8f674e6b0b0bcaed15b8808b43dcde4ae690665fbd7f4bad2bc7ae72b641e675dd3e67228d935f0e0ba18e30605385bec54da
7
- data.tar.gz: c71d68a17bb981b5638f9c28521d093fbf69266aa94323e96969c38301ad4293ba65ca1857cc6efaacc938f46a4857faff8ddfa737b6a200cac11dc8914e49a9
6
+ metadata.gz: 35da0260954c54d63cb02aadd26d110810bdcf776bfc9e7dfe5966512411d9b42b6a2d49474e4db3025891b976b9d8c72f140c440f96a402931b5141811b2fd6
7
+ data.tar.gz: 17a5658d7d56c4a93a8f1eda5fa8782f41452fbc64a4fb195daeca9e1b22fe5e34f6329b595db6e73a23651e61f2b3ab47cec66e74e90a20a2d3d37819ada1b5
data/README.md CHANGED
@@ -1,18 +1,22 @@
1
- # NRSER Ruby lib
1
+ NRSER Ruby lib
2
+ ========================================================================
2
3
 
3
- basic ruby utils i use in a lot of stuff.
4
+ Basic Ruby utilities I use in a lot of stuff.
4
5
 
5
- these tools are hastily written or copied from other sources.
6
+ These tools are hastily written or copied from other sources.
6
7
 
7
- they are not fast.
8
+ They are not fast.
8
9
 
9
- they are not optimized.
10
+ They are not optimized.
10
11
 
11
- they are largely untested.
12
+ They are largely untested. Though this *is* slowly getting better.
12
13
 
13
- proceed with caution.
14
+ Proceed with caution.
14
15
 
15
- ## Installation
16
+
17
+ ------------------------------------------------------------------------
18
+ Installation
19
+ ------------------------------------------------------------------------
16
20
 
17
21
  Add this line to your application's Gemfile:
18
22
 
@@ -27,6 +31,30 @@ Or install it yourself as:
27
31
  $ gem install nrser
28
32
 
29
33
 
30
- ## Design
31
-
32
-
34
+ ------------------------------------------------------------------------
35
+ Design
36
+ ------------------------------------------------------------------------
37
+
38
+ 1. No monkey-patching (`core_ext` kinda stuff).
39
+
40
+ All language extension is done with refinements.
41
+
42
+ Refinements are funky in a few ways, but they make me feel better.
43
+
44
+ 2. As a corollary, (pretty-much) all refinement methods are implemented functionally so they can be used in older Rubies (2.0 and before I think?).
45
+
46
+ This is pretty much only an issue with the current system Ruby version on macOS, which is `2.0.0`.
47
+
48
+ I don't run into it much, but it's nice to have it when you need it, and has panned-out to be a decent design philosophy.
49
+
50
+ 3. This means that code in the `NRSER` gem itself can't use the refinements it provides.
51
+
52
+ Which sucks, but I can live with it, because the times that I need some Ruby when I've only got the macOS system installation available I really wants it.
53
+
54
+ - The exception is the types system, which uses the refinements, and will thus be unavailable in old-ass rubies.
55
+
56
+ 4. Basically all these methods are defined directly on the `NRSER` module for the sake of brevity and connivence, though their definitions are split up across many files and directories by subject.
57
+
58
+ I like this because I like small files. They make it easier to see what's changing in commits at a glance, and I find them easier to work with in the GUI editors that I use.
59
+
60
+ The fact that Ruby does not tie source file location to API path is one of my favorite parts of the language.
data/lib/nrser.rb CHANGED
@@ -6,8 +6,10 @@ end
6
6
 
7
7
  require_relative './nrser/version'
8
8
  require_relative './nrser/no_arg'
9
+ require_relative './nrser/message'
10
+ require_relative './nrser/proc'
9
11
  require_relative './nrser/collection'
10
- require_relative './nrser/truthy'
12
+ require_relative './nrser/object'
11
13
  require_relative './nrser/string'
12
14
  require_relative './nrser/binding'
13
15
  require_relative './nrser/exception'
@@ -17,3 +19,5 @@ require_relative './nrser/array'
17
19
  require_relative './nrser/types'
18
20
  require_relative './nrser/meta'
19
21
  require_relative './nrser/open_struct'
22
+ require_relative './nrser/merge_by'
23
+ require_relative './nrser/tree'
data/lib/nrser/array.rb CHANGED
@@ -1,58 +1,15 @@
1
1
  module NRSER
2
2
 
3
- # Eigenclass (Singleton Class)
4
- # ========================================================================
3
+ # Functional implementation of "rest" for arrays. Used when refining `#rest`
4
+ # into {Array}.
5
5
  #
6
- class << self
7
-
8
- # Return an array given any value in the way that makes most sense:
9
- #
10
- # 1. If `value` is an array, return it.
11
- #
12
- # 2. If `value` is `nil`, return `[]`.
13
- #
14
- # 3. If `value` responds to `#to_a`, try calling it. If it succeeds, return
15
- # that.
16
- #
17
- # 4. Return an array with `value` as it's only item.
18
- #
19
- # Refinement
20
- # ----------
21
- #
22
- # Added to `Object` in `nrser/refinements`.
23
- #
24
- # @param [Object] value
25
- #
26
- # @return [Array]
27
- #
28
- def as_array value
29
- return value if value.is_a? Array
30
- return [] if value.nil?
31
-
32
- if value.respond_to? :to_a
33
- begin
34
- return value.to_a
35
- rescue
36
- end
37
- end
38
-
39
- [value]
40
- end # #as_array
41
-
42
-
43
- # Functional implementation of "rest" for arrays. Used when refining `#rest`
44
- # into {Array}.
45
- #
46
- # @param [Array] array
47
- #
48
- # @return [return_type]
49
- # New array consisting of all elements after the first.
50
- #
51
- def rest array
52
- array[1..-1]
53
- end # #rest
54
-
55
-
56
- end # class << self (Eigenclass)
6
+ # @param [Array] array
7
+ #
8
+ # @return [return_type]
9
+ # New array consisting of all elements after the first.
10
+ #
11
+ def self.rest array
12
+ array[1..-1]
13
+ end # .rest
57
14
 
58
15
  end # module NRSER
@@ -107,6 +107,27 @@ module NRSER
107
107
  end # #find_only
108
108
 
109
109
 
110
+
111
+ # @todo Document only method.
112
+ #
113
+ # @param [type] arg_name
114
+ # @todo Add name param description.
115
+ #
116
+ # @return [return_type]
117
+ # @todo Document return value.
118
+ #
119
+ def only! enum
120
+ unless enum.length == 1
121
+ raise TypeError.new squish <<-END
122
+ Expected enumerable #{ enum.inspect } to have exactly one entry.
123
+ END
124
+ end
125
+
126
+ enum.first
127
+ end # #only
128
+
129
+
130
+
110
131
  # @todo Document to_h_by method.
111
132
  #
112
133
  # @param [type] arg_name
data/lib/nrser/hash.rb CHANGED
@@ -1,476 +1,13 @@
1
- module NRSER
2
-
3
- def self.leaves hash, path: [], results: {}
4
- hash.each { |key, value|
5
- new_path = [*path, key]
6
-
7
- case value
8
- when Hash
9
- leaves value, path: new_path, results: results
10
- else
11
- results[new_path] = value
12
- end
13
- }
14
-
15
- results
16
- end # .leaves
17
-
18
-
19
- # Treat the value as the value for `key` in a hash if it's not already a
20
- # hash and can't be converted to one:
21
- #
22
- # 1. If the value is a `Hash`, return it.
23
- #
24
- # 2. If `value` is `nil`, return `{}`.
25
- #
26
- # 3. If the value responds to `#to_h` and `#to_h` succeeds, return the
27
- # resulting hash.
28
- #
29
- # 4. Otherwise, return a new hash where `key` points to the value.
30
- # **`key` MUST be provided in this case.**
31
- #
32
- # Useful in method overloading and similar situations where you expect a
33
- # hash that may specify a host of options, but want to allow the method
34
- # to be called with a single value that corresponds to a default key in that
35
- # option hash.
36
- #
37
- # Refinement
38
- # ----------
39
- #
40
- # Added to `Object` in `nrser/refinements`.
41
- #
42
- #
43
- # Example Time!
44
- # -------------
45
- #
46
- # Say you have a method `m` that handles a hash of HTML options that can
47
- # look something like
48
- #
49
- # {class: 'address', data: {confirm: 'Really?'}}
50
- #
51
- # And can call `m` like
52
- #
53
- # m({class: 'address', data: {confirm: 'Really?'}})
54
- #
55
- # but often you are just dealing with the `:class` option. You can use
56
- # {NRSER.as_hash} to accept a string and treat it as the `:class` key:
57
- #
58
- # using NRSER
59
- #
60
- # def m opts
61
- # opts = opts.as_hash :class
62
- # # ...
63
- # end
64
- #
65
- # If you pass a hash, everything works normally, but if you pass a string
66
- # `'address'` it will be converted to `{class: 'address'}`.
67
- #
68
- #
69
- # About `#to_h` Support
70
- # ---------------------
71
- #
72
- # Right now, {.as_hash} also tests if `value` responds to `#to_h`, and will
73
- # try to call it, using the result if it doesn't raise. This lets it deal
74
- # with Ruby's "I used to be a Hash until someone mapped me" values like
75
- # `[[:class, 'address']]`. I'm not sure if this is the best approach, but
76
- # I'm going to try it for now and see how it pans out in actual usage.
77
- #
78
- # @todo
79
- # It might be nice to have a `check` option that ensures the resulting
80
- # hash has a value for `key`.
81
- #
82
- # @param [Object] value
83
- # The value that we want to be a hash.
84
- #
85
- # @param [Object] key [default nil]
86
- # The key that `value` will be stored under in the result if `value` is
87
- # not a hash or can't be turned into one via `#to_h`. If this happens
88
- # this value can **NOT** be `nil` or an `ArgumentError` is raised.
89
- #
90
- # @return [Hash]
91
- #
92
- # @raise [ArgumentError]
93
- # If it comes to constructing a new Hash with `value` as a value and no
94
- # argument was provided
95
- #
96
- def self.as_hash value, key = nil
97
- return value if value.is_a? Hash
98
- return {} if value.nil?
99
-
100
- if value.respond_to? :to_h
101
- begin
102
- return value.to_h
103
- rescue
104
- end
105
- end
106
-
107
- # at this point we need a key argument
108
- if key.nil?
109
- raise ArgumentError,
110
- "Need key to construct hash with value #{ value.inspect }, " +
111
- "found nil."
112
- end
113
-
114
- {key => value}
115
- end # .as_hash
116
-
117
-
118
-
119
- # Lifted from ActiveSupport
120
- # =====================================================================
121
- #
122
- # Not sure *why* I didn't want to depend on ActiveSupport in the first place,
123
- # but I'm guessing it's many other things depending on it and the potential
124
- # for dependency hell, but anyways, I didn't, and I'm going to keep it that
125
- # way for the moment.
126
- #
127
- # However, I do want some of that functionality, and I think it makes sense
128
- # to keep the names and behaviors the same since ActiveSupport is so wide
129
- # spread.
130
- #
131
- # The methods are modified to operate functionally since we use refinements
132
- # instead of global monkey-patching, and Ruby versions before 2.1 (I think)
133
- # don't support refinements, so these are useful in environments where you
134
- # don't want to mess with the global built-ins and you don't have
135
- # refinements available.
136
- #
137
-
138
- # Removes the given keys from hash and returns it.
139
- #
140
- # Lifted from ActiveSupport.
141
- #
142
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:except!
143
- #
144
- # @param [Hash] hash
145
- # Hash to mutate.
146
- #
147
- # @return [Hash]
148
- #
149
- def self.except_keys! hash, *keys
150
- keys.each { |key| hash.delete(key) }
151
- hash
152
- end
153
-
154
- singleton_class.send :alias_method, :omit_keys!, :except_keys!
155
-
156
-
157
- # Returns a new hash without `keys`.
158
- #
159
- # Lifted from ActiveSupport.
160
- #
161
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:except
162
- #
163
- # @param [Hash] hash
164
- # Source hash.
165
- #
166
- # @return [Hash]
167
- #
168
- def self.except_keys hash, *keys
169
- except_keys! hash.dup, *keys
170
- end
171
-
172
- singleton_class.send :alias_method, :omit_keys, :except_keys
173
-
174
-
175
- # Lifted from ActiveSupport.
176
- #
177
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:transform_keys!
178
- #
179
- # @param [Hash] hash
180
- # Hash to mutate keys.
181
- #
182
- # @return [Hash]
183
- # The mutated hash.
184
- #
185
- def self.transform_keys! hash
186
- # File 'lib/active_support/core_ext/hash/keys.rb', line 23
187
- hash.keys.each do |key|
188
- hash[yield(key)] = hash.delete(key)
189
- end
190
- hash
191
- end
192
-
193
-
194
- # Returns a new hash with each key transformed by the provided block.
195
- #
196
- # Lifted from ActiveSupport.
197
- #
198
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:transform_keys
199
- #
200
- # @param [Hash] hash
201
- #
202
- # @return [Hash]
203
- # New hash with transformed keys.
204
- #
205
- def self.transform_keys hash, &block
206
- # File 'lib/active_support/core_ext/hash/keys.rb', line 12
207
- result = {}
208
- hash.each_key do |key|
209
- result[yield(key)] = hash[key]
210
- end
211
- result
212
- end
213
-
214
- # My-style name
215
- singleton_class.send :alias_method, :map_keys, :transform_keys
216
-
217
-
218
- # Mutates `hash` by converting all keys that respond to `#to_sym` to symbols.
219
- #
220
- # Lifted from ActiveSupport.
221
- #
222
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:symbolize_keys!
223
- #
224
- # @param [Hash] hash
225
- #
226
- # @return [Hash]
227
- #
228
- def self.symbolize_keys! hash
229
- transform_keys!(hash) { |key| key.to_sym rescue key }
230
- end # .symbolize_keys!
231
-
232
-
233
- # Returns a new hash with all keys that respond to `#to_sym` converted to
234
- # symbols.
235
- #
236
- # Lifted from ActiveSupport.
237
- #
238
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:symbolize_keys
239
- #
240
- # @param [Hash] hash
241
- #
242
- # @return [Hash]
243
- #
244
- def self.symbolize_keys hash
245
- # File 'lib/active_support/core_ext/hash/keys.rb', line 54
246
- transform_keys(hash) { |key| key.to_sym rescue key }
247
- end
248
-
249
-
250
- # Converts all keys into strings by calling `#to_s` on them. **Mutates the
251
- # hash.**
252
- #
253
- # Lifted from ActiveSupport.
254
- #
255
- # @param [Hash] hash
256
- #
257
- # @return [Hash<String, *>]
258
- #
259
- def self.stringify_keys! hash
260
- transform_keys! hash, &:to_s
261
- end
262
-
263
-
264
- # Returns a new hash with all keys transformed to strings by calling `#to_s`
265
- # on them.
266
- #
267
- # Lifted from ActiveSupport.
268
- #
269
- # @param [Hash] hash
270
- #
271
- # @return [Hash<String, *>]
272
- #
273
- def self.stringify_keys hash
274
- transform_keys hash, &:to_s
275
- end
276
-
277
-
278
- # Lifted from ActiveSupport.
279
- #
280
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:slice
281
- #
282
- #
283
- def self.slice_keys hash, *keys
284
- # We're not using this, but, whatever, leave it in...
285
- if hash.respond_to?(:convert_key, true)
286
- keys.map! { |key| hash.send :convert_key, key }
287
- end
288
-
289
- keys.each_with_object(hash.class.new) { |k, new_hash|
290
- new_hash[k] = hash[k] if hash.has_key?(k)
291
- }
292
- end
293
-
294
-
295
- # Eigenclass (Singleton Class)
296
- # ========================================================================
297
- #
298
- class << self
299
-
300
-
301
-
302
- # @todo Document select_map method.
303
- #
304
- # @param [type] arg_name
305
- # @todo Add name param description.
306
- #
307
- # @return [return_type]
308
- # @todo Document return value.
309
- #
310
- def select_map arg_name
311
- # method body...
312
- end # #select_map
313
-
314
-
315
- # Guess which type of "name" key - strings or symbols - a hash (or other
316
- # object that responds to `#keys` and `#empty`) uses.
317
- #
318
- # @param [#keys & #empty] keyed
319
- # Hash or similar object that responds to `#keys` and `#empty` to guess
320
- # about.
321
- #
322
- # @return [nil]
323
- # If we can't determine the type of name keys used.
324
- #
325
- # @return [Class]
326
- # If we can determine that {String} or {Symbol} keys are exclusively
327
- # used returns that class.
328
- #
329
- def guess_name_type keyed
330
- # We can't tell shit if the hash is empty
331
- return nil if keyed.empty?
332
-
333
- name_types = keyed.
334
- keys.
335
- map( &:class ).
336
- select { |klass| klass == String || klass == Symbol }.
337
- uniq
338
-
339
- return name_types[0] if name_types.length == 1
340
-
341
- # There are both string and symbol keys present, we can't guess
342
- nil
343
- end # #guess_key_type
344
-
345
-
346
- # @todo Document bury method.
347
- #
348
- # @param [Hash] hash
349
- # Hash to bury the value in.
350
- #
351
- # @param [Array | #to_s] key_path
352
- # - When an {Array}, each entry is used exactly as-is for each key.
353
- #
354
- # - Otherwise, the `key_path` is converted to a string and split by
355
- # `.` to produce the key array, and the actual keys used depend on
356
- # the `parsed_key_type` option.
357
- #
358
- # @param [Object] value
359
- # The value to set at the end of the path.
360
- #
361
- # @param [Class | :guess] parsed_key_type:
362
- # How to handle parsed key path segments:
363
- #
364
- # - `String` - use the strings that naturally split from a parsed
365
- # key path.
366
- #
367
- # Note that this is the *String class itself, **not** a value that
368
- # is a String*.
369
- #
370
- # - `Symbol` - convert the strings that are split from the key path
371
- # to symbols.
372
- #
373
- # Note that this is the *Symbol class itself, **not** a value that
374
- # is a Symbol*.``
375
- #
376
- # - `:guess` (default) -
377
- #
378
- # @return [return_type]
379
- # @todo Document return value.
380
- #
381
- def bury! hash,
382
- key_path,
383
- value,
384
- parsed_key_type: :guess,
385
- clobber: false
386
-
387
- # Parse the key if it's not an array
388
- unless key_path.is_a?( Array )
389
- key_path = key_path.to_s.split '.'
390
-
391
- # Convert the keys to symbols now if that's what we want to use
392
- if parsed_key_type == Symbol
393
- key_path.map! &:to_sym
394
- end
395
- end
396
-
397
- _internal_bury! \
398
- hash,
399
- key_path,
400
- value,
401
- guess_key_type: ( parsed_key_type == :guess ),
402
- clobber: clobber
403
- end # #bury
404
-
405
-
406
-
407
- private
408
- # ========================================================================
409
-
410
-
411
- # @todo Document _internal_bury! method.
412
- #
413
- # @param [type] arg_name
414
- # @todo Add name param description.
415
- #
416
- # @return [return_type]
417
- # @todo Document return value.
418
- #
419
- def _internal_bury! hash,
420
- key_path,
421
- value,
422
- guess_key_type:,
423
- clobber:
424
-
425
- # Split the key path into the current key and the rest of the keys
426
- key, *rest = key_path
427
-
428
- # If we are guessing the key type and the hash uses some {Symbol}
429
- # (and no {String}) keys then convert the key to a symbol.
430
- if guess_key_type && guess_name_type( hash ) == Symbol
431
- key = key.to_sym
432
- end
433
-
434
- # Terminating case: we're at the last segment
435
- if rest.empty?
436
- # Set the value
437
- hash[key] = value
438
-
439
- else
440
- # Go deeper...
441
-
442
- # See if there is a hash in place
443
- unless hash[key].is_a?( Hash )
444
- # There is not... so we need to do some figurin'
445
-
446
- # If we're clobbering or the hash has no value, we're good:
447
- # assign a new hash to set in
448
- if clobber || ! hash.key?( key )
449
- hash[key] = {}
450
-
451
- else
452
- # We've got an intractable state conflict; raise
453
- raise NRSER::ConflictError.new squish <<-END
454
- can not set key #{ key.inspect } due to conflicting value
455
- #{ hash[key].inspect } in hash #{ hash.inspect } (:clobber
456
- option not set)
457
- END
458
-
459
- end
460
- end # unless hash[key].is_a?( Hash )
461
-
462
- # Dive in...
463
- bury! hash[key], rest, value
464
-
465
- end # if rest.empty? / else
466
- end # #_internal_bury!
467
-
468
-
469
- # end private
470
-
471
-
472
-
473
- end # class << self (Eigenclass)
474
-
475
-
476
- end # module NRSER
1
+ # Requirements
2
+ # =======================================================================
3
+
4
+ # Project / Package
5
+ # -----------------------------------------------------------------------
6
+ require_relative './hash/except_keys'
7
+ require_relative './hash/transform_keys'
8
+ require_relative './hash/symbolize_keys'
9
+ require_relative './hash/stringify_keys'
10
+ require_relative './hash/slice_keys'
11
+ require_relative './hash/guess_label_key_type'
12
+ require_relative './hash/bury'
13
+ require_relative './hash/deep_merge'