burtpath 1.1.0 → 1.1.1
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/jmespath/errors.rb +2 -2
- data/lib/jmespath/nodes/function.rb +54 -46
- data/lib/jmespath/nodes/slice.rb +2 -2
- data/lib/jmespath/parser.rb +2 -1
- data/lib/jmespath/runtime.rb +6 -1
- data/lib/jmespath/version.rb +1 -1
- data/lib/jmespath.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f0fad9f7110671a046e39df22effa1b65ac8644
|
4
|
+
data.tar.gz: 0855479643813db91c37eadc33bb43cd16789c65
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d165fe70830ff20c9f453bbce8f6a1af849bd010fe5ce2421c9650b715f4db97a038ff8e1279549ea7b30db54e9f852d73eee1a3b73ccd6fb23840715fc5c9f3
|
7
|
+
data.tar.gz: b2647b7e414c3a9f32b6444a2663feb802f0819769de492ddf83710f93a46a16f6a390b57c22546b814b1d337d5507d99e45fe0d268fc2ca5a7fa0a3a4336c86
|
data/lib/jmespath/errors.rb
CHANGED
@@ -4,13 +4,15 @@ module JMESPath
|
|
4
4
|
class Function < Node
|
5
5
|
FUNCTIONS = {}
|
6
6
|
|
7
|
-
def initialize(children)
|
7
|
+
def initialize(children, options = {})
|
8
8
|
@children = children
|
9
|
+
@options = options
|
10
|
+
@disable_visit_errors = @options[:disable_visit_errors]
|
9
11
|
end
|
10
12
|
|
11
|
-
def self.create(name, children)
|
13
|
+
def self.create(name, children, options = {})
|
12
14
|
if (type = FUNCTIONS[name])
|
13
|
-
type.new(children)
|
15
|
+
type.new(children, options)
|
14
16
|
else
|
15
17
|
raise Errors::UnknownFunctionError, "unknown function #{name}()"
|
16
18
|
end
|
@@ -21,7 +23,7 @@ module JMESPath
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def optimize
|
24
|
-
self.class.new(@children.map(&:optimize))
|
26
|
+
self.class.new(@children.map(&:optimize), @options)
|
25
27
|
end
|
26
28
|
|
27
29
|
class FunctionName
|
@@ -34,6 +36,12 @@ module JMESPath
|
|
34
36
|
|
35
37
|
private
|
36
38
|
|
39
|
+
def maybe_raise(error_type, message)
|
40
|
+
unless @disable_visit_errors
|
41
|
+
raise error_type, message
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
37
45
|
def call(args)
|
38
46
|
nil
|
39
47
|
end
|
@@ -78,12 +86,12 @@ module JMESPath
|
|
78
86
|
if args.count == 1
|
79
87
|
value = args.first
|
80
88
|
else
|
81
|
-
|
89
|
+
return maybe_raise Errors::InvalidArityError, "function abs() expects one argument"
|
82
90
|
end
|
83
91
|
if Numeric === value
|
84
92
|
value.abs
|
85
93
|
else
|
86
|
-
|
94
|
+
return maybe_raise Errors::InvalidTypeError, "function abs() expects a number"
|
87
95
|
end
|
88
96
|
end
|
89
97
|
end
|
@@ -95,18 +103,18 @@ module JMESPath
|
|
95
103
|
if args.count == 1
|
96
104
|
values = args.first
|
97
105
|
else
|
98
|
-
|
106
|
+
return maybe_raise Errors::InvalidArityError, "function avg() expects one argument"
|
99
107
|
end
|
100
108
|
if Array === values
|
101
109
|
values.inject(0) do |total,n|
|
102
110
|
if Numeric === n
|
103
111
|
total + n
|
104
112
|
else
|
105
|
-
|
113
|
+
return maybe_raise Errors::InvalidTypeError, "function avg() expects numeric values"
|
106
114
|
end
|
107
115
|
end / values.size.to_f
|
108
116
|
else
|
109
|
-
|
117
|
+
return maybe_raise Errors::InvalidTypeError, "function avg() expects a number"
|
110
118
|
end
|
111
119
|
end
|
112
120
|
end
|
@@ -118,12 +126,12 @@ module JMESPath
|
|
118
126
|
if args.count == 1
|
119
127
|
value = args.first
|
120
128
|
else
|
121
|
-
|
129
|
+
return maybe_raise Errors::InvalidArityError, "function ceil() expects one argument"
|
122
130
|
end
|
123
131
|
if Numeric === value
|
124
132
|
value.ceil
|
125
133
|
else
|
126
|
-
|
134
|
+
return maybe_raise Errors::InvalidTypeError, "function ceil() expects a numeric value"
|
127
135
|
end
|
128
136
|
end
|
129
137
|
end
|
@@ -138,10 +146,10 @@ module JMESPath
|
|
138
146
|
if String === haystack || Array === haystack
|
139
147
|
haystack.include?(needle)
|
140
148
|
else
|
141
|
-
|
149
|
+
return maybe_raise Errors::InvalidTypeError, "contains expects 2nd arg to be a list"
|
142
150
|
end
|
143
151
|
else
|
144
|
-
|
152
|
+
return maybe_raise Errors::InvalidArityError, "function contains() expects 2 arguments"
|
145
153
|
end
|
146
154
|
end
|
147
155
|
end
|
@@ -153,12 +161,12 @@ module JMESPath
|
|
153
161
|
if args.count == 1
|
154
162
|
value = args.first
|
155
163
|
else
|
156
|
-
|
164
|
+
return maybe_raise Errors::InvalidArityError, "function floor() expects one argument"
|
157
165
|
end
|
158
166
|
if Numeric === value
|
159
167
|
value.floor
|
160
168
|
else
|
161
|
-
|
169
|
+
return maybe_raise Errors::InvalidTypeError, "function floor() expects a numeric value"
|
162
170
|
end
|
163
171
|
end
|
164
172
|
end
|
@@ -170,11 +178,11 @@ module JMESPath
|
|
170
178
|
if args.count == 1
|
171
179
|
value = args.first
|
172
180
|
else
|
173
|
-
|
181
|
+
return maybe_raise Errors::InvalidArityError, "function length() expects one argument"
|
174
182
|
end
|
175
183
|
case value
|
176
184
|
when Hash, Array, String then value.size
|
177
|
-
else
|
185
|
+
else return maybe_raise Errors::InvalidTypeError, "function length() expects string, array or object"
|
178
186
|
end
|
179
187
|
end
|
180
188
|
end
|
@@ -186,18 +194,18 @@ module JMESPath
|
|
186
194
|
if args.count == 1
|
187
195
|
values = args.first
|
188
196
|
else
|
189
|
-
|
197
|
+
return maybe_raise Errors::InvalidArityError, "function max() expects one argument"
|
190
198
|
end
|
191
199
|
if Array === values
|
192
200
|
values.inject(values.first) do |max, v|
|
193
201
|
if Numeric === v
|
194
202
|
v > max ? v : max
|
195
203
|
else
|
196
|
-
|
204
|
+
return maybe_raise Errors::InvalidTypeError, "function max() expects numeric values"
|
197
205
|
end
|
198
206
|
end
|
199
207
|
else
|
200
|
-
|
208
|
+
return maybe_raise Errors::InvalidTypeError, "function max() expects an array"
|
201
209
|
end
|
202
210
|
end
|
203
211
|
end
|
@@ -209,18 +217,18 @@ module JMESPath
|
|
209
217
|
if args.count == 1
|
210
218
|
values = args.first
|
211
219
|
else
|
212
|
-
|
220
|
+
return maybe_raise Errors::InvalidArityError, "function min() expects one argument"
|
213
221
|
end
|
214
222
|
if Array === values
|
215
223
|
values.inject(values.first) do |min, v|
|
216
224
|
if Numeric === v
|
217
225
|
v < min ? v : min
|
218
226
|
else
|
219
|
-
|
227
|
+
return maybe_raise Errors::InvalidTypeError, "function min() expects numeric values"
|
220
228
|
end
|
221
229
|
end
|
222
230
|
else
|
223
|
-
|
231
|
+
return maybe_raise Errors::InvalidTypeError, "function min() expects an array"
|
224
232
|
end
|
225
233
|
end
|
226
234
|
end
|
@@ -234,7 +242,7 @@ module JMESPath
|
|
234
242
|
if args.count == 1
|
235
243
|
TYPE_NAMES[get_type(args.first)]
|
236
244
|
else
|
237
|
-
|
245
|
+
return maybe_raise Errors::InvalidArityError, "function type() expects one argument"
|
238
246
|
end
|
239
247
|
end
|
240
248
|
end
|
@@ -252,10 +260,10 @@ module JMESPath
|
|
252
260
|
else raise NotImplementedError
|
253
261
|
end
|
254
262
|
else
|
255
|
-
|
263
|
+
return maybe_raise Errors::InvalidTypeError, "function keys() expects a hash"
|
256
264
|
end
|
257
265
|
else
|
258
|
-
|
266
|
+
return maybe_raise Errors::InvalidArityError, "function keys() expects one argument"
|
259
267
|
end
|
260
268
|
end
|
261
269
|
end
|
@@ -271,10 +279,10 @@ module JMESPath
|
|
271
279
|
elsif Array === value
|
272
280
|
value
|
273
281
|
else
|
274
|
-
|
282
|
+
return maybe_raise Errors::InvalidTypeError, "function values() expects an array or a hash"
|
275
283
|
end
|
276
284
|
else
|
277
|
-
|
285
|
+
return maybe_raise Errors::InvalidArityError, "function values() expects one argument"
|
278
286
|
end
|
279
287
|
end
|
280
288
|
end
|
@@ -287,14 +295,14 @@ module JMESPath
|
|
287
295
|
glue = args[0]
|
288
296
|
values = args[1]
|
289
297
|
if !(String === glue)
|
290
|
-
|
298
|
+
return maybe_raise Errors::InvalidTypeError, "function join() expects the first argument to be a string"
|
291
299
|
elsif Array === values && values.all? { |v| String === v }
|
292
300
|
values.join(glue)
|
293
301
|
else
|
294
|
-
|
302
|
+
return maybe_raise Errors::InvalidTypeError, "function join() expects values to be an array of strings"
|
295
303
|
end
|
296
304
|
else
|
297
|
-
|
305
|
+
return maybe_raise Errors::InvalidArityError, "function join() expects an array of strings"
|
298
306
|
end
|
299
307
|
end
|
300
308
|
end
|
@@ -305,9 +313,9 @@ module JMESPath
|
|
305
313
|
def call(args)
|
306
314
|
if args.count == 1
|
307
315
|
value = args.first
|
308
|
-
String === value ? value :
|
316
|
+
String === value ? value : JSON.dump(value)
|
309
317
|
else
|
310
|
-
|
318
|
+
return maybe_raise Errors::InvalidArityError, "function to_string() expects one argument"
|
311
319
|
end
|
312
320
|
end
|
313
321
|
end
|
@@ -324,7 +332,7 @@ module JMESPath
|
|
324
332
|
nil
|
325
333
|
end
|
326
334
|
else
|
327
|
-
|
335
|
+
return maybe_raise Errors::InvalidArityError, "function to_number() expects one argument"
|
328
336
|
end
|
329
337
|
end
|
330
338
|
end
|
@@ -338,11 +346,11 @@ module JMESPath
|
|
338
346
|
if Numeric === n
|
339
347
|
sum + n
|
340
348
|
else
|
341
|
-
|
349
|
+
return maybe_raise Errors::InvalidTypeError, "function sum() expects values to be numeric"
|
342
350
|
end
|
343
351
|
end
|
344
352
|
else
|
345
|
-
|
353
|
+
return maybe_raise Errors::InvalidArityError, "function sum() expects one argument"
|
346
354
|
end
|
347
355
|
end
|
348
356
|
end
|
@@ -354,7 +362,7 @@ module JMESPath
|
|
354
362
|
if args.count > 0
|
355
363
|
args.find { |value| !value.nil? }
|
356
364
|
else
|
357
|
-
|
365
|
+
return maybe_raise Errors::InvalidArityError, "function not_null() expects one or more arguments"
|
358
366
|
end
|
359
367
|
end
|
360
368
|
end
|
@@ -374,14 +382,14 @@ module JMESPath
|
|
374
382
|
if (a_type == STRING_TYPE || a_type == NUMBER_TYPE) && a_type == b_type
|
375
383
|
a <=> b
|
376
384
|
else
|
377
|
-
|
385
|
+
return maybe_raise Errors::InvalidTypeError, "function sort() expects values to be an array of numbers or integers"
|
378
386
|
end
|
379
387
|
end
|
380
388
|
else
|
381
|
-
|
389
|
+
return maybe_raise Errors::InvalidTypeError, "function sort() expects values to be an array of numbers or integers"
|
382
390
|
end
|
383
391
|
else
|
384
|
-
|
392
|
+
return maybe_raise Errors::InvalidArityError, "function sort() expects one argument"
|
385
393
|
end
|
386
394
|
end
|
387
395
|
end
|
@@ -404,14 +412,14 @@ module JMESPath
|
|
404
412
|
if (a_type == STRING_TYPE || a_type == NUMBER_TYPE) && a_type == b_type
|
405
413
|
a_value <=> b_value
|
406
414
|
else
|
407
|
-
|
415
|
+
return maybe_raise Errors::InvalidTypeError, "function sort() expects values to be an array of numbers or integers"
|
408
416
|
end
|
409
417
|
end
|
410
418
|
else
|
411
|
-
|
419
|
+
return maybe_raise Errors::InvalidTypeError, "function sort_by() expects an array and an expression"
|
412
420
|
end
|
413
421
|
else
|
414
|
-
|
422
|
+
return maybe_raise Errors::InvalidArityError, "function sort_by() expects two arguments"
|
415
423
|
end
|
416
424
|
end
|
417
425
|
end
|
@@ -429,14 +437,14 @@ module JMESPath
|
|
429
437
|
if get_type(value) == NUMBER_TYPE
|
430
438
|
value
|
431
439
|
else
|
432
|
-
|
440
|
+
return maybe_raise Errors::InvalidTypeError, "function #{mode}() expects values to be an numbers"
|
433
441
|
end
|
434
442
|
end
|
435
443
|
else
|
436
|
-
|
444
|
+
return maybe_raise Errors::InvalidTypeError, "function #{mode}() expects an array and an expression"
|
437
445
|
end
|
438
446
|
else
|
439
|
-
|
447
|
+
return maybe_raise Errors::InvalidArityError, "function #{mode}() expects two arguments"
|
440
448
|
end
|
441
449
|
end
|
442
450
|
end
|
data/lib/jmespath/nodes/slice.rb
CHANGED
@@ -6,11 +6,13 @@ module JMESPath
|
|
6
6
|
@start = start
|
7
7
|
@stop = stop
|
8
8
|
@step = step
|
9
|
+
raise Errors::InvalidValueError.new('slice step cannot be 0') if @step == 0
|
9
10
|
end
|
10
11
|
|
11
12
|
def visit(value)
|
12
13
|
if String === value || Array === value
|
13
14
|
start, stop, step = adjust_slice(value.size, @start, @stop, @step)
|
15
|
+
return unless start && stop && step
|
14
16
|
result = []
|
15
17
|
if step > 0
|
16
18
|
i = start
|
@@ -44,8 +46,6 @@ module JMESPath
|
|
44
46
|
def adjust_slice(length, start, stop, step)
|
45
47
|
if step.nil?
|
46
48
|
step = 1
|
47
|
-
elsif step == 0
|
48
|
-
raise Errors::RuntimeError, 'slice step cannot be 0'
|
49
49
|
end
|
50
50
|
|
51
51
|
if start.nil?
|
data/lib/jmespath/parser.rb
CHANGED
@@ -20,6 +20,7 @@ module JMESPath
|
|
20
20
|
# @option options [Lexer] :lexer
|
21
21
|
def initialize(options = {})
|
22
22
|
@lexer = options[:lexer] || Lexer.new()
|
23
|
+
@disable_visit_errors = options[:disable_visit_errors]
|
23
24
|
end
|
24
25
|
|
25
26
|
# @param [String<JMESPath>] expression
|
@@ -188,7 +189,7 @@ module JMESPath
|
|
188
189
|
end
|
189
190
|
end
|
190
191
|
stream.next
|
191
|
-
Nodes::Function.create(name, args)
|
192
|
+
Nodes::Function.create(name, args, :disable_visit_errors => @disable_visit_errors)
|
192
193
|
end
|
193
194
|
|
194
195
|
def led_or(stream, left)
|
data/lib/jmespath/runtime.rb
CHANGED
@@ -49,6 +49,11 @@ module JMESPath
|
|
49
49
|
# searches, so it's highly recommended if you're using the same expression
|
50
50
|
# multiple times and have not disabled caching. Defaults to `true`.
|
51
51
|
#
|
52
|
+
# @option options [Boolean] :disable_visit_errors (false) When `true`,
|
53
|
+
# no errors will be raised during runtime processing. Parse errors
|
54
|
+
# will still be raised, but unexpected data sent to visit will
|
55
|
+
# result in nil being returned.
|
56
|
+
#
|
52
57
|
# @option options [Parser] :parser
|
53
58
|
#
|
54
59
|
def initialize(options = {})
|
@@ -68,7 +73,7 @@ module JMESPath
|
|
68
73
|
private
|
69
74
|
|
70
75
|
def create_parser(options)
|
71
|
-
parser = Parser.new
|
76
|
+
parser = Parser.new(:disable_visit_errors => !!options[:disable_visit_errors])
|
72
77
|
unless options[:optimize_expression] == false
|
73
78
|
parser = OptimizingParser.new(parser)
|
74
79
|
end
|
data/lib/jmespath/version.rb
CHANGED
data/lib/jmespath.rb
CHANGED
@@ -23,14 +23,14 @@ module JMESPath
|
|
23
23
|
# @param [Hash] data
|
24
24
|
# @return [Mixed,nil] Returns the matched values. Returns `nil` if the
|
25
25
|
# expression does not resolve inside `data`.
|
26
|
-
def search(expression, data)
|
26
|
+
def search(expression, data, runtime_options = {})
|
27
27
|
data = case data
|
28
28
|
when Hash, Struct then data # check for most common case first
|
29
29
|
when Pathname then load_json(data)
|
30
30
|
when IO, StringIO then JSON.load(data.read)
|
31
31
|
else data
|
32
32
|
end
|
33
|
-
Runtime.new.search(expression, data)
|
33
|
+
Runtime.new(runtime_options).search(expression, data)
|
34
34
|
end
|
35
35
|
|
36
36
|
# @api private
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: burtpath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Trevor Rowe
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-09-
|
12
|
+
date: 2015-09-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|