jnunemaker-siren 0.1.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.
- data/.gitignore +8 -0
- data/History.txt +4 -0
- data/LICENSE +22 -0
- data/README.txt +9 -0
- data/Rakefile +64 -0
- data/VERSION +1 -0
- data/lib/json.rb +1037 -0
- data/lib/json.tt +84 -0
- data/lib/json_query.rb +2045 -0
- data/lib/json_query.tt +162 -0
- data/lib/json_query/nodes.rb +260 -0
- data/lib/siren.rb +63 -0
- data/lib/siren/node.rb +37 -0
- data/lib/siren/observer.rb +14 -0
- data/lib/siren/parser.rb +205 -0
- data/lib/siren/reference.rb +34 -0
- data/lib/siren/walker.rb +36 -0
- data/siren.gemspec +62 -0
- data/test/fixtures/car.rb +14 -0
- data/test/fixtures/people.json +34 -0
- data/test/fixtures/person.rb +15 -0
- data/test/fixtures/refs.json +26 -0
- data/test/fixtures/store.json +32 -0
- data/test/test_siren.rb +112 -0
- metadata +79 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "mike",
|
|
4
|
+
"favourite": {"$ref": "mike"}
|
|
5
|
+
},
|
|
6
|
+
|
|
7
|
+
{
|
|
8
|
+
"type": "person",
|
|
9
|
+
"id": "bob",
|
|
10
|
+
"favourite": {"$ref": "bob"}
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
{
|
|
14
|
+
"type": "person",
|
|
15
|
+
"id": "romeo",
|
|
16
|
+
"handle": {"$ref": "@.id"},
|
|
17
|
+
"favourite": {"$ref": "juliet"}
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
{
|
|
21
|
+
"type": "person",
|
|
22
|
+
"id": "juliet",
|
|
23
|
+
"favourite": {"$ref": "romeo"}
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{ "store": {
|
|
2
|
+
"book": [
|
|
3
|
+
{ "category": "reference",
|
|
4
|
+
"author": "Nigel Rees",
|
|
5
|
+
"title": "Sayings of the Century",
|
|
6
|
+
"price": 8.95
|
|
7
|
+
},
|
|
8
|
+
{ "category": "fiction",
|
|
9
|
+
"author": "Evelyn Waugh",
|
|
10
|
+
"title": "Sword of Honour",
|
|
11
|
+
"price": 12.99
|
|
12
|
+
},
|
|
13
|
+
{ "category": "fiction",
|
|
14
|
+
"author": "Herman Melville",
|
|
15
|
+
"title": "Moby Dick",
|
|
16
|
+
"isbn": "0-553-21311-3",
|
|
17
|
+
"price": 8.99
|
|
18
|
+
},
|
|
19
|
+
{ "category": "fiction",
|
|
20
|
+
"author": "J. R. R. Tolkien",
|
|
21
|
+
"title": "The Lord of the Rings",
|
|
22
|
+
"isbn": "0-395-19395-8",
|
|
23
|
+
"price": 22.99
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"bicycle": {
|
|
27
|
+
"color": "red",
|
|
28
|
+
"price": 19.95
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
data/test/test_siren.rb
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
$dir = File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
require $dir + '/../lib/siren'
|
|
4
|
+
require 'test/unit'
|
|
5
|
+
|
|
6
|
+
Dir[$dir + '/fixtures/**/*.rb'].each { |fixture| require fixture }
|
|
7
|
+
|
|
8
|
+
$VERBOSE = nil
|
|
9
|
+
|
|
10
|
+
class SirenTest < Test::Unit::TestCase
|
|
11
|
+
|
|
12
|
+
def fixtures(name)
|
|
13
|
+
@fixtures ||= {}
|
|
14
|
+
@fixtures[name.to_sym] ||= Siren.parse(File.read("#{$dir}/fixtures/#{name}.json"))
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_parser
|
|
18
|
+
|
|
19
|
+
assert_equal(
|
|
20
|
+
{"foo" => 12},
|
|
21
|
+
Siren.parse('{"foo": 12}') )
|
|
22
|
+
|
|
23
|
+
assert_equal(
|
|
24
|
+
{"foo" => {"something" => true}},
|
|
25
|
+
Siren.parse('{"foo": {"something": true}}') )
|
|
26
|
+
|
|
27
|
+
assert_equal(
|
|
28
|
+
{"list" => [1,2,"value"]},
|
|
29
|
+
Siren.parse('{"list": [1, 2, "value"]}') )
|
|
30
|
+
|
|
31
|
+
assert_equal(
|
|
32
|
+
{"list" => []},
|
|
33
|
+
Siren.parse(' { "list" : [ ] } ') )
|
|
34
|
+
|
|
35
|
+
assert_equal( {}, Siren.parse("{}") )
|
|
36
|
+
assert_equal( [], Siren.parse("[]") )
|
|
37
|
+
assert_equal( nil, Siren.parse("undefined") )
|
|
38
|
+
|
|
39
|
+
assert_equal( 'something "funny"', Siren.parse('{"key": "something \\"funny\\""}')["key"] )
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_parser_with_callback
|
|
43
|
+
value = Siren.parse('{"list": [1,2,3,[56,34],4,5,6]}') do |holder, key, v|
|
|
44
|
+
Numeric === v ? key + v : v
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
assert_equal( {"list" => [1,3,5,[56,35],8,10,12]}, value )
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_casting
|
|
51
|
+
mike = Person.new('ford')
|
|
52
|
+
bob = Person.new('bentley', 'ferrari', 'zonda')
|
|
53
|
+
assert_equal( {"people" => [mike, bob]}, fixtures(:people) )
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_referencing
|
|
57
|
+
person = fixtures(:refs).first
|
|
58
|
+
assert person.equal?(person["favourite"])
|
|
59
|
+
person = fixtures(:refs)[1]
|
|
60
|
+
assert person.equal?(person.favourite)
|
|
61
|
+
|
|
62
|
+
romeo, juliet = fixtures(:refs)[2..3]
|
|
63
|
+
assert romeo.equal?(juliet.favourite)
|
|
64
|
+
assert juliet.equal?(romeo.favourite)
|
|
65
|
+
|
|
66
|
+
assert_equal "romeo", romeo.handle
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_json_query
|
|
70
|
+
assert_equal [5,6,7], Siren.query("$[? @ > 4 ]", 1..7)
|
|
71
|
+
assert_equal "FOO", Siren.query("$.upcase", "foo")
|
|
72
|
+
assert_equal 99, Siren.query("$['key']", {"key" => 99})
|
|
73
|
+
assert_equal 4, Siren.query("$.values[$.key]", {"key" => 2, "values" => [3,9,4,6]})
|
|
74
|
+
assert_equal 1, Siren.query("$[? @ = ('foo')]", %w(bar foo baz)).size
|
|
75
|
+
assert_equal 2, Siren.query("$[?( @ != 'foo' )]", %w(bar foo baz)).size
|
|
76
|
+
|
|
77
|
+
assert_equal 2, Siren.query("$.data[? $.value != @]",
|
|
78
|
+
{"value" => "foo", "data" => %w(bar foo baz)}).size
|
|
79
|
+
|
|
80
|
+
data = {"keys" => [1,7,9,5,6], :values => [4,0,5,2,8,1,7,9]}
|
|
81
|
+
assert_equal 9, Siren.query("$.keys[? @ >= 9][0]", data)
|
|
82
|
+
assert_equal [4,0,5,2,1], Siren.query("$.values[? $.keys[? @ = 6][0] > @ ]", data)
|
|
83
|
+
|
|
84
|
+
assert_equal [1,3,4,5], Siren.query("$[? @ > 2 & @ < 6 | @ = 1]", 1..9)
|
|
85
|
+
|
|
86
|
+
assert_equal 9, Siren.query("$.key[? @ = ($.val - 2) + 4][0]",
|
|
87
|
+
{:key => [0,2,9,4,7], :val => 7})
|
|
88
|
+
assert_equal "foobar", Siren.query("'foo' + 'bar'", {:val => 7})
|
|
89
|
+
|
|
90
|
+
Siren.parse '[{"id": "whizz", "name": "jcoglan"}]'
|
|
91
|
+
assert_equal 'jcoglan', Siren.query("whizz.name", {})
|
|
92
|
+
|
|
93
|
+
assert_equal 5, Siren.query("$.store.*", fixtures(:store)).flatten.size
|
|
94
|
+
assert_equal 2, Siren.query("$.store[*]", fixtures(:store)).size
|
|
95
|
+
|
|
96
|
+
assert_equal [7,8], Siren.query("$.val[? @ > $.key.*.size * 2]",
|
|
97
|
+
{:key => [9,5,7], :val => 1..8})
|
|
98
|
+
|
|
99
|
+
assert_equal "The Lord of the Rings",
|
|
100
|
+
Siren.query("$.store.book[@.length - 1]", fixtures(:store))["title"]
|
|
101
|
+
|
|
102
|
+
assert_equal ["Sayings of the Century", "The Lord of the Rings"],
|
|
103
|
+
Siren.query("$.store.book[0,3]", fixtures(:store)).map { |b| b["title"] }
|
|
104
|
+
|
|
105
|
+
assert_equal fixtures(:store)["store"]["book"].map { |b| b["title"] },
|
|
106
|
+
Siren.query("$.store.book[=title ]", fixtures(:store))
|
|
107
|
+
|
|
108
|
+
assert_equal fixtures(:store)["store"]["book"].map { |b| b["title"] }.sort,
|
|
109
|
+
Siren.query("$.store.book[/title][= @.title ]", fixtures(:store))
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
metadata
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: jnunemaker-siren
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- James Coglan
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
|
|
12
|
+
date: 2009-06-22 00:00:00 -07:00
|
|
13
|
+
default_executable:
|
|
14
|
+
dependencies: []
|
|
15
|
+
|
|
16
|
+
description:
|
|
17
|
+
email: jcoglan@googlemail.com
|
|
18
|
+
executables: []
|
|
19
|
+
|
|
20
|
+
extensions: []
|
|
21
|
+
|
|
22
|
+
extra_rdoc_files:
|
|
23
|
+
- LICENSE
|
|
24
|
+
- README.txt
|
|
25
|
+
files:
|
|
26
|
+
- .gitignore
|
|
27
|
+
- History.txt
|
|
28
|
+
- LICENSE
|
|
29
|
+
- README.txt
|
|
30
|
+
- Rakefile
|
|
31
|
+
- VERSION
|
|
32
|
+
- lib/json.rb
|
|
33
|
+
- lib/json.tt
|
|
34
|
+
- lib/json_query.rb
|
|
35
|
+
- lib/json_query.tt
|
|
36
|
+
- lib/json_query/nodes.rb
|
|
37
|
+
- lib/siren.rb
|
|
38
|
+
- lib/siren/node.rb
|
|
39
|
+
- lib/siren/observer.rb
|
|
40
|
+
- lib/siren/parser.rb
|
|
41
|
+
- lib/siren/reference.rb
|
|
42
|
+
- lib/siren/walker.rb
|
|
43
|
+
- siren.gemspec
|
|
44
|
+
- test/fixtures/car.rb
|
|
45
|
+
- test/fixtures/people.json
|
|
46
|
+
- test/fixtures/person.rb
|
|
47
|
+
- test/fixtures/refs.json
|
|
48
|
+
- test/fixtures/store.json
|
|
49
|
+
- test/test_siren.rb
|
|
50
|
+
has_rdoc: true
|
|
51
|
+
homepage: http://github.com/jnunemaker/siren
|
|
52
|
+
post_install_message:
|
|
53
|
+
rdoc_options:
|
|
54
|
+
- --charset=UTF-8
|
|
55
|
+
require_paths:
|
|
56
|
+
- lib
|
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: "0"
|
|
62
|
+
version:
|
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: "0"
|
|
68
|
+
version:
|
|
69
|
+
requirements: []
|
|
70
|
+
|
|
71
|
+
rubyforge_project:
|
|
72
|
+
rubygems_version: 1.2.0
|
|
73
|
+
signing_key:
|
|
74
|
+
specification_version: 2
|
|
75
|
+
summary: JSON parser that understands cross-references and casts to typed Ruby objects. Implements JSONQuery against JSON trees and Ruby object graphs.
|
|
76
|
+
test_files:
|
|
77
|
+
- test/fixtures/car.rb
|
|
78
|
+
- test/fixtures/person.rb
|
|
79
|
+
- test/test_siren.rb
|