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.
@@ -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
+
@@ -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