jsonpath 0.9.2 → 0.9.3
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/.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/
|