jsonpath 0.8.12 → 0.9.0
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/jsonpath/enumerable.rb +9 -14
- data/lib/jsonpath/parser.rb +6 -3
- data/lib/jsonpath/version.rb +1 -1
- data/test/test_jsonpath.rb +42 -7
- 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: 02b522c0db894285a626b8e1d6d44a95140d5a03
|
4
|
+
data.tar.gz: 1f4176316390136b0d229627bf3965f4b4ae1c44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f4e322af2377394c35ca7fa5fb03f3f3df63ed815eb064d33c6a4e96064ad872a3fc58a3462ecffa4f733d7444d484abb4a454e4b0bb75dbea1cce0f3ad57be
|
7
|
+
data.tar.gz: 72110c129177b94eb9572bc4dd288dfe6bd8025f00db6c71ef4b384b0122f9ba6d373c7305fce7c6e477b50a524fc2b921c33bd95eb01877c752758a074d7378
|
data/lib/jsonpath/enumerable.rb
CHANGED
@@ -36,13 +36,14 @@ class JsonPath
|
|
36
36
|
expr[1, expr.size - 2].split(',').each do |sub_path|
|
37
37
|
case sub_path[0]
|
38
38
|
when '\'', '"'
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
if node.is_a?(Hash)
|
40
|
+
k = sub_path[1, sub_path.size - 2]
|
41
|
+
each(node, k, pos + 1, &blk) if node.key?(k)
|
42
|
+
end
|
42
43
|
when '?'
|
43
44
|
handle_question_mark(sub_path, node, pos, &blk)
|
44
45
|
else
|
45
|
-
next
|
46
|
+
next if node.is_a?(Array) && node.empty?
|
46
47
|
array_args = sub_path.split(':')
|
47
48
|
if array_args[0] == '*'
|
48
49
|
start_idx = 0
|
@@ -65,19 +66,13 @@ class JsonPath
|
|
65
66
|
|
66
67
|
def handle_question_mark(sub_path, node, pos, &blk)
|
67
68
|
case node
|
68
|
-
when Array
|
69
|
-
node.size.
|
70
|
-
@_current_node = node[
|
71
|
-
# exps = sub_path[1, sub_path.size - 1]
|
72
|
-
# if @_current_node.send("[#{exps.gsub(/@/, '@_current_node')}]")
|
69
|
+
when Hash, Array
|
70
|
+
(node.is_a?(Hash) ? node.keys : (0..node.size)).each do |e|
|
71
|
+
@_current_node = node[e]
|
73
72
|
if process_function_or_literal(sub_path[1, sub_path.size - 1])
|
74
73
|
each(@_current_node, nil, pos + 1, &blk)
|
75
74
|
end
|
76
75
|
end
|
77
|
-
when Hash
|
78
|
-
if process_function_or_literal(sub_path[1, sub_path.size - 1])
|
79
|
-
each(@_current_node, nil, pos + 1, &blk)
|
80
|
-
end
|
81
76
|
else
|
82
77
|
yield node if process_function_or_literal(sub_path[1, sub_path.size - 1])
|
83
78
|
end
|
@@ -111,7 +106,7 @@ class JsonPath
|
|
111
106
|
return nil unless @_current_node
|
112
107
|
|
113
108
|
identifiers = /@?((?<!\d)\.(?!\d)(\w+))+/.match(exp)
|
114
|
-
|
109
|
+
if !identifiers.nil? && !@_current_node.methods.include?(identifiers[2].to_sym)
|
115
110
|
exp_to_eval = exp.dup
|
116
111
|
exp_to_eval[identifiers[0]] = identifiers[0].split('.').map do |el|
|
117
112
|
el == '@' ? '@' : "['#{el}']"
|
data/lib/jsonpath/parser.rb
CHANGED
@@ -46,14 +46,17 @@ class JsonPath
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
|
49
|
+
if elements.empty?
|
50
|
+
el = @_current_node
|
51
|
+
else
|
52
|
+
el = dig(elements, @_current_node)
|
53
|
+
end
|
50
54
|
return false if el.nil?
|
51
55
|
return true if operator.nil? && el
|
52
56
|
|
53
57
|
el = Float(el) rescue el
|
54
58
|
operand = Float(operand) rescue operand
|
55
59
|
operand = false if operand == 'false' && el == false
|
56
|
-
|
57
60
|
el.send(operator.strip, operand)
|
58
61
|
end
|
59
62
|
|
@@ -61,7 +64,7 @@ class JsonPath
|
|
61
64
|
|
62
65
|
# @TODO: Remove this once JsonPath no longer supports ruby versions below 2.3
|
63
66
|
def dig(keys, hash)
|
64
|
-
return
|
67
|
+
return nil unless hash.is_a? Hash
|
65
68
|
return nil unless hash.key?(keys.first)
|
66
69
|
return hash.fetch(keys.first) if keys.size == 1
|
67
70
|
prev = keys.shift
|
data/lib/jsonpath/version.rb
CHANGED
data/test/test_jsonpath.rb
CHANGED
@@ -245,8 +245,8 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
245
245
|
'id' => '123'
|
246
246
|
}
|
247
247
|
}
|
248
|
-
assert_equal [{ 'type' => 'users', 'id' => '123' }], JsonPath.new("$.
|
249
|
-
assert_equal [], JsonPath.new("$.
|
248
|
+
assert_equal [{ 'type' => 'users', 'id' => '123' }], JsonPath.new("$.[?(@.type == 'users')]").on(data)
|
249
|
+
assert_equal [], JsonPath.new("$.[?(@.type == 'admins')]").on(data)
|
250
250
|
end
|
251
251
|
|
252
252
|
def test_support_at_sign_in_member_names
|
@@ -270,9 +270,11 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
270
270
|
|
271
271
|
def test_slash_in_value
|
272
272
|
data = {
|
273
|
-
'data' => {
|
274
|
-
'type' => 'mps/awesome'
|
275
|
-
}
|
273
|
+
'data' => [{
|
274
|
+
'type' => 'mps/awesome',
|
275
|
+
},{
|
276
|
+
'type' => 'not',
|
277
|
+
}]
|
276
278
|
}
|
277
279
|
assert_equal [{ 'type' => 'mps/awesome' }], JsonPath.new("$.data[?(@.type == \"mps/awesome\")]").on(data)
|
278
280
|
end
|
@@ -283,7 +285,7 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
283
285
|
'type' => 0.00001
|
284
286
|
}
|
285
287
|
}
|
286
|
-
assert_equal [{"type"=>0.00001}], JsonPath.new("$.
|
288
|
+
assert_equal [{"type"=>0.00001}], JsonPath.new("$.[?(@.type == 0.00001)]").on(data)
|
287
289
|
end
|
288
290
|
|
289
291
|
def test_digits_only_string
|
@@ -293,6 +295,19 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
293
295
|
'id' => '123'
|
294
296
|
}
|
295
297
|
}
|
298
|
+
assert_equal([{"type"=>"users", "id"=>"123"}], JsonPath.new("$.[?(@.id == '123')]").on(data))
|
299
|
+
end
|
300
|
+
|
301
|
+
def test_digits_only_string_in_array
|
302
|
+
data = {
|
303
|
+
'foo' => [{
|
304
|
+
'type' => 'users',
|
305
|
+
'id' => '123'
|
306
|
+
},{
|
307
|
+
'type' => 'users',
|
308
|
+
'id' => '321'
|
309
|
+
}]
|
310
|
+
}
|
296
311
|
assert_equal([{"type"=>"users", "id"=>"123"}], JsonPath.new("$.foo[?(@.id == '123')]").on(data))
|
297
312
|
end
|
298
313
|
|
@@ -366,7 +381,7 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
366
381
|
'number' => '(492) 080-3961'
|
367
382
|
}
|
368
383
|
}
|
369
|
-
assert_equal [{'number'=>'(492) 080-3961'}], JsonPath.new("$.
|
384
|
+
assert_equal [{'number'=>'(492) 080-3961'}], JsonPath.new("$.[?(@.number == '(492) 080-3961')]").on(data)
|
370
385
|
end
|
371
386
|
|
372
387
|
|
@@ -452,6 +467,26 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
452
467
|
assert_equal 'C09C598QL', JsonPath.on(json, "$..channels[?(@.is_archived)].id")[0]
|
453
468
|
end
|
454
469
|
|
470
|
+
def test_regression_4
|
471
|
+
json = {
|
472
|
+
ok: true,
|
473
|
+
channels: [
|
474
|
+
{
|
475
|
+
id: 'C09C5GYHF',
|
476
|
+
name: 'general',
|
477
|
+
is_archived: false
|
478
|
+
},
|
479
|
+
{
|
480
|
+
id: 'C09C598QL',
|
481
|
+
name: 'random',
|
482
|
+
is_archived: true
|
483
|
+
}
|
484
|
+
]
|
485
|
+
}.to_json
|
486
|
+
|
487
|
+
assert_equal ['C09C5GYHF'], JsonPath.on(json, "$..[?(@.name == 'general')].id")
|
488
|
+
end
|
489
|
+
|
455
490
|
def test_regression_5
|
456
491
|
json = {
|
457
492
|
ok: true,
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonpath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Hull
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-05-
|
12
|
+
date: 2018-05-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|