jmespath 1.4.0 → 1.6.2
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 +5 -5
- data/VERSION +1 -0
- data/bin/jmespath.rb +12 -0
- data/lib/jmespath/caching_parser.rb +1 -2
- data/lib/jmespath/errors.rb +2 -2
- data/lib/jmespath/lexer.rb +28 -31
- data/lib/jmespath/nodes/and.rb +1 -2
- data/lib/jmespath/nodes/comparator.rb +16 -24
- data/lib/jmespath/nodes/condition.rb +19 -9
- data/lib/jmespath/nodes/current.rb +1 -0
- data/lib/jmespath/nodes/expression.rb +2 -2
- data/lib/jmespath/nodes/field.rb +11 -13
- data/lib/jmespath/nodes/flatten.rb +5 -6
- data/lib/jmespath/nodes/function.rb +121 -105
- data/lib/jmespath/nodes/index.rb +1 -0
- data/lib/jmespath/nodes/literal.rb +2 -1
- data/lib/jmespath/nodes/multi_select_hash.rb +1 -0
- data/lib/jmespath/nodes/multi_select_list.rb +1 -0
- data/lib/jmespath/nodes/not.rb +1 -2
- data/lib/jmespath/nodes/or.rb +1 -0
- data/lib/jmespath/nodes/pipe.rb +1 -0
- data/lib/jmespath/nodes/projection.rb +7 -12
- data/lib/jmespath/nodes/slice.rb +16 -21
- data/lib/jmespath/nodes/subexpression.rb +1 -0
- data/lib/jmespath/nodes.rb +3 -8
- data/lib/jmespath/parser.rb +24 -29
- data/lib/jmespath/runtime.rb +1 -2
- data/lib/jmespath/token.rb +3 -4
- data/lib/jmespath/token_stream.rb +4 -5
- data/lib/jmespath/util.rb +19 -3
- data/lib/jmespath/version.rb +2 -1
- data/lib/jmespath.rb +6 -8
- metadata +10 -8
@@ -1,8 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module JMESPath
|
2
3
|
# @api private
|
3
4
|
module Nodes
|
4
5
|
class Function < Node
|
5
|
-
|
6
6
|
FUNCTIONS = {}
|
7
7
|
|
8
8
|
def initialize(children, options = {})
|
@@ -38,26 +38,30 @@ module JMESPath
|
|
38
38
|
private
|
39
39
|
|
40
40
|
def maybe_raise(error_type, message)
|
41
|
-
unless @disable_visit_errors
|
42
|
-
raise error_type, message
|
43
|
-
end
|
41
|
+
raise error_type, message unless @disable_visit_errors
|
44
42
|
end
|
45
43
|
|
46
|
-
def call(
|
44
|
+
def call(_args)
|
47
45
|
nil
|
48
46
|
end
|
49
47
|
end
|
50
48
|
|
51
49
|
module TypeChecker
|
52
50
|
def get_type(value)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
51
|
+
if value.respond_to?(:to_str)
|
52
|
+
STRING_TYPE
|
53
|
+
elsif value == true || value == false
|
54
|
+
BOOLEAN_TYPE
|
55
|
+
elsif value.nil?
|
56
|
+
NULL_TYPE
|
57
|
+
elsif value.is_a?(Numeric)
|
58
|
+
NUMBER_TYPE
|
59
|
+
elsif value.respond_to?(:to_hash) || value.is_a?(Struct)
|
60
|
+
OBJECT_TYPE
|
61
|
+
elsif value.respond_to?(:to_ary)
|
62
|
+
ARRAY_TYPE
|
63
|
+
elsif value.is_a?(Expression)
|
64
|
+
EXPRESSION_TYPE
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
@@ -76,7 +80,7 @@ module JMESPath
|
|
76
80
|
NULL_TYPE => 'null',
|
77
81
|
NUMBER_TYPE => 'number',
|
78
82
|
OBJECT_TYPE => 'object',
|
79
|
-
STRING_TYPE => 'string'
|
83
|
+
STRING_TYPE => 'string'
|
80
84
|
}.freeze
|
81
85
|
end
|
82
86
|
|
@@ -87,12 +91,12 @@ module JMESPath
|
|
87
91
|
if args.count == 1
|
88
92
|
value = args.first
|
89
93
|
else
|
90
|
-
return maybe_raise Errors::InvalidArityError,
|
94
|
+
return maybe_raise Errors::InvalidArityError, 'function abs() expects one argument'
|
91
95
|
end
|
92
96
|
if Numeric === value
|
93
97
|
value.abs
|
94
98
|
else
|
95
|
-
return maybe_raise Errors::InvalidTypeError,
|
99
|
+
return maybe_raise Errors::InvalidTypeError, 'function abs() expects a number'
|
96
100
|
end
|
97
101
|
end
|
98
102
|
end
|
@@ -104,19 +108,20 @@ module JMESPath
|
|
104
108
|
if args.count == 1
|
105
109
|
values = args.first
|
106
110
|
else
|
107
|
-
return maybe_raise Errors::InvalidArityError,
|
111
|
+
return maybe_raise Errors::InvalidArityError, 'function avg() expects one argument'
|
108
112
|
end
|
109
|
-
if
|
113
|
+
if values.respond_to?(:to_ary)
|
114
|
+
values = values.to_ary
|
110
115
|
return nil if values.empty?
|
111
|
-
values.inject(0) do |total,n|
|
116
|
+
values.inject(0) do |total, n|
|
112
117
|
if Numeric === n
|
113
118
|
total + n
|
114
119
|
else
|
115
|
-
return maybe_raise Errors::InvalidTypeError,
|
120
|
+
return maybe_raise Errors::InvalidTypeError, 'function avg() expects numeric values'
|
116
121
|
end
|
117
122
|
end / values.size.to_f
|
118
123
|
else
|
119
|
-
return maybe_raise Errors::InvalidTypeError,
|
124
|
+
return maybe_raise Errors::InvalidTypeError, 'function avg() expects a number'
|
120
125
|
end
|
121
126
|
end
|
122
127
|
end
|
@@ -128,12 +133,12 @@ module JMESPath
|
|
128
133
|
if args.count == 1
|
129
134
|
value = args.first
|
130
135
|
else
|
131
|
-
return maybe_raise Errors::InvalidArityError,
|
136
|
+
return maybe_raise Errors::InvalidArityError, 'function ceil() expects one argument'
|
132
137
|
end
|
133
138
|
if Numeric === value
|
134
139
|
value.ceil
|
135
140
|
else
|
136
|
-
return maybe_raise Errors::InvalidTypeError,
|
141
|
+
return maybe_raise Errors::InvalidTypeError, 'function ceil() expects a numeric value'
|
137
142
|
end
|
138
143
|
end
|
139
144
|
end
|
@@ -144,14 +149,16 @@ module JMESPath
|
|
144
149
|
def call(args)
|
145
150
|
if args.count == 2
|
146
151
|
haystack = args[0]
|
147
|
-
needle = args[1]
|
148
|
-
if
|
149
|
-
haystack.include?(needle)
|
152
|
+
needle = Util.as_json(args[1])
|
153
|
+
if haystack.respond_to?(:to_str)
|
154
|
+
haystack.to_str.include?(needle)
|
155
|
+
elsif haystack.respond_to?(:to_ary)
|
156
|
+
haystack.to_ary.any? { |e| Util.as_json(e) == needle }
|
150
157
|
else
|
151
|
-
return maybe_raise Errors::InvalidTypeError,
|
158
|
+
return maybe_raise Errors::InvalidTypeError, 'contains expects 2nd arg to be a list'
|
152
159
|
end
|
153
160
|
else
|
154
|
-
return maybe_raise Errors::InvalidArityError,
|
161
|
+
return maybe_raise Errors::InvalidArityError, 'function contains() expects 2 arguments'
|
155
162
|
end
|
156
163
|
end
|
157
164
|
end
|
@@ -163,12 +170,12 @@ module JMESPath
|
|
163
170
|
if args.count == 1
|
164
171
|
value = args.first
|
165
172
|
else
|
166
|
-
return maybe_raise Errors::InvalidArityError,
|
173
|
+
return maybe_raise Errors::InvalidArityError, 'function floor() expects one argument'
|
167
174
|
end
|
168
175
|
if Numeric === value
|
169
176
|
value.floor
|
170
177
|
else
|
171
|
-
return maybe_raise Errors::InvalidTypeError,
|
178
|
+
return maybe_raise Errors::InvalidTypeError, 'function floor() expects a numeric value'
|
172
179
|
end
|
173
180
|
end
|
174
181
|
end
|
@@ -180,36 +187,39 @@ module JMESPath
|
|
180
187
|
if args.count == 1
|
181
188
|
value = args.first
|
182
189
|
else
|
183
|
-
return maybe_raise Errors::InvalidArityError,
|
184
|
-
end
|
185
|
-
|
186
|
-
|
187
|
-
|
190
|
+
return maybe_raise Errors::InvalidArityError, 'function length() expects one argument'
|
191
|
+
end
|
192
|
+
if value.respond_to?(:to_hash)
|
193
|
+
value.to_hash.size
|
194
|
+
elsif value.respond_to?(:to_ary)
|
195
|
+
value.to_ary.size
|
196
|
+
elsif value.respond_to?(:to_str)
|
197
|
+
value.to_str.size
|
198
|
+
else
|
199
|
+
return maybe_raise Errors::InvalidTypeError, 'function length() expects string, array or object'
|
188
200
|
end
|
189
201
|
end
|
190
202
|
end
|
191
203
|
|
192
204
|
class Map < Function
|
193
|
-
|
194
205
|
FUNCTIONS['map'] = self
|
195
206
|
|
196
207
|
def call(args)
|
197
208
|
if args.count != 2
|
198
|
-
return maybe_raise Errors::InvalidArityError,
|
209
|
+
return maybe_raise Errors::InvalidArityError, 'function map() expects two arguments'
|
199
210
|
end
|
200
211
|
if Nodes::Expression === args[0]
|
201
212
|
expr = args[0]
|
202
213
|
else
|
203
|
-
return maybe_raise Errors::InvalidTypeError,
|
214
|
+
return maybe_raise Errors::InvalidTypeError, 'function map() expects the first argument to be an expression'
|
204
215
|
end
|
205
|
-
if
|
206
|
-
list = args[1]
|
216
|
+
if args[1].respond_to?(:to_ary)
|
217
|
+
list = args[1].to_ary
|
207
218
|
else
|
208
|
-
return maybe_raise Errors::InvalidTypeError,
|
219
|
+
return maybe_raise Errors::InvalidTypeError, 'function map() expects the second argument to be an list'
|
209
220
|
end
|
210
221
|
list.map { |value| expr.eval(value) }
|
211
222
|
end
|
212
|
-
|
213
223
|
end
|
214
224
|
|
215
225
|
class MaxFunction < Function
|
@@ -221,14 +231,15 @@ module JMESPath
|
|
221
231
|
if args.count == 1
|
222
232
|
values = args.first
|
223
233
|
else
|
224
|
-
return maybe_raise Errors::InvalidArityError,
|
234
|
+
return maybe_raise Errors::InvalidArityError, 'function max() expects one argument'
|
225
235
|
end
|
226
|
-
if
|
236
|
+
if values.respond_to?(:to_ary)
|
237
|
+
values = values.to_ary
|
227
238
|
return nil if values.empty?
|
228
239
|
first = values.first
|
229
240
|
first_type = get_type(first)
|
230
241
|
unless first_type == NUMBER_TYPE || first_type == STRING_TYPE
|
231
|
-
msg =
|
242
|
+
msg = String.new('function max() expects numeric or string values')
|
232
243
|
return maybe_raise Errors::InvalidTypeError, msg
|
233
244
|
end
|
234
245
|
values.inject([first, first_type]) do |(max, max_type), v|
|
@@ -236,13 +247,13 @@ module JMESPath
|
|
236
247
|
if max_type == v_type
|
237
248
|
v > max ? [v, v_type] : [max, max_type]
|
238
249
|
else
|
239
|
-
msg =
|
250
|
+
msg = String.new('function max() encountered a type mismatch in sequence: ')
|
240
251
|
msg << "#{max_type}, #{v_type}"
|
241
252
|
return maybe_raise Errors::InvalidTypeError, msg
|
242
253
|
end
|
243
254
|
end.first
|
244
255
|
else
|
245
|
-
return maybe_raise Errors::InvalidTypeError,
|
256
|
+
return maybe_raise Errors::InvalidTypeError, 'function max() expects an array'
|
246
257
|
end
|
247
258
|
end
|
248
259
|
end
|
@@ -256,14 +267,15 @@ module JMESPath
|
|
256
267
|
if args.count == 1
|
257
268
|
values = args.first
|
258
269
|
else
|
259
|
-
return maybe_raise Errors::InvalidArityError,
|
270
|
+
return maybe_raise Errors::InvalidArityError, 'function min() expects one argument'
|
260
271
|
end
|
261
|
-
if
|
272
|
+
if values.respond_to?(:to_ary)
|
273
|
+
values = values.to_ary
|
262
274
|
return nil if values.empty?
|
263
275
|
first = values.first
|
264
276
|
first_type = get_type(first)
|
265
277
|
unless first_type == NUMBER_TYPE || first_type == STRING_TYPE
|
266
|
-
msg =
|
278
|
+
msg = String.new('function min() expects numeric or string values')
|
267
279
|
return maybe_raise Errors::InvalidTypeError, msg
|
268
280
|
end
|
269
281
|
values.inject([first, first_type]) do |(min, min_type), v|
|
@@ -271,13 +283,13 @@ module JMESPath
|
|
271
283
|
if min_type == v_type
|
272
284
|
v < min ? [v, v_type] : [min, min_type]
|
273
285
|
else
|
274
|
-
msg =
|
286
|
+
msg = String.new('function min() encountered a type mismatch in sequence: ')
|
275
287
|
msg << "#{min_type}, #{v_type}"
|
276
288
|
return maybe_raise Errors::InvalidTypeError, msg
|
277
289
|
end
|
278
290
|
end.first
|
279
291
|
else
|
280
|
-
return maybe_raise Errors::InvalidTypeError,
|
292
|
+
return maybe_raise Errors::InvalidTypeError, 'function min() expects an array'
|
281
293
|
end
|
282
294
|
end
|
283
295
|
end
|
@@ -291,7 +303,7 @@ module JMESPath
|
|
291
303
|
if args.count == 1
|
292
304
|
TYPE_NAMES[get_type(args.first)]
|
293
305
|
else
|
294
|
-
return maybe_raise Errors::InvalidArityError,
|
306
|
+
return maybe_raise Errors::InvalidArityError, 'function type() expects one argument'
|
295
307
|
end
|
296
308
|
end
|
297
309
|
end
|
@@ -302,17 +314,15 @@ module JMESPath
|
|
302
314
|
def call(args)
|
303
315
|
if args.count == 1
|
304
316
|
value = args.first
|
305
|
-
if
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
else raise NotImplementedError
|
310
|
-
end
|
317
|
+
if value.respond_to?(:to_hash)
|
318
|
+
value.to_hash.keys.map(&:to_s)
|
319
|
+
elsif value.is_a?(Struct)
|
320
|
+
value.members.map(&:to_s)
|
311
321
|
else
|
312
|
-
return maybe_raise Errors::InvalidTypeError,
|
322
|
+
return maybe_raise Errors::InvalidTypeError, 'function keys() expects a hash'
|
313
323
|
end
|
314
324
|
else
|
315
|
-
return maybe_raise Errors::InvalidArityError,
|
325
|
+
return maybe_raise Errors::InvalidArityError, 'function keys() expects one argument'
|
316
326
|
end
|
317
327
|
end
|
318
328
|
end
|
@@ -323,15 +333,17 @@ module JMESPath
|
|
323
333
|
def call(args)
|
324
334
|
if args.count == 1
|
325
335
|
value = args.first
|
326
|
-
if
|
336
|
+
if value.respond_to?(:to_hash)
|
337
|
+
value.to_hash.values
|
338
|
+
elsif value.is_a?(Struct)
|
327
339
|
value.values
|
328
|
-
elsif
|
329
|
-
value
|
340
|
+
elsif value.respond_to?(:to_ary)
|
341
|
+
value.to_ary
|
330
342
|
else
|
331
|
-
return maybe_raise Errors::InvalidTypeError,
|
343
|
+
return maybe_raise Errors::InvalidTypeError, 'function values() expects an array or a hash'
|
332
344
|
end
|
333
345
|
else
|
334
|
-
return maybe_raise Errors::InvalidArityError,
|
346
|
+
return maybe_raise Errors::InvalidArityError, 'function values() expects one argument'
|
335
347
|
end
|
336
348
|
end
|
337
349
|
end
|
@@ -343,15 +355,15 @@ module JMESPath
|
|
343
355
|
if args.count == 2
|
344
356
|
glue = args[0]
|
345
357
|
values = args[1]
|
346
|
-
if !(
|
347
|
-
return maybe_raise Errors::InvalidTypeError,
|
348
|
-
elsif
|
349
|
-
values.join(glue)
|
358
|
+
if !glue.respond_to?(:to_str)
|
359
|
+
return maybe_raise Errors::InvalidTypeError, 'function join() expects the first argument to be a string'
|
360
|
+
elsif values.respond_to?(:to_ary) && values.to_ary.all? { |v| v.respond_to?(:to_str) }
|
361
|
+
values.to_ary.join(glue)
|
350
362
|
else
|
351
|
-
return maybe_raise Errors::InvalidTypeError,
|
363
|
+
return maybe_raise Errors::InvalidTypeError, 'function join() expects values to be an array of strings'
|
352
364
|
end
|
353
365
|
else
|
354
|
-
return maybe_raise Errors::InvalidArityError,
|
366
|
+
return maybe_raise Errors::InvalidArityError, 'function join() expects an array of strings'
|
355
367
|
end
|
356
368
|
end
|
357
369
|
end
|
@@ -362,9 +374,9 @@ module JMESPath
|
|
362
374
|
def call(args)
|
363
375
|
if args.count == 1
|
364
376
|
value = args.first
|
365
|
-
|
377
|
+
value.respond_to?(:to_str) ? value.to_str : value.to_json
|
366
378
|
else
|
367
|
-
return maybe_raise Errors::InvalidArityError,
|
379
|
+
return maybe_raise Errors::InvalidArityError, 'function to_string() expects one argument'
|
368
380
|
end
|
369
381
|
end
|
370
382
|
end
|
@@ -381,7 +393,7 @@ module JMESPath
|
|
381
393
|
nil
|
382
394
|
end
|
383
395
|
else
|
384
|
-
return maybe_raise Errors::InvalidArityError,
|
396
|
+
return maybe_raise Errors::InvalidArityError, 'function to_number() expects one argument'
|
385
397
|
end
|
386
398
|
end
|
387
399
|
end
|
@@ -390,16 +402,16 @@ module JMESPath
|
|
390
402
|
FUNCTIONS['sum'] = self
|
391
403
|
|
392
404
|
def call(args)
|
393
|
-
if args.count == 1 &&
|
394
|
-
args.first.inject(0) do |sum,n|
|
405
|
+
if args.count == 1 && args.first.respond_to?(:to_ary)
|
406
|
+
args.first.to_ary.inject(0) do |sum, n|
|
395
407
|
if Numeric === n
|
396
408
|
sum + n
|
397
409
|
else
|
398
|
-
return maybe_raise Errors::InvalidTypeError,
|
410
|
+
return maybe_raise Errors::InvalidTypeError, 'function sum() expects values to be numeric'
|
399
411
|
end
|
400
412
|
end
|
401
413
|
else
|
402
|
-
return maybe_raise Errors::InvalidArityError,
|
414
|
+
return maybe_raise Errors::InvalidArityError, 'function sum() expects one argument'
|
403
415
|
end
|
404
416
|
end
|
405
417
|
end
|
@@ -411,7 +423,7 @@ module JMESPath
|
|
411
423
|
if args.count > 0
|
412
424
|
args.find { |value| !value.nil? }
|
413
425
|
else
|
414
|
-
return maybe_raise Errors::InvalidArityError,
|
426
|
+
return maybe_raise Errors::InvalidArityError, 'function not_null() expects one or more arguments'
|
415
427
|
end
|
416
428
|
end
|
417
429
|
end
|
@@ -424,29 +436,30 @@ module JMESPath
|
|
424
436
|
def call(args)
|
425
437
|
if args.count == 1
|
426
438
|
value = args.first
|
427
|
-
if
|
439
|
+
if value.respond_to?(:to_ary)
|
440
|
+
value = value.to_ary
|
428
441
|
# every element in the list must be of the same type
|
429
442
|
array_type = get_type(value[0])
|
430
|
-
if array_type == STRING_TYPE || array_type == NUMBER_TYPE || value.
|
443
|
+
if array_type == STRING_TYPE || array_type == NUMBER_TYPE || value.empty?
|
431
444
|
# stable sort
|
432
445
|
n = 0
|
433
446
|
value.sort_by do |v|
|
434
447
|
value_type = get_type(v)
|
435
448
|
if value_type != array_type
|
436
|
-
msg =
|
449
|
+
msg = 'function sort() expects values to be an array of only numbers, or only integers'
|
437
450
|
return maybe_raise Errors::InvalidTypeError, msg
|
438
451
|
end
|
439
452
|
n += 1
|
440
453
|
[v, n]
|
441
454
|
end
|
442
455
|
else
|
443
|
-
return maybe_raise Errors::InvalidTypeError,
|
456
|
+
return maybe_raise Errors::InvalidTypeError, 'function sort() expects values to be an array of numbers or integers'
|
444
457
|
end
|
445
458
|
else
|
446
|
-
return maybe_raise Errors::InvalidTypeError,
|
459
|
+
return maybe_raise Errors::InvalidTypeError, 'function sort() expects values to be an array of numbers or integers'
|
447
460
|
end
|
448
461
|
else
|
449
|
-
return maybe_raise Errors::InvalidArityError,
|
462
|
+
return maybe_raise Errors::InvalidArityError, 'function sort() expects one argument'
|
450
463
|
end
|
451
464
|
end
|
452
465
|
end
|
@@ -459,30 +472,30 @@ module JMESPath
|
|
459
472
|
def call(args)
|
460
473
|
if args.count == 2
|
461
474
|
if get_type(args[0]) == ARRAY_TYPE && get_type(args[1]) == EXPRESSION_TYPE
|
462
|
-
values = args[0]
|
475
|
+
values = args[0].to_ary
|
463
476
|
expression = args[1]
|
464
477
|
array_type = get_type(expression.eval(values[0]))
|
465
|
-
if array_type == STRING_TYPE || array_type == NUMBER_TYPE || values.
|
478
|
+
if array_type == STRING_TYPE || array_type == NUMBER_TYPE || values.empty?
|
466
479
|
# stable sort the list
|
467
480
|
n = 0
|
468
481
|
values.sort_by do |value|
|
469
482
|
value = expression.eval(value)
|
470
483
|
value_type = get_type(value)
|
471
484
|
if value_type != array_type
|
472
|
-
msg =
|
485
|
+
msg = 'function sort() expects values to be an array of only numbers, or only integers'
|
473
486
|
return maybe_raise Errors::InvalidTypeError, msg
|
474
487
|
end
|
475
488
|
n += 1
|
476
489
|
[value, n]
|
477
490
|
end
|
478
491
|
else
|
479
|
-
return maybe_raise Errors::InvalidTypeError,
|
492
|
+
return maybe_raise Errors::InvalidTypeError, 'function sort() expects values to be an array of numbers or integers'
|
480
493
|
end
|
481
494
|
else
|
482
|
-
return maybe_raise Errors::InvalidTypeError,
|
495
|
+
return maybe_raise Errors::InvalidTypeError, 'function sort_by() expects an array and an expression'
|
483
496
|
end
|
484
497
|
else
|
485
|
-
return maybe_raise Errors::InvalidArityError,
|
498
|
+
return maybe_raise Errors::InvalidArityError, 'function sort_by() expects two arguments'
|
486
499
|
end
|
487
500
|
end
|
488
501
|
end
|
@@ -495,6 +508,7 @@ module JMESPath
|
|
495
508
|
values = args[0]
|
496
509
|
expression = args[1]
|
497
510
|
if get_type(values) == ARRAY_TYPE && get_type(expression) == EXPRESSION_TYPE
|
511
|
+
values = values.to_ary
|
498
512
|
type = get_type(expression.eval(values.first))
|
499
513
|
if type != NUMBER_TYPE && type != STRING_TYPE
|
500
514
|
msg = "function #{mode}() expects values to be strings or numbers"
|
@@ -504,7 +518,7 @@ module JMESPath
|
|
504
518
|
value = expression.eval(entry)
|
505
519
|
value_type = get_type(value)
|
506
520
|
if value_type != type
|
507
|
-
msg = "function #{mode}() encountered a type mismatch in "
|
521
|
+
msg = String.new("function #{mode}() encountered a type mismatch in ")
|
508
522
|
msg << "sequence: #{type}, #{value_type}"
|
509
523
|
return maybe_raise Errors::InvalidTypeError, msg
|
510
524
|
end
|
@@ -552,16 +566,16 @@ module JMESPath
|
|
552
566
|
search_type = get_type(search)
|
553
567
|
suffix_type = get_type(suffix)
|
554
568
|
if search_type != STRING_TYPE
|
555
|
-
msg =
|
569
|
+
msg = 'function ends_with() expects first argument to be a string'
|
556
570
|
return maybe_raise Errors::InvalidTypeError, msg
|
557
571
|
end
|
558
572
|
if suffix_type != STRING_TYPE
|
559
|
-
msg =
|
573
|
+
msg = 'function ends_with() expects second argument to be a string'
|
560
574
|
return maybe_raise Errors::InvalidTypeError, msg
|
561
575
|
end
|
562
576
|
search.end_with?(suffix)
|
563
577
|
else
|
564
|
-
msg =
|
578
|
+
msg = 'function ends_with() expects two arguments'
|
565
579
|
return maybe_raise Errors::InvalidArityError, msg
|
566
580
|
end
|
567
581
|
end
|
@@ -578,16 +592,16 @@ module JMESPath
|
|
578
592
|
search_type = get_type(search)
|
579
593
|
prefix_type = get_type(prefix)
|
580
594
|
if search_type != STRING_TYPE
|
581
|
-
msg =
|
595
|
+
msg = 'function starts_with() expects first argument to be a string'
|
582
596
|
return maybe_raise Errors::InvalidTypeError, msg
|
583
597
|
end
|
584
598
|
if prefix_type != STRING_TYPE
|
585
|
-
msg =
|
599
|
+
msg = 'function starts_with() expects second argument to be a string'
|
586
600
|
return maybe_raise Errors::InvalidTypeError, msg
|
587
601
|
end
|
588
602
|
search.start_with?(prefix)
|
589
603
|
else
|
590
|
-
msg =
|
604
|
+
msg = 'function starts_with() expects two arguments'
|
591
605
|
return maybe_raise Errors::InvalidArityError, msg
|
592
606
|
end
|
593
607
|
end
|
@@ -598,7 +612,7 @@ module JMESPath
|
|
598
612
|
|
599
613
|
def call(args)
|
600
614
|
if args.count == 0
|
601
|
-
msg =
|
615
|
+
msg = 'function merge() expects 1 or more arguments'
|
602
616
|
return maybe_raise Errors::InvalidArityError, msg
|
603
617
|
end
|
604
618
|
args.inject({}) do |h, v|
|
@@ -612,14 +626,16 @@ module JMESPath
|
|
612
626
|
|
613
627
|
def call(args)
|
614
628
|
if args.count == 0
|
615
|
-
msg =
|
629
|
+
msg = 'function reverse() expects 1 or more arguments'
|
616
630
|
return maybe_raise Errors::InvalidArityError, msg
|
617
631
|
end
|
618
632
|
value = args.first
|
619
|
-
if
|
620
|
-
value.reverse
|
633
|
+
if value.respond_to?(:to_ary)
|
634
|
+
value.to_ary.reverse
|
635
|
+
elsif value.respond_to?(:to_str)
|
636
|
+
value.to_str.reverse
|
621
637
|
else
|
622
|
-
msg =
|
638
|
+
msg = 'function reverse() expects an array or string'
|
623
639
|
return maybe_raise Errors::InvalidTypeError, msg
|
624
640
|
end
|
625
641
|
end
|
@@ -630,7 +646,7 @@ module JMESPath
|
|
630
646
|
|
631
647
|
def call(args)
|
632
648
|
value = args.first
|
633
|
-
|
649
|
+
value.respond_to?(:to_ary) ? value.to_ary : [value]
|
634
650
|
end
|
635
651
|
end
|
636
652
|
end
|
data/lib/jmespath/nodes/index.rb
CHANGED
data/lib/jmespath/nodes/not.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module JMESPath
|
2
3
|
module Nodes
|
3
4
|
class Not < Node
|
4
|
-
|
5
5
|
def initialize(expression)
|
6
6
|
@expression = expression
|
7
7
|
end
|
@@ -13,7 +13,6 @@ module JMESPath
|
|
13
13
|
def optimize
|
14
14
|
self.class.new(@expression.optimize)
|
15
15
|
end
|
16
|
-
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
data/lib/jmespath/nodes/or.rb
CHANGED
data/lib/jmespath/nodes/pipe.rb
CHANGED