jsonpath 1.0.1 → 1.0.2

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 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/