jsonpath 0.9.2 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +112 -0
- data/.travis.yml +1 -0
- data/Gemfile +5 -2
- data/Rakefile +10 -1
- data/bin/jsonpath +1 -0
- data/jsonpath.gemspec +7 -6
- data/lib/jsonpath.rb +4 -2
- data/lib/jsonpath/enumerable.rb +20 -13
- data/lib/jsonpath/parser.rb +16 -14
- data/lib/jsonpath/proxy.rb +2 -0
- data/lib/jsonpath/version.rb +3 -1
- data/test/test_jsonpath.rb +134 -88
- data/test/test_jsonpath_bin.rb +2 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '048116fe74d7b281fbcf58d8f5d1aa44c359267bf179e58376527032e58c0094'
|
4
|
+
data.tar.gz: 4d91c8953e2750322d486f372b165507c4f383a42c11d07987cc49630abea5b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb899c515175b16b0f9c1001ae7525f14d086b4bf844779cef819c9e634511445c0ee1aa033c7e51c9419aa1de1e22ae8e4670e7fbaa162b27d5c819ebef0846
|
7
|
+
data.tar.gz: d303bb0188617e52133250571c43c0262b02cd1f586edb2d05683f30e6e26e17dfaeb81a3a62e40c4b838374e9b9354fbf012d03591fa7fb465549ff9148ddd8
|
data/.rubocop.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2018-07-07 21:29:45 +0200 using RuboCop version 0.57.2.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 15
|
10
|
+
# Configuration parameters: AllowSafeAssignment.
|
11
|
+
Lint/AssignmentInCondition:
|
12
|
+
Exclude:
|
13
|
+
- 'lib/jsonpath.rb'
|
14
|
+
- 'lib/jsonpath/parser.rb'
|
15
|
+
|
16
|
+
# Offense count: 1
|
17
|
+
Lint/IneffectiveAccessModifier:
|
18
|
+
Exclude:
|
19
|
+
- 'lib/jsonpath.rb'
|
20
|
+
|
21
|
+
# Offense count: 16
|
22
|
+
Metrics/AbcSize:
|
23
|
+
Max: 54
|
24
|
+
|
25
|
+
# Offense count: 2
|
26
|
+
# Configuration parameters: CountComments, ExcludedMethods.
|
27
|
+
Metrics/BlockLength:
|
28
|
+
Max: 33
|
29
|
+
|
30
|
+
# Offense count: 1
|
31
|
+
# Configuration parameters: CountBlocks.
|
32
|
+
Metrics/BlockNesting:
|
33
|
+
Max: 4
|
34
|
+
|
35
|
+
# Offense count: 2
|
36
|
+
# Configuration parameters: CountComments.
|
37
|
+
Metrics/ClassLength:
|
38
|
+
Max: 578
|
39
|
+
|
40
|
+
# Offense count: 6
|
41
|
+
Metrics/CyclomaticComplexity:
|
42
|
+
Max: 18
|
43
|
+
|
44
|
+
# Offense count: 24
|
45
|
+
# Configuration parameters: CountComments.
|
46
|
+
Metrics/MethodLength:
|
47
|
+
Max: 52
|
48
|
+
|
49
|
+
# Offense count: 1
|
50
|
+
# Configuration parameters: CountKeywordArgs.
|
51
|
+
Metrics/ParameterLists:
|
52
|
+
Max: 6
|
53
|
+
|
54
|
+
# Offense count: 6
|
55
|
+
Metrics/PerceivedComplexity:
|
56
|
+
Max: 20
|
57
|
+
|
58
|
+
# Offense count: 1
|
59
|
+
# Configuration parameters: AllowedChars.
|
60
|
+
Style/AsciiComments:
|
61
|
+
Exclude:
|
62
|
+
- 'lib/jsonpath/parser.rb'
|
63
|
+
|
64
|
+
# Offense count: 2
|
65
|
+
Style/Documentation:
|
66
|
+
Exclude:
|
67
|
+
- 'spec/**/*'
|
68
|
+
- 'test/**/*'
|
69
|
+
- 'lib/jsonpath/enumerable.rb'
|
70
|
+
- 'lib/jsonpath/proxy.rb'
|
71
|
+
|
72
|
+
# Offense count: 1
|
73
|
+
# Configuration parameters: MinBodyLength.
|
74
|
+
Style/GuardClause:
|
75
|
+
Exclude:
|
76
|
+
- 'lib/jsonpath/enumerable.rb'
|
77
|
+
|
78
|
+
# Offense count: 2
|
79
|
+
# Cop supports --auto-correct.
|
80
|
+
Style/IfUnlessModifier:
|
81
|
+
Exclude:
|
82
|
+
- 'lib/jsonpath/enumerable.rb'
|
83
|
+
|
84
|
+
# Offense count: 2
|
85
|
+
# Cop supports --auto-correct.
|
86
|
+
# Configuration parameters: AutoCorrect, EnforcedStyle.
|
87
|
+
# SupportedStyles: predicate, comparison
|
88
|
+
Style/NumericPredicate:
|
89
|
+
Exclude:
|
90
|
+
- 'spec/**/*'
|
91
|
+
- 'lib/jsonpath/enumerable.rb'
|
92
|
+
|
93
|
+
# Offense count: 2
|
94
|
+
# Cop supports --auto-correct.
|
95
|
+
# Configuration parameters: EnforcedStyle, AllowInnerSlashes.
|
96
|
+
# SupportedStyles: slashes, percent_r, mixed
|
97
|
+
Style/RegexpLiteral:
|
98
|
+
Exclude:
|
99
|
+
- 'lib/jsonpath/parser.rb'
|
100
|
+
|
101
|
+
# Offense count: 3
|
102
|
+
# Cop supports --auto-correct.
|
103
|
+
Style/RescueModifier:
|
104
|
+
Exclude:
|
105
|
+
- 'lib/jsonpath/enumerable.rb'
|
106
|
+
- 'lib/jsonpath/parser.rb'
|
107
|
+
|
108
|
+
# Offense count: 71
|
109
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
110
|
+
# URISchemes: http, https
|
111
|
+
Metrics/LineLength:
|
112
|
+
Max: 175
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
desc 'run rubocop'
|
4
|
+
task(:rubocop) do
|
5
|
+
require 'rubocop'
|
6
|
+
cli = RuboCop::CLI.new
|
7
|
+
cli.run
|
8
|
+
end
|
9
|
+
|
1
10
|
require 'simplecov'
|
2
11
|
SimpleCov.start do
|
3
12
|
add_filter '/test/'
|
@@ -11,4 +20,4 @@ task :test do
|
|
11
20
|
Dir['./test/**/test_*.rb'].each { |test| require test }
|
12
21
|
end
|
13
22
|
|
14
|
-
task default:
|
23
|
+
task default: %i[test rubocop]
|
data/bin/jsonpath
CHANGED
data/jsonpath.gemspec
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require File.join(File.dirname(__FILE__), 'lib', 'jsonpath', 'version')
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'jsonpath'
|
7
7
|
s.version = JsonPath::VERSION
|
8
|
-
s.required_rubygems_version
|
9
|
-
|
8
|
+
if s.respond_to? :required_rubygems_version=
|
9
|
+
s.required_rubygems_version =
|
10
|
+
Gem::Requirement.new('>= 0')
|
11
|
+
end
|
10
12
|
s.authors = ['Joshua Hull', 'Gergely Brautigam']
|
11
13
|
s.summary = 'Ruby implementation of http://goessner.net/articles/JsonPath/'
|
12
14
|
s.description = 'Ruby implementation of http://goessner.net/articles/JsonPath/.'
|
@@ -25,10 +27,9 @@ Gem::Specification.new do |s|
|
|
25
27
|
# dependencies
|
26
28
|
s.add_runtime_dependency 'multi_json'
|
27
29
|
s.add_runtime_dependency 'to_regexp', '~> 0.2.1'
|
30
|
+
s.add_development_dependency 'bundler'
|
28
31
|
s.add_development_dependency 'code_stats'
|
29
|
-
s.add_development_dependency 'rake'
|
30
32
|
s.add_development_dependency 'minitest', '~> 2.2.0'
|
31
33
|
s.add_development_dependency 'phocus'
|
32
|
-
s.add_development_dependency '
|
34
|
+
s.add_development_dependency 'rake'
|
33
35
|
end
|
34
|
-
|
data/lib/jsonpath.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'strscan'
|
2
4
|
require 'multi_json'
|
3
5
|
require 'jsonpath/proxy'
|
@@ -8,7 +10,7 @@ require 'jsonpath/parser'
|
|
8
10
|
# JsonPath: initializes the class with a given JsonPath and parses that path
|
9
11
|
# into a token array.
|
10
12
|
class JsonPath
|
11
|
-
PATH_ALL = '$..*'
|
13
|
+
PATH_ALL = '$..*'
|
12
14
|
|
13
15
|
attr_accessor :path
|
14
16
|
|
@@ -73,7 +75,7 @@ class JsonPath
|
|
73
75
|
JsonPath::Enumerable.new(self, self.class.process_object(obj_or_str), mode,
|
74
76
|
@opts)
|
75
77
|
end
|
76
|
-
|
78
|
+
alias [] enum_on
|
77
79
|
|
78
80
|
def self.on(obj_or_str, path, opts = {})
|
79
81
|
new(path, opts).on(process_object(obj_or_str))
|
data/lib/jsonpath/enumerable.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class JsonPath
|
2
4
|
class Enumerable
|
3
5
|
include ::Enumerable
|
@@ -32,7 +34,7 @@ class JsonPath
|
|
32
34
|
|
33
35
|
private
|
34
36
|
|
35
|
-
def handle_wildecard(node, expr,
|
37
|
+
def handle_wildecard(node, expr, _context, _key, pos, &blk)
|
36
38
|
expr[1, expr.size - 2].split(',').each do |sub_path|
|
37
39
|
case sub_path[0]
|
38
40
|
when '\'', '"'
|
@@ -60,27 +62,32 @@ class JsonPath
|
|
60
62
|
end_idx %= node.size
|
61
63
|
step = process_function_or_literal(array_args[2], 1)
|
62
64
|
next unless step
|
63
|
-
|
65
|
+
if @mode == :delete
|
66
|
+
(start_idx..end_idx).step(step) { |i| node[i] = nil }
|
67
|
+
node.compact!
|
68
|
+
else
|
69
|
+
(start_idx..end_idx).step(step) { |i| each(node, i, pos + 1, &blk) }
|
70
|
+
end
|
64
71
|
end
|
65
72
|
end
|
66
73
|
end
|
67
74
|
|
68
75
|
def handle_question_mark(sub_path, node, pos, &blk)
|
69
76
|
case node
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
if process_function_or_literal(sub_path[1, sub_path.size - 1])
|
76
|
-
each(@_current_node, nil, pos + 1, &blk)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
when Hash
|
77
|
+
when Array
|
78
|
+
node.size.times do |index|
|
79
|
+
@_current_node = node[index]
|
80
|
+
# exps = sub_path[1, sub_path.size - 1]
|
81
|
+
# if @_current_node.send("[#{exps.gsub(/@/, '@_current_node')}]")
|
80
82
|
if process_function_or_literal(sub_path[1, sub_path.size - 1])
|
81
83
|
each(@_current_node, nil, pos + 1, &blk)
|
82
84
|
end
|
83
|
-
|
85
|
+
end
|
86
|
+
when Hash
|
87
|
+
if process_function_or_literal(sub_path[1, sub_path.size - 1])
|
88
|
+
each(@_current_node, nil, pos + 1, &blk)
|
89
|
+
end
|
90
|
+
else
|
84
91
|
yield node if process_function_or_literal(sub_path[1, sub_path.size - 1])
|
85
92
|
end
|
86
93
|
end
|
data/lib/jsonpath/parser.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'strscan'
|
2
4
|
require 'to_regexp'
|
3
5
|
|
@@ -23,7 +25,7 @@ class JsonPath
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def parse_exp(exp)
|
26
|
-
exp = exp.sub(/@/, '').gsub(/^\(/, '').gsub(/\)$/, '').
|
28
|
+
exp = exp.sub(/@/, '').gsub(/^\(/, '').gsub(/\)$/, '').tr('"', '\'').strip
|
27
29
|
scanner = StringScanner.new(exp)
|
28
30
|
elements = []
|
29
31
|
until scanner.eos?
|
@@ -39,25 +41,25 @@ class JsonPath
|
|
39
41
|
operator = t
|
40
42
|
elsif t = scanner.scan(/(\s+)?'?.*'?(\s+)?/)
|
41
43
|
# If we encounter a node which does not contain `'` it means
|
42
|
-
#
|
43
|
-
if t ==
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
# that we are dealing with a boolean type.
|
45
|
+
operand = if t == 'true'
|
46
|
+
true
|
47
|
+
elsif t == 'false'
|
48
|
+
false
|
49
|
+
else
|
50
|
+
operator.strip == '=~' ? t.to_regexp : t.delete("'").strip
|
51
|
+
end
|
50
52
|
elsif t = scanner.scan(/\/\w+\//)
|
51
53
|
elsif t = scanner.scan(/.*/)
|
52
54
|
raise "Could not process symbol: #{t}"
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
56
|
-
if elements.empty?
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
el = if elements.empty?
|
59
|
+
@_current_node
|
60
|
+
else
|
61
|
+
dig(elements, @_current_node)
|
62
|
+
end
|
61
63
|
return false if el.nil?
|
62
64
|
return true if operator.nil? && el
|
63
65
|
|
data/lib/jsonpath/proxy.rb
CHANGED
data/lib/jsonpath/version.rb
CHANGED
data/test/test_jsonpath.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'minitest/autorun'
|
2
4
|
require 'phocus'
|
3
5
|
require 'jsonpath'
|
@@ -250,17 +252,17 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
250
252
|
end
|
251
253
|
|
252
254
|
def test_support_at_sign_in_member_names
|
253
|
-
assert_equal [@object['store']['@id']], JsonPath.new(
|
255
|
+
assert_equal [@object['store']['@id']], JsonPath.new('$.store.@id').on(@object)
|
254
256
|
end
|
255
257
|
|
256
258
|
def test_support_dollar_sign_in_member_names
|
257
259
|
assert_equal [@object['store']['$meta-data']],
|
258
|
-
|
260
|
+
JsonPath.new('$.store.$meta-data').on(@object)
|
259
261
|
end
|
260
262
|
|
261
263
|
def test_support_underscore_in_member_names
|
262
264
|
assert_equal [@object['store']['_links']],
|
263
|
-
|
265
|
+
JsonPath.new('$.store._links').on(@object)
|
264
266
|
end
|
265
267
|
|
266
268
|
def test_dig_return_string
|
@@ -271,12 +273,12 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
271
273
|
def test_slash_in_value
|
272
274
|
data = {
|
273
275
|
'data' => [{
|
274
|
-
'type' => 'mps/awesome'
|
275
|
-
},{
|
276
|
-
'type' => 'not'
|
276
|
+
'type' => 'mps/awesome'
|
277
|
+
}, {
|
278
|
+
'type' => 'not'
|
277
279
|
}]
|
278
280
|
}
|
279
|
-
assert_equal [{ 'type' => 'mps/awesome' }], JsonPath.new(
|
281
|
+
assert_equal [{ 'type' => 'mps/awesome' }], JsonPath.new('$.data[?(@.type == "mps/awesome")]').on(data)
|
280
282
|
end
|
281
283
|
|
282
284
|
def test_floating_point_with_precision_marker
|
@@ -285,7 +287,7 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
285
287
|
'type' => 0.00001
|
286
288
|
}
|
287
289
|
}
|
288
|
-
assert_equal [{
|
290
|
+
assert_equal [{ 'type' => 0.00001 }], JsonPath.new('$.data[?(@.type == 0.00001)]').on(data)
|
289
291
|
end
|
290
292
|
|
291
293
|
def test_digits_only_string
|
@@ -295,7 +297,7 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
295
297
|
'id' => '123'
|
296
298
|
}
|
297
299
|
}
|
298
|
-
assert_equal([{
|
300
|
+
assert_equal([{ 'type' => 'users', 'id' => '123' }], JsonPath.new("$.foo[?(@.id == '123')]").on(data))
|
299
301
|
end
|
300
302
|
|
301
303
|
def test_digits_only_string_in_array
|
@@ -303,55 +305,55 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
303
305
|
'foo' => [{
|
304
306
|
'type' => 'users',
|
305
307
|
'id' => '123'
|
306
|
-
},{
|
308
|
+
}, {
|
307
309
|
'type' => 'users',
|
308
310
|
'id' => '321'
|
309
311
|
}]
|
310
312
|
}
|
311
|
-
assert_equal([{
|
313
|
+
assert_equal([{ 'type' => 'users', 'id' => '123' }], JsonPath.new("$.foo[?(@.id == '123')]").on(data))
|
312
314
|
end
|
313
315
|
|
314
316
|
def test_at_in_filter
|
315
317
|
jsonld = {
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
318
|
+
'mentions' => [
|
319
|
+
{
|
320
|
+
'name' => 'Delimara Powerplant',
|
321
|
+
'identifier' => 'krzana://took/powerstation/Delimara Powerplant',
|
322
|
+
'@type' => 'Place',
|
323
|
+
'geo' => {
|
324
|
+
'latitude' => 35.83020073454,
|
325
|
+
'longitude' => 14.55602645874
|
326
|
+
}
|
327
|
+
}
|
326
328
|
]
|
327
|
-
|
328
|
-
|
329
|
+
}
|
330
|
+
assert_equal(['Place'], JsonPath.new("$..mentions[?(@['@type'] == 'Place')].@type").on(jsonld))
|
329
331
|
end
|
330
332
|
|
331
333
|
def test_dollar_in_filter
|
332
334
|
jsonld = {
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
335
|
+
'mentions' => [
|
336
|
+
{
|
337
|
+
'name' => 'Delimara Powerplant',
|
338
|
+
'identifier' => 'krzana://took/powerstation/Delimara Powerplant',
|
339
|
+
'$type' => 'Place',
|
340
|
+
'geo' => {
|
341
|
+
'latitude' => 35.83020073454,
|
342
|
+
'longitude' => 14.55602645874
|
343
|
+
}
|
344
|
+
}
|
343
345
|
]
|
344
|
-
|
345
|
-
|
346
|
+
}
|
347
|
+
assert_equal(['Place'], JsonPath.new("$..mentions[?(@['$type'] == 'Place')].$type").on(jsonld))
|
346
348
|
end
|
347
349
|
|
348
350
|
def test_underscore_in_filter
|
349
351
|
jsonld = {
|
350
|
-
|
352
|
+
'attributes' => [
|
351
353
|
{
|
352
|
-
|
353
|
-
|
354
|
-
|
354
|
+
'store' => [
|
355
|
+
{ 'with' => 'urn' },
|
356
|
+
{ 'with_underscore' => 'urn:1' }
|
355
357
|
]
|
356
358
|
}
|
357
359
|
]
|
@@ -361,18 +363,18 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
361
363
|
|
362
364
|
def test_at_in_value
|
363
365
|
jsonld = {
|
364
|
-
|
366
|
+
'mentions' =>
|
365
367
|
{
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
368
|
+
'name' => 'Delimara Powerplant',
|
369
|
+
'identifier' => 'krzana://took/powerstation/Delimara Powerplant',
|
370
|
+
'type' => '@Place',
|
371
|
+
'geo' => {
|
372
|
+
'latitude' => 35.83020073454,
|
373
|
+
'longitude' => 14.55602645874
|
374
|
+
}
|
373
375
|
}
|
374
|
-
|
375
|
-
|
376
|
+
}
|
377
|
+
assert_equal(['@Place'], JsonPath.new("$..mentions.type[?(@ == '@Place')]").on(jsonld))
|
376
378
|
end
|
377
379
|
|
378
380
|
def test_parens_in_value
|
@@ -381,21 +383,20 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
381
383
|
'number' => '(492) 080-3961'
|
382
384
|
}
|
383
385
|
}
|
384
|
-
assert_equal [{'number'=>'(492) 080-3961'}], JsonPath.new("$.data[?(@.number == '(492) 080-3961')]").on(data)
|
386
|
+
assert_equal [{ 'number' => '(492) 080-3961' }], JsonPath.new("$.data[?(@.number == '(492) 080-3961')]").on(data)
|
385
387
|
end
|
386
388
|
|
387
|
-
|
388
389
|
def test_boolean_parameter_value
|
389
390
|
data = {
|
390
391
|
'data' => [{
|
391
392
|
'isTrue' => true,
|
392
|
-
'name' => 'testname1'
|
393
|
-
},{
|
393
|
+
'name' => 'testname1'
|
394
|
+
}, {
|
394
395
|
'isTrue' => false,
|
395
|
-
'name' => 'testname2'
|
396
|
-
|
396
|
+
'name' => 'testname2'
|
397
|
+
}]
|
397
398
|
}
|
398
|
-
assert_equal [{
|
399
|
+
assert_equal [{ 'isTrue' => true, 'name' => 'testname1' }], JsonPath.new('$.data[?(@.isTrue)]').on(data)
|
399
400
|
end
|
400
401
|
|
401
402
|
def test_regex
|
@@ -404,9 +405,9 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
404
405
|
@object['store']['book'][2],
|
405
406
|
@object['store']['book'][4],
|
406
407
|
@object['store']['book'][5],
|
407
|
-
@object['store']['book'][6]
|
408
|
+
@object['store']['book'][6]
|
408
409
|
], JsonPath.new('$..book[?(@.author =~ /herman|lukyanenko/i)]').on(@object)
|
409
|
-
assert_equal [
|
410
|
+
assert_equal %w[asdf asdf2], JsonPath.new('$.store.book..tags[?(@ =~ /asdf/)]').on(@object)
|
410
411
|
end
|
411
412
|
|
412
413
|
def test_regression_1
|
@@ -444,7 +445,7 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
444
445
|
]
|
445
446
|
}.to_json
|
446
447
|
|
447
|
-
assert_equal 'C09C5GYHF', JsonPath.on(json,
|
448
|
+
assert_equal 'C09C5GYHF', JsonPath.on(json, '$..channels[?(@.is_archived == false)].id')[0]
|
448
449
|
end
|
449
450
|
|
450
451
|
def test_regression_3
|
@@ -464,7 +465,7 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
464
465
|
]
|
465
466
|
}.to_json
|
466
467
|
|
467
|
-
assert_equal 'C09C598QL', JsonPath.on(json,
|
468
|
+
assert_equal 'C09C598QL', JsonPath.on(json, '$..channels[?(@.is_archived)].id')[0]
|
468
469
|
end
|
469
470
|
|
470
471
|
def test_regression_4
|
@@ -509,26 +510,26 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
509
510
|
|
510
511
|
def test_changed
|
511
512
|
json =
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
513
|
+
{
|
514
|
+
'snapshot' => {
|
515
|
+
'objects' => {
|
516
|
+
'whatever' => [
|
517
|
+
{
|
518
|
+
'column' => {
|
519
|
+
'name' => 'ASSOCIATE_FLAG',
|
520
|
+
'nullable' => true
|
521
|
+
}
|
522
|
+
},
|
523
|
+
{
|
524
|
+
'column' => {
|
525
|
+
'name' => 'AUTHOR',
|
526
|
+
'nullable' => false
|
527
|
+
}
|
526
528
|
}
|
527
|
-
|
528
|
-
|
529
|
+
]
|
530
|
+
}
|
529
531
|
}
|
530
532
|
}
|
531
|
-
}
|
532
533
|
assert_equal true, JsonPath.on(json, "$..column[?(@.name == 'ASSOCIATE_FLAG')].nullable")[0]
|
533
534
|
end
|
534
535
|
|
@@ -537,30 +538,75 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
537
538
|
initial: true,
|
538
539
|
not: true
|
539
540
|
}.to_json
|
540
|
-
assert_equal [{
|
541
|
+
assert_equal [{ 'initial' => true, 'not' => true }], JsonPath.on(json, '$.[?(@.initial == true)]')
|
541
542
|
json = {
|
542
543
|
initial: false,
|
543
544
|
not: true
|
544
545
|
}.to_json
|
545
|
-
assert_equal [], JsonPath.on(json,
|
546
|
-
assert_equal [], JsonPath.on(json,
|
547
|
-
assert_equal [{
|
546
|
+
assert_equal [], JsonPath.on(json, '$.initial[?(@)]')
|
547
|
+
assert_equal [], JsonPath.on(json, '$.[?(@.initial == true)]')
|
548
|
+
assert_equal [{ 'initial' => false, 'not' => true }], JsonPath.on(json, '$.[?(@.initial == false)]')
|
548
549
|
json = {
|
549
550
|
initial: 'false',
|
550
551
|
not: true
|
551
552
|
}.to_json
|
552
|
-
assert_equal [{
|
553
|
-
assert_equal [], JsonPath.on(json,
|
553
|
+
assert_equal [{ 'initial' => 'false', 'not' => true }], JsonPath.on(json, "$.[?(@.initial == 'false')]")
|
554
|
+
assert_equal [], JsonPath.on(json, '$.[?(@.initial == false)]')
|
554
555
|
end
|
555
556
|
|
556
557
|
def test_hanging
|
557
558
|
json = { initial: true }.to_json
|
558
|
-
success_path =
|
559
|
+
success_path = '$.initial'
|
559
560
|
assert_equal [true], JsonPath.on(json, success_path)
|
560
561
|
broken_path = "$.initial\n"
|
561
562
|
assert_equal [true], JsonPath.on(json, broken_path)
|
562
563
|
end
|
563
564
|
|
565
|
+
def test_delete_more_items
|
566
|
+
a = { 'itemList' =>
|
567
|
+
[{ 'alfa' => 'beta1' },
|
568
|
+
{ 'alfa' => 'beta2' },
|
569
|
+
{ 'alfa' => 'beta3' },
|
570
|
+
{ 'alfa' => 'beta4' },
|
571
|
+
{ 'alfa' => 'beta5' },
|
572
|
+
{ 'alfa' => 'beta6' },
|
573
|
+
{ 'alfa' => 'beta7' },
|
574
|
+
{ 'alfa' => 'beta8' },
|
575
|
+
{ 'alfa' => 'beta9' },
|
576
|
+
{ 'alfa' => 'beta10' },
|
577
|
+
{ 'alfa' => 'beta11' },
|
578
|
+
{ 'alfa' => 'beta12' }] }
|
579
|
+
expected = { 'itemList' => [{ 'alfa' => 'beta1' }] }
|
580
|
+
assert_equal expected, JsonPath.for(a.to_json).delete('$.itemList[1:11:1]').to_hash
|
581
|
+
end
|
582
|
+
|
583
|
+
def test_delete_more_items_with_stepping
|
584
|
+
a = { 'itemList' =>
|
585
|
+
[{ 'alfa' => 'beta1' },
|
586
|
+
{ 'alfa' => 'beta2' },
|
587
|
+
{ 'alfa' => 'beta3' },
|
588
|
+
{ 'alfa' => 'beta4' },
|
589
|
+
{ 'alfa' => 'beta5' },
|
590
|
+
{ 'alfa' => 'beta6' },
|
591
|
+
{ 'alfa' => 'beta7' },
|
592
|
+
{ 'alfa' => 'beta8' },
|
593
|
+
{ 'alfa' => 'beta9' },
|
594
|
+
{ 'alfa' => 'beta10' },
|
595
|
+
{ 'alfa' => 'beta11' },
|
596
|
+
{ 'alfa' => 'beta12' }] }
|
597
|
+
expected = { 'itemList' =>
|
598
|
+
[{ 'alfa' => 'beta1' },
|
599
|
+
{ 'alfa' => 'beta3' },
|
600
|
+
{ 'alfa' => 'beta5' },
|
601
|
+
{ 'alfa' => 'beta7' },
|
602
|
+
{ 'alfa' => 'beta8' },
|
603
|
+
{ 'alfa' => 'beta9' },
|
604
|
+
{ 'alfa' => 'beta10' },
|
605
|
+
{ 'alfa' => 'beta11' },
|
606
|
+
{ 'alfa' => 'beta12' }] }
|
607
|
+
assert_equal expected, JsonPath.for(a.to_json).delete('$.itemList[1:6:2]').to_hash
|
608
|
+
end
|
609
|
+
|
564
610
|
def example_object
|
565
611
|
{ 'store' => {
|
566
612
|
'book' => [
|
@@ -568,7 +614,7 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
568
614
|
'author' => 'Nigel Rees',
|
569
615
|
'title' => 'Sayings of the Century',
|
570
616
|
'price' => 9,
|
571
|
-
'tags' => [
|
617
|
+
'tags' => %w[asdf asdf2] },
|
572
618
|
{ 'category' => 'fiction',
|
573
619
|
'author' => 'Evelyn Waugh',
|
574
620
|
'title' => 'Sword of Honour',
|
@@ -610,9 +656,9 @@ class TestJsonpath < MiniTest::Unit::TestCase
|
|
610
656
|
'2seater' => 'yes',
|
611
657
|
'make:model' => 'Zippy Sweetwheeler'
|
612
658
|
},
|
613
|
-
|
614
|
-
|
615
|
-
|
659
|
+
'@id' => 'http://example.org/store/42',
|
660
|
+
'$meta-data' => 'whatevs',
|
661
|
+
'_links' => { 'self' => {} }
|
616
662
|
} }
|
617
663
|
end
|
618
664
|
end
|
data/test/test_jsonpath_bin.rb
CHANGED
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.9.
|
4
|
+
version: 0.9.3
|
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-
|
12
|
+
date: 2018-07-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: 0.2.1
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: bundler
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - ">="
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: code_stats
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - ">="
|
@@ -96,7 +96,7 @@ dependencies:
|
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
|
-
name:
|
99
|
+
name: rake
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
102
|
- - ">="
|
@@ -122,6 +122,8 @@ files:
|
|
122
122
|
- ".gemtest"
|
123
123
|
- ".gitignore"
|
124
124
|
- ".rspec"
|
125
|
+
- ".rubocop.yml"
|
126
|
+
- ".rubocop_todo.yml"
|
125
127
|
- ".travis.yml"
|
126
128
|
- Gemfile
|
127
129
|
- LICENSE.md
|
@@ -157,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
157
159
|
version: '0'
|
158
160
|
requirements: []
|
159
161
|
rubyforge_project: jsonpath
|
160
|
-
rubygems_version: 2.
|
162
|
+
rubygems_version: 2.7.3
|
161
163
|
signing_key:
|
162
164
|
specification_version: 4
|
163
165
|
summary: Ruby implementation of http://goessner.net/articles/JsonPath/
|