brianmario-yajl-ruby 0.4.4 → 0.4.5
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/CHANGELOG.rdoc +10 -0
- data/README.rdoc +75 -5
- data/VERSION.yml +2 -2
- data/benchmark/encode.rb +37 -0
- data/benchmark/encode_json_and_marshal.rb +33 -0
- data/benchmark/encode_json_and_yaml.rb +47 -0
- data/benchmark/{stream.rb → parse.rb} +2 -2
- data/benchmark/parse_json_and_marshal.rb +42 -0
- data/benchmark/parse_json_and_yaml.rb +55 -0
- data/benchmark/subjects/contacts.yml +114685 -0
- data/ext/extconf.rb +3 -1
- data/ext/yajl.c +86 -2
- data/ext/yajl.h +2 -1
- data/lib/yajl/bzip2/stream_writer.rb +11 -0
- data/lib/yajl/bzip2.rb +1 -0
- data/lib/yajl/deflate/stream_writer.rb +16 -0
- data/lib/yajl/deflate.rb +2 -1
- data/lib/yajl/gzip/stream_writer.rb +11 -0
- data/lib/yajl/gzip.rb +2 -1
- data/lib/yajl/http_stream.rb +19 -14
- data/lib/yajl.rb +2 -2
- data/yajl-ruby.gemspec +12 -3
- metadata +12 -3
data/ext/extconf.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'mkmf'
|
3
|
+
require 'rbconfig'
|
4
|
+
|
3
5
|
dir_config('yajl')
|
4
6
|
have_header('yajl/yajl_parse.h')
|
5
7
|
have_header('yajl/yajl_gen.h')
|
6
8
|
|
7
9
|
if have_library("yajl")
|
8
|
-
create_makefile("
|
10
|
+
create_makefile("yajl_ext")
|
9
11
|
else
|
10
12
|
puts "Yajl not found, maybe try manually specifying --with-yajl-dir to find it?"
|
11
13
|
end
|
data/ext/yajl.c
CHANGED
@@ -44,6 +44,66 @@ void set_static_value(void * ctx, VALUE val) {
|
|
44
44
|
}
|
45
45
|
}
|
46
46
|
|
47
|
+
void encode_part(yajl_gen hand, VALUE obj, VALUE io) {
|
48
|
+
VALUE str, outBuff, otherObj;
|
49
|
+
int objLen;
|
50
|
+
int idx = 0;
|
51
|
+
const unsigned char * buffer;
|
52
|
+
unsigned int len;
|
53
|
+
yajl_gen_get_buf(hand, &buffer, &len);
|
54
|
+
outBuff = rb_str_new((const char *)buffer, len);
|
55
|
+
rb_io_write(io, outBuff);
|
56
|
+
yajl_gen_clear(hand);
|
57
|
+
|
58
|
+
switch (TYPE(obj)) {
|
59
|
+
case T_HASH:
|
60
|
+
yajl_gen_map_open(hand);
|
61
|
+
|
62
|
+
// TODO: itterate through keys in the hash
|
63
|
+
VALUE keys = rb_funcall(obj, intern_keys, 0);
|
64
|
+
VALUE entry;
|
65
|
+
for(idx=0; idx<RARRAY_LEN(keys); idx++) {
|
66
|
+
entry = rb_ary_entry(keys, idx);
|
67
|
+
// the key
|
68
|
+
encode_part(hand, entry, io);
|
69
|
+
// the value
|
70
|
+
encode_part(hand, rb_hash_aref(obj, entry), io);
|
71
|
+
}
|
72
|
+
|
73
|
+
yajl_gen_map_close(hand);
|
74
|
+
break;
|
75
|
+
case T_ARRAY:
|
76
|
+
yajl_gen_array_open(hand);
|
77
|
+
for(idx=0; idx<RARRAY_LEN(obj); idx++) {
|
78
|
+
otherObj = rb_ary_entry(obj, idx);
|
79
|
+
encode_part(hand, otherObj, io);
|
80
|
+
}
|
81
|
+
yajl_gen_array_close(hand);
|
82
|
+
break;
|
83
|
+
case T_NIL:
|
84
|
+
yajl_gen_null(hand);
|
85
|
+
break;
|
86
|
+
case T_TRUE:
|
87
|
+
yajl_gen_bool(hand, 1);
|
88
|
+
break;
|
89
|
+
case T_FALSE:
|
90
|
+
yajl_gen_bool(hand, 0);
|
91
|
+
break;
|
92
|
+
case T_FIXNUM:
|
93
|
+
case T_FLOAT:
|
94
|
+
case T_BIGNUM:
|
95
|
+
str = rb_funcall(obj, intern_to_s, 0);
|
96
|
+
objLen = RSTRING_LEN(str);
|
97
|
+
yajl_gen_number(hand, RSTRING_PTR(str), (unsigned int)objLen);
|
98
|
+
break;
|
99
|
+
default:
|
100
|
+
str = rb_funcall(obj, intern_to_s, 0);
|
101
|
+
objLen = RSTRING_LEN(str);
|
102
|
+
yajl_gen_string(hand, (const unsigned char *)RSTRING_PTR(str), (unsigned int)objLen);
|
103
|
+
break;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
47
107
|
static int found_null(void * ctx) {
|
48
108
|
set_static_value(ctx, Qnil);
|
49
109
|
check_and_fire_callback(ctx);
|
@@ -150,7 +210,7 @@ static VALUE t_parse(VALUE self, VALUE io) {
|
|
150
210
|
// allocate our parser
|
151
211
|
streamParser = yajl_alloc(&callbacks, &cfg, NULL, (void *)context);
|
152
212
|
|
153
|
-
VALUE parsed =
|
213
|
+
VALUE parsed = rb_str_new2("");
|
154
214
|
VALUE rbufsize = INT2FIX(readBufferSize);
|
155
215
|
|
156
216
|
// now parse from the IO
|
@@ -179,11 +239,33 @@ static VALUE t_parse(VALUE self, VALUE io) {
|
|
179
239
|
return rb_ary_pop(context);
|
180
240
|
}
|
181
241
|
|
182
|
-
|
242
|
+
static VALUE t_encode(VALUE self, VALUE obj, VALUE io) {
|
243
|
+
yajl_gen_config conf = {0, " "};
|
244
|
+
yajl_gen hand;
|
245
|
+
yajl_status stat;
|
246
|
+
const unsigned char * buffer;
|
247
|
+
unsigned int len;
|
248
|
+
VALUE outBuff;
|
249
|
+
|
250
|
+
hand = yajl_gen_alloc(&conf, NULL);
|
251
|
+
encode_part(hand, obj, io);
|
252
|
+
|
253
|
+
// just make sure we output the remaining buffer
|
254
|
+
yajl_gen_get_buf(hand, &buffer, &len);
|
255
|
+
outBuff = rb_str_new((const char *)buffer, len);
|
256
|
+
rb_io_write(io, outBuff);
|
257
|
+
|
258
|
+
yajl_gen_clear(hand);
|
259
|
+
yajl_gen_free(hand);
|
260
|
+
return Qnil;
|
261
|
+
}
|
262
|
+
|
263
|
+
void Init_yajl_ext() {
|
183
264
|
mYajl = rb_define_module("Yajl");
|
184
265
|
|
185
266
|
mStream = rb_define_module_under(mYajl, "Stream");
|
186
267
|
rb_define_module_function(mStream, "parse", t_parse, 1);
|
268
|
+
rb_define_module_function(mStream, "encode", t_encode, 2);
|
187
269
|
|
188
270
|
mChunked = rb_define_module_under(mYajl, "Chunked");
|
189
271
|
rb_define_module_function(mChunked, "parse_some", t_parseSome, 1);
|
@@ -197,4 +279,6 @@ void Init_yajl() {
|
|
197
279
|
intern_eof = rb_intern("eof?");
|
198
280
|
intern_respond_to = rb_intern("respond_to?");
|
199
281
|
intern_call = rb_intern("call");
|
282
|
+
intern_keys = rb_intern("keys");
|
283
|
+
intern_to_s = rb_intern("to_s");
|
200
284
|
}
|
data/ext/yajl.h
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
#define READ_BUFSIZE 4096
|
6
6
|
|
7
7
|
static VALUE cParseError, mYajl, mStream, mChunked;
|
8
|
-
static ID intern_io_read, intern_eof, intern_respond_to, intern_call;
|
8
|
+
static ID intern_io_read, intern_eof, intern_respond_to, intern_call, intern_keys, intern_to_s;
|
9
9
|
static int readBufferSize = READ_BUFSIZE;
|
10
10
|
static yajl_parser_config cfg = {1, 1};
|
11
11
|
|
@@ -43,3 +43,4 @@ static yajl_callbacks callbacks = {
|
|
43
43
|
static VALUE t_setParseComplete(VALUE self, VALUE callback);
|
44
44
|
static VALUE t_parseSome(VALUE self, VALUE string);
|
45
45
|
static VALUE t_parse(VALUE self, VALUE io);
|
46
|
+
static VALUE t_encode(VALUE self, VALUE obj, VALUE io);
|
data/lib/yajl/bzip2.rb
CHANGED
@@ -5,6 +5,7 @@ require 'yajl.rb' unless defined?(Yajl::Stream)
|
|
5
5
|
begin
|
6
6
|
require 'bzip2' unless defined?(Bzip2)
|
7
7
|
require 'yajl/bzip2/stream_reader.rb'
|
8
|
+
require 'yajl/bzip2/stream_writer.rb'
|
8
9
|
rescue LoadError => e
|
9
10
|
raise "Unable to load the bzip2 library. Is the bzip2-ruby gem installed?"
|
10
11
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Yajl
|
3
|
+
module Deflate
|
4
|
+
# === Yajl::Deflate::StreamWriter
|
5
|
+
class StreamWriter < ::Zlib::Deflate
|
6
|
+
def write(str)
|
7
|
+
deflate(str)
|
8
|
+
str.size unless str.nil?
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.encode(obj, io)
|
12
|
+
Yajl::Stream.encode(obj, new(io))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/yajl/deflate.rb
CHANGED
data/lib/yajl/gzip.rb
CHANGED
data/lib/yajl/http_stream.rb
CHANGED
@@ -28,11 +28,12 @@ module Yajl
|
|
28
28
|
user_agent = opts.has_key?(['User-Agent']) ? opts['User-Agent'] : "Yajl::HttpStream #{Yajl::VERSION}"
|
29
29
|
|
30
30
|
socket = TCPSocket.new(uri.host, uri.port)
|
31
|
-
request = "GET #{uri.path}#{uri.query ? "?"+uri.query : nil} HTTP/1.
|
31
|
+
request = "GET #{uri.path}#{uri.query ? "?"+uri.query : nil} HTTP/1.1\r\n"
|
32
32
|
request << "Host: #{uri.host}\r\n"
|
33
33
|
request << "Authorization: Basic #{[userinfo].pack('m')}\r\n" unless uri.userinfo.nil?
|
34
34
|
request << "User-Agent: #{user_agent}\r\n"
|
35
35
|
request << "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
|
36
|
+
request << "Connection: close\r\n"
|
36
37
|
encodings = []
|
37
38
|
encodings << "bzip2" if defined?(Yajl::Bzip2)
|
38
39
|
encodings << "gzip" if defined?(Yajl::Gzip)
|
@@ -61,21 +62,25 @@ module Yajl
|
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
65
|
+
if response_head[:headers]["Transfer-Encoding"] == 'chunked'
|
66
|
+
raise Exception, "Chunked responses not supported yet (I'm working on this)"
|
67
|
+
else
|
68
|
+
content_type = response_head[:headers]["Content-Type"].split('; ')
|
69
|
+
content_type = content_type.first
|
70
|
+
if ALLOWED_MIME_TYPES.include?(content_type)
|
71
|
+
case response_head[:headers]["Content-Encoding"]
|
72
|
+
when "gzip"
|
73
|
+
return Yajl::Gzip::StreamReader.parse(socket)
|
74
|
+
when "deflate"
|
75
|
+
return Yajl::Deflate::StreamReader.parse(socket, -Zlib::MAX_WBITS)
|
76
|
+
when "bzip2"
|
77
|
+
return Yajl::Bzip2::StreamReader.parse(socket)
|
78
|
+
else
|
79
|
+
return Yajl::Stream.parse(socket)
|
80
|
+
end
|
74
81
|
else
|
75
|
-
|
82
|
+
raise InvalidContentType, "The response MIME type #{content_type}"
|
76
83
|
end
|
77
|
-
else
|
78
|
-
raise InvalidContentType, "The response MIME type #{content_type}"
|
79
84
|
end
|
80
85
|
ensure
|
81
86
|
socket.close
|
data/lib/yajl.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require '
|
2
|
+
require 'yajl_ext'
|
3
3
|
|
4
4
|
# = Extras
|
5
5
|
# We're not going to load these auotmatically, because you might not need them ;)
|
@@ -13,7 +13,7 @@ require 'yajl.bundle'
|
|
13
13
|
#
|
14
14
|
# Ruby bindings to the excellent Yajl (Yet Another JSON Parser) ANSI C library.
|
15
15
|
module Yajl
|
16
|
-
VERSION = "0.4.
|
16
|
+
VERSION = "0.4.5"
|
17
17
|
|
18
18
|
# == Yajl::Chunked
|
19
19
|
#
|
data/yajl-ruby.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{yajl-ruby}
|
5
|
-
s.version = "0.4.
|
5
|
+
s.version = "0.4.5"
|
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"]
|
9
|
-
s.date = %q{2009-05-
|
9
|
+
s.date = %q{2009-05-17}
|
10
10
|
s.email = %q{seniorlopez@gmail.com}
|
11
11
|
s.extensions = ["ext/extconf.rb"]
|
12
12
|
s.extra_rdoc_files = [
|
@@ -20,9 +20,15 @@ Gem::Specification.new do |s|
|
|
20
20
|
"README.rdoc",
|
21
21
|
"Rakefile",
|
22
22
|
"VERSION.yml",
|
23
|
+
"benchmark/encode.rb",
|
24
|
+
"benchmark/encode_json_and_marshal.rb",
|
25
|
+
"benchmark/encode_json_and_yaml.rb",
|
23
26
|
"benchmark/http.rb",
|
24
|
-
"benchmark/
|
27
|
+
"benchmark/parse.rb",
|
28
|
+
"benchmark/parse_json_and_marshal.rb",
|
29
|
+
"benchmark/parse_json_and_yaml.rb",
|
25
30
|
"benchmark/subjects/contacts.json",
|
31
|
+
"benchmark/subjects/contacts.yml",
|
26
32
|
"benchmark/subjects/item.json",
|
27
33
|
"benchmark/subjects/ohai.json",
|
28
34
|
"benchmark/subjects/twitter_search.json",
|
@@ -34,10 +40,13 @@ Gem::Specification.new do |s|
|
|
34
40
|
"lib/yajl.rb",
|
35
41
|
"lib/yajl/bzip2.rb",
|
36
42
|
"lib/yajl/bzip2/stream_reader.rb",
|
43
|
+
"lib/yajl/bzip2/stream_writer.rb",
|
37
44
|
"lib/yajl/deflate.rb",
|
38
45
|
"lib/yajl/deflate/stream_reader.rb",
|
46
|
+
"lib/yajl/deflate/stream_writer.rb",
|
39
47
|
"lib/yajl/gzip.rb",
|
40
48
|
"lib/yajl/gzip/stream_reader.rb",
|
49
|
+
"lib/yajl/gzip/stream_writer.rb",
|
41
50
|
"lib/yajl/http_stream.rb",
|
42
51
|
"spec/active_support_spec.rb",
|
43
52
|
"spec/fixtures/fail.15.json",
|
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.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Lopez
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05-
|
12
|
+
date: 2009-05-17 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -29,9 +29,15 @@ files:
|
|
29
29
|
- README.rdoc
|
30
30
|
- Rakefile
|
31
31
|
- VERSION.yml
|
32
|
+
- benchmark/encode.rb
|
33
|
+
- benchmark/encode_json_and_marshal.rb
|
34
|
+
- benchmark/encode_json_and_yaml.rb
|
32
35
|
- benchmark/http.rb
|
33
|
-
- benchmark/
|
36
|
+
- benchmark/parse.rb
|
37
|
+
- benchmark/parse_json_and_marshal.rb
|
38
|
+
- benchmark/parse_json_and_yaml.rb
|
34
39
|
- benchmark/subjects/contacts.json
|
40
|
+
- benchmark/subjects/contacts.yml
|
35
41
|
- benchmark/subjects/item.json
|
36
42
|
- benchmark/subjects/ohai.json
|
37
43
|
- benchmark/subjects/twitter_search.json
|
@@ -43,10 +49,13 @@ files:
|
|
43
49
|
- lib/yajl.rb
|
44
50
|
- lib/yajl/bzip2.rb
|
45
51
|
- lib/yajl/bzip2/stream_reader.rb
|
52
|
+
- lib/yajl/bzip2/stream_writer.rb
|
46
53
|
- lib/yajl/deflate.rb
|
47
54
|
- lib/yajl/deflate/stream_reader.rb
|
55
|
+
- lib/yajl/deflate/stream_writer.rb
|
48
56
|
- lib/yajl/gzip.rb
|
49
57
|
- lib/yajl/gzip/stream_reader.rb
|
58
|
+
- lib/yajl/gzip/stream_writer.rb
|
50
59
|
- lib/yajl/http_stream.rb
|
51
60
|
- spec/active_support_spec.rb
|
52
61
|
- spec/fixtures/fail.15.json
|