remap 2.1.14 → 2.1.15
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/lib/remap/base.rb +5 -7
- data/lib/remap/compiler.rb +27 -31
- data/lib/remap/extensions/enumerable.rb +11 -12
- data/lib/remap/extensions/object.rb +17 -2
- data/lib/remap/failure.rb +6 -7
- data/lib/remap/proxy.rb +1 -0
- data/lib/remap/selector/index.rb +3 -4
- data/lib/remap/state/extension.rb +3 -18
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3439c23b054b2470688ec55cedb4dc0d7c0f77544c45f8f47c82b5d8d9b954a
|
4
|
+
data.tar.gz: 515558fee642db02bd30e5194846a4486f6b59c67830c46581b9b3d3c529532e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 599b8f2de0d62e5d4ab8ded2d303243fe11292f0cc621b7cdf66bb9e70ac712bb3fe4811cd926e9929a06f110445e283b2b8c3134a68cec5c810c53f572f720c
|
7
|
+
data.tar.gz: 6cf4704750445ac8dfdac08cfe2beec2bff5ac34db4c61557f9239b49857c3a1423978d6cc38342917753d48b4edeeff397d012c8b91d32a3ee49ec96ab62fa4
|
data/lib/remap/base.rb
CHANGED
@@ -143,7 +143,7 @@ module Remap
|
|
143
143
|
#
|
144
144
|
# @return [void]
|
145
145
|
def self.contract(&context)
|
146
|
-
self.contract = Dry::Schema.
|
146
|
+
self.contract = Dry::Schema.define(&context)
|
147
147
|
end
|
148
148
|
|
149
149
|
# Defines a rule for the mapper
|
@@ -236,14 +236,12 @@ module Remap
|
|
236
236
|
#
|
237
237
|
# @return [void]
|
238
238
|
def self.define(target = Nothing, method: :new, strategy: :argument, &context)
|
239
|
-
unless
|
240
|
-
raise ArgumentError, "
|
239
|
+
unless block_given?
|
240
|
+
raise ArgumentError, "#{self}.define requires a block"
|
241
241
|
end
|
242
242
|
|
243
|
-
self.context = Compiler.call(&context)
|
244
243
|
self.constructor = Constructor.call(method: method, strategy: strategy, target: target)
|
245
|
-
|
246
|
-
raise ArgumentError, e.message
|
244
|
+
self.context = Compiler.call(&context)
|
247
245
|
end
|
248
246
|
|
249
247
|
# Similar to {::call}, but takes a state
|
@@ -269,7 +267,7 @@ module Remap
|
|
269
267
|
#
|
270
268
|
# @private
|
271
269
|
def call(state, &error)
|
272
|
-
unless
|
270
|
+
unless block_given?
|
273
271
|
raise ArgumentError, "Base#call(state, &error) requires block"
|
274
272
|
end
|
275
273
|
|
data/lib/remap/compiler.rb
CHANGED
@@ -30,7 +30,7 @@ module Remap
|
|
30
30
|
#
|
31
31
|
# @return [Rule]
|
32
32
|
def self.call(&block)
|
33
|
-
unless
|
33
|
+
unless block_given?
|
34
34
|
return Rule::VOID
|
35
35
|
end
|
36
36
|
|
@@ -38,10 +38,6 @@ module Remap
|
|
38
38
|
compiler.instance_exec(&block)
|
39
39
|
end.rules
|
40
40
|
|
41
|
-
if rules.empty?
|
42
|
-
return Rule::VOID
|
43
|
-
end
|
44
|
-
|
45
41
|
Rule::Block.new(rules)
|
46
42
|
end
|
47
43
|
|
@@ -66,7 +62,7 @@ module Remap
|
|
66
62
|
# output.fetch(:value) # => { nickname: "John" }
|
67
63
|
#
|
68
64
|
# @return [Rule::Map::Required]
|
69
|
-
def map(*path, to: EMPTY_ARRAY, backtrace:
|
65
|
+
def map(*path, to: EMPTY_ARRAY, backtrace: caller, &block)
|
70
66
|
add rule(*path, to: to, backtrace: backtrace, &block)
|
71
67
|
end
|
72
68
|
|
@@ -93,7 +89,7 @@ module Remap
|
|
93
89
|
# @see #map
|
94
90
|
#
|
95
91
|
# @return [Rule::Map::Optional]
|
96
|
-
def map?(*path, to: EMPTY_ARRAY, backtrace:
|
92
|
+
def map?(*path, to: EMPTY_ARRAY, backtrace: caller, &block)
|
97
93
|
add rule?(*path, to: to, backtrace: backtrace, &block)
|
98
94
|
end
|
99
95
|
|
@@ -117,7 +113,7 @@ module Remap
|
|
117
113
|
# output.fetch(:value) # => { name: "John" }
|
118
114
|
#
|
119
115
|
# @return [Rule::Map::Required]
|
120
|
-
def get(*path, backtrace:
|
116
|
+
def get(*path, backtrace: caller, &block)
|
121
117
|
add rule(path, to: path, backtrace: backtrace, &block)
|
122
118
|
end
|
123
119
|
|
@@ -142,7 +138,7 @@ module Remap
|
|
142
138
|
# @see #get
|
143
139
|
#
|
144
140
|
# @return [Rule::Map::Optional]
|
145
|
-
def get?(*path, backtrace:
|
141
|
+
def get?(*path, backtrace: caller, &block)
|
146
142
|
add rule?(path, to: path, backtrace: backtrace, &block)
|
147
143
|
end
|
148
144
|
|
@@ -180,12 +176,12 @@ module Remap
|
|
180
176
|
# output.fetch(:value) # => { car: "Volvo" }
|
181
177
|
#
|
182
178
|
# @return [Rule::Embed]
|
183
|
-
def embed(mapper
|
184
|
-
if
|
179
|
+
def embed(mapper)
|
180
|
+
if block_given?
|
185
181
|
raise ArgumentError, "#embed does not take a block"
|
186
182
|
end
|
187
183
|
|
188
|
-
embeding = rule
|
184
|
+
embeding = rule.add do |state, &error|
|
189
185
|
mapper.call!(state.set(mapper: mapper)) do |failure|
|
190
186
|
next error[failure]
|
191
187
|
end.except(:mapper, :scope)
|
@@ -229,8 +225,8 @@ module Remap
|
|
229
225
|
# @raise [ArgumentError]
|
230
226
|
# if no path given
|
231
227
|
# if path is not a Symbol or Array<Symbol>
|
232
|
-
def set(*path, to
|
233
|
-
if
|
228
|
+
def set(*path, to:)
|
229
|
+
if block_given?
|
234
230
|
raise ArgumentError, "#set does not take a block"
|
235
231
|
end
|
236
232
|
|
@@ -258,7 +254,7 @@ module Remap
|
|
258
254
|
# output.fetch(:value) # => { nickname: "John" }
|
259
255
|
#
|
260
256
|
# @return [Rule::Map]
|
261
|
-
def to(*path, map: EMPTY_ARRAY, backtrace:
|
257
|
+
def to(*path, map: EMPTY_ARRAY, backtrace: caller, &block)
|
262
258
|
add rule(*map, to: path, backtrace: backtrace, &block)
|
263
259
|
end
|
264
260
|
|
@@ -313,7 +309,7 @@ module Remap
|
|
313
309
|
# @return [Rule::Each]]
|
314
310
|
# @raise [ArgumentError] if no block given
|
315
311
|
def each(&block)
|
316
|
-
unless
|
312
|
+
unless block_given?
|
317
313
|
raise ArgumentError, "#each requires a block"
|
318
314
|
end
|
319
315
|
|
@@ -346,7 +342,7 @@ module Remap
|
|
346
342
|
# @return [Rule::Wrap]
|
347
343
|
# @raise [ArgumentError] if type is not :array
|
348
344
|
def wrap(type, &block)
|
349
|
-
unless
|
345
|
+
unless block_given?
|
350
346
|
raise ArgumentError, "#wrap requires a block"
|
351
347
|
end
|
352
348
|
|
@@ -372,8 +368,8 @@ module Remap
|
|
372
368
|
# output.fetch(:value) # => { names: ["John", "Jane"] }
|
373
369
|
#
|
374
370
|
# @return [Rule::Path::Segment::Quantifier::All]
|
375
|
-
def all
|
376
|
-
if
|
371
|
+
def all
|
372
|
+
if block_given?
|
377
373
|
raise ArgumentError, "all selector does not take a block"
|
378
374
|
end
|
379
375
|
|
@@ -398,8 +394,8 @@ module Remap
|
|
398
394
|
# output.fetch(:value) # => { api_key: "<SECRET>" }
|
399
395
|
#
|
400
396
|
# @return [Rule::Static::Fixed]
|
401
|
-
def value(value
|
402
|
-
if
|
397
|
+
def value(value)
|
398
|
+
if block_given?
|
403
399
|
raise ArgumentError, "option selector does not take a block"
|
404
400
|
end
|
405
401
|
|
@@ -424,8 +420,8 @@ module Remap
|
|
424
420
|
# @param id [Symbol]
|
425
421
|
#
|
426
422
|
# @return [Rule::Static::Option]
|
427
|
-
def option(id, backtrace:
|
428
|
-
if
|
423
|
+
def option(id, backtrace: caller)
|
424
|
+
if block_given?
|
429
425
|
raise ArgumentError, "option selector does not take a block"
|
430
426
|
end
|
431
427
|
|
@@ -453,8 +449,8 @@ module Remap
|
|
453
449
|
#
|
454
450
|
# @return [Path::Segment::Key]
|
455
451
|
# @raise [ArgumentError] if index is not an Integer
|
456
|
-
def at(index
|
457
|
-
if
|
452
|
+
def at(index)
|
453
|
+
if block_given?
|
458
454
|
raise ArgumentError, "first selector does not take a block"
|
459
455
|
end
|
460
456
|
|
@@ -482,8 +478,8 @@ module Remap
|
|
482
478
|
# output.fetch(:value) # => { name: "John" }
|
483
479
|
#
|
484
480
|
# @return [Path::Segment::Key]]
|
485
|
-
def first
|
486
|
-
if
|
481
|
+
def first
|
482
|
+
if block_given?
|
487
483
|
raise ArgumentError, "first selector does not take a block"
|
488
484
|
end
|
489
485
|
|
@@ -509,8 +505,8 @@ module Remap
|
|
509
505
|
# output.fetch(:value) # => { name: "Linus" }
|
510
506
|
#
|
511
507
|
# @return [Path::Segment::Key]
|
512
|
-
def last
|
513
|
-
if
|
508
|
+
def last
|
509
|
+
if block_given?
|
514
510
|
raise ArgumentError, "last selector does not take a block"
|
515
511
|
end
|
516
512
|
|
@@ -523,7 +519,7 @@ module Remap
|
|
523
519
|
rule.tap { rules << rule }
|
524
520
|
end
|
525
521
|
|
526
|
-
def rule(*path, to: EMPTY_ARRAY, backtrace:
|
522
|
+
def rule(*path, to: EMPTY_ARRAY, backtrace: caller, &block)
|
527
523
|
Rule::Map::Required.call({
|
528
524
|
path: {
|
529
525
|
output: [to].flatten,
|
@@ -534,7 +530,7 @@ module Remap
|
|
534
530
|
})
|
535
531
|
end
|
536
532
|
|
537
|
-
def rule?(*path, to: EMPTY_ARRAY, backtrace:
|
533
|
+
def rule?(*path, to: EMPTY_ARRAY, backtrace: caller, &block)
|
538
534
|
Rule::Map::Optional.call({
|
539
535
|
path: {
|
540
536
|
output: [to].flatten,
|
@@ -28,21 +28,20 @@ module Remap
|
|
28
28
|
# @return [Any]
|
29
29
|
#
|
30
30
|
# @raise When path cannot be found
|
31
|
-
def get(*path, &
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
]) do |(current_path, element), key|
|
36
|
-
value = element.fetch(key) do
|
37
|
-
raise PathError, current_path + [key]
|
38
|
-
end
|
31
|
+
def get(*path, trace: [], &fallback)
|
32
|
+
return self if path.empty?
|
33
|
+
|
34
|
+
key = path.first
|
39
35
|
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
unless block_given?
|
37
|
+
get(*path, trace: trace) do
|
38
|
+
raise PathError, trace + [key]
|
39
|
+
end
|
43
40
|
end
|
44
41
|
|
45
|
-
|
42
|
+
fetch(key, &fallback).get(*path[1..], trace: trace + [key], &fallback)
|
43
|
+
rescue TypeError
|
44
|
+
raise PathError, trace + [key]
|
46
45
|
end
|
47
46
|
end
|
48
47
|
end
|
@@ -17,14 +17,29 @@ module Remap
|
|
17
17
|
block["Expected a state, got [#{self}] (#{self.class})"]
|
18
18
|
end
|
19
19
|
|
20
|
+
# @return [Array]
|
21
|
+
#
|
22
|
+
# @see Extension::Paths::Hash
|
23
|
+
def paths
|
24
|
+
[]
|
25
|
+
end
|
26
|
+
|
20
27
|
# Fallback method used when #get is called on an object that does not respond to #get
|
21
28
|
#
|
22
29
|
# Block is invoked, if provided
|
23
30
|
# Otherwise a symbol is thrown
|
24
31
|
#
|
25
32
|
# @param path [Array<Key>]
|
26
|
-
def get(*path, &
|
27
|
-
|
33
|
+
def get(*path, trace: [], &fallback)
|
34
|
+
return self if path.empty?
|
35
|
+
|
36
|
+
unless block_given?
|
37
|
+
get(*path, trace: trace) do
|
38
|
+
raise PathError, trace
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
yield
|
28
43
|
end
|
29
44
|
alias_method :fetch, :get
|
30
45
|
|
data/lib/remap/failure.rb
CHANGED
@@ -14,22 +14,21 @@ module Remap
|
|
14
14
|
# @return [Failure]
|
15
15
|
def merge(other)
|
16
16
|
unless other.is_a?(self.class)
|
17
|
-
raise ArgumentError, "
|
17
|
+
raise ArgumentError, "Cannot merge %s (%s) with %s (%s)" % [
|
18
|
+
self, self.class, other, other.class
|
19
|
+
]
|
18
20
|
end
|
19
21
|
|
20
|
-
failure = attributes.deep_merge(other.attributes) do |
|
21
|
-
case [value1, value2]
|
22
|
-
in [Array, Array]
|
22
|
+
failure = attributes.deep_merge(other.attributes) do |key, value1, value2|
|
23
|
+
case [key, value1, value2]
|
24
|
+
in [:failures | :notices, Array, Array]
|
23
25
|
value1 + value2
|
24
|
-
else
|
25
|
-
raise ArgumentError, "can't merge #{self.class} with #{other.class}"
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
new(failure)
|
30
30
|
end
|
31
31
|
|
32
|
-
# @return [String]
|
33
32
|
def exception
|
34
33
|
Error.new(attributes.formated)
|
35
34
|
end
|
data/lib/remap/proxy.rb
CHANGED
data/lib/remap/selector/index.rb
CHANGED
@@ -11,11 +11,10 @@ module Remap
|
|
11
11
|
# index = Remap::Selector::Index.new(1)
|
12
12
|
#
|
13
13
|
# result = index.call(state) do |element|
|
14
|
-
# element.
|
15
|
-
#
|
16
|
-
# end
|
14
|
+
# value = element.fetch(:value)
|
15
|
+
# element.merge(value: value.upcase)
|
17
16
|
# end
|
18
|
-
|
17
|
+
#
|
19
18
|
# result.fetch(:value) # => :TWO
|
20
19
|
class Index < Unit
|
21
20
|
# @return [Integer]
|
@@ -7,13 +7,6 @@ module Remap
|
|
7
7
|
using Extensions::Object
|
8
8
|
using Extensions::Hash
|
9
9
|
|
10
|
-
refine Object do
|
11
|
-
# @see Extension::Paths::Hash
|
12
|
-
def paths
|
13
|
-
EMPTY_ARRAY
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
10
|
refine Hash do
|
18
11
|
# Returns a list of all key paths
|
19
12
|
#
|
@@ -23,7 +16,7 @@ module Remap
|
|
23
16
|
# b: :c
|
24
17
|
# },
|
25
18
|
# d: :e
|
26
|
-
# }.
|
19
|
+
# }.paths # => [[:a, :b], [:d]]
|
27
20
|
#
|
28
21
|
# @return [Array<Array<Symbol>>] a list of key paths
|
29
22
|
def paths
|
@@ -47,7 +40,7 @@ module Remap
|
|
47
40
|
# b: :c
|
48
41
|
# },
|
49
42
|
# d: :e
|
50
|
-
# }.
|
43
|
+
# }.only(:a, :b) # => { a: { b: :c } }
|
51
44
|
#
|
52
45
|
# @returns [Hash] a hash containing the given path
|
53
46
|
# @raise Europace::Error when path doesn't exist
|
@@ -117,11 +110,7 @@ module Remap
|
|
117
110
|
def map(&block)
|
118
111
|
bind do |value, state|
|
119
112
|
Iteration.call(state: state, value: value).call do |other, **options|
|
120
|
-
state.set(other, **options).then
|
121
|
-
block[inner_state] do |failure|
|
122
|
-
throw :failure, failure
|
123
|
-
end
|
124
|
-
end
|
113
|
+
state.set(other, **options).then(&block)
|
125
114
|
end.except(:index, :element, :key)
|
126
115
|
end
|
127
116
|
end
|
@@ -275,10 +264,6 @@ module Remap
|
|
275
264
|
end
|
276
265
|
|
277
266
|
set(result)._
|
278
|
-
rescue NoMethodError => e
|
279
|
-
e.name == :fetch ? error["Fetch not defined on value: #{e}"] : raise
|
280
|
-
rescue NameError => e
|
281
|
-
e.name == :Undefined ? error["Undefined returned, skipping!: #{e}"] : raise
|
282
267
|
rescue KeyError, IndexError => e
|
283
268
|
error[e.message]
|
284
269
|
rescue PathError => e
|