remap 2.1.0 → 2.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/remap/compiler.rb +277 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bfb874debe63d7c683fb4c029046d16e8165a3eacbedd249a0503f8294ce490
|
4
|
+
data.tar.gz: e534d0362da7a9239ee105a3ca6ba433ff604785b36468b045d08e51ea48bb86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c71d9adde466f2b5d625679962872e4066147ebd1d6b37a5aa5707a57d4e835dd97ccc49406b46e5152fc78f9ce38f4b71f3a0fc85442e3c2893ba390047592d
|
7
|
+
data.tar.gz: 0dab17896fb4ad8c745d458b58a17e95c9c383e95ec4aa98bcb5817e563b26021d3f113894446dde377eabb2b17bdb6e253484206a666be48e12a1b17698197f
|
data/lib/remap/compiler.rb
CHANGED
@@ -11,7 +11,7 @@ module Remap
|
|
11
11
|
|
12
12
|
# Constructs a rule tree given block
|
13
13
|
#
|
14
|
-
# @example Compiles two rules
|
14
|
+
# @example Compiles two rules, [get] and [map]
|
15
15
|
# rule = Remap::Compiler.call do
|
16
16
|
# get :name
|
17
17
|
# get :age
|
@@ -42,6 +42,21 @@ module Remap
|
|
42
42
|
# @param path ([]) [Array<Segment>, Segment]
|
43
43
|
# @param to ([]) [Array<Symbol>, Symbol]
|
44
44
|
#
|
45
|
+
# @example From path [:name] to [:nickname]
|
46
|
+
# rule = Remap::Compiler.call do
|
47
|
+
# map :name, to: :nickname
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# state = Remap::State.call({
|
51
|
+
# name: "John"
|
52
|
+
# })
|
53
|
+
#
|
54
|
+
# output = rule.call(state) do |failure|
|
55
|
+
# raise failure.exception
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# output.fetch(:value) # => { nickname: "John" }
|
59
|
+
#
|
45
60
|
# @return [Rule::Map::Required]
|
46
61
|
def map(*path, to: EMPTY_ARRAY, backtrace: Kernel.caller, &block)
|
47
62
|
add Rule::Map::Required.call(
|
@@ -55,6 +70,24 @@ module Remap
|
|
55
70
|
|
56
71
|
# Optional version of {#map}
|
57
72
|
#
|
73
|
+
# @example Map an optional field
|
74
|
+
# rule = Remap::Compiler.call do
|
75
|
+
# to :person do
|
76
|
+
# map? :age, to: :age
|
77
|
+
# map :name, to: :name
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# state = Remap::State.call({
|
82
|
+
# name: "John"
|
83
|
+
# })
|
84
|
+
#
|
85
|
+
# output = rule.call(state) do |failure|
|
86
|
+
# raise failure.exception
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
# output.fetch(:value) # => { person: { name: "John" } }
|
90
|
+
#
|
58
91
|
# @see #map
|
59
92
|
#
|
60
93
|
# @return [Rule::Map::Optional]
|
@@ -72,6 +105,21 @@ module Remap
|
|
72
105
|
#
|
73
106
|
# @param path ([]) [Array<Segment>, Segment]
|
74
107
|
#
|
108
|
+
# @example Map from [:name] to [:name]
|
109
|
+
# rule = Remap::Compiler.call do
|
110
|
+
# get :name
|
111
|
+
# end
|
112
|
+
#
|
113
|
+
# state = Remap::State.call({
|
114
|
+
# name: "John"
|
115
|
+
# })
|
116
|
+
#
|
117
|
+
# output = rule.call(state) do |failure|
|
118
|
+
# raise failure.exception
|
119
|
+
# end
|
120
|
+
#
|
121
|
+
# output.fetch(:value) # => { name: "John" }
|
122
|
+
#
|
75
123
|
# @return [Rule::Map::Required]
|
76
124
|
def get(*path, backtrace: Kernel.caller, &block)
|
77
125
|
map(path, to: path, backtrace: backtrace, &block)
|
@@ -79,6 +127,22 @@ module Remap
|
|
79
127
|
|
80
128
|
# Optional version of {#get}
|
81
129
|
#
|
130
|
+
# @example Map from [:name] to [:name]
|
131
|
+
# rule = Remap::Compiler.call do
|
132
|
+
# get :name
|
133
|
+
# get? :age
|
134
|
+
# end
|
135
|
+
#
|
136
|
+
# state = Remap::State.call({
|
137
|
+
# name: "John"
|
138
|
+
# })
|
139
|
+
#
|
140
|
+
# output = rule.call(state) do |failure|
|
141
|
+
# raise failure.exception
|
142
|
+
# end
|
143
|
+
#
|
144
|
+
# output.fetch(:value) # => { name: "John" }
|
145
|
+
#
|
82
146
|
# @see #get
|
83
147
|
#
|
84
148
|
# @return [Rule::Map::Optional]
|
@@ -90,6 +154,35 @@ module Remap
|
|
90
154
|
#
|
91
155
|
# @param mapper [Remap]
|
92
156
|
#
|
157
|
+
# @example Embed mapper Car into a person
|
158
|
+
# class Car < Remap::Base
|
159
|
+
# define do
|
160
|
+
# map :car do
|
161
|
+
# map :name, to: :car
|
162
|
+
# end
|
163
|
+
# end
|
164
|
+
# end
|
165
|
+
#
|
166
|
+
# rule = Remap::Compiler.call do
|
167
|
+
# map :person do
|
168
|
+
# embed Car
|
169
|
+
# end
|
170
|
+
# end
|
171
|
+
#
|
172
|
+
# state = Remap::State.call({
|
173
|
+
# person: {
|
174
|
+
# car: {
|
175
|
+
# name: "Volvo"
|
176
|
+
# }
|
177
|
+
# }
|
178
|
+
# })
|
179
|
+
#
|
180
|
+
# output = rule.call(state) do |failure|
|
181
|
+
# raise failure.exception
|
182
|
+
# end
|
183
|
+
#
|
184
|
+
# output.fetch(:value) # => { car: "Volvo" }
|
185
|
+
#
|
93
186
|
# @return [Rule::Embed]
|
94
187
|
def embed(mapper, &block)
|
95
188
|
if block
|
@@ -101,9 +194,37 @@ module Remap
|
|
101
194
|
raise ArgumentError, "Embeded mapper must be [Remap::Mapper], got [#{mapper}]"
|
102
195
|
end
|
103
196
|
|
197
|
+
# Set a static value
|
198
|
+
#
|
104
199
|
# @param path ([]) [Symbol, Array<Symbol>]
|
105
200
|
# @option to [Remap::Static]
|
106
201
|
#
|
202
|
+
# @example Set static value to { name: "John" }
|
203
|
+
# rule = Remap::Compiler.call do
|
204
|
+
# set :name, to: value("John")
|
205
|
+
# end
|
206
|
+
#
|
207
|
+
# state = Remap::State.call({})
|
208
|
+
#
|
209
|
+
# output = rule.call(state) do |failure|
|
210
|
+
# raise failure.exception
|
211
|
+
# end
|
212
|
+
#
|
213
|
+
# output.fetch(:value) # => { name: "John" }
|
214
|
+
#
|
215
|
+
# @example Reference an option
|
216
|
+
# rule = Remap::Compiler.call do
|
217
|
+
# set :name, to: option(:name)
|
218
|
+
# end
|
219
|
+
#
|
220
|
+
# state = Remap::State.call({}, options: { name: "John" })
|
221
|
+
#
|
222
|
+
# output = rule.call(state) do |failure|
|
223
|
+
# raise failure.exception
|
224
|
+
# end
|
225
|
+
#
|
226
|
+
# output.fetch(:value) # => { name: "John" }
|
227
|
+
#
|
107
228
|
# @return [Rule::Set]
|
108
229
|
# @raise [ArgumentError]
|
109
230
|
# if no path given
|
@@ -123,6 +244,21 @@ module Remap
|
|
123
244
|
# @param path [Array<Symbol>, Symbol]
|
124
245
|
# @param map [Array<Segment>, Segment]
|
125
246
|
#
|
247
|
+
# @example From path [:name] to [:nickname]
|
248
|
+
# rule = Remap::Compiler.call do
|
249
|
+
# to :nickname, map: :name
|
250
|
+
# end
|
251
|
+
#
|
252
|
+
# state = Remap::State.call({
|
253
|
+
# name: "John"
|
254
|
+
# })
|
255
|
+
#
|
256
|
+
# output = rule.call(state) do |failure|
|
257
|
+
# raise failure.exception
|
258
|
+
# end
|
259
|
+
#
|
260
|
+
# output.fetch(:value) # => { nickname: "John" }
|
261
|
+
#
|
126
262
|
# @return [Rule::Map]
|
127
263
|
def to(*path, map: EMPTY_ARRAY, backtrace: Kernel.caller, &block)
|
128
264
|
map(*map, to: path, backtrace: backtrace, &block)
|
@@ -130,6 +266,23 @@ module Remap
|
|
130
266
|
|
131
267
|
# Optional version of {#to}
|
132
268
|
#
|
269
|
+
# @example Map an optional field
|
270
|
+
# rule = Remap::Compiler.call do
|
271
|
+
# to :person do
|
272
|
+
# to? :age, map: :age
|
273
|
+
# to :name, map: :name
|
274
|
+
# end
|
275
|
+
# end
|
276
|
+
#
|
277
|
+
# state = Remap::State.call({
|
278
|
+
# name: "John"
|
279
|
+
# })
|
280
|
+
#
|
281
|
+
# output = rule.call(state) do |failure|
|
282
|
+
# raise failure.exception
|
283
|
+
# end
|
284
|
+
#
|
285
|
+
# output.fetch(:value) # => { person: { name: "John" } }
|
133
286
|
# @see #to
|
134
287
|
#
|
135
288
|
# @return [Rule::Map::Optional]
|
@@ -140,6 +293,25 @@ module Remap
|
|
140
293
|
# Iterates over the input value, passes each value
|
141
294
|
# to its block and merges the result back together
|
142
295
|
#
|
296
|
+
# @example Map an array of hashes
|
297
|
+
# rule = Remap::Compiler.call do
|
298
|
+
# each do
|
299
|
+
# map :name
|
300
|
+
# end
|
301
|
+
# end
|
302
|
+
#
|
303
|
+
# state = Remap::State.call([{
|
304
|
+
# name: "John"
|
305
|
+
# }, {
|
306
|
+
# name: "Jane"
|
307
|
+
# }])
|
308
|
+
#
|
309
|
+
# output = rule.call(state) do |failure|
|
310
|
+
# raise failure.exception
|
311
|
+
# end
|
312
|
+
#
|
313
|
+
# output.fetch(:value) # => ["John", "Jane"]
|
314
|
+
#
|
143
315
|
# @return [Rule::Each]]
|
144
316
|
# @raise [ArgumentError] if no block given
|
145
317
|
def each(&block)
|
@@ -156,6 +328,23 @@ module Remap
|
|
156
328
|
#
|
157
329
|
# @yieldreturn [Rule]
|
158
330
|
#
|
331
|
+
# @example Wrap an output value in an array
|
332
|
+
# rule = Remap::Compiler.call do
|
333
|
+
# wrap(:array) do
|
334
|
+
# map :name
|
335
|
+
# end
|
336
|
+
# end
|
337
|
+
#
|
338
|
+
# state = Remap::State.call({
|
339
|
+
# name: "John"
|
340
|
+
# })
|
341
|
+
#
|
342
|
+
# output = rule.call(state) do |failure|
|
343
|
+
# raise failure.exception
|
344
|
+
# end
|
345
|
+
#
|
346
|
+
# output.fetch(:value) # => ["John"]
|
347
|
+
#
|
159
348
|
# @return [Rule::Wrap]
|
160
349
|
# @raise [ArgumentError] if type is not :array
|
161
350
|
def wrap(type, &block)
|
@@ -170,6 +359,22 @@ module Remap
|
|
170
359
|
|
171
360
|
# Selects all elements
|
172
361
|
#
|
362
|
+
# @example Select all keys in array
|
363
|
+
# rule = Remap::Compiler.call do
|
364
|
+
# map all, :name, to: :names
|
365
|
+
# end
|
366
|
+
#
|
367
|
+
# state = Remap::State.call([
|
368
|
+
# { name: "John" },
|
369
|
+
# { name: "Jane" }
|
370
|
+
# ])
|
371
|
+
#
|
372
|
+
# output = rule.call(state) do |failure|
|
373
|
+
# raise failure.exception
|
374
|
+
# end
|
375
|
+
#
|
376
|
+
# output.fetch(:value) # => { names: ["John", "Jane"] }
|
377
|
+
#
|
173
378
|
# @return [Rule::Path::Segment::Quantifier::All]
|
174
379
|
def all(&block)
|
175
380
|
if block
|
@@ -183,6 +388,19 @@ module Remap
|
|
183
388
|
#
|
184
389
|
# @param value [Any]
|
185
390
|
#
|
391
|
+
# @example Set path to static value
|
392
|
+
# rule = Remap::Compiler.call do
|
393
|
+
# set :api_key, to: value("<SECRET>")
|
394
|
+
# end
|
395
|
+
#
|
396
|
+
# state = Remap::State.call({})
|
397
|
+
#
|
398
|
+
# output = rule.call(state) do |failure|
|
399
|
+
# raise failure.exception
|
400
|
+
# end
|
401
|
+
#
|
402
|
+
# output.fetch(:value) # => { api_key: "<SECRET>" }
|
403
|
+
#
|
186
404
|
# @return [Rule::Static::Fixed]
|
187
405
|
def value(value, &block)
|
188
406
|
if block
|
@@ -194,6 +412,19 @@ module Remap
|
|
194
412
|
|
195
413
|
# Static option to be selected
|
196
414
|
#
|
415
|
+
# @example Set path to option
|
416
|
+
# rule = Remap::Compiler.call do
|
417
|
+
# set :meaning_of_life, to: option(:number)
|
418
|
+
# end
|
419
|
+
#
|
420
|
+
# state = Remap::State.call({}, options: { number: 42 })
|
421
|
+
#
|
422
|
+
# output = rule.call(state) do |failure|
|
423
|
+
# raise failure.exception
|
424
|
+
# end
|
425
|
+
#
|
426
|
+
# output.fetch(:value) # => { meaning_of_life: 42 }
|
427
|
+
#
|
197
428
|
# @param id [Symbol]
|
198
429
|
#
|
199
430
|
# @return [Rule::Static::Option]
|
@@ -209,6 +440,21 @@ module Remap
|
|
209
440
|
#
|
210
441
|
# @param index [Integer]
|
211
442
|
#
|
443
|
+
# @example Select value at index
|
444
|
+
# rule = Remap::Compiler.call do
|
445
|
+
# map :names, at(1), to: :name
|
446
|
+
# end
|
447
|
+
#
|
448
|
+
# state = Remap::State.call({
|
449
|
+
# names: ["John", "Jane"]
|
450
|
+
# })
|
451
|
+
#
|
452
|
+
# output = rule.call(state) do |failure|
|
453
|
+
# raise failure.exception
|
454
|
+
# end
|
455
|
+
#
|
456
|
+
# output.fetch(:value) # => { name: "Jane" }
|
457
|
+
#
|
212
458
|
# @return [Path::Segment::Key]
|
213
459
|
# @raise [ArgumentError] if index is not an Integer
|
214
460
|
def at(index, &block)
|
@@ -224,6 +470,21 @@ module Remap
|
|
224
470
|
|
225
471
|
# Selects first element in input
|
226
472
|
#
|
473
|
+
# @example Select first value in an array
|
474
|
+
# rule = Remap::Compiler.call do
|
475
|
+
# map :names, first, to: :name
|
476
|
+
# end
|
477
|
+
#
|
478
|
+
# state = Remap::State.call({
|
479
|
+
# names: ["John", "Jane"]
|
480
|
+
# })
|
481
|
+
#
|
482
|
+
# output = rule.call(state) do |failure|
|
483
|
+
# raise failure.exception
|
484
|
+
# end
|
485
|
+
#
|
486
|
+
# output.fetch(:value) # => { name: "John" }
|
487
|
+
#
|
227
488
|
# @return [Path::Segment::Key]]
|
228
489
|
def first(&block)
|
229
490
|
if block
|
@@ -236,6 +497,21 @@ module Remap
|
|
236
497
|
|
237
498
|
# Selects last element in input
|
238
499
|
#
|
500
|
+
# @example Select last value in an array
|
501
|
+
# rule = Remap::Compiler.call do
|
502
|
+
# map :names, last, to: :name
|
503
|
+
# end
|
504
|
+
#
|
505
|
+
# state = Remap::State.call({
|
506
|
+
# names: ["John", "Jane", "Linus"]
|
507
|
+
# })
|
508
|
+
#
|
509
|
+
# output = rule.call(state) do |failure|
|
510
|
+
# raise failure.exception
|
511
|
+
# end
|
512
|
+
#
|
513
|
+
# output.fetch(:value) # => { name: "Linus" }
|
514
|
+
#
|
239
515
|
# @return [Path::Segment::Key]
|
240
516
|
def last(&block)
|
241
517
|
if block
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: remap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Linus Oleander
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2021-12-08 00:00:00.000000000 Z
|
@@ -308,7 +308,7 @@ licenses:
|
|
308
308
|
- MIT
|
309
309
|
metadata:
|
310
310
|
rubygems_mfa_required: 'true'
|
311
|
-
post_install_message:
|
311
|
+
post_install_message:
|
312
312
|
rdoc_options: []
|
313
313
|
require_paths:
|
314
314
|
- lib
|
@@ -324,7 +324,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
324
324
|
version: '0'
|
325
325
|
requirements: []
|
326
326
|
rubygems_version: 3.2.32
|
327
|
-
signing_key:
|
327
|
+
signing_key:
|
328
328
|
specification_version: 4
|
329
329
|
summary: An expressive and feature-complete data mapper with intuitive syntax thanks
|
330
330
|
to its DSL
|