jsonpath 0.7.0 → 0.7.1

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
  SHA1:
3
- metadata.gz: 0c8e5023499ffb2c83cb4eeed6d400f55f28bf8f
4
- data.tar.gz: 81cb76411fd07a5d0ce6ef227d72682de7c9c4b6
3
+ metadata.gz: 4c81ddcbb6e1a1224f9a068866f731a119a26806
4
+ data.tar.gz: 7147c3700e548741223faf65f81c570a8d3e1790
5
5
  SHA512:
6
- metadata.gz: e3475b1e4bdf85fcc9da42a353f81db379a41cc8baf01680096083ffda68a40deee85872632f1470ff94285295830e7933d8656cf59e8a4ff48cc860d89049e1
7
- data.tar.gz: 7a89006179792222b0222a599fae3ceb4548d49b73f9cd89867716f29b567547f36edd5251bd1bc9d7ddb58f0d4150f87f9860021b587b04c0cff0183b45ddb5
6
+ metadata.gz: c3d4e55012e0ab3e1b969e89bb8ac3e4450178c0954710eaf06b214a4973a796186a1cd976f6fbc211723ca7061e74f0e600650f2252d77b87c8b40109fa5494
7
+ data.tar.gz: e993c5f494bc2910728d3da43ab3e0933808a5824c7d057c23ba0fa38ce04cd72fa76898058c5c48702ae8418ead5eb898b9dbd38d643f630bcc3423992aa881
data/Gemfile CHANGED
@@ -1,2 +1,3 @@
1
1
  source "http://rubygems.org"
2
- gemspec
2
+ gemspec
3
+ gem 'simplecov', :require => false, :group => :test
data/README.md CHANGED
@@ -22,7 +22,7 @@ There is stand-alone usage through the binary `jsonpath`
22
22
 
23
23
  To use JsonPath as a library simply include and get goin'!
24
24
 
25
- ~~~~~ {ruby}
25
+ ```ruby
26
26
  require 'jsonpath'
27
27
 
28
28
  json = <<-HERE_DOC
@@ -38,94 +38,116 @@ json = <<-HERE_DOC
38
38
  }
39
39
  }
40
40
  HERE_DOC
41
- ~~~~~
41
+ ```
42
42
 
43
43
  Now that we have a JSON object, let's get all the prices present in the object. We create an object for the path
44
44
  in the following way.
45
45
 
46
- ~~~~~ {ruby}
46
+ ```ruby
47
47
  path = JsonPath.new('$..price')
48
- ~~~~~
48
+ ```
49
49
 
50
50
  Now that we have a path, let's apply it to the object above.
51
51
 
52
- ~~~~~ {ruby}
52
+ ```ruby
53
53
  path.on(json)
54
54
  # => [19.95, 8.95, 12.99, 8.99, 22.99]
55
- ~~~~~
55
+ ```
56
56
 
57
57
  Or on some other object ...
58
58
 
59
- ~~~~~ {ruby}
59
+ ```ruby
60
60
  path.on('{"books":[{"title":"A Tale of Two Somethings","price":18.88}]}')
61
61
  # => [18.88]
62
- ~~~~~
62
+ ```
63
63
 
64
64
  You can also just combine this into one mega-call with the convenient `JsonPath.on` method.
65
65
 
66
- ~~~~~ {ruby}
66
+ ```ruby
67
67
  JsonPath.on(json, '$..author')
68
68
  # => ["Nigel Rees", "Evelyn Waugh", "Herman Melville", "Tolkien"]
69
- ~~~~~
69
+ ```
70
70
 
71
71
  Of course the full JsonPath syntax is supported, such as array slices
72
72
 
73
- ~~~~~ {ruby}
73
+ ```ruby
74
74
  JsonPath.new('$..book[::2]').on(json)
75
75
  # => [
76
76
  # {"price"=>8.95, "category"=>"reference", "author"=>"Nigel Rees", "title"=>"Sayings of the Century"},
77
77
  # {"price"=>8.99, "category"=>"fiction", "author"=>"Herman Melville", "title"=>"Moby Dick", "isbn"=>"0-553-21311-3"}
78
78
  # ]
79
- ~~~~~
79
+ ```
80
80
 
81
81
  ...and evals.
82
82
 
83
- ~~~~~ {ruby}
83
+ ```ruby
84
84
  JsonPath.new('$..price[?(@ < 10)]').on(json)
85
85
  # => [8.95, 8.99]
86
- ~~~~~
86
+ ```
87
87
 
88
88
  There is a convenience method, `#first` that gives you the first element for a JSON object and path.
89
89
 
90
- ~~~~~ {ruby}
90
+ ```ruby
91
91
  JsonPath.new('$..color').first(object)
92
92
  # => "red"
93
- ~~~~~
93
+ ```
94
94
 
95
95
  As well, we can directly create an `Enumerable` at any time using `#[]`.
96
96
 
97
- ~~~~~ {ruby}
97
+ ```ruby
98
98
  enum = JsonPath.new('$..color')[object]
99
99
  # => #<JsonPath::Enumerable:...>
100
100
  enum.first
101
101
  # => "red"
102
102
  enum.any?{ |c| c == 'red' }
103
103
  # => true
104
- ~~~~~
104
+ ```
105
105
 
106
106
  You can optionally prevent eval from being called on sub-expressions by passing in :allow_eval => false to the constructor.
107
107
 
108
- ### More examples
108
+ ### More examples
109
109
 
110
110
  For more usage examples and variations on paths, please visit the tests. There are some more complex ones as well.
111
111
 
112
+ ### Conditional Operators Are Also Supported
113
+
114
+ ```ruby
115
+ def test_or_operator
116
+ assert_equal [@object['store']['book'][1], @object['store']['book'][3]], JsonPath.new("$..book[?(@['price'] == 13 || @['price'] == 23)]").on(@object)
117
+ end
118
+
119
+ def test_and_operator
120
+ assert_equal [], JsonPath.new("$..book[?(@['price'] == 13 && @['price'] == 23)]").on(@object)
121
+ end
122
+
123
+ def test_and_operator_with_more_results
124
+ assert_equal [@object['store']['book'][1]], JsonPath.new("$..book[?(@['price'] < 23 && @['price'] > 9)]").on(@object)
125
+ end
126
+ ```
127
+
128
+ ### Running an individual test
129
+
130
+ ```ruby
131
+ ruby -Ilib:../lib test/test_jsonpath.rb --name test_wildcard_on_intermediary_element_v6
132
+ ```
133
+
112
134
  ### Manipulation
113
135
 
114
136
  If you'd like to do substitution in a json object, you can use `#gsub` or `#gsub!` to modify the object in place.
115
137
 
116
- ~~~~~ {ruby}
138
+ ```ruby
117
139
  JsonPath.for('{"candy":"lollipop"}').gsub('$..candy') {|v| "big turks" }.to_hash
118
- ~~~~~
140
+ ```
119
141
 
120
142
  The result will be
121
143
 
122
- ~~~~~ {ruby}
144
+ ```ruby
123
145
  {'candy' => 'big turks'}
124
- ~~~~~
146
+ ```
125
147
 
126
148
  If you'd like to remove all nil keys, you can use `#compact` and `#compact!`. To remove all keys under a certain path, use `#delete` or `#delete!`. You can even chain these methods together as follows:
127
149
 
128
- ~~~~~ {ruby}
150
+ ```ruby
129
151
  json = '{"candy":"lollipop","noncandy":null,"other":"things"}'
130
152
  o = JsonPath.for(json).
131
153
  gsub('$..candy') {|v| "big turks" }.
@@ -133,8 +155,8 @@ o = JsonPath.for(json).
133
155
  delete('$..other').
134
156
  to_hash
135
157
  # => {"candy" => "big turks"}
136
- ~~~~~
158
+ ```
137
159
 
138
160
  # Contributions
139
161
 
140
- Please feel free to submit an Issue or a Pull Request any time you feel like you would like to contribute. Thank you!
162
+ Please feel free to submit an Issue or a Pull Request any time you feel like you would like to contribute. Thank you!
data/Rakefile CHANGED
@@ -1,3 +1,8 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter '/test/'
4
+ end
5
+
1
6
  require 'bundler'
2
7
  Bundler::GemHelper.install_tasks
3
8
 
@@ -16,7 +16,7 @@ class JsonPath
16
16
  scanner = StringScanner.new(path)
17
17
  @path = []
18
18
  until scanner.eos?
19
- if token = scanner.scan(/\$|@\B|\*|\.\./)
19
+ if token = scanner.scan(/\$\B|@\B|\*|\.\./)
20
20
  @path << token
21
21
  elsif token = scanner.scan(/[\$@a-zA-Z0-9:_-]+/)
22
22
  @path << "['#{token}']"
@@ -1,3 +1,3 @@
1
1
  class JsonPath
2
- VERSION = '0.7.0'.freeze
2
+ VERSION = '0.7.1'.freeze
3
3
  end
@@ -64,10 +64,16 @@ class TestJsonpath < MiniTest::Unit::TestCase
64
64
  assert_equal [@object['store']['book'][3]], JsonPath.new("$..book[?(@['price'] > 20)]").on(@object)
65
65
  end
66
66
 
67
- if RUBY_VERSION[/^1\.9/]
68
- def test_recognize_filters_on_val
69
- assert_equal [@object['store']['book'][1]['price'], @object['store']['book'][3]['price'], @object['store']['bicycle']['price']], JsonPath.new('$..price[?(@ > 10)]').on(@object)
70
- end
67
+ def test_or_operator
68
+ assert_equal [@object['store']['book'][1], @object['store']['book'][3]], JsonPath.new("$..book[?(@['price'] == 13 || @['price'] == 23)]").on(@object)
69
+ end
70
+
71
+ def test_and_operator
72
+ assert_equal [], JsonPath.new("$..book[?(@['price'] == 13 && @['price'] == 23)]").on(@object)
73
+ end
74
+
75
+ def test_and_operator_with_more_results
76
+ assert_equal [@object['store']['book'][1]], JsonPath.new("$..book[?(@['price'] < 23 && @['price'] > 9)]").on(@object)
71
77
  end
72
78
 
73
79
  def test_no_eval
@@ -99,7 +105,7 @@ class TestJsonpath < MiniTest::Unit::TestCase
99
105
  end
100
106
 
101
107
  def test_counting
102
- assert_equal 50, JsonPath.new('$..*').on(@object).to_a.size
108
+ assert_equal 54, JsonPath.new('$..*').on(@object).to_a.size
103
109
  end
104
110
 
105
111
  def test_space_in_path
@@ -231,6 +237,21 @@ class TestJsonpath < MiniTest::Unit::TestCase
231
237
  assert_equal [], JsonPath.new("$.data[?(@.type == 'admins')]").on(data)
232
238
  end
233
239
 
240
+ def test_support_at_sign_in_member_names
241
+ assert_equal [@object['store']['@id']], JsonPath.new("$.store.@id").on(@object)
242
+ end
243
+
244
+ def test_support_dollar_sign_in_member_names
245
+ assert_equal [@object['store']['$meta-data']],
246
+ JsonPath.new("$.store.$meta-data").on(@object)
247
+ end
248
+
249
+ def test_support_underscore_in_member_names
250
+ assert_equal [@object['store']['_links']],
251
+ JsonPath.new("$.store._links").on(@object)
252
+ end
253
+
254
+
234
255
  def example_object
235
256
  { 'store' => {
236
257
  'book' => [
@@ -278,7 +299,10 @@ class TestJsonpath < MiniTest::Unit::TestCase
278
299
  'single-speed' => 'no',
279
300
  '2seater' => 'yes',
280
301
  'make:model' => 'Zippy Sweetwheeler'
281
- }
302
+ },
303
+ "@id" => "http://example.org/store/42",
304
+ "$meta-data" => "whatevs",
305
+ "_links" => { "self" => {} }
282
306
  } }
283
307
  end
284
308
  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: 0.7.0
4
+ version: 0.7.1
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: 2017-05-02 00:00:00.000000000 Z
12
+ date: 2017-05-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json