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.
Files changed (143) hide show
  1. data/.gitignore +9 -0
  2. data/CHANGELOG.md +281 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +320 -0
  5. data/Rakefile +40 -0
  6. data/VERSION.yml +5 -0
  7. data/benchmark/encode.rb +58 -0
  8. data/benchmark/encode_json_and_marshal.rb +42 -0
  9. data/benchmark/encode_json_and_yaml.rb +53 -0
  10. data/benchmark/http.rb +32 -0
  11. data/benchmark/parse.rb +59 -0
  12. data/benchmark/parse_json_and_marshal.rb +50 -0
  13. data/benchmark/parse_json_and_yaml.rb +55 -0
  14. data/benchmark/parse_stream.rb +54 -0
  15. data/benchmark/subjects/item.json +1 -0
  16. data/benchmark/subjects/ohai.json +1216 -0
  17. data/benchmark/subjects/ohai.marshal_dump +0 -0
  18. data/benchmark/subjects/ohai.yml +975 -0
  19. data/benchmark/subjects/twitter_search.json +1 -0
  20. data/benchmark/subjects/twitter_stream.json +430 -0
  21. data/benchmark/subjects/unicode.json +1 -0
  22. data/examples/encoding/chunked_encoding.rb +27 -0
  23. data/examples/encoding/one_shot.rb +13 -0
  24. data/examples/encoding/to_an_io.rb +12 -0
  25. data/examples/http/twitter_search_api.rb +12 -0
  26. data/examples/http/twitter_stream_api.rb +26 -0
  27. data/examples/parsing/from_file.rb +14 -0
  28. data/examples/parsing/from_stdin.rb +9 -0
  29. data/examples/parsing/from_string.rb +13 -0
  30. data/ext/api/yajl_common.h +85 -0
  31. data/ext/api/yajl_gen.h +159 -0
  32. data/ext/api/yajl_parse.h +196 -0
  33. data/ext/extconf.rb +9 -0
  34. data/ext/yajl.c +164 -0
  35. data/ext/yajl_alloc.c +65 -0
  36. data/ext/yajl_alloc.h +50 -0
  37. data/ext/yajl_buf.c +119 -0
  38. data/ext/yajl_buf.h +73 -0
  39. data/ext/yajl_bytestack.h +85 -0
  40. data/ext/yajl_encode.c +188 -0
  41. data/ext/yajl_encode.h +50 -0
  42. data/ext/yajl_ext.c +911 -0
  43. data/ext/yajl_ext.h +128 -0
  44. data/ext/yajl_gen.c +317 -0
  45. data/ext/yajl_lex.c +747 -0
  46. data/ext/yajl_lex.h +135 -0
  47. data/ext/yajl_parser.c +450 -0
  48. data/ext/yajl_parser.h +82 -0
  49. data/lib/yajl/bzip2/stream_reader.rb +32 -0
  50. data/lib/yajl/bzip2/stream_writer.rb +15 -0
  51. data/lib/yajl/bzip2.rb +11 -0
  52. data/lib/yajl/deflate/stream_reader.rb +44 -0
  53. data/lib/yajl/deflate/stream_writer.rb +21 -0
  54. data/lib/yajl/deflate.rb +6 -0
  55. data/lib/yajl/gzip/stream_reader.rb +31 -0
  56. data/lib/yajl/gzip/stream_writer.rb +14 -0
  57. data/lib/yajl/gzip.rb +6 -0
  58. data/lib/yajl/http_stream.rb +197 -0
  59. data/lib/yajl/json_gem/encoding.rb +50 -0
  60. data/lib/yajl/json_gem/parsing.rb +27 -0
  61. data/lib/yajl/json_gem.rb +14 -0
  62. data/lib/yajl.rb +93 -0
  63. data/spec/encoding/encoding_spec.rb +234 -0
  64. data/spec/global/global_spec.rb +55 -0
  65. data/spec/http/fixtures/http.bzip2.dump +0 -0
  66. data/spec/http/fixtures/http.chunked.dump +11 -0
  67. data/spec/http/fixtures/http.deflate.dump +0 -0
  68. data/spec/http/fixtures/http.error.dump +12 -0
  69. data/spec/http/fixtures/http.gzip.dump +0 -0
  70. data/spec/http/fixtures/http.html.dump +1220 -0
  71. data/spec/http/fixtures/http.raw.dump +1226 -0
  72. data/spec/http/http_delete_spec.rb +99 -0
  73. data/spec/http/http_error_spec.rb +33 -0
  74. data/spec/http/http_get_spec.rb +110 -0
  75. data/spec/http/http_post_spec.rb +124 -0
  76. data/spec/http/http_put_spec.rb +106 -0
  77. data/spec/json_gem_compatibility/compatibility_spec.rb +203 -0
  78. data/spec/parsing/active_support_spec.rb +64 -0
  79. data/spec/parsing/chunked_spec.rb +98 -0
  80. data/spec/parsing/fixtures/fail.15.json +1 -0
  81. data/spec/parsing/fixtures/fail.16.json +1 -0
  82. data/spec/parsing/fixtures/fail.17.json +1 -0
  83. data/spec/parsing/fixtures/fail.26.json +1 -0
  84. data/spec/parsing/fixtures/fail11.json +1 -0
  85. data/spec/parsing/fixtures/fail12.json +1 -0
  86. data/spec/parsing/fixtures/fail13.json +1 -0
  87. data/spec/parsing/fixtures/fail14.json +1 -0
  88. data/spec/parsing/fixtures/fail19.json +1 -0
  89. data/spec/parsing/fixtures/fail20.json +1 -0
  90. data/spec/parsing/fixtures/fail21.json +1 -0
  91. data/spec/parsing/fixtures/fail22.json +1 -0
  92. data/spec/parsing/fixtures/fail23.json +1 -0
  93. data/spec/parsing/fixtures/fail24.json +1 -0
  94. data/spec/parsing/fixtures/fail25.json +1 -0
  95. data/spec/parsing/fixtures/fail27.json +2 -0
  96. data/spec/parsing/fixtures/fail28.json +2 -0
  97. data/spec/parsing/fixtures/fail3.json +1 -0
  98. data/spec/parsing/fixtures/fail4.json +1 -0
  99. data/spec/parsing/fixtures/fail5.json +1 -0
  100. data/spec/parsing/fixtures/fail6.json +1 -0
  101. data/spec/parsing/fixtures/fail9.json +1 -0
  102. data/spec/parsing/fixtures/pass.array.json +6 -0
  103. data/spec/parsing/fixtures/pass.codepoints_from_unicode_org.json +1 -0
  104. data/spec/parsing/fixtures/pass.contacts.json +1 -0
  105. data/spec/parsing/fixtures/pass.db100.xml.json +1 -0
  106. data/spec/parsing/fixtures/pass.db1000.xml.json +1 -0
  107. data/spec/parsing/fixtures/pass.dc_simple_with_comments.json +11 -0
  108. data/spec/parsing/fixtures/pass.deep_arrays.json +1 -0
  109. data/spec/parsing/fixtures/pass.difficult_json_c_test_case.json +1 -0
  110. data/spec/parsing/fixtures/pass.difficult_json_c_test_case_with_comments.json +1 -0
  111. data/spec/parsing/fixtures/pass.doubles.json +1 -0
  112. data/spec/parsing/fixtures/pass.empty_array.json +1 -0
  113. data/spec/parsing/fixtures/pass.empty_string.json +1 -0
  114. data/spec/parsing/fixtures/pass.escaped_bulgarian.json +4 -0
  115. data/spec/parsing/fixtures/pass.escaped_foobar.json +1 -0
  116. data/spec/parsing/fixtures/pass.item.json +1 -0
  117. data/spec/parsing/fixtures/pass.json-org-sample1.json +23 -0
  118. data/spec/parsing/fixtures/pass.json-org-sample2.json +11 -0
  119. data/spec/parsing/fixtures/pass.json-org-sample3.json +26 -0
  120. data/spec/parsing/fixtures/pass.json-org-sample4-nows.json +88 -0
  121. data/spec/parsing/fixtures/pass.json-org-sample4.json +89 -0
  122. data/spec/parsing/fixtures/pass.json-org-sample5.json +27 -0
  123. data/spec/parsing/fixtures/pass.map-spain.xml.json +1 -0
  124. data/spec/parsing/fixtures/pass.ns-invoice100.xml.json +1 -0
  125. data/spec/parsing/fixtures/pass.ns-soap.xml.json +1 -0
  126. data/spec/parsing/fixtures/pass.numbers-fp-4k.json +6 -0
  127. data/spec/parsing/fixtures/pass.numbers-fp-64k.json +61 -0
  128. data/spec/parsing/fixtures/pass.numbers-int-4k.json +11 -0
  129. data/spec/parsing/fixtures/pass.numbers-int-64k.json +154 -0
  130. data/spec/parsing/fixtures/pass.twitter-search.json +1 -0
  131. data/spec/parsing/fixtures/pass.twitter-search2.json +1 -0
  132. data/spec/parsing/fixtures/pass.unicode.json +3315 -0
  133. data/spec/parsing/fixtures/pass.yelp.json +1 -0
  134. data/spec/parsing/fixtures/pass1.json +56 -0
  135. data/spec/parsing/fixtures/pass2.json +1 -0
  136. data/spec/parsing/fixtures/pass3.json +6 -0
  137. data/spec/parsing/fixtures_spec.rb +41 -0
  138. data/spec/parsing/one_off_spec.rb +81 -0
  139. data/spec/rcov.opts +3 -0
  140. data/spec/spec.opts +2 -0
  141. data/spec/spec_helper.rb +16 -0
  142. data/yajl-ruby.gemspec +203 -0
  143. metadata +232 -0
@@ -0,0 +1,58 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
3
+
4
+ require 'rubygems'
5
+ require 'benchmark'
6
+ require 'yajl_ext'
7
+ require 'stringio'
8
+ begin
9
+ require 'json'
10
+ rescue LoadError
11
+ end
12
+ # Can't use ActiveSuport::JSON.encode with the JSON gem loaded
13
+ # begin
14
+ # require 'active_support'
15
+ # rescue LoadError
16
+ # end
17
+
18
+ filename = ARGV[0] || 'benchmark/subjects/ohai.json'
19
+ json = File.new(filename, 'r')
20
+ hash = Yajl::Parser.new.parse(json)
21
+ json.close
22
+
23
+ times = ARGV[1] ? ARGV[1].to_i : 1000
24
+ puts "Starting benchmark encoding #{filename} #{times} times\n\n"
25
+ Benchmark.bmbm { |x|
26
+ io_encoder = Yajl::Encoder.new
27
+ x.report {
28
+ puts "Yajl::Encoder#encode (to an IO)"
29
+ times.times {
30
+ io_encoder.encode(hash, StringIO.new)
31
+ }
32
+ }
33
+ string_encoder = Yajl::Encoder.new
34
+ x.report {
35
+ puts "Yajl::Encoder#encode (to a String)"
36
+ times.times {
37
+ output = string_encoder.encode(hash)
38
+ }
39
+ }
40
+ if defined?(JSON)
41
+ x.report {
42
+ puts "JSON.generate"
43
+ times.times {
44
+ JSON.generate(hash)
45
+ }
46
+ }
47
+ end
48
+ # Can't use ActiveSuport::JSON.encode with the JSON gem loaded
49
+ #
50
+ # if defined?(ActiveSupport::JSON)
51
+ # x.report {
52
+ # puts "ActiveSupport::JSON.encode"
53
+ # times.times {
54
+ # ActiveSupport::JSON.encode(hash)
55
+ # }
56
+ # }
57
+ # end
58
+ }
@@ -0,0 +1,42 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
3
+
4
+ require 'rubygems'
5
+ require 'benchmark'
6
+ require 'yajl_ext'
7
+ require 'stringio'
8
+ begin
9
+ require 'json'
10
+ rescue LoadError
11
+ end
12
+
13
+ times = ARGV[0] ? ARGV[0].to_i : 1000
14
+ filename = 'benchmark/subjects/ohai.json'
15
+ json = File.new(filename, 'r')
16
+ hash = Yajl::Parser.new.parse(json)
17
+ json.close
18
+
19
+ puts "Starting benchmark encoding #{filename} #{times} times\n\n"
20
+ Benchmark.bmbm { |x|
21
+ encoder = Yajl::Encoder.new
22
+ x.report {
23
+ puts "Yajl::Encoder#encode"
24
+ times.times {
25
+ encoder.encode(hash, StringIO.new)
26
+ }
27
+ }
28
+ if defined?(JSON)
29
+ x.report {
30
+ puts "JSON's #to_json"
31
+ times.times {
32
+ JSON.generate(hash)
33
+ }
34
+ }
35
+ end
36
+ x.report {
37
+ puts "Marshal.dump"
38
+ times.times {
39
+ Marshal.dump(hash)
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,53 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
3
+
4
+ require 'rubygems'
5
+ require 'benchmark'
6
+ require 'yajl_ext'
7
+ begin
8
+ require 'json'
9
+ rescue LoadError
10
+ end
11
+ require 'yaml'
12
+
13
+ # JSON Section
14
+ filename = 'benchmark/subjects/ohai.json'
15
+ json = File.new(filename, 'r')
16
+ hash = Yajl::Parser.new.parse(json)
17
+ json.close
18
+
19
+ times = ARGV[0] ? ARGV[0].to_i : 1000
20
+ puts "Starting benchmark encoding #{filename} into JSON #{times} times\n\n"
21
+ Benchmark.bmbm { |x|
22
+ encoder = Yajl::Encoder.new
23
+ x.report {
24
+ puts "Yajl::Encoder#encode"
25
+ times.times {
26
+ encoder.encode(hash, StringIO.new)
27
+ }
28
+ }
29
+ if defined?(JSON)
30
+ x.report {
31
+ puts "JSON's #to_json"
32
+ times.times {
33
+ JSON.generate(hash)
34
+ }
35
+ }
36
+ end
37
+ }
38
+
39
+ # YAML Section
40
+ filename = 'benchmark/subjects/ohai.yml'
41
+ yml = File.new(filename, 'r')
42
+ data = YAML.load_stream(yml)
43
+ yml.close
44
+
45
+ puts "Starting benchmark encoding #{filename} into YAML #{times} times\n\n"
46
+ Benchmark.bmbm { |x|
47
+ x.report {
48
+ puts "YAML.dump"
49
+ times.times {
50
+ YAML.dump(data, StringIO.new)
51
+ }
52
+ }
53
+ }
data/benchmark/http.rb ADDED
@@ -0,0 +1,32 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
3
+
4
+ require 'rubygems'
5
+ require 'benchmark'
6
+ require 'yajl/http_stream'
7
+ require 'yajl/gzip'
8
+ require 'yajl/deflate'
9
+ require 'yajl/bzip2' unless defined?(Bzip2)
10
+ require 'json'
11
+ require 'uri'
12
+ require 'net/http'
13
+
14
+ uri = URI.parse('http://search.twitter.com/search.json?q=github')
15
+ # uri = URI.parse('http://localhost/yajl-ruby.git/benchmark/subjects/contacts.json')
16
+
17
+ times = ARGV[0] ? ARGV[0].to_i : 1
18
+ puts "Starting benchmark parsing #{uri.to_s} #{times} times\n\n"
19
+ Benchmark.bmbm { |x|
20
+ x.report {
21
+ puts "Yajl::HttpStream.get"
22
+ times.times {
23
+ Yajl::HttpStream.get(uri)
24
+ }
25
+ }
26
+ x.report {
27
+ puts "JSON.parser"
28
+ times.times {
29
+ JSON.parse(Net::HTTP.get_response(uri).body, :max_nesting => false)
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,59 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
3
+
4
+ require 'rubygems'
5
+ require 'benchmark'
6
+ require 'yajl_ext'
7
+ begin
8
+ require 'json'
9
+ rescue LoadError
10
+ end
11
+ begin
12
+ require 'active_support'
13
+ rescue LoadError
14
+ end
15
+
16
+ filename = ARGV[0] || 'benchmark/subjects/twitter_search.json'
17
+ json = File.new(filename, 'r')
18
+
19
+ times = ARGV[1] ? ARGV[1].to_i : 1000
20
+ puts "Starting benchmark parsing #{File.size(filename)} bytes of JSON data #{times} times\n\n"
21
+ Benchmark.bmbm { |x|
22
+ io_parser = Yajl::Parser.new
23
+ io_parser.on_parse_complete = lambda {|obj|} if times > 1
24
+ x.report {
25
+ puts "Yajl::Parser#parse (from an IO)"
26
+ times.times {
27
+ json.rewind
28
+ io_parser.parse(json)
29
+ }
30
+ }
31
+ string_parser = Yajl::Parser.new
32
+ string_parser.on_parse_complete = lambda {|obj|} if times > 1
33
+ x.report {
34
+ puts "Yajl::Parser#parse (from a String)"
35
+ times.times {
36
+ json.rewind
37
+ string_parser.parse(json.read)
38
+ }
39
+ }
40
+ if defined?(JSON)
41
+ x.report {
42
+ puts "JSON.parse"
43
+ times.times {
44
+ json.rewind
45
+ JSON.parse(json.read, :max_nesting => false)
46
+ }
47
+ }
48
+ end
49
+ if defined?(ActiveSupport::JSON)
50
+ x.report {
51
+ puts "ActiveSupport::JSON.decode"
52
+ times.times {
53
+ json.rewind
54
+ ActiveSupport::JSON.decode(json.read)
55
+ }
56
+ }
57
+ end
58
+ }
59
+ json.close
@@ -0,0 +1,50 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
3
+
4
+ require 'rubygems'
5
+ require 'benchmark'
6
+ require 'yajl_ext'
7
+ begin
8
+ require 'json'
9
+ rescue LoadError
10
+ end
11
+
12
+ # JSON section
13
+ filename = 'benchmark/subjects/ohai.json'
14
+ marshal_filename = 'benchmark/subjects/ohai.marshal_dump'
15
+ json = File.new(filename, 'r')
16
+ marshal_file = File.new(marshal_filename, 'r')
17
+
18
+ hash = {}
19
+
20
+ times = ARGV[0] ? ARGV[0].to_i : 1000
21
+ puts "Starting benchmark parsing #{File.size(filename)} bytes of JSON data #{times} times\n\n"
22
+ Benchmark.bmbm { |x|
23
+ x.report {
24
+ puts "Yajl::Parser#parse"
25
+ yajl = Yajl::Parser.new
26
+ yajl.on_parse_complete = lambda {|obj|} if times > 1
27
+ times.times {
28
+ json.rewind
29
+ hash = yajl.parse(json)
30
+ }
31
+ }
32
+ if defined?(JSON)
33
+ x.report {
34
+ puts "JSON.parse"
35
+ times.times {
36
+ json.rewind
37
+ JSON.parse(json.read, :max_nesting => false)
38
+ }
39
+ }
40
+ end
41
+ x.report {
42
+ puts "Marshal.load"
43
+ times.times {
44
+ marshal_file.rewind
45
+ Marshal.load(marshal_file)
46
+ }
47
+ }
48
+ }
49
+ json.close
50
+ marshal_file.close
@@ -0,0 +1,55 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
3
+
4
+ require 'rubygems'
5
+ require 'benchmark'
6
+ require 'yajl_ext'
7
+ begin
8
+ require 'json'
9
+ rescue LoadError
10
+ end
11
+ require 'yaml'
12
+
13
+ # JSON section
14
+ filename = 'benchmark/subjects/ohai.json'
15
+ json = File.new(filename, 'r')
16
+
17
+ times = ARGV[0] ? ARGV[0].to_i : 1000
18
+ puts "Starting benchmark parsing #{File.size(filename)} bytes of JSON data #{times} times\n\n"
19
+ Benchmark.bmbm { |x|
20
+ parser = Yajl::Parser.new
21
+ parser.on_parse_complete = lambda {|obj|} if times > 1
22
+ x.report {
23
+ puts "Yajl::Parser#parse"
24
+ times.times {
25
+ json.rewind
26
+ parser.parse(json)
27
+ }
28
+ }
29
+ if defined?(JSON)
30
+ x.report {
31
+ puts "JSON.parse"
32
+ times.times {
33
+ json.rewind
34
+ JSON.parse(json.read, :max_nesting => false)
35
+ }
36
+ }
37
+ end
38
+ }
39
+ json.close
40
+
41
+ # YAML section
42
+ filename = 'benchmark/subjects/ohai.yml'
43
+ yaml = File.new(filename, 'r')
44
+
45
+ puts "Starting benchmark parsing #{File.size(filename)} bytes of YAML data #{times} times\n\n"
46
+ Benchmark.bmbm { |x|
47
+ x.report {
48
+ puts "YAML.load_stream"
49
+ times.times {
50
+ yaml.rewind
51
+ YAML.load(yaml)
52
+ }
53
+ }
54
+ }
55
+ yaml.close
@@ -0,0 +1,54 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
3
+
4
+ require 'rubygems'
5
+ require 'benchmark'
6
+ require 'yajl_ext'
7
+ begin
8
+ require 'json'
9
+ rescue LoadError
10
+ end
11
+ begin
12
+ require 'active_support'
13
+ rescue LoadError
14
+ end
15
+
16
+ filename = 'benchmark/subjects/twitter_stream.json'
17
+ json = File.new(filename, 'r')
18
+
19
+ times = ARGV[0] ? ARGV[0].to_i : 100
20
+ puts "Starting benchmark parsing JSON stream (#{File.size(filename)} bytes of JSON data with 430 JSON separate strings) #{times} times\n\n"
21
+ Benchmark.bmbm { |x|
22
+ parser = Yajl::Parser.new
23
+ parser.on_parse_complete = lambda {|obj|}
24
+ x.report {
25
+ puts "Yajl::Parser#parse"
26
+ times.times {
27
+ json.rewind
28
+ parser.parse(json)
29
+ }
30
+ }
31
+ if defined?(JSON)
32
+ x.report {
33
+ puts "JSON.parse"
34
+ times.times {
35
+ json.rewind
36
+ while chunk = json.gets
37
+ JSON.parse(chunk, :max_nesting => false)
38
+ end
39
+ }
40
+ }
41
+ end
42
+ if defined?(ActiveSupport::JSON)
43
+ x.report {
44
+ puts "ActiveSupport::JSON.decode"
45
+ times.times {
46
+ json.rewind
47
+ while chunk = json.gets
48
+ ActiveSupport::JSON.decode(chunk)
49
+ end
50
+ }
51
+ }
52
+ end
53
+ }
54
+ json.close
@@ -0,0 +1 @@
1
+ {"item": {"name": "generated", "cached_tag_list": "", "updated_at": "2009-03-24T05:25:09Z", "updated_by_id": null, "price": 1.99, "delta": false, "cost": 0.597, "account_id": 16, "unit": null, "import_tag": null, "taxable": true, "id": 1, "created_by_id": null, "description": null, "company_id": 0, "sku": "06317-0306", "created_at": "2009-03-24T05:25:09Z", "active": true}}