brianmario-yajl-ruby 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,6 +1,12 @@
1
1
  = Changelog
2
2
 
3
- 0.5.0 (?)
3
+ 0.5.1 (May 25th, 2009)
4
+ * added some more tests for the new API
5
+ * inlined a couple of hot functions used in parsing for a little speedup
6
+ * updates to readme, reflecting changes in API
7
+ * version bump to push another gem build
8
+
9
+ 0.5.0 (May 25th, 2009)
4
10
  * Refactored internal API so the caller can specify initialization options for the Parser and Encoder
5
11
  respectively. Two new classes were introduced as a result - Yajl::Parser and Yajl::Encoder.
6
12
  The newly refactored codebase is cleaner, thread-safe and removed all of the hack-code that was trickled
data/README.rdoc CHANGED
@@ -25,16 +25,18 @@ Then maybe parse some JSON from:
25
25
  a File IO
26
26
 
27
27
  json = File.new('test.json', 'r')
28
- hash = Yajl::Stream.parse(json)
28
+ parser = Yajl::Parser.new
29
+ hash = parser.parse(json)
29
30
 
30
31
  or maybe a StringIO
31
32
 
32
- json = StringIO.new
33
- hash = Yajl::Stream.parse(json)
33
+ json = StringIO.new("...some JSON...")
34
+ parser = Yajl::Parser.new
35
+ hash = parser.parse(json)
34
36
 
35
37
  or maybe STDIN
36
38
 
37
- cat someJsonFile.json | ruby -ryajl -e "puts Yajl::Stream.parse(STDIN).inspect"
39
+ cat someJsonFile.json | ruby -ryajl -e "puts Yajl::Parser.new.parse(STDIN).inspect"
38
40
 
39
41
 
40
42
  Or lets say you didn't have access to the IO object that contained JSON data, but instead
@@ -42,6 +44,10 @@ only had access to chunks of it at a time. No problem!
42
44
 
43
45
  (Assume we're in an EventMachine::Connection instance)
44
46
 
47
+ def post_init
48
+ @parser = Yajl::Parser.new
49
+ end
50
+
45
51
  def object_parsed(obj)
46
52
  puts "Sometimes one pays most for the things one gets for nothing. - Albert Einstein"
47
53
  puts obj.inspect
@@ -50,15 +56,12 @@ only had access to chunks of it at a time. No problem!
50
56
  def connection_completed
51
57
  # once a full JSON object has been parsed from the stream
52
58
  # object_parsed will be called, and passed the constructed object
53
- Yajl::Chunked.on_parse_complete = method(:object_parsed)
59
+ @parser.on_parse_complete = method(:object_parsed)
54
60
  end
55
61
 
56
62
  def receive_data(data)
57
63
  # continue passing chunks
58
- Yajl::Chunked.parse_some(data)
59
-
60
- # Or as an alias, you could have done:
61
- # Yajl::Chunked << data
64
+ @parser << data
62
65
  end
63
66
 
64
67
 
@@ -110,7 +113,8 @@ This allows you to encode JSON as a stream, writing directly to a socket
110
113
 
111
114
  socket = TCPSocket.new(192.168.1.101, 9000)
112
115
  hash = {:foo => 12425125, :bar => "some string", ... }
113
- Yajl::Stream.encode(hash, socket)
116
+ encoder = Yajl::Encoder.new
117
+ Yajl::encoder.encode(hash, socket)
114
118
 
115
119
  Or what if you wanted to compress the stream over the wire?
116
120
 
@@ -148,25 +152,25 @@ Here's what parsing a 2.43MB JSON file off the filesystem 20 times looks like:
148
152
 
149
153
  ==== Average
150
154
 
151
- * Yajl::Stream.parse: 32MB
155
+ * Yajl::Parser#parse: 32MB
152
156
  * JSON.parse: 54MB
153
157
  * ActiveSupport::JSON.decode: 63MB
154
158
 
155
159
  ==== Peak
156
160
 
157
- * Yajl::Stream.parse: 32MB
161
+ * Yajl::Parser#parse: 32MB
158
162
  * JSON.parse: 57MB
159
163
  * ActiveSupport::JSON.decode: 67MB
160
164
 
161
165
  === Parse Time
162
166
 
163
- * Yajl::Stream.parse: 4.54s
167
+ * Yajl::Parser#parse: 4.54s
164
168
  * JSON.parse: 5.47s
165
169
  * ActiveSupport::JSON.decode: 64.42s
166
170
 
167
171
  === Encode Time
168
172
 
169
- * Yajl::Stream.encode: 3.59s
173
+ * Yajl::Encoder#encode: 3.59s
170
174
  * JSON#to_json: 6.2s
171
175
  * ActiveSupport::JSON.encode: 45.58s
172
176
 
@@ -176,13 +180,13 @@ NOTE: I converted the 2.4MB JSON file to YAML for this test.
176
180
 
177
181
  ==== Parse Time (from their respective formats)
178
182
 
179
- * Yajl::Stream.parse: 4.33s
183
+ * Yajl::Parser#parse: 4.33s
180
184
  * JSON.parse: 5.37s
181
185
  * YAML.load_stream: 19.47s
182
186
 
183
187
  ==== Encode Time (to their respective formats)
184
188
 
185
- * Yajl::Stream.encode: 3.47s
189
+ * Yajl::Encoder#encode: 3.47s
186
190
  * JSON#to_json: 6.6s
187
191
  * YAML.dump(obj, io): 1309.93s
188
192
 
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :minor: 5
3
- :patch: 0
3
+ :patch: 1
4
4
  :major: 0
data/ext/yajl_ext.c CHANGED
@@ -1,7 +1,7 @@
1
1
  #include "yajl_ext.h"
2
2
 
3
3
  // Helpers for building objects
4
- void yajl_check_and_fire_callback(void * ctx) {
4
+ inline void yajl_check_and_fire_callback(void * ctx) {
5
5
  struct yajl_parser_wrapper * wrapper;
6
6
  GetParser((VALUE)ctx, wrapper);
7
7
 
@@ -14,7 +14,7 @@ void yajl_check_and_fire_callback(void * ctx) {
14
14
  }
15
15
  }
16
16
 
17
- void yajl_set_static_value(void * ctx, VALUE val) {
17
+ inline void yajl_set_static_value(void * ctx, VALUE val) {
18
18
  struct yajl_parser_wrapper * wrapper;
19
19
  VALUE lastEntry, hash;
20
20
  int len;
data/ext/yajl_ext.h CHANGED
@@ -11,8 +11,8 @@ static ID intern_io_read, intern_eof, intern_call, intern_keys, intern_to_s,
11
11
  #define GetParser(obj, sval) (sval = (struct yajl_parser_wrapper*)DATA_PTR(obj));
12
12
  #define GetEncoder(obj, sval) (sval = (yajl_gen*)DATA_PTR(obj));
13
13
 
14
- void yajl_check_and_fire_callback(void * ctx);
15
- void yajl_set_static_value(void * ctx, VALUE val);
14
+ inline void yajl_check_and_fire_callback(void * ctx);
15
+ inline void yajl_set_static_value(void * ctx, VALUE val);
16
16
  void yajl_encode_part(yajl_gen hand, VALUE obj, VALUE io);
17
17
 
18
18
  static int yajl_found_null(void * ctx);
data/lib/yajl.rb CHANGED
@@ -13,7 +13,7 @@ require 'yajl_ext'
13
13
  #
14
14
  # Ruby bindings to the excellent Yajl (Yet Another JSON Parser) ANSI C library.
15
15
  module Yajl
16
- VERSION = "0.5.0"
16
+ VERSION = "0.5.1"
17
17
 
18
18
  # == Yajl::Parser
19
19
  #
@@ -25,4 +25,24 @@ describe "Yajl JSON encoder" do
25
25
  end
26
26
  end
27
27
  end
28
+
29
+ it "should encode with :pretty turned on and a single space indent" do
30
+ output = "{\n \"foo\": {\n \"name\": \"bar\",\n \"id\": 1234\n }\n}\n"
31
+ obj = {:foo => {:id => 1234, :name => "bar"}}
32
+ io = StringIO.new
33
+ encoder = Yajl::Encoder.new(:pretty => true, :indent => ' ')
34
+ encoder.encode(obj, io)
35
+ io.rewind
36
+ io.read.should == output
37
+ end
38
+
39
+ it "should encode with :pretty turned on and a tab character indent" do
40
+ output = "{\n\t\"foo\": {\n\t\t\"name\": \"bar\",\n\t\t\"id\": 1234\n\t}\n}\n"
41
+ obj = {:foo => {:id => 1234, :name => "bar"}}
42
+ io = StringIO.new
43
+ encoder = Yajl::Encoder.new(:pretty => true, :indent => "\t")
44
+ encoder.encode(obj, io)
45
+ io.rewind
46
+ io.read.should == output
47
+ end
28
48
  end
@@ -9,4 +9,30 @@ describe "One-off JSON examples" do
9
9
  parser.parse(StringIO.new('{"key": 23456789012E666}')).should == {"key" => infinity}
10
10
  end
11
11
  end
12
+
13
+ it "should not parse JSON with a comment, with :allow_comments set to false" do
14
+ parser = Yajl::Parser.new(:allow_comments => false)
15
+ json = StringIO.new('{"key": /* this is a comment */ "value"}')
16
+ lambda {
17
+ parser.parse(json)
18
+ }.should raise_error(Yajl::ParseError)
19
+ end
20
+
21
+ it "should parse JSON with a comment, with :allow_comments set to true" do
22
+ parser = Yajl::Parser.new(:allow_comments => true)
23
+ json = StringIO.new('{"key": /* this is a comment */ "value"}')
24
+ lambda {
25
+ parser.parse(json)
26
+ }.should_not raise_error(Yajl::ParseError)
27
+ end
28
+
29
+ it "should not parse invalid UTF8 with :check_utf8 set to true" do
30
+ pending
31
+ # not sure how to write this test yet
32
+ end
33
+
34
+ it "should parse invalid UTF8 with :check_utf8 set to false" do
35
+ pending
36
+ # not sure how to write this test yet
37
+ end
12
38
  end
data/yajl-ruby.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{yajl-ruby}
5
- s.version = "0.5.0"
5
+ s.version = "0.5.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Brian Lopez", "Lloyd Hilaiel"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brianmario-yajl-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Lopez