benofsky-yajl-ruby 0.7.6
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 +9 -0
- data/CHANGELOG.md +281 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +320 -0
- data/Rakefile +40 -0
- data/VERSION.yml +5 -0
- data/benchmark/encode.rb +58 -0
- data/benchmark/encode_json_and_marshal.rb +42 -0
- data/benchmark/encode_json_and_yaml.rb +53 -0
- data/benchmark/http.rb +32 -0
- data/benchmark/parse.rb +59 -0
- data/benchmark/parse_json_and_marshal.rb +50 -0
- data/benchmark/parse_json_and_yaml.rb +55 -0
- data/benchmark/parse_stream.rb +54 -0
- data/benchmark/subjects/item.json +1 -0
- data/benchmark/subjects/ohai.json +1216 -0
- data/benchmark/subjects/ohai.marshal_dump +0 -0
- data/benchmark/subjects/ohai.yml +975 -0
- data/benchmark/subjects/twitter_search.json +1 -0
- data/benchmark/subjects/twitter_stream.json +430 -0
- data/benchmark/subjects/unicode.json +1 -0
- data/examples/encoding/chunked_encoding.rb +27 -0
- data/examples/encoding/one_shot.rb +13 -0
- data/examples/encoding/to_an_io.rb +12 -0
- data/examples/http/twitter_search_api.rb +12 -0
- data/examples/http/twitter_stream_api.rb +26 -0
- data/examples/parsing/from_file.rb +14 -0
- data/examples/parsing/from_stdin.rb +9 -0
- data/examples/parsing/from_string.rb +13 -0
- data/ext/api/yajl_common.h +85 -0
- data/ext/api/yajl_gen.h +159 -0
- data/ext/api/yajl_parse.h +196 -0
- data/ext/extconf.rb +9 -0
- data/ext/yajl.c +164 -0
- data/ext/yajl_alloc.c +65 -0
- data/ext/yajl_alloc.h +50 -0
- data/ext/yajl_buf.c +119 -0
- data/ext/yajl_buf.h +73 -0
- data/ext/yajl_bytestack.h +85 -0
- data/ext/yajl_encode.c +188 -0
- data/ext/yajl_encode.h +50 -0
- data/ext/yajl_ext.c +911 -0
- data/ext/yajl_ext.h +128 -0
- data/ext/yajl_gen.c +317 -0
- data/ext/yajl_lex.c +747 -0
- data/ext/yajl_lex.h +135 -0
- data/ext/yajl_parser.c +450 -0
- data/ext/yajl_parser.h +82 -0
- data/lib/yajl/bzip2/stream_reader.rb +32 -0
- data/lib/yajl/bzip2/stream_writer.rb +15 -0
- data/lib/yajl/bzip2.rb +11 -0
- data/lib/yajl/deflate/stream_reader.rb +44 -0
- data/lib/yajl/deflate/stream_writer.rb +21 -0
- data/lib/yajl/deflate.rb +6 -0
- data/lib/yajl/gzip/stream_reader.rb +31 -0
- data/lib/yajl/gzip/stream_writer.rb +14 -0
- data/lib/yajl/gzip.rb +6 -0
- data/lib/yajl/http_stream.rb +197 -0
- data/lib/yajl/json_gem/encoding.rb +50 -0
- data/lib/yajl/json_gem/parsing.rb +27 -0
- data/lib/yajl/json_gem.rb +14 -0
- data/lib/yajl.rb +93 -0
- data/spec/encoding/encoding_spec.rb +234 -0
- data/spec/global/global_spec.rb +55 -0
- data/spec/http/fixtures/http.bzip2.dump +0 -0
- data/spec/http/fixtures/http.chunked.dump +11 -0
- data/spec/http/fixtures/http.deflate.dump +0 -0
- data/spec/http/fixtures/http.error.dump +12 -0
- data/spec/http/fixtures/http.gzip.dump +0 -0
- data/spec/http/fixtures/http.html.dump +1220 -0
- data/spec/http/fixtures/http.raw.dump +1226 -0
- data/spec/http/http_delete_spec.rb +99 -0
- data/spec/http/http_error_spec.rb +33 -0
- data/spec/http/http_get_spec.rb +110 -0
- data/spec/http/http_post_spec.rb +124 -0
- data/spec/http/http_put_spec.rb +106 -0
- data/spec/json_gem_compatibility/compatibility_spec.rb +203 -0
- data/spec/parsing/active_support_spec.rb +64 -0
- data/spec/parsing/chunked_spec.rb +98 -0
- data/spec/parsing/fixtures/fail.15.json +1 -0
- data/spec/parsing/fixtures/fail.16.json +1 -0
- data/spec/parsing/fixtures/fail.17.json +1 -0
- data/spec/parsing/fixtures/fail.26.json +1 -0
- data/spec/parsing/fixtures/fail11.json +1 -0
- data/spec/parsing/fixtures/fail12.json +1 -0
- data/spec/parsing/fixtures/fail13.json +1 -0
- data/spec/parsing/fixtures/fail14.json +1 -0
- data/spec/parsing/fixtures/fail19.json +1 -0
- data/spec/parsing/fixtures/fail20.json +1 -0
- data/spec/parsing/fixtures/fail21.json +1 -0
- data/spec/parsing/fixtures/fail22.json +1 -0
- data/spec/parsing/fixtures/fail23.json +1 -0
- data/spec/parsing/fixtures/fail24.json +1 -0
- data/spec/parsing/fixtures/fail25.json +1 -0
- data/spec/parsing/fixtures/fail27.json +2 -0
- data/spec/parsing/fixtures/fail28.json +2 -0
- data/spec/parsing/fixtures/fail3.json +1 -0
- data/spec/parsing/fixtures/fail4.json +1 -0
- data/spec/parsing/fixtures/fail5.json +1 -0
- data/spec/parsing/fixtures/fail6.json +1 -0
- data/spec/parsing/fixtures/fail9.json +1 -0
- data/spec/parsing/fixtures/pass.array.json +6 -0
- data/spec/parsing/fixtures/pass.codepoints_from_unicode_org.json +1 -0
- data/spec/parsing/fixtures/pass.contacts.json +1 -0
- data/spec/parsing/fixtures/pass.db100.xml.json +1 -0
- data/spec/parsing/fixtures/pass.db1000.xml.json +1 -0
- data/spec/parsing/fixtures/pass.dc_simple_with_comments.json +11 -0
- data/spec/parsing/fixtures/pass.deep_arrays.json +1 -0
- data/spec/parsing/fixtures/pass.difficult_json_c_test_case.json +1 -0
- data/spec/parsing/fixtures/pass.difficult_json_c_test_case_with_comments.json +1 -0
- data/spec/parsing/fixtures/pass.doubles.json +1 -0
- data/spec/parsing/fixtures/pass.empty_array.json +1 -0
- data/spec/parsing/fixtures/pass.empty_string.json +1 -0
- data/spec/parsing/fixtures/pass.escaped_bulgarian.json +4 -0
- data/spec/parsing/fixtures/pass.escaped_foobar.json +1 -0
- data/spec/parsing/fixtures/pass.item.json +1 -0
- data/spec/parsing/fixtures/pass.json-org-sample1.json +23 -0
- data/spec/parsing/fixtures/pass.json-org-sample2.json +11 -0
- data/spec/parsing/fixtures/pass.json-org-sample3.json +26 -0
- data/spec/parsing/fixtures/pass.json-org-sample4-nows.json +88 -0
- data/spec/parsing/fixtures/pass.json-org-sample4.json +89 -0
- data/spec/parsing/fixtures/pass.json-org-sample5.json +27 -0
- data/spec/parsing/fixtures/pass.map-spain.xml.json +1 -0
- data/spec/parsing/fixtures/pass.ns-invoice100.xml.json +1 -0
- data/spec/parsing/fixtures/pass.ns-soap.xml.json +1 -0
- data/spec/parsing/fixtures/pass.numbers-fp-4k.json +6 -0
- data/spec/parsing/fixtures/pass.numbers-fp-64k.json +61 -0
- data/spec/parsing/fixtures/pass.numbers-int-4k.json +11 -0
- data/spec/parsing/fixtures/pass.numbers-int-64k.json +154 -0
- data/spec/parsing/fixtures/pass.twitter-search.json +1 -0
- data/spec/parsing/fixtures/pass.twitter-search2.json +1 -0
- data/spec/parsing/fixtures/pass.unicode.json +3315 -0
- data/spec/parsing/fixtures/pass.yelp.json +1 -0
- data/spec/parsing/fixtures/pass1.json +56 -0
- data/spec/parsing/fixtures/pass2.json +1 -0
- data/spec/parsing/fixtures/pass3.json +6 -0
- data/spec/parsing/fixtures_spec.rb +41 -0
- data/spec/parsing/one_off_spec.rb +81 -0
- data/spec/rcov.opts +3 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +16 -0
- data/yajl-ruby.gemspec +203 -0
- metadata +232 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
|
|
3
|
+
|
|
4
|
+
describe "ActiveSupport test cases" do
|
|
5
|
+
TESTS = {
|
|
6
|
+
%q({"returnTo":{"\/categories":"\/"}}) => {"returnTo" => {"/categories" => "/"}},
|
|
7
|
+
%q({"return\\"To\\":":{"\/categories":"\/"}}) => {"return\"To\":" => {"/categories" => "/"}},
|
|
8
|
+
%q({"returnTo":{"\/categories":1}}) => {"returnTo" => {"/categories" => 1}},
|
|
9
|
+
%({"returnTo":[1,"a"]}) => {"returnTo" => [1, "a"]},
|
|
10
|
+
%({"returnTo":[1,"\\"a\\",", "b"]}) => {"returnTo" => [1, "\"a\",", "b"]},
|
|
11
|
+
%({"a": "'", "b": "5,000"}) => {"a" => "'", "b" => "5,000"},
|
|
12
|
+
%({"a": "a's, b's and c's", "b": "5,000"}) => {"a" => "a's, b's and c's", "b" => "5,000"},
|
|
13
|
+
# multibyte
|
|
14
|
+
%({"matzue": "松江", "asakusa": "浅草"}) => {"matzue" => "松江", "asakusa" => "浅草"},
|
|
15
|
+
%({"a": "2007-01-01"}) => {'a' => "2007-01-01"},
|
|
16
|
+
%({"a": "2007-01-01 01:12:34 Z"}) => {'a' => "2007-01-01 01:12:34 Z"},
|
|
17
|
+
# no time zone
|
|
18
|
+
%({"a": "2007-01-01 01:12:34"}) => {'a' => "2007-01-01 01:12:34"},
|
|
19
|
+
# needs to be *exact*
|
|
20
|
+
%({"a": " 2007-01-01 01:12:34 Z "}) => {'a' => " 2007-01-01 01:12:34 Z "},
|
|
21
|
+
%({"a": "2007-01-01 : it's your birthday"}) => {'a' => "2007-01-01 : it's your birthday"},
|
|
22
|
+
%([]) => [],
|
|
23
|
+
%({}) => {},
|
|
24
|
+
%({"a":1}) => {"a" => 1},
|
|
25
|
+
%({"a": ""}) => {"a" => ""},
|
|
26
|
+
%({"a":"\\""}) => {"a" => "\""},
|
|
27
|
+
%({"a": null}) => {"a" => nil},
|
|
28
|
+
%({"a": true}) => {"a" => true},
|
|
29
|
+
%({"a": false}) => {"a" => false},
|
|
30
|
+
%q({"a": "http:\/\/test.host\/posts\/1"}) => {"a" => "http://test.host/posts/1"},
|
|
31
|
+
%q({"a": "\u003cunicode\u0020escape\u003e"}) => {"a" => "<unicode escape>"},
|
|
32
|
+
%q({"a": "\\\\u0020skip double backslashes"}) => {"a" => "\\u0020skip double backslashes"},
|
|
33
|
+
%q({"a": "\u003cbr /\u003e"}) => {'a' => "<br />"},
|
|
34
|
+
%q({"b":["\u003ci\u003e","\u003cb\u003e","\u003cu\u003e"]}) => {'b' => ["<i>","<b>","<u>"]}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
TESTS.each do |json, expected|
|
|
38
|
+
it "should be able to parse #{json} as an IO" do
|
|
39
|
+
lambda {
|
|
40
|
+
Yajl::Parser.parse(StringIO.new(json)).should == expected
|
|
41
|
+
}.should_not raise_error(Yajl::ParseError)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
TESTS.each do |json, expected|
|
|
46
|
+
it "should be able to parse #{json} as a string" do
|
|
47
|
+
lambda {
|
|
48
|
+
Yajl::Parser.parse(json).should == expected
|
|
49
|
+
}.should_not raise_error(Yajl::ParseError)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should fail parsing {: 1} as an IO" do
|
|
54
|
+
lambda {
|
|
55
|
+
Yajl::Parser.parse(StringIO.new("{: 1}"))
|
|
56
|
+
}.should raise_error(Yajl::ParseError)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should fail parsing {: 1} as a string" do
|
|
60
|
+
lambda {
|
|
61
|
+
Yajl::Parser.parse("{: 1}")
|
|
62
|
+
}.should raise_error(Yajl::ParseError)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
|
|
3
|
+
require 'stringio'
|
|
4
|
+
|
|
5
|
+
describe "Chunked parser" do
|
|
6
|
+
before(:all) do
|
|
7
|
+
@final = [{"abc" => 123}, {"def" => 456}]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
before(:each) do
|
|
11
|
+
@callback = lambda { |hash|
|
|
12
|
+
# no-op
|
|
13
|
+
}
|
|
14
|
+
@parser = Yajl::Parser.new
|
|
15
|
+
@parser.on_parse_complete = @callback
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should parse a single chunk" do
|
|
19
|
+
@callback.should_receive(:call).with(@final)
|
|
20
|
+
@parser << '[{"abc": 123},{"def": 456}]'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should parse a single chunk, 3 times" do
|
|
24
|
+
@callback.should_receive(:call).with(@final).exactly(3).times
|
|
25
|
+
@parser << '[{"abc": 123},{"def": 456}]'
|
|
26
|
+
@parser << '[{"abc": 123},{"def": 456}]'
|
|
27
|
+
@parser << '[{"abc": 123},{"def": 456}]'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should parse in two chunks" do
|
|
31
|
+
@callback.should_receive(:call).with(@final)
|
|
32
|
+
@parser << '[{"abc": 123},'
|
|
33
|
+
@parser << '{"def": 456}]'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should parse in 2 chunks, twice" do
|
|
37
|
+
@callback.should_receive(:call).with(@final).exactly(2).times
|
|
38
|
+
@parser << '[{"abc": 123},'
|
|
39
|
+
@parser << '{"def": 456}]'
|
|
40
|
+
@parser << '[{"abc": 123},'
|
|
41
|
+
@parser << '{"def": 456}]'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should parse 2 JSON strings, in 3 chunks" do
|
|
45
|
+
@callback.should_receive(:call).with(@final).exactly(2).times
|
|
46
|
+
@parser << '[{"abc": 123},'
|
|
47
|
+
@parser << '{"def": 456}][{"abc": 123},{"def":'
|
|
48
|
+
@parser << ' 456}]'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should parse 2 JSON strings in 1 chunk" do
|
|
52
|
+
@callback.should_receive(:call).with(@final).exactly(2).times
|
|
53
|
+
@parser << '[{"abc": 123},{"def": 456}][{"abc": 123},{"def": 456}]'
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should parse 2 JSON strings from an IO" do
|
|
57
|
+
@callback.should_receive(:call).with(@final).exactly(2).times
|
|
58
|
+
@parser.parse(StringIO.new('[{"abc": 123},{"def": 456}][{"abc": 123},{"def": 456}]'))
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should parse a JSON string an IO and fire callback once" do
|
|
62
|
+
@callback.should_receive(:call).with(@final)
|
|
63
|
+
@parser.parse(StringIO.new('[{"abc": 123},{"def": 456}]'))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should parse twitter_stream.json and fire callback 430 times" do
|
|
67
|
+
path = File.expand_path(File.dirname(__FILE__) + '/../../benchmark/subjects/twitter_stream.json')
|
|
68
|
+
json = File.new(path, 'r')
|
|
69
|
+
@callback.should_receive(:call).exactly(430).times
|
|
70
|
+
lambda {
|
|
71
|
+
@parser.parse(json)
|
|
72
|
+
}.should_not raise_error(Yajl::ParseError)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "should parse twitter_stream.json and fire callback 430 times, with a block as the callback" do
|
|
76
|
+
path = File.expand_path(File.dirname(__FILE__) + '/../../benchmark/subjects/twitter_stream.json')
|
|
77
|
+
json = File.new(path, 'r')
|
|
78
|
+
@callback.should_receive(:call).exactly(0).times
|
|
79
|
+
@parser.on_parse_complete = nil
|
|
80
|
+
lambda {
|
|
81
|
+
times = 0
|
|
82
|
+
@parser.parse(json) do |hsh|
|
|
83
|
+
times += 1
|
|
84
|
+
end
|
|
85
|
+
times.should eql(430)
|
|
86
|
+
}.should_not raise_error(Yajl::ParseError)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should raise a Yajl::ParseError error if multiple JSON strings were found when no on_parse_complete callback assigned" do
|
|
90
|
+
path = File.expand_path(File.dirname(__FILE__) + '/../../benchmark/subjects/twitter_stream.json')
|
|
91
|
+
json = File.new(path, 'r')
|
|
92
|
+
@parser.on_parse_complete = nil
|
|
93
|
+
@callback.should_receive(:call).exactly(0).times
|
|
94
|
+
lambda {
|
|
95
|
+
@parser.parse(json)
|
|
96
|
+
}.should raise_error(Yajl::ParseError)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["Illegal backslash escape: \x15"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["Illegal backslash escape: \'"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["Illegal backslash escape: \017"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["tab\ character\ in\ string\ "]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"Illegal expression": 1 + 2}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"Illegal invocation": alert()}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"Numbers cannot have leading zeroes": 013}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"Numbers cannot be hex": 0x14}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"Missing colon" null}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"Double colon":: null}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"Comma instead of colon", null}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["Colon instead of comma": false]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["Bad value", truth]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
['single quote']
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["tab character in string "]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{unquoted_key: "keys must be quoted"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["extra comma",]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["double extra comma",,]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[ , "<-- missing value"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"Extra comma": true,}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"\u004d\u0430\u4e8c\ud800\udf02"
|