jsonpath 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -13,7 +13,8 @@ There is stand-alone usage through the binary `jsonpath`
13
13
 
14
14
  As well, you can include it as a library.
15
15
 
16
- object = JSON.parse(<<-HERE_DOC))
16
+ ~~~~~ {ruby}
17
+ object = JSON.parse(<<-HERE_DOC)
17
18
  {"store":
18
19
  {"bicycle":
19
20
  {"price":19.95, "color":"red"},
@@ -27,11 +28,21 @@ As well, you can include it as a library.
27
28
  }
28
29
  HERE_DOC
29
30
 
30
- JsonPath.new('$..price').on(object).to_a
31
+ JsonPath.new('$..price').on(object)
31
32
  # => [19.95, 8.95, 12.99, 8.99, 22.99]
32
33
 
33
- JsonPath.new('$..author').on(object).to_a
34
+ JsonPath.on(object, '$..author')
34
35
  # => ["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"]
35
36
 
36
- JsonPath.new('$..book[::2]').on(object).to_a
37
+ JsonPath.new('$..book[::2]').on(object)
37
38
  # => [{"price"=>8.95, "category"=>"reference", "author"=>"Nigel Rees", "title"=>"Sayings of the Century"}, {"price"=>8.99, "category"=>"fiction", "author"=>"Herman Melville", "title"=>"Moby Dick", "isbn"=>"0-553-21311-3"}]
39
+
40
+ JsonPath.new('$..color').first(object)
41
+ # => "red"
42
+
43
+ # Lazy enumeration - only needs to find the first two matches
44
+ JsonPath.new('$..price').enum_on(object).each do |match|
45
+ break price if price < 15.0
46
+ end
47
+ # => 8.95
48
+ ~~~~~
data/Rakefile CHANGED
@@ -1,16 +1,18 @@
1
- require 'bundler'
2
- Bundler::GemHelper.install_tasks
3
-
4
- require 'rake/rdoctask'
5
- desc "Generate documentation"
6
- Rake::RDocTask.new do |rd|
7
- rd.main = "README.rdoc"
8
- rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
9
- rd.rdoc_dir = 'rdoc'
10
- end
11
-
12
- require 'rspec/core/rake_task'
13
- RSpec::Core::RakeTask.new(:spec)
14
-
15
- task :default => :spec
16
- task :test => :spec
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/rdoctask'
5
+ desc "Generate documentation"
6
+ Rake::RDocTask.new do |rd|
7
+ rd.main = "README.rdoc"
8
+ rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
9
+ rd.rdoc_dir = 'rdoc'
10
+ end
11
+
12
+ task :test do
13
+ $: << 'lib'
14
+ require 'minitest/autorun'
15
+ require 'phocus'
16
+ require 'jsonpath'
17
+ Dir['./test/**/test_*.rb'].each { |test| require test }
18
+ end
data/jsonpath.gemspec CHANGED
@@ -18,12 +18,14 @@ Gem::Specification.new do |s|
18
18
  s.rubygems_version = %q{1.3.7}
19
19
  s.test_files = `git ls-files`.split("\n").select{|f| f =~ /^spec/}
20
20
  s.rubyforge_project = 'jsonpath'
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
22
 
22
23
  # dependencies
23
24
  s.add_runtime_dependency 'json'
24
25
  s.add_development_dependency 'code_stats'
25
26
  s.add_development_dependency 'rake'
26
- s.add_development_dependency 'rspec', '~> 2.5.0'
27
- s.add_development_dependency 'bundler', '~> 1.0.0'
27
+ s.add_development_dependency 'minitest', '~> 2.2.0'
28
+ s.add_development_dependency 'phocus'
29
+ s.add_development_dependency 'bundler', '~> 1.0.10'
28
30
  end
29
31
 
@@ -1,3 +1,3 @@
1
1
  class JsonPath
2
- VERSION = '0.3.1'
2
+ VERSION = '0.3.2'
3
3
  end
@@ -0,0 +1,101 @@
1
+ class TestJsonpath < MiniTest::Unit::TestCase
2
+
3
+ def setup
4
+ @object = { "store"=> {
5
+ "book" => [
6
+ { "category"=> "reference",
7
+ "author"=> "Nigel Rees",
8
+ "title"=> "Sayings of the Century",
9
+ "price"=> 8.95
10
+ },
11
+ { "category"=> "fiction",
12
+ "author"=> "Evelyn Waugh",
13
+ "title"=> "Sword of Honour",
14
+ "price"=> 12.99
15
+ },
16
+ { "category"=> "fiction",
17
+ "author"=> "Herman Melville",
18
+ "title"=> "Moby Dick",
19
+ "isbn"=> "0-553-21311-3",
20
+ "price"=> 8.99
21
+ },
22
+ { "category"=> "fiction",
23
+ "author"=> "J. R. R. Tolkien",
24
+ "title"=> "The Lord of the Rings",
25
+ "isbn"=> "0-395-19395-8",
26
+ "price"=> 22.99
27
+ }
28
+ ],
29
+ "bicycle"=> {
30
+ "color"=> "red",
31
+ "price"=> 19.95,
32
+ "catalogue_number" => 12345,
33
+ } } }
34
+ end
35
+
36
+ def test_lookup_direct_path
37
+ assert_equal 4, JsonPath.new('$.store.*').on(@object).to_a.first['book'].size
38
+ end
39
+
40
+ def test_retrieve_all_authors
41
+ assert_equal [
42
+ @object['store']['book'][0]['author'],
43
+ @object['store']['book'][1]['author'],
44
+ @object['store']['book'][2]['author'],
45
+ @object['store']['book'][3]['author']
46
+ ], JsonPath.new('$..author').on(@object)
47
+ end
48
+
49
+ def test_retrieve_all_prices
50
+ assert_equal [
51
+ @object['store']['bicycle']['price'],
52
+ @object['store']['book'][0]['price'],
53
+ @object['store']['book'][1]['price'],
54
+ @object['store']['book'][2]['price'],
55
+ @object['store']['book'][3]['price']
56
+ ].sort, JsonPath.new('$..price').on(@object).sort
57
+ end
58
+
59
+ def test_recognize_array_splices
60
+ assert_equal [@object['store']['book'][0], @object['store']['book'][1]], JsonPath.new('$..book[0:1:1]').on(@object)
61
+ assert_equal [@object['store']['book'][1], @object['store']['book'][3]], JsonPath.new('$..book[1::2]').on(@object)
62
+ assert_equal [@object['store']['book'][0], @object['store']['book'][2]], JsonPath.new('$..book[::2]').on(@object)
63
+ assert_equal [@object['store']['book'][0], @object['store']['book'][2]], JsonPath.new('$..book[:-2:2]').on(@object)
64
+ assert_equal [@object['store']['book'][2], @object['store']['book'][3]], JsonPath.new('$..book[2::]').on(@object)
65
+ end
66
+
67
+ def test_recognize_array_comma
68
+ assert_equal [@object['store']['book'][0], @object['store']['book'][1]], JsonPath.new('$..book[0,1]').on(@object)
69
+ assert_equal [@object['store']['book'][2], @object['store']['book'][3]], JsonPath.new('$..book[2,-1::]').on(@object)
70
+ end
71
+
72
+ def test_recognize_filters
73
+ assert_equal [@object['store']['book'][2], @object['store']['book'][3]], JsonPath.new("$..book[?(@['isbn'])]").on(@object)
74
+ assert_equal [@object['store']['book'][0], @object['store']['book'][2]], JsonPath.new("$..book[?(@['price'] < 10)]").on(@object)
75
+ end
76
+
77
+ def test_paths_with_underscores
78
+ assert_equal [@object['store']['bicycle']['catalogue_number']], JsonPath.new('$.store.bicycle.catalogue_number').on(@object)
79
+ end
80
+
81
+ def test_recognize_array_with_evald_index
82
+ assert_equal [@object['store']['book'][2]], JsonPath.new('$..book[(@.length-2)]').on(@object)
83
+ end
84
+
85
+ def test_use_first
86
+ assert_equal @object['store']['book'][2], JsonPath.new('$..book[(@.length-2)]').first(@object)
87
+ end
88
+
89
+ def test_counting
90
+ assert_equal 29, JsonPath.new('$..*').on(@object).to_a.size
91
+ end
92
+
93
+ def test_space_in_path
94
+ assert_equal ['e'], JsonPath.new("$.'c d'").on({"a" => "a","b" => "b", "c d" => "e"})
95
+ end
96
+
97
+ def test_class_method
98
+ assert_equal JsonPath.new('$..author').on(@object), JsonPath.on(@object, '$..author')
99
+ end
100
+
101
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonpath
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 1
10
- version: 0.3.1
9
+ - 2
10
+ version: 0.3.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joshua Hull
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-06 00:00:00 -07:00
18
+ date: 2011-06-07 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -61,41 +61,55 @@ dependencies:
61
61
  type: :development
62
62
  version_requirements: *id003
63
63
  - !ruby/object:Gem::Dependency
64
- name: rspec
64
+ name: minitest
65
65
  prerelease: false
66
66
  requirement: &id004 !ruby/object:Gem::Requirement
67
67
  none: false
68
68
  requirements:
69
69
  - - ~>
70
70
  - !ruby/object:Gem::Version
71
- hash: 27
71
+ hash: 7
72
72
  segments:
73
73
  - 2
74
- - 5
74
+ - 2
75
75
  - 0
76
- version: 2.5.0
76
+ version: 2.2.0
77
77
  type: :development
78
78
  version_requirements: *id004
79
79
  - !ruby/object:Gem::Dependency
80
- name: bundler
80
+ name: phocus
81
81
  prerelease: false
82
82
  requirement: &id005 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ type: :development
92
+ version_requirements: *id005
93
+ - !ruby/object:Gem::Dependency
94
+ name: bundler
95
+ prerelease: false
96
+ requirement: &id006 !ruby/object:Gem::Requirement
83
97
  none: false
84
98
  requirements:
85
99
  - - ~>
86
100
  - !ruby/object:Gem::Version
87
- hash: 23
101
+ hash: 3
88
102
  segments:
89
103
  - 1
90
104
  - 0
91
- - 0
92
- version: 1.0.0
105
+ - 10
106
+ version: 1.0.10
93
107
  type: :development
94
- version_requirements: *id005
108
+ version_requirements: *id006
95
109
  description: Ruby implementation of http://goessner.net/articles/JsonPath/.
96
110
  email: joshbuddy@gmail.com
97
- executables: []
98
-
111
+ executables:
112
+ - jsonpath
99
113
  extensions: []
100
114
 
101
115
  extra_rdoc_files:
@@ -112,8 +126,7 @@ files:
112
126
  - lib/jsonpath.rb
113
127
  - lib/jsonpath/enumerable.rb
114
128
  - lib/jsonpath/version.rb
115
- - spec/jsonpath_spec.rb
116
- - spec/spec_helper.rb
129
+ - test/test_jsonpath.rb
117
130
  has_rdoc: true
118
131
  homepage: http://github.com/joshbuddy/jsonpath
119
132
  licenses: []
@@ -148,6 +161,5 @@ rubygems_version: 1.6.2
148
161
  signing_key:
149
162
  specification_version: 3
150
163
  summary: Ruby implementation of http://goessner.net/articles/JsonPath/
151
- test_files:
152
- - spec/jsonpath_spec.rb
153
- - spec/spec_helper.rb
164
+ test_files: []
165
+
@@ -1,105 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "JsonPath" do
4
-
5
- before(:each) do
6
- @object = { "store"=> {
7
- "book" => [
8
- { "category"=> "reference",
9
- "author"=> "Nigel Rees",
10
- "title"=> "Sayings of the Century",
11
- "price"=> 8.95
12
- },
13
- { "category"=> "fiction",
14
- "author"=> "Evelyn Waugh",
15
- "title"=> "Sword of Honour",
16
- "price"=> 12.99
17
- },
18
- { "category"=> "fiction",
19
- "author"=> "Herman Melville",
20
- "title"=> "Moby Dick",
21
- "isbn"=> "0-553-21311-3",
22
- "price"=> 8.99
23
- },
24
- { "category"=> "fiction",
25
- "author"=> "J. R. R. Tolkien",
26
- "title"=> "The Lord of the Rings",
27
- "isbn"=> "0-395-19395-8",
28
- "price"=> 22.99
29
- }
30
- ],
31
- "bicycle"=> {
32
- "color"=> "red",
33
- "price"=> 19.95,
34
- "catalogue_number" => 12345,
35
- }
36
- }
37
- }
38
- end
39
-
40
- it "should lookup a direct path" do
41
- JsonPath.new('$.store.*').on(@object).to_a.first['book'].size.should == 4
42
- end
43
-
44
- it "should retrieve all authors" do
45
- JsonPath.new('$..author').on(@object).to_a.should == [
46
- @object['store']['book'][0]['author'],
47
- @object['store']['book'][1]['author'],
48
- @object['store']['book'][2]['author'],
49
- @object['store']['book'][3]['author']
50
- ]
51
- end
52
-
53
- it "should retrieve all prices" do
54
- JsonPath.new('$..price').on(@object).to_a.sort.should == [
55
- @object['store']['bicycle']['price'],
56
- @object['store']['book'][0]['price'],
57
- @object['store']['book'][1]['price'],
58
- @object['store']['book'][2]['price'],
59
- @object['store']['book'][3]['price']
60
- ].sort
61
- end
62
-
63
- it "should recognize all types of array splices" do
64
- JsonPath.new('$..book[0:1:1]').on(@object).to_a.should == [@object['store']['book'][0], @object['store']['book'][1]]
65
- JsonPath.new('$..book[1::2]').on(@object).to_a.should == [@object['store']['book'][1], @object['store']['book'][3]]
66
- JsonPath.new('$..book[::2]').on(@object).to_a.should == [@object['store']['book'][0], @object['store']['book'][2]]
67
- JsonPath.new('$..book[:-2:2]').on(@object).to_a.should == [@object['store']['book'][0], @object['store']['book'][2]]
68
- JsonPath.new('$..book[2::]').on(@object).to_a.should == [@object['store']['book'][2], @object['store']['book'][3]]
69
- end
70
-
71
- it "should recognize array comma syntax" do
72
- JsonPath.new('$..book[0,1]').on(@object).to_a.should == [@object['store']['book'][0], @object['store']['book'][1]]
73
- JsonPath.new('$..book[2,-1::]').on(@object).to_a.should == [@object['store']['book'][2], @object['store']['book'][3]]
74
- end
75
-
76
- it "should support filters" do
77
- JsonPath.new("$..book[?(@['isbn'])]").on(@object).to_a.should == [@object['store']['book'][2], @object['store']['book'][3]]
78
- JsonPath.new("$..book[?(@['price'] < 10)]").on(@object).to_a.should == [@object['store']['book'][0], @object['store']['book'][2]]
79
- end
80
-
81
- it "should recognize paths with underscores" do
82
- JsonPath.new('$.store.bicycle.catalogue_number').on(@object).to_a.should == [@object['store']['bicycle']['catalogue_number']]
83
- end
84
-
85
- it "should support eval'd array indicies" do
86
- JsonPath.new('$..book[(@.length-2)]').on(@object).to_a.should == [@object['store']['book'][2]]
87
- end
88
-
89
- it "should support first" do
90
- JsonPath.new('$..book[(@.length-2)]').first(@object) == @object['store']['book'][2]
91
- end
92
-
93
- it "should correct retrieve the right number of all nodes" do
94
- JsonPath.new('$..*').on(@object).to_a.size.should == 29
95
- end
96
-
97
- it "should deal with a space in the key name" do
98
- JsonPath.new("$.'c d'").on({"a" => "a","b" => "b", "c d" => "e"}).to_a.should == ['e']
99
- end
100
-
101
- it "should support a convenience class method" do
102
- JsonPath.on(@object, '$..author').to_a.should == JsonPath.new('$..author').on(@object).to_a
103
- end
104
-
105
- end
data/spec/spec_helper.rb DELETED
@@ -1,2 +0,0 @@
1
- $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- require 'jsonpath'