yajl-ruby 0.7.4 → 0.7.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of yajl-ruby might be problematic. Click here for more details.
- data/CHANGELOG.md +7 -0
- data/VERSION.yml +2 -2
- data/benchmark/encode.rb +5 -1
- data/benchmark/parse.rb +5 -1
- data/benchmark/parse_stream.rb +5 -1
- data/ext/api/yajl_common.h +10 -10
- data/ext/api/yajl_gen.h +26 -26
- data/ext/api/yajl_parse.h +35 -21
- data/ext/extconf.rb +1 -1
- data/ext/yajl.c +19 -12
- data/ext/yajl_alloc.c +7 -7
- data/ext/yajl_alloc.h +7 -7
- data/ext/yajl_buf.c +8 -8
- data/ext/yajl_buf.h +8 -8
- data/ext/yajl_bytestack.h +11 -11
- data/ext/yajl_encode.c +14 -14
- data/ext/yajl_encode.h +8 -8
- data/ext/yajl_ext.c +7 -3
- data/ext/yajl_ext.h +1 -1
- data/ext/yajl_gen.c +16 -18
- data/ext/yajl_lex.c +74 -74
- data/ext/yajl_lex.h +15 -15
- data/ext/yajl_parser.c +42 -39
- data/ext/yajl_parser.h +14 -11
- data/lib/yajl.rb +1 -1
- data/lib/yajl/bzip2/stream_reader.rb +13 -0
- data/lib/yajl/deflate/stream_reader.rb +10 -3
- data/lib/yajl/gzip/stream_reader.rb +13 -0
- data/spec/encoding/encoding_spec.rb +13 -2
- data/spec/spec_helper.rb +1 -0
- data/yajl-ruby.gemspec +2 -2
- metadata +3 -3
data/ext/yajl_parser.c
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright
|
3
|
-
*
|
2
|
+
* Copyright 2010, Lloyd Hilaiel.
|
3
|
+
*
|
4
4
|
* Redistribution and use in source and binary forms, with or without
|
5
5
|
* modification, are permitted provided that the following conditions are
|
6
6
|
* met:
|
7
|
-
*
|
7
|
+
*
|
8
8
|
* 1. Redistributions of source code must retain the above copyright
|
9
9
|
* notice, this list of conditions and the following disclaimer.
|
10
|
-
*
|
10
|
+
*
|
11
11
|
* 2. Redistributions in binary form must reproduce the above copyright
|
12
12
|
* notice, this list of conditions and the following disclaimer in
|
13
13
|
* the documentation and/or other materials provided with the
|
14
14
|
* distribution.
|
15
|
-
*
|
15
|
+
*
|
16
16
|
* 3. Neither the name of Lloyd Hilaiel nor the names of its
|
17
17
|
* contributors may be used to endorse or promote products derived
|
18
18
|
* from this software without specific prior written permission.
|
19
|
-
*
|
19
|
+
*
|
20
20
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
21
21
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
22
22
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
@@ -28,7 +28,7 @@
|
|
28
28
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
29
29
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30
30
|
* POSSIBILITY OF SUCH DAMAGE.
|
31
|
-
*/
|
31
|
+
*/
|
32
32
|
|
33
33
|
#include "yajl_lex.h"
|
34
34
|
#include "yajl_parser.h"
|
@@ -48,12 +48,12 @@ unsigned char *
|
|
48
48
|
yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText,
|
49
49
|
unsigned int jsonTextLen, int verbose)
|
50
50
|
{
|
51
|
-
unsigned int offset = hand->
|
51
|
+
unsigned int offset = hand->bytesConsumed;
|
52
52
|
unsigned char * str;
|
53
53
|
const char * errorType = NULL;
|
54
54
|
const char * errorText = NULL;
|
55
55
|
char text[72];
|
56
|
-
const char * arrow = " (right here) ------^\n";
|
56
|
+
const char * arrow = " (right here) ------^\n";
|
57
57
|
|
58
58
|
if (yajl_bs_current(hand->stateStack) == yajl_state_parse_error) {
|
59
59
|
errorType = "parse";
|
@@ -70,18 +70,18 @@ yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText,
|
|
70
70
|
memneeded += strlen(errorType);
|
71
71
|
memneeded += strlen(" error");
|
72
72
|
if (errorText != NULL) {
|
73
|
-
memneeded += strlen(": ");
|
74
|
-
memneeded += strlen(errorText);
|
73
|
+
memneeded += strlen(": ");
|
74
|
+
memneeded += strlen(errorText);
|
75
75
|
}
|
76
76
|
str = (unsigned char *) YA_MALLOC(&(hand->alloc), memneeded + 2);
|
77
77
|
str[0] = 0;
|
78
78
|
strcat((char *) str, errorType);
|
79
|
-
strcat((char *) str, " error");
|
79
|
+
strcat((char *) str, " error");
|
80
80
|
if (errorText != NULL) {
|
81
|
-
strcat((char *) str, ": ");
|
82
|
-
strcat((char *) str, errorText);
|
81
|
+
strcat((char *) str, ": ");
|
82
|
+
strcat((char *) str, errorText);
|
83
83
|
}
|
84
|
-
strcat((char *) str, "\n");
|
84
|
+
strcat((char *) str, "\n");
|
85
85
|
}
|
86
86
|
|
87
87
|
/* now we append as many spaces as needed to make sure the error
|
@@ -93,7 +93,7 @@ yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText,
|
|
93
93
|
spacesNeeded = (offset < 30 ? 40 - offset : 10);
|
94
94
|
start = (offset >= 30 ? offset - 30 : 0);
|
95
95
|
end = (offset + 30 > jsonTextLen ? jsonTextLen : offset + 30);
|
96
|
-
|
96
|
+
|
97
97
|
for (i=0;i<spacesNeeded;i++) text[i] = ' ';
|
98
98
|
|
99
99
|
for (;start < end;start++, i++) {
|
@@ -117,7 +117,7 @@ yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText,
|
|
117
117
|
newStr[0] = 0;
|
118
118
|
strcat((char *) newStr, (char *) str);
|
119
119
|
strcat((char *) newStr, text);
|
120
|
-
strcat((char *) newStr, arrow);
|
120
|
+
strcat((char *) newStr, arrow);
|
121
121
|
YA_FREE(&(hand->alloc), str);
|
122
122
|
str = (unsigned char *) newStr;
|
123
123
|
}
|
@@ -136,20 +136,23 @@ yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText,
|
|
136
136
|
|
137
137
|
|
138
138
|
yajl_status
|
139
|
-
yajl_do_parse(yajl_handle hand, unsigned
|
140
|
-
|
139
|
+
yajl_do_parse(yajl_handle hand, const unsigned char * jsonText,
|
140
|
+
unsigned int jsonTextLen)
|
141
141
|
{
|
142
142
|
yajl_tok tok;
|
143
143
|
const unsigned char * buf;
|
144
144
|
unsigned int bufLen;
|
145
|
+
unsigned int * offset = &(hand->bytesConsumed);
|
146
|
+
|
147
|
+
*offset = 0;
|
148
|
+
|
145
149
|
|
146
150
|
around_again:
|
147
151
|
switch (yajl_bs_current(hand->stateStack)) {
|
148
152
|
case yajl_state_parse_complete:
|
149
153
|
return yajl_status_ok;
|
150
154
|
case yajl_state_lexical_error:
|
151
|
-
case yajl_state_parse_error:
|
152
|
-
hand->errorOffset = *offset;
|
155
|
+
case yajl_state_parse_error:
|
153
156
|
return yajl_status_error;
|
154
157
|
case yajl_state_start:
|
155
158
|
case yajl_state_map_need_val:
|
@@ -187,13 +190,13 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
187
190
|
yajl_buf_len(hand->decodeBuf)));
|
188
191
|
}
|
189
192
|
break;
|
190
|
-
case yajl_tok_bool:
|
193
|
+
case yajl_tok_bool:
|
191
194
|
if (hand->callbacks && hand->callbacks->yajl_boolean) {
|
192
195
|
_CC_CHK(hand->callbacks->yajl_boolean(hand->ctx,
|
193
196
|
*buf == 't'));
|
194
197
|
}
|
195
198
|
break;
|
196
|
-
case yajl_tok_null:
|
199
|
+
case yajl_tok_null:
|
197
200
|
if (hand->callbacks && hand->callbacks->yajl_null) {
|
198
201
|
_CC_CHK(hand->callbacks->yajl_null(hand->ctx));
|
199
202
|
}
|
@@ -287,13 +290,13 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
287
290
|
_CC_CHK(hand->callbacks->yajl_end_array(hand->ctx));
|
288
291
|
}
|
289
292
|
yajl_bs_pop(hand->stateStack);
|
290
|
-
goto around_again;
|
293
|
+
goto around_again;
|
291
294
|
}
|
292
295
|
/* intentional fall-through */
|
293
296
|
}
|
294
|
-
case yajl_tok_colon:
|
295
|
-
case yajl_tok_comma:
|
296
|
-
case yajl_tok_right_bracket:
|
297
|
+
case yajl_tok_colon:
|
298
|
+
case yajl_tok_comma:
|
299
|
+
case yajl_tok_right_bracket:
|
297
300
|
yajl_bs_set(hand->stateStack, yajl_state_parse_error);
|
298
301
|
hand->parseError =
|
299
302
|
"unallowed token at this point in JSON text";
|
@@ -312,7 +315,7 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
312
315
|
yajl_reset_parser(hand);
|
313
316
|
} else if (s == yajl_state_map_need_val) {
|
314
317
|
yajl_bs_set(hand->stateStack, yajl_state_map_got_val);
|
315
|
-
} else {
|
318
|
+
} else {
|
316
319
|
yajl_bs_set(hand->stateStack, yajl_state_array_got_val);
|
317
320
|
}
|
318
321
|
}
|
@@ -322,7 +325,7 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
322
325
|
|
323
326
|
goto around_again;
|
324
327
|
}
|
325
|
-
case yajl_state_map_start:
|
328
|
+
case yajl_state_map_start:
|
326
329
|
case yajl_state_map_need_key: {
|
327
330
|
/* only difference between these two states is that in
|
328
331
|
* start '}' is valid, whereas in need_key, we've parsed
|
@@ -358,12 +361,12 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
358
361
|
_CC_CHK(hand->callbacks->yajl_end_map(hand->ctx));
|
359
362
|
}
|
360
363
|
yajl_bs_pop(hand->stateStack);
|
361
|
-
goto around_again;
|
364
|
+
goto around_again;
|
362
365
|
}
|
363
366
|
default:
|
364
367
|
yajl_bs_set(hand->stateStack, yajl_state_parse_error);
|
365
368
|
hand->parseError =
|
366
|
-
"invalid object key (must be a string)";
|
369
|
+
"invalid object key (must be a string)";
|
367
370
|
goto around_again;
|
368
371
|
}
|
369
372
|
}
|
@@ -373,7 +376,7 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
373
376
|
switch (tok) {
|
374
377
|
case yajl_tok_colon:
|
375
378
|
yajl_bs_set(hand->stateStack, yajl_state_map_need_val);
|
376
|
-
goto around_again;
|
379
|
+
goto around_again;
|
377
380
|
case yajl_tok_eof:
|
378
381
|
return yajl_status_insufficient_data;
|
379
382
|
case yajl_tok_error:
|
@@ -395,10 +398,10 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
395
398
|
_CC_CHK(hand->callbacks->yajl_end_map(hand->ctx));
|
396
399
|
}
|
397
400
|
yajl_bs_pop(hand->stateStack);
|
398
|
-
goto around_again;
|
401
|
+
goto around_again;
|
399
402
|
case yajl_tok_comma:
|
400
403
|
yajl_bs_set(hand->stateStack, yajl_state_map_need_key);
|
401
|
-
goto around_again;
|
404
|
+
goto around_again;
|
402
405
|
case yajl_tok_eof:
|
403
406
|
return yajl_status_insufficient_data;
|
404
407
|
case yajl_tok_error:
|
@@ -406,8 +409,8 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
406
409
|
goto around_again;
|
407
410
|
default:
|
408
411
|
yajl_bs_set(hand->stateStack, yajl_state_parse_error);
|
409
|
-
hand->parseError = "after key and value, inside map, "
|
410
|
-
"I expect ',' or '}'";
|
412
|
+
hand->parseError = "after key and value, inside map, "
|
413
|
+
"I expect ',' or '}'";
|
411
414
|
/* try to restore error offset */
|
412
415
|
if (*offset >= bufLen) *offset -= bufLen;
|
413
416
|
else *offset = 0;
|
@@ -423,10 +426,10 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
423
426
|
_CC_CHK(hand->callbacks->yajl_end_array(hand->ctx));
|
424
427
|
}
|
425
428
|
yajl_bs_pop(hand->stateStack);
|
426
|
-
goto around_again;
|
429
|
+
goto around_again;
|
427
430
|
case yajl_tok_comma:
|
428
431
|
yajl_bs_set(hand->stateStack, yajl_state_array_need_val);
|
429
|
-
goto around_again;
|
432
|
+
goto around_again;
|
430
433
|
case yajl_tok_eof:
|
431
434
|
return yajl_status_insufficient_data;
|
432
435
|
case yajl_tok_error:
|
@@ -440,7 +443,7 @@ yajl_do_parse(yajl_handle hand, unsigned int * offset,
|
|
440
443
|
}
|
441
444
|
}
|
442
445
|
}
|
443
|
-
|
446
|
+
|
444
447
|
abort();
|
445
448
|
return yajl_status_error;
|
446
449
|
}
|
data/ext/yajl_parser.h
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright
|
3
|
-
*
|
2
|
+
* Copyright 2010, Lloyd Hilaiel.
|
3
|
+
*
|
4
4
|
* Redistribution and use in source and binary forms, with or without
|
5
5
|
* modification, are permitted provided that the following conditions are
|
6
6
|
* met:
|
7
|
-
*
|
7
|
+
*
|
8
8
|
* 1. Redistributions of source code must retain the above copyright
|
9
9
|
* notice, this list of conditions and the following disclaimer.
|
10
|
-
*
|
10
|
+
*
|
11
11
|
* 2. Redistributions in binary form must reproduce the above copyright
|
12
12
|
* notice, this list of conditions and the following disclaimer in
|
13
13
|
* the documentation and/or other materials provided with the
|
14
14
|
* distribution.
|
15
|
-
*
|
15
|
+
*
|
16
16
|
* 3. Neither the name of Lloyd Hilaiel nor the names of its
|
17
17
|
* contributors may be used to endorse or promote products derived
|
18
18
|
* from this software without specific prior written permission.
|
19
|
-
*
|
19
|
+
*
|
20
20
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
21
21
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
22
22
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
@@ -28,7 +28,7 @@
|
|
28
28
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
29
29
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30
30
|
* POSSIBILITY OF SUCH DAMAGE.
|
31
|
-
*/
|
31
|
+
*/
|
32
32
|
|
33
33
|
#ifndef __YAJL_PARSER_H__
|
34
34
|
#define __YAJL_PARSER_H__
|
@@ -44,7 +44,7 @@ typedef enum {
|
|
44
44
|
yajl_state_parse_error,
|
45
45
|
yajl_state_lexical_error,
|
46
46
|
yajl_state_map_start,
|
47
|
-
yajl_state_map_sep,
|
47
|
+
yajl_state_map_sep,
|
48
48
|
yajl_state_map_need_val,
|
49
49
|
yajl_state_map_got_val,
|
50
50
|
yajl_state_map_need_key,
|
@@ -58,7 +58,10 @@ struct yajl_handle_t {
|
|
58
58
|
void * ctx;
|
59
59
|
yajl_lexer lexer;
|
60
60
|
const char * parseError;
|
61
|
-
|
61
|
+
/* the number of bytes consumed from the last client buffer,
|
62
|
+
* in the case of an error this will be an error offset, in the
|
63
|
+
* case of an error this can be used as the error offset */
|
64
|
+
unsigned int bytesConsumed;
|
62
65
|
/* temporary storage for decoded strings */
|
63
66
|
yajl_buf decodeBuf;
|
64
67
|
/* a stack of states. access with yajl_state_XXX routines */
|
@@ -68,8 +71,8 @@ struct yajl_handle_t {
|
|
68
71
|
};
|
69
72
|
|
70
73
|
yajl_status
|
71
|
-
yajl_do_parse(yajl_handle handle, unsigned
|
72
|
-
|
74
|
+
yajl_do_parse(yajl_handle handle, const unsigned char * jsonText,
|
75
|
+
unsigned int jsonTextLen);
|
73
76
|
|
74
77
|
unsigned char *
|
75
78
|
yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText,
|
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.7.
|
16
|
+
VERSION = "0.7.5"
|
17
17
|
|
18
18
|
# For compatibility, has the same signature of Yajl::Parser.parse
|
19
19
|
def self.load(str_or_io, options={}, read_bufsize=nil, &block)
|
@@ -4,6 +4,19 @@ module Yajl
|
|
4
4
|
# This is a wrapper around Bzip::Reader to allow it's #read method to adhere
|
5
5
|
# to the IO spec, allowing for two parameters (length, and buffer)
|
6
6
|
class StreamReader < ::Bzip2::Reader
|
7
|
+
# A helper method to allow use similar to IO#read
|
8
|
+
def read(len=nil, buffer=nil)
|
9
|
+
if val = super(len)
|
10
|
+
unless buffer.nil?
|
11
|
+
buffer.replace(val)
|
12
|
+
return buffer
|
13
|
+
end
|
14
|
+
super(len)
|
15
|
+
else
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
7
20
|
# Helper method for one-off parsing from a bzip2-compressed stream
|
8
21
|
#
|
9
22
|
# See Yajl::Parser#parse for parameter documentation
|
@@ -12,9 +12,16 @@ module Yajl
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# A helper method to allow use similar to IO#read
|
15
|
-
def read(len=nil)
|
16
|
-
|
17
|
-
|
15
|
+
def read(len=nil, buffer=nil)
|
16
|
+
if val = @io.read(len)
|
17
|
+
unless buffer.nil?
|
18
|
+
buffer.replace(inflate(val))
|
19
|
+
return buffer
|
20
|
+
end
|
21
|
+
inflate(@io.read(len))
|
22
|
+
else
|
23
|
+
nil
|
24
|
+
end
|
18
25
|
end
|
19
26
|
|
20
27
|
# Helper method for one-off parsing from a deflate-compressed stream
|
@@ -4,6 +4,19 @@ module Yajl
|
|
4
4
|
# This is a wrapper around Zlib::GzipReader to allow it's #read method to adhere
|
5
5
|
# to the IO spec, allowing for two parameters (length, and buffer)
|
6
6
|
class StreamReader < ::Zlib::GzipReader
|
7
|
+
# A helper method to allow use similar to IO#read
|
8
|
+
def read(len=nil, buffer=nil)
|
9
|
+
if val = super(len)
|
10
|
+
unless buffer.nil?
|
11
|
+
buffer.replace(val)
|
12
|
+
return buffer
|
13
|
+
end
|
14
|
+
super(len)
|
15
|
+
else
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
7
20
|
# Helper method for one-off parsing from a gzip-compressed stream
|
8
21
|
#
|
9
22
|
# See Yajl::Parser#parse for parameter documentation
|
@@ -3,7 +3,13 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
|
|
3
3
|
|
4
4
|
class Dummy2
|
5
5
|
def to_json
|
6
|
-
"hawtness"
|
6
|
+
"{\"hawtness\":true}"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Dummy3
|
11
|
+
def as_json
|
12
|
+
{:hawtness => true}
|
7
13
|
end
|
8
14
|
end
|
9
15
|
|
@@ -152,7 +158,12 @@ describe "Yajl JSON encoder" do
|
|
152
158
|
|
153
159
|
it "should check for and call #to_json if it exists on custom objects" do
|
154
160
|
d = Dummy2.new
|
155
|
-
Yajl::Encoder.encode({:foo => d}).should eql('{"foo":"hawtness"}')
|
161
|
+
Yajl::Encoder.encode({:foo => d}).should eql('{"foo":{"hawtness":true}}')
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should check for and call #as_json if it exists on custom objects" do
|
165
|
+
d = Dummy3.new
|
166
|
+
Yajl::Encoder.encode(d).should eql('{"hawtness":true}')
|
156
167
|
end
|
157
168
|
|
158
169
|
it "should encode a hash where the key and value can be symbols" do
|
data/spec/spec_helper.rb
CHANGED
data/yajl-ruby.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{yajl-ruby}
|
8
|
-
s.version = "0.7.
|
8
|
+
s.version = "0.7.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Brian Lopez", "Lloyd Hilaiel"]
|
12
|
-
s.date = %q{2010-03-
|
12
|
+
s.date = %q{2010-03-23}
|
13
13
|
s.email = %q{seniorlopez@gmail.com}
|
14
14
|
s.extensions = ["ext/extconf.rb"]
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 7
|
8
|
-
-
|
9
|
-
version: 0.7.
|
8
|
+
- 5
|
9
|
+
version: 0.7.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Brian Lopez
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-03-
|
18
|
+
date: 2010-03-23 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|