jsonpath 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d45aa52a5d4a9500f243abaa6ff69131a7e5a8653ffacd1ff0787946774d12f3
4
- data.tar.gz: bd0903ab08210ac2e5a44a56f548104c1924f2d9a9db9d5006a51db86aafc648
3
+ metadata.gz: 7dc2dc97587acd71d6ac7b1d5a2cb178f1ee9938823ef924c12e2213adafea1a
4
+ data.tar.gz: bc9b02cbc4c0a68329c9a682ed344b544028e27ba3f63f5079824cd536192792
5
5
  SHA512:
6
- metadata.gz: 96a161911383f2c7870bd5450020aaaaceb1ea4305672f5a08493016e4fdcc5fb346001b3e8a377c16588c7bcd5adf9b0be1ef51d18b483404619324600501bb
7
- data.tar.gz: 2c824f8916a742f0e5a9201c858c683bf2df7e9c7d5e38f7b7206fc8f511f69741afb3378993f3ed7e8f396148a14596ce7b9e78f0a739d2aeafc15591a0b585
6
+ metadata.gz: a8834f4fdcd9d1a3ba41f9431297ce87b3cf8da93ef33c0f9cd69f4c3649d1948aa32de0184f00dd157497a5ef5ec459fcfdd6be8987480b337384fcbeb4bd16
7
+ data.tar.gz: 3e2370e1114d041f108804e33b409e21884d2ebf21d2745fd94b81ce054646538e2f5c4d5889109f166ce8fed1d2f522e02298608bc9e766cce163b690f88f23
data/.travis.yml CHANGED
@@ -1,7 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.6
4
- - 2.3.1
3
+ - 2.3.8
4
+ - 2.4.6
5
+ - 2.5.5
6
+ - 2.6.3
5
7
  - ruby-head
6
8
  - jruby-head
7
9
 
@@ -12,7 +12,12 @@ class JsonPath
12
12
  end
13
13
 
14
14
  def each(context = @object, key = nil, pos = 0, &blk)
15
- node = key ? context[key] : context
15
+ node =
16
+ if key
17
+ context.is_a?(Hash) || context.is_a?(Array) ? context[key] : context.__send__(key)
18
+ else
19
+ context
20
+ end
16
21
  @_current_node = node
17
22
  return yield_value(blk, context, key) if pos == @path.size
18
23
 
@@ -39,10 +44,12 @@ class JsonPath
39
44
  expr[1, expr.size - 2].split(',').each do |sub_path|
40
45
  case sub_path[0]
41
46
  when '\'', '"'
47
+ k = sub_path[1, sub_path.size - 2]
42
48
  if node.is_a?(Hash)
43
- k = sub_path[1, sub_path.size - 2]
44
49
  node[k] ||= nil if @options[:default_path_leaf_to_null]
45
50
  each(node, k, pos + 1, &blk) if node.key?(k)
51
+ elsif node.respond_to?(k.to_s)
52
+ each(node, k, pos + 1, &blk)
46
53
  end
47
54
  when '?'
48
55
  handle_question_mark(sub_path, node, pos, &blk)
@@ -53,15 +53,9 @@ class JsonPath
53
53
  scanner = StringScanner.new(exp)
54
54
  elements = []
55
55
  until scanner.eos?
56
- if scanner.scan(/\./)
57
- sym = scanner.scan(/\w+/)
58
- op = scanner.scan(/./)
59
- num = scanner.scan(/\d+/)
60
- return @_current_node.send(sym.to_sym).send(op.to_sym, num.to_i)
61
- end
62
- if t = scanner.scan(/\['[a-zA-Z@&\*\/\$%\^\?_]+'\]+/)
63
- elements << t.gsub(/\[|\]|'|\s+/, '')
64
- elsif t = scanner.scan(/(\s+)?[<>=][=~]?(\s+)?/)
56
+ if t = scanner.scan(/\['[a-zA-Z@&\*\/\$%\^\?_]+'\]|\.[a-zA-Z0-9_]+[?!]?/)
57
+ elements << t.gsub(/[\[\]'\.]|\s+/, '')
58
+ elsif t = scanner.scan(/(\s+)?[<>=!\-+][=~]?(\s+)?/)
65
59
  operator = t
66
60
  elsif t = scanner.scan(/(\s+)?'?.*'?(\s+)?/)
67
61
  # If we encounter a node which does not contain `'` it means
@@ -81,11 +75,15 @@ class JsonPath
81
75
 
82
76
  el = if elements.empty?
83
77
  @_current_node
78
+ elsif @_current_node.is_a?(Hash)
79
+ @_current_node.dig(*elements)
84
80
  else
85
- dig(elements, @_current_node)
81
+ elements.inject(@_current_node) do |agg, key|
82
+ agg.__send__(key)
83
+ end
86
84
  end
87
- return false if el.nil?
88
- return true if operator.nil? && el
85
+
86
+ return (el ? true : false) if el.nil? || operator.nil?
89
87
 
90
88
  el = Float(el) rescue el
91
89
  operand = Float(operand) rescue operand
@@ -95,16 +93,6 @@ class JsonPath
95
93
 
96
94
  private
97
95
 
98
- # @TODO: Remove this once JsonPath no longer supports ruby versions below 2.3
99
- def dig(keys, hash)
100
- return nil unless hash.is_a? Hash
101
- return nil unless hash.key?(keys.first)
102
- return hash.fetch(keys.first) if keys.size == 1
103
-
104
- prev = keys.shift
105
- dig(keys, hash.fetch(prev))
106
- end
107
-
108
96
  #  This will break down a parenthesis from the left to the right
109
97
  #  and replace the given expression with it's returned value.
110
98
  # It does this in order to make it easy to eliminate groups
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class JsonPath
4
- VERSION = '1.0.1'.freeze
4
+ VERSION = '1.0.2'.freeze
5
5
  end
@@ -70,6 +70,12 @@ class TestJsonpath < MiniTest::Unit::TestCase
70
70
  assert_equal [@object['store']['book'][0], @object['store']['book'][2]], JsonPath.new("$..book[?(@['price'] < 10)]").on(@object)
71
71
  assert_equal [@object['store']['book'][0], @object['store']['book'][2]], JsonPath.new("$..book[?(@['price'] == 9)]").on(@object)
72
72
  assert_equal [@object['store']['book'][3]], JsonPath.new("$..book[?(@['price'] > 20)]").on(@object)
73
+ assert_equal [
74
+ @object['store']['book'][0],
75
+ @object['store']['book'][4],
76
+ @object['store']['book'][5],
77
+ @object['store']['book'][6]
78
+ ], JsonPath.new("$..book[?(@['category'] != 'fiction')]").on(@object)
73
79
  end
74
80
 
75
81
  def test_or_operator
@@ -113,6 +119,25 @@ class TestJsonpath < MiniTest::Unit::TestCase
113
119
  assert_equal [@object['store']['bicycle']['2seater']], JsonPath.new('$.store.bicycle.2seater').on(@object)
114
120
  end
115
121
 
122
+ def test_recognized_dot_notation_in_filters
123
+ assert_equal [@object['store']['book'][2], @object['store']['book'][3]], JsonPath.new('$..book[?(@.isbn)]').on(@object)
124
+ end
125
+
126
+ def test_works_on_non_hash
127
+ klass = Struct.new(:a, :b)
128
+ object = klass.new('some', 'value')
129
+
130
+ assert_equal ['value'], JsonPath.new('$.b').on(object)
131
+ end
132
+
133
+ def test_works_on_non_hash_with_filters
134
+ klass = Struct.new(:a, :b)
135
+ first_object = klass.new('some', 'value')
136
+ second_object = klass.new('next', 'other value')
137
+
138
+ assert_equal ['other value'], JsonPath.new('$[?(@.a == "next")].b').on([first_object, second_object])
139
+ end
140
+
116
141
  def test_recognize_array_with_evald_index
117
142
  assert_equal [@object['store']['book'][2]], JsonPath.new('$..book[(@.length-5)]').on(@object)
118
143
  end
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: 1.0.1
4
+ version: 1.0.2
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: 2019-01-25 00:00:00.000000000 Z
12
+ date: 2019-05-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -158,8 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  requirements: []
161
- rubyforge_project: jsonpath
162
- rubygems_version: 2.7.8
161
+ rubygems_version: 3.0.2
163
162
  signing_key:
164
163
  specification_version: 4
165
164
  summary: Ruby implementation of http://goessner.net/articles/JsonPath/