yajl-ruby 1.0.0-x86-mswin32-60

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.

Potentially problematic release.


This version of yajl-ruby might be problematic. Click here for more details.

Files changed (152) hide show
  1. data/.gitignore +12 -0
  2. data/.rspec +2 -0
  3. data/CHANGELOG.md +327 -0
  4. data/Gemfile +3 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +362 -0
  7. data/Rakefile +2 -0
  8. data/benchmark/encode.rb +72 -0
  9. data/benchmark/encode_json_and_marshal.rb +42 -0
  10. data/benchmark/encode_json_and_yaml.rb +53 -0
  11. data/benchmark/http.rb +32 -0
  12. data/benchmark/parse.rb +94 -0
  13. data/benchmark/parse_json_and_marshal.rb +50 -0
  14. data/benchmark/parse_json_and_yaml.rb +55 -0
  15. data/benchmark/parse_stream.rb +54 -0
  16. data/benchmark/subjects/item.json +1 -0
  17. data/benchmark/subjects/ohai.json +1216 -0
  18. data/benchmark/subjects/ohai.marshal_dump +0 -0
  19. data/benchmark/subjects/ohai.yml +975 -0
  20. data/benchmark/subjects/twitter_search.json +1 -0
  21. data/benchmark/subjects/twitter_stream.json +430 -0
  22. data/benchmark/subjects/unicode.json +1 -0
  23. data/examples/encoding/chunked_encoding.rb +27 -0
  24. data/examples/encoding/one_shot.rb +13 -0
  25. data/examples/encoding/to_an_io.rb +12 -0
  26. data/examples/http/twitter_search_api.rb +12 -0
  27. data/examples/http/twitter_stream_api.rb +26 -0
  28. data/examples/parsing/from_file.rb +14 -0
  29. data/examples/parsing/from_stdin.rb +9 -0
  30. data/examples/parsing/from_string.rb +13 -0
  31. data/ext/yajl/api/yajl_common.h +89 -0
  32. data/ext/yajl/api/yajl_gen.h +161 -0
  33. data/ext/yajl/api/yajl_parse.h +196 -0
  34. data/ext/yajl/api/yajl_version.h +23 -0
  35. data/ext/yajl/extconf.rb +7 -0
  36. data/ext/yajl/yajl.c +164 -0
  37. data/ext/yajl/yajl_alloc.c +65 -0
  38. data/ext/yajl/yajl_alloc.h +50 -0
  39. data/ext/yajl/yajl_buf.c +119 -0
  40. data/ext/yajl/yajl_buf.h +73 -0
  41. data/ext/yajl/yajl_bytestack.h +85 -0
  42. data/ext/yajl/yajl_encode.c +201 -0
  43. data/ext/yajl/yajl_encode.h +52 -0
  44. data/ext/yajl/yajl_ext.c +905 -0
  45. data/ext/yajl/yajl_ext.h +135 -0
  46. data/ext/yajl/yajl_gen.c +344 -0
  47. data/ext/yajl/yajl_lex.c +748 -0
  48. data/ext/yajl/yajl_lex.h +135 -0
  49. data/ext/yajl/yajl_parser.c +450 -0
  50. data/ext/yajl/yajl_parser.h +82 -0
  51. data/ext/yajl/yajl_version.c +7 -0
  52. data/lib/yajl.rb +75 -0
  53. data/lib/yajl/1.8/yajl.so +0 -0
  54. data/lib/yajl/1.9/yajl.so +0 -0
  55. data/lib/yajl/bzip2.rb +11 -0
  56. data/lib/yajl/bzip2/stream_reader.rb +31 -0
  57. data/lib/yajl/bzip2/stream_writer.rb +14 -0
  58. data/lib/yajl/deflate.rb +6 -0
  59. data/lib/yajl/deflate/stream_reader.rb +43 -0
  60. data/lib/yajl/deflate/stream_writer.rb +20 -0
  61. data/lib/yajl/gzip.rb +6 -0
  62. data/lib/yajl/gzip/stream_reader.rb +30 -0
  63. data/lib/yajl/gzip/stream_writer.rb +13 -0
  64. data/lib/yajl/http_stream.rb +212 -0
  65. data/lib/yajl/json_gem.rb +15 -0
  66. data/lib/yajl/json_gem/encoding.rb +51 -0
  67. data/lib/yajl/json_gem/parsing.rb +26 -0
  68. data/lib/yajl/version.rb +3 -0
  69. data/lib/yajl/yajl.rb +2 -0
  70. data/spec/encoding/encoding_spec.rb +271 -0
  71. data/spec/global/global_spec.rb +54 -0
  72. data/spec/http/fixtures/http.bzip2.dump +0 -0
  73. data/spec/http/fixtures/http.chunked.dump +11 -0
  74. data/spec/http/fixtures/http.deflate.dump +0 -0
  75. data/spec/http/fixtures/http.error.dump +12 -0
  76. data/spec/http/fixtures/http.gzip.dump +0 -0
  77. data/spec/http/fixtures/http.html.dump +1220 -0
  78. data/spec/http/fixtures/http.raw.dump +1226 -0
  79. data/spec/http/http_delete_spec.rb +98 -0
  80. data/spec/http/http_error_spec.rb +32 -0
  81. data/spec/http/http_get_spec.rb +109 -0
  82. data/spec/http/http_post_spec.rb +123 -0
  83. data/spec/http/http_put_spec.rb +105 -0
  84. data/spec/http/http_stream_options_spec.rb +27 -0
  85. data/spec/json_gem_compatibility/compatibility_spec.rb +203 -0
  86. data/spec/parsing/active_support_spec.rb +64 -0
  87. data/spec/parsing/chunked_spec.rb +96 -0
  88. data/spec/parsing/fixtures/fail.15.json +1 -0
  89. data/spec/parsing/fixtures/fail.16.json +1 -0
  90. data/spec/parsing/fixtures/fail.17.json +1 -0
  91. data/spec/parsing/fixtures/fail.26.json +1 -0
  92. data/spec/parsing/fixtures/fail11.json +1 -0
  93. data/spec/parsing/fixtures/fail12.json +1 -0
  94. data/spec/parsing/fixtures/fail13.json +1 -0
  95. data/spec/parsing/fixtures/fail14.json +1 -0
  96. data/spec/parsing/fixtures/fail19.json +1 -0
  97. data/spec/parsing/fixtures/fail20.json +1 -0
  98. data/spec/parsing/fixtures/fail21.json +1 -0
  99. data/spec/parsing/fixtures/fail22.json +1 -0
  100. data/spec/parsing/fixtures/fail23.json +1 -0
  101. data/spec/parsing/fixtures/fail24.json +1 -0
  102. data/spec/parsing/fixtures/fail25.json +1 -0
  103. data/spec/parsing/fixtures/fail27.json +2 -0
  104. data/spec/parsing/fixtures/fail28.json +2 -0
  105. data/spec/parsing/fixtures/fail3.json +1 -0
  106. data/spec/parsing/fixtures/fail4.json +1 -0
  107. data/spec/parsing/fixtures/fail5.json +1 -0
  108. data/spec/parsing/fixtures/fail6.json +1 -0
  109. data/spec/parsing/fixtures/fail9.json +1 -0
  110. data/spec/parsing/fixtures/pass.array.json +6 -0
  111. data/spec/parsing/fixtures/pass.codepoints_from_unicode_org.json +1 -0
  112. data/spec/parsing/fixtures/pass.contacts.json +1 -0
  113. data/spec/parsing/fixtures/pass.db100.xml.json +1 -0
  114. data/spec/parsing/fixtures/pass.db1000.xml.json +1 -0
  115. data/spec/parsing/fixtures/pass.dc_simple_with_comments.json +11 -0
  116. data/spec/parsing/fixtures/pass.deep_arrays.json +1 -0
  117. data/spec/parsing/fixtures/pass.difficult_json_c_test_case.json +1 -0
  118. data/spec/parsing/fixtures/pass.difficult_json_c_test_case_with_comments.json +1 -0
  119. data/spec/parsing/fixtures/pass.doubles.json +1 -0
  120. data/spec/parsing/fixtures/pass.empty_array.json +1 -0
  121. data/spec/parsing/fixtures/pass.empty_string.json +1 -0
  122. data/spec/parsing/fixtures/pass.escaped_bulgarian.json +4 -0
  123. data/spec/parsing/fixtures/pass.escaped_foobar.json +1 -0
  124. data/spec/parsing/fixtures/pass.item.json +1 -0
  125. data/spec/parsing/fixtures/pass.json-org-sample1.json +23 -0
  126. data/spec/parsing/fixtures/pass.json-org-sample2.json +11 -0
  127. data/spec/parsing/fixtures/pass.json-org-sample3.json +26 -0
  128. data/spec/parsing/fixtures/pass.json-org-sample4-nows.json +88 -0
  129. data/spec/parsing/fixtures/pass.json-org-sample4.json +89 -0
  130. data/spec/parsing/fixtures/pass.json-org-sample5.json +27 -0
  131. data/spec/parsing/fixtures/pass.map-spain.xml.json +1 -0
  132. data/spec/parsing/fixtures/pass.ns-invoice100.xml.json +1 -0
  133. data/spec/parsing/fixtures/pass.ns-soap.xml.json +1 -0
  134. data/spec/parsing/fixtures/pass.numbers-fp-4k.json +6 -0
  135. data/spec/parsing/fixtures/pass.numbers-fp-64k.json +61 -0
  136. data/spec/parsing/fixtures/pass.numbers-int-4k.json +11 -0
  137. data/spec/parsing/fixtures/pass.numbers-int-64k.json +154 -0
  138. data/spec/parsing/fixtures/pass.twitter-search.json +1 -0
  139. data/spec/parsing/fixtures/pass.twitter-search2.json +1 -0
  140. data/spec/parsing/fixtures/pass.unicode.json +3315 -0
  141. data/spec/parsing/fixtures/pass.yelp.json +1 -0
  142. data/spec/parsing/fixtures/pass1.json +56 -0
  143. data/spec/parsing/fixtures/pass2.json +1 -0
  144. data/spec/parsing/fixtures/pass3.json +6 -0
  145. data/spec/parsing/fixtures_spec.rb +40 -0
  146. data/spec/parsing/one_off_spec.rb +85 -0
  147. data/spec/rcov.opts +3 -0
  148. data/spec/spec_helper.rb +16 -0
  149. data/tasks/compile.rake +35 -0
  150. data/tasks/rspec.rake +16 -0
  151. data/yajl-ruby.gemspec +24 -0
  152. metadata +335 -0
@@ -0,0 +1,15 @@
1
+ puts "DEPRECATION WARNING: Yajl's JSON gem compatibility API is going to be removed in 2.0"
2
+
3
+ require 'yajl' unless defined?(Yajl::Parser)
4
+ require 'yajl/json_gem/parsing'
5
+ require 'yajl/json_gem/encoding'
6
+
7
+ module ::Kernel
8
+ def JSON(object, opts = {})
9
+ if object.respond_to? :to_s
10
+ JSON.parse(object.to_s, JSON.default_options.merge(opts))
11
+ else
12
+ JSON.generate(object, opts)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,51 @@
1
+ require 'yajl' unless defined?(Yajl::Parser)
2
+
3
+ # NOTE: this is probably temporary until I can split out the JSON compat C code into it's own
4
+ # extension that can be included when this file is.
5
+ Yajl::Encoder.enable_json_gem_compatability
6
+
7
+ # Our fallback to_json definition
8
+ unless defined?(ActiveSupport)
9
+ class Object
10
+ def to_json(*args, &block)
11
+ "\"#{to_s}\""
12
+ end
13
+ end
14
+ end
15
+
16
+ module JSON
17
+ class JSONError < StandardError; end unless defined?(JSON::JSONError)
18
+ class GeneratorError < JSONError; end unless defined?(JSON::GeneratorError)
19
+
20
+ def self.generate(obj, opts={})
21
+ begin
22
+ options_map = {}
23
+ if opts.has_key?(:indent)
24
+ options_map[:pretty] = true
25
+ options_map[:indent] = opts[:indent]
26
+ end
27
+ Yajl::Encoder.encode(obj, options_map)
28
+ rescue Yajl::EncodeError => e
29
+ raise JSON::GeneratorError, e.message
30
+ end
31
+ end
32
+
33
+ def self.pretty_generate(obj, opts={})
34
+ begin
35
+ options_map = {}
36
+ options_map[:pretty] = true
37
+ options_map[:indent] = opts[:indent] if opts.has_key?(:indent)
38
+ Yajl::Encoder.encode(obj, options_map)
39
+ rescue Yajl::EncodeError => e
40
+ raise JSON::GeneratorError, e.message
41
+ end
42
+ end
43
+
44
+ def self.dump(obj, io=nil, *args)
45
+ begin
46
+ Yajl::Encoder.encode(obj, io)
47
+ rescue Yajl::EncodeError => e
48
+ raise JSON::GeneratorError, e.message
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,26 @@
1
+ require 'yajl' unless defined?(Yajl::Parser)
2
+
3
+ module JSON
4
+ class JSONError < StandardError; end unless defined?(JSON::JSONError)
5
+ class ParserError < JSONError; end unless defined?(JSON::ParserError)
6
+
7
+ def self.default_options
8
+ @default_options ||= {:symbolize_keys => false}
9
+ end
10
+
11
+ def self.parse(str, opts=JSON.default_options)
12
+ begin
13
+ Yajl::Parser.parse(str, opts)
14
+ rescue Yajl::ParseError => e
15
+ raise JSON::ParserError, e.message
16
+ end
17
+ end
18
+
19
+ def self.load(input, *args)
20
+ begin
21
+ Yajl::Parser.parse(input, default_options)
22
+ rescue Yajl::ParseError => e
23
+ raise JSON::ParserError, e.message
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ module Yajl
2
+ VERSION = '1.0.0'
3
+ end
data/lib/yajl/yajl.rb ADDED
@@ -0,0 +1,2 @@
1
+ RUBY_VERSION =~ /(\d+.\d+)/
2
+ require "yajl/#{$1}/yajl"
@@ -0,0 +1,271 @@
1
+ # encoding: UTF-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
3
+
4
+ class Dummy2
5
+ def to_json
6
+ "{\"hawtness\":true}"
7
+ end
8
+ end
9
+
10
+ class TheMindKiller
11
+ def to_json
12
+ @wait_i_dont_exist_this_is_a_horrible_mistake_dont_do_it_aiiiiiiiiieeeeeee
13
+ end
14
+ end
15
+
16
+ class TheMindKillerDuce
17
+ def to_s
18
+ @wait_i_dont_exist_this_is_a_horrible_mistake_dont_do_it_aiiiiiiiiieeeeeee
19
+ end
20
+ end
21
+
22
+ describe "Yajl JSON encoder" do
23
+ FILES = Dir[File.dirname(__FILE__)+'/../../benchmark/subjects/*.json']
24
+
25
+ FILES.each do |file|
26
+ it "should encode #{File.basename(file)} to an IO" do
27
+ # we don't care about testing the stream subject as it has multiple JSON strings in it
28
+ if File.basename(file) != 'twitter_stream.json'
29
+ input = File.new(File.expand_path(file), 'r')
30
+ io = StringIO.new
31
+ encoder = Yajl::Encoder.new
32
+ hash = Yajl::Parser.parse(input)
33
+ encoder.encode(hash, io)
34
+ io.rewind
35
+ hash2 = Yajl::Parser.parse(io)
36
+ io.close
37
+ input.close
38
+ hash.should == hash2
39
+ end
40
+ end
41
+ end
42
+
43
+ FILES.each do |file|
44
+ it "should encode #{File.basename(file)} and return a String" do
45
+ # we don't care about testing the stream subject as it has multiple JSON strings in it
46
+ if File.basename(file) != 'twitter_stream.json'
47
+ input = File.new(File.expand_path(file), 'r')
48
+ encoder = Yajl::Encoder.new
49
+ hash = Yajl::Parser.parse(input)
50
+ output = encoder.encode(hash)
51
+ hash2 = Yajl::Parser.parse(output)
52
+ input.close
53
+ hash.should == hash2
54
+ end
55
+ end
56
+ end
57
+
58
+ FILES.each do |file|
59
+ it "should encode #{File.basename(file)} call the passed block, passing it a String" do
60
+ # we don't care about testing the stream subject as it has multiple JSON strings in it
61
+ if File.basename(file) != 'twitter_stream.json'
62
+ input = File.new(File.expand_path(file), 'r')
63
+ encoder = Yajl::Encoder.new
64
+ hash = Yajl::Parser.parse(input)
65
+ output = ''
66
+ encoder.encode(hash) do |json_str|
67
+ output << json_str
68
+ end
69
+ hash2 = Yajl::Parser.parse(output)
70
+ input.close
71
+ hash.should == hash2
72
+ end
73
+ end
74
+ end
75
+
76
+ it "should encode with :pretty turned on and a single space indent, to an IO" do
77
+ output = "{\n \"foo\": 1234\n}"
78
+ obj = {:foo => 1234}
79
+ io = StringIO.new
80
+ encoder = Yajl::Encoder.new(:pretty => true, :indent => ' ')
81
+ encoder.encode(obj, io)
82
+ io.rewind
83
+ io.read.should == output
84
+ end
85
+
86
+ it "should encode with :pretty turned on and a single space indent, and return a String" do
87
+ output = "{\n \"foo\": 1234\n}"
88
+ obj = {:foo => 1234}
89
+ encoder = Yajl::Encoder.new(:pretty => true, :indent => ' ')
90
+ output = encoder.encode(obj)
91
+ output.should == output
92
+ end
93
+
94
+ it "should encode with :pretty turned on and a tab character indent, to an IO" do
95
+ output = "{\n\t\"foo\": 1234\n}"
96
+ obj = {:foo => 1234}
97
+ io = StringIO.new
98
+ encoder = Yajl::Encoder.new(:pretty => true, :indent => "\t")
99
+ encoder.encode(obj, io)
100
+ io.rewind
101
+ io.read.should == output
102
+ end
103
+
104
+ it "should encode with :pretty turned on and a tab character indent, and return a String" do
105
+ output = "{\n\t\"foo\": 1234\n}"
106
+ obj = {:foo => 1234}
107
+ encoder = Yajl::Encoder.new(:pretty => true, :indent => "\t")
108
+ output = encoder.encode(obj)
109
+ output.should == output
110
+ end
111
+
112
+ it "should encode with it's class method with :pretty and a tab character indent options set, to an IO" do
113
+ output = "{\n\t\"foo\": 1234\n}"
114
+ obj = {:foo => 1234}
115
+ io = StringIO.new
116
+ Yajl::Encoder.encode(obj, io, :pretty => true, :indent => "\t")
117
+ io.rewind
118
+ io.read.should == output
119
+ end
120
+
121
+ it "should encode with it's class method with :pretty and a tab character indent options set, and return a String" do
122
+ output = "{\n\t\"foo\": 1234\n}"
123
+ obj = {:foo => 1234}
124
+ output = Yajl::Encoder.encode(obj, :pretty => true, :indent => "\t")
125
+ output.should == output
126
+ end
127
+
128
+ it "should encode with it's class method with :pretty and a tab character indent options set, to a block" do
129
+ output = "{\n\t\"foo\": 1234\n}"
130
+ obj = {:foo => 1234}
131
+ output = ''
132
+ Yajl::Encoder.encode(obj, :pretty => true, :indent => "\t") do |json_str|
133
+ output = json_str
134
+ end
135
+ output.should == output
136
+ end
137
+
138
+ it "should encode multiple objects into a single stream, to an IO" do
139
+ io = StringIO.new
140
+ obj = {:foo => 1234}
141
+ encoder = Yajl::Encoder.new
142
+ 5.times do
143
+ encoder.encode(obj, io)
144
+ end
145
+ io.rewind
146
+ output = "{\"foo\":1234}{\"foo\":1234}{\"foo\":1234}{\"foo\":1234}{\"foo\":1234}"
147
+ io.read.should == output
148
+ end
149
+
150
+ it "should encode multiple objects into a single stream, and return a String" do
151
+ obj = {:foo => 1234}
152
+ encoder = Yajl::Encoder.new
153
+ json_output = ''
154
+ 5.times do
155
+ json_output << encoder.encode(obj)
156
+ end
157
+ output = "{\"foo\":1234}{\"foo\":1234}{\"foo\":1234}{\"foo\":1234}{\"foo\":1234}"
158
+ json_output.should == output
159
+ end
160
+
161
+ it "should encode all map keys as strings" do
162
+ Yajl::Encoder.encode({1=>1}).should eql("{\"1\":1}")
163
+ end
164
+
165
+ it "should check for and call #to_json if it exists on custom objects" do
166
+ d = Dummy2.new
167
+ Yajl::Encoder.encode({:foo => d}).should eql('{"foo":{"hawtness":true}}')
168
+ end
169
+
170
+ it "should encode a hash where the key and value can be symbols" do
171
+ Yajl::Encoder.encode({:foo => :bar}).should eql('{"foo":"bar"}')
172
+ end
173
+
174
+ it "should encode using a newline or nil terminator" do
175
+ Yajl::Encoder.new(:terminator => "\n").encode({:foo => :bar}).should eql("{\"foo\":\"bar\"}\n")
176
+ Yajl::Encoder.new(:terminator => nil).encode({:foo => :bar}).should eql("{\"foo\":\"bar\"}")
177
+ end
178
+
179
+ it "should encode using a newline or nil terminator, to an IO" do
180
+ s = StringIO.new
181
+ Yajl::Encoder.new(:terminator => "\n").encode({:foo => :bar}, s)
182
+ s.rewind
183
+ s.read.should eql("{\"foo\":\"bar\"}\n")
184
+
185
+ s = StringIO.new
186
+ Yajl::Encoder.new(:terminator => nil).encode({:foo => :bar}, s)
187
+ s.rewind
188
+ s.read.should eql("{\"foo\":\"bar\"}")
189
+ end
190
+
191
+ it "should encode using a newline or nil terminator, using a block" do
192
+ s = StringIO.new
193
+ Yajl::Encoder.new(:terminator => "\n").encode({:foo => :bar}) do |chunk|
194
+ s << chunk
195
+ end
196
+ s.rewind
197
+ s.read.should eql("{\"foo\":\"bar\"}\n")
198
+
199
+ s = StringIO.new
200
+ nilpassed = false
201
+ Yajl::Encoder.new(:terminator => nil).encode({:foo => :bar}) do |chunk|
202
+ nilpassed = true if chunk.nil?
203
+ s << chunk
204
+ end
205
+ nilpassed.should be_true
206
+ s.rewind
207
+ s.read.should eql("{\"foo\":\"bar\"}")
208
+ end
209
+
210
+ it "should not encode NaN" do
211
+ lambda {
212
+ Yajl::Encoder.encode(0.0/0.0)
213
+ }.should raise_error(Yajl::EncodeError)
214
+ end
215
+
216
+ it "should not encode Infinity or -Infinity" do
217
+ lambda {
218
+ Yajl::Encoder.encode(1.0/0.0)
219
+ }.should raise_error(Yajl::EncodeError)
220
+ lambda {
221
+ Yajl::Encoder.encode(-1.0/0.0)
222
+ }.should raise_error(Yajl::EncodeError)
223
+ end
224
+
225
+ it "should encode with unicode chars in the key" do
226
+ hash = {"浅草" => "<- those are unicode"}
227
+ Yajl::Encoder.encode(hash).should eql("{\"浅草\":\"<- those are unicode\"}")
228
+ end
229
+
230
+ if RUBY_VERSION =~ /^1.9/
231
+ it "should return a string encoded in utf-8 if Encoding.default_internal is nil" do
232
+ Encoding.default_internal = nil
233
+ hash = {"浅草" => "<- those are unicode"}
234
+ Yajl::Encoder.encode(hash).encoding.should eql(Encoding.find('utf-8'))
235
+ end
236
+
237
+ it "should return a string encoded in utf-8 even if Encoding.default_internal *is* set" do
238
+ Encoding.default_internal = Encoding.find('utf-8')
239
+ hash = {"浅草" => "<- those are unicode"}
240
+ Yajl::Encoder.encode(hash).encoding.should eql(Encoding.default_internal)
241
+ Encoding.default_internal = Encoding.find('us-ascii')
242
+ hash = {"浅草" => "<- those are unicode"}
243
+ Yajl::Encoder.encode(hash).encoding.should eql(Encoding.find('utf-8'))
244
+ end
245
+ end
246
+
247
+ it "should be able to escape / characters if html_safe is enabled" do
248
+ unsafe_encoder = Yajl::Encoder.new(:html_safe => false)
249
+ safe_encoder = Yajl::Encoder.new(:html_safe => true)
250
+
251
+ unsafe_encoder.encode("</script>").should_not eql("\"<\\/script>\"")
252
+ safe_encoder.encode("</script>").should eql("\"<\\/script>\"")
253
+ end
254
+
255
+ it "should default to *not* escaping / characters" do
256
+ unsafe_encoder = Yajl::Encoder.new
257
+ unsafe_encoder.encode("</script>").should_not eql("\"<\\/script>\"")
258
+ end
259
+
260
+ it "return value of #to_json must be a string" do
261
+ lambda {
262
+ Yajl::Encoder.encode(TheMindKiller.new)
263
+ }.should raise_error(TypeError)
264
+ end
265
+
266
+ it "return value of #to_s must be a string" do
267
+ lambda {
268
+ Yajl::Encoder.encode(TheMindKillerDuce.new)
269
+ }.should raise_error(TypeError)
270
+ end
271
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
2
+
3
+ describe "Yajl" do
4
+ context "dump" do
5
+ it "should exist as a class-method" do
6
+ Yajl.should respond_to(:dump)
7
+ end
8
+
9
+ it "should be able to encode to a string" do
10
+ Yajl.dump({:a => 1234}).should eql('{"a":1234}')
11
+ end
12
+
13
+ it "should be able to encode to an IO" do
14
+ io = StringIO.new
15
+ Yajl.dump({:a => 1234}, io)
16
+ io.rewind
17
+ io.read.should eql('{"a":1234}')
18
+ end
19
+
20
+ it "should be able to encode with a block supplied" do
21
+ Yajl.dump({:a => 1234}) do |chunk|
22
+ chunk.should eql('{"a":1234}')
23
+ end
24
+ end
25
+ end
26
+
27
+ context "load" do
28
+ it "should exist as a class-method" do
29
+ Yajl.should respond_to(:load)
30
+ end
31
+
32
+ it "should be able to parse from a string" do
33
+ Yajl.load('{"a":1234}').should eql({"a" => 1234})
34
+ end
35
+
36
+ it "should be able to parse from an IO" do
37
+ io = StringIO.new('{"a":1234}')
38
+ Yajl.load(io).should eql({"a" => 1234})
39
+ end
40
+
41
+ it "should be able to parse from a string with a block supplied" do
42
+ Yajl.load('{"a":1234}') do |h|
43
+ h.should eql({"a" => 1234})
44
+ end
45
+ end
46
+
47
+ it "should be able to parse from an IO with a block supplied" do
48
+ io = StringIO.new('{"a":1234}')
49
+ Yajl.load(io) do |h|
50
+ h.should eql({"a" => 1234})
51
+ end
52
+ end
53
+ end
54
+ end
Binary file
@@ -0,0 +1,11 @@
1
+ HTTP/1.1 200 OK
2
+ Content-Type: application/json
3
+ Transfer-Encoding: chunked
4
+
5
+ 12f
6
+ {"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, "sk
7
+
8
+ 48
9
+ u": "06317-0306", "created_at": "2009-03-24T05:25:09Z", "active": true}}
10
+
11
+ 0