yajl-ruby 1.1.0 → 1.2.0

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.

@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 123d047ce44bacef2d09aab8b2f51bf4a0d456d6
4
+ data.tar.gz: 2d8622c124a07ea78ca3678a8042baed033407ef
5
+ SHA512:
6
+ metadata.gz: 3d68e9873ee4ea9173adc6d46a20c9157b64d4b613e3ea9d5bcff6becc32bc130a26637565b1a6aa3a5c98ddad824e09edae2f83995974da754ba9dfd8e0e444
7
+ data.tar.gz: a47eb3ca4f465e3cc931e492cb18083ce00e2f7b81d307c1232409dff5509f2138d904877e1397ef3ffd7f3f22f779f1857c0092701716bc650f983ad4e1c61b
data/.gitignore CHANGED
@@ -9,4 +9,5 @@ tmp/*
9
9
  pkg/*
10
10
  vendor/gems
11
11
  Gemfile.lock
12
- .rbx
12
+ .rbx
13
+ bin/
@@ -1,6 +1,14 @@
1
+ language: ruby
1
2
  rvm:
2
3
  - 1.8.7
3
4
  - 1.9.2
4
5
  - 1.9.3
5
6
  - rbx
6
- - ree
7
+ - ree
8
+ - ruby-head
9
+ - rbx-18mode
10
+ - rbx-19mode
11
+ matrix:
12
+ allow_failures:
13
+ - rvm: rbx-18mode
14
+ - rvm: rbx-19mode
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
- gemspec
3
+ gemspec
data/README.md CHANGED
@@ -68,13 +68,13 @@ only had access to chunks of it at a time. No problem!
68
68
 
69
69
  ``` ruby
70
70
  def post_init
71
- @parser = Yajl::Parser.new(:symbolize_keys => true)
71
+ @parser = Yajl::Parser.new(:symbolize_keys => true)
72
72
  end
73
73
 
74
74
  def object_parsed(obj)
75
- puts "Sometimes one pays most for the things one gets for nothing. - Albert Einstein"
76
- puts obj.inspect
77
- end
75
+ puts "Sometimes one pays most for the things one gets for nothing. - Albert Einstein"
76
+ puts obj.inspect
77
+ end
78
78
 
79
79
  def connection_completed
80
80
  # once a full JSON object has been parsed from the stream
@@ -157,7 +157,6 @@ This allows you to encode JSON as a stream, writing directly to a socket
157
157
  ``` ruby
158
158
  socket = TCPSocket.new('192.168.1.101', 9000)
159
159
  hash = {:foo => 12425125, :bar => "some string", ... }
160
- encoder = Yajl::Encoder.new
161
160
  Yajl::Encoder.encode(hash, socket)
162
161
  ```
163
162
 
@@ -37,7 +37,7 @@
37
37
  extern "C" {
38
38
  #endif
39
39
 
40
- #define YAJL_MAX_DEPTH 128
40
+ #define YAJL_MAX_DEPTH 256
41
41
 
42
42
  /* msft dll export gunk. To build a DLL on windows, you
43
43
  * must define WIN32, YAJL_SHARED, and YAJL_BUILD. To use a shared
@@ -50,7 +50,7 @@ extern "C" {
50
50
  # endif
51
51
  #else
52
52
  # if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
53
- # define YAJL_API __attribute__ ((visibility("default")))
53
+ # define YAJL_API __attribute__ ((visibility("hidden")))
54
54
  # else
55
55
  # define YAJL_API
56
56
  # endif
@@ -133,7 +133,7 @@ extern "C" {
133
133
  void * ctx);
134
134
 
135
135
  /** allow resetting of the lexer without the need to realloc a new parser */
136
- void yajl_reset_parser(yajl_handle hand);
136
+ YAJL_API void yajl_reset_parser(yajl_handle hand);
137
137
 
138
138
  /** free a parser handle */
139
139
  YAJL_API void yajl_free(yajl_handle handle);
@@ -45,6 +45,7 @@
45
45
  #define YA_FREE(afs, ptr) (afs)->free((afs)->ctx, (ptr))
46
46
  #define YA_REALLOC(afs, ptr, sz) (afs)->realloc((afs)->ctx, (ptr), (sz))
47
47
 
48
+ YAJL_API
48
49
  void yajl_set_default_alloc_funcs(yajl_alloc_funcs * yaf);
49
50
 
50
51
  #endif
@@ -50,24 +50,31 @@
50
50
  typedef struct yajl_buf_t * yajl_buf;
51
51
 
52
52
  /* allocate a new buffer */
53
+ YAJL_API
53
54
  yajl_buf yajl_buf_alloc(yajl_alloc_funcs * alloc);
54
55
 
55
56
  /* free the buffer */
57
+ YAJL_API
56
58
  void yajl_buf_free(yajl_buf buf);
57
59
 
58
60
  /* append a number of bytes to the buffer */
61
+ YAJL_API
59
62
  void yajl_buf_append(yajl_buf buf, const void * data, unsigned int len);
60
63
 
61
64
  /* empty the buffer */
65
+ YAJL_API
62
66
  void yajl_buf_clear(yajl_buf buf);
63
67
 
64
68
  /* get a pointer to the beginning of the buffer */
69
+ YAJL_API
65
70
  const unsigned char * yajl_buf_data(yajl_buf buf);
66
71
 
67
72
  /* get the length of the buffer */
73
+ YAJL_API
68
74
  unsigned int yajl_buf_len(yajl_buf buf);
69
75
 
70
76
  /* truncate the buffer */
77
+ YAJL_API
71
78
  void yajl_buf_truncate(yajl_buf buf, unsigned int len);
72
79
 
73
80
  #endif
@@ -36,16 +36,19 @@
36
36
  #include "yajl_buf.h"
37
37
  #include "api/yajl_gen.h"
38
38
 
39
+ YAJL_API
39
40
  void yajl_string_encode2(const yajl_print_t printer,
40
41
  void * ctx,
41
42
  const unsigned char * str,
42
43
  unsigned int length,
43
44
  unsigned int htmlSafe);
44
45
 
46
+ YAJL_API
45
47
  void yajl_string_encode(yajl_buf buf, const unsigned char * str,
46
48
  unsigned int length,
47
49
  unsigned int htmlSafe);
48
50
 
51
+ YAJL_API
49
52
  void yajl_string_decode(yajl_buf buf, const unsigned char * str,
50
53
  unsigned int length);
51
54
 
@@ -54,6 +54,25 @@ static void yajl_check_and_fire_callback(void * ctx) {
54
54
  }
55
55
  }
56
56
 
57
+ static char *yajl_raise_encode_error_for_status(yajl_gen_status status, VALUE obj) {
58
+ switch (status) {
59
+ case yajl_gen_keys_must_be_strings:
60
+ rb_raise(cEncodeError, "YAJL internal error: attempted use of non-string object as key");
61
+ case yajl_max_depth_exceeded:
62
+ rb_raise(cEncodeError, "Max nesting depth of %d exceeded", YAJL_MAX_DEPTH);
63
+ case yajl_gen_in_error_state:
64
+ rb_raise(cEncodeError, "YAJL internal error: a generator function (yajl_gen_XXX) was called while in an error state");
65
+ case yajl_gen_generation_complete:
66
+ rb_raise(cEncodeError, "YAJL internal error: attempted to encode to an already-complete document");
67
+ case yajl_gen_invalid_number:
68
+ rb_raise(cEncodeError, "Invalid number: cannot encode Infinity, -Infinity, or NaN");
69
+ case yajl_gen_no_buf:
70
+ rb_raise(cEncodeError, "YAJL internal error: yajl_gen_get_buf was called, but a print callback was specified, so no internal buffer is available");
71
+ default:
72
+ return NULL;
73
+ }
74
+ }
75
+
57
76
  static void yajl_set_static_value(void * ctx, VALUE val) {
58
77
  yajl_parser_wrapper * wrapper;
59
78
  VALUE lastEntry, hash;
@@ -96,10 +115,10 @@ static void yajl_encoder_wrapper_free(void * wrapper) {
96
115
  yajl_encoder_wrapper * w = wrapper;
97
116
  if (w) {
98
117
  if (w->indentString) {
99
- free(w->indentString);
118
+ xfree(w->indentString);
100
119
  }
101
120
  yajl_gen_free(w->encoder);
102
- free(w);
121
+ xfree(w);
103
122
  }
104
123
  }
105
124
 
@@ -111,6 +130,9 @@ static void yajl_encoder_wrapper_mark(void * wrapper) {
111
130
  }
112
131
  }
113
132
 
133
+ #define CHECK_STATUS(call) \
134
+ if ((status = (call)) != yajl_gen_status_ok) { break; }
135
+
114
136
  void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
115
137
  VALUE str, outBuff, otherObj;
116
138
  yajl_encoder_wrapper * w = wrapper;
@@ -123,6 +145,9 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
123
145
 
124
146
  if (io != Qnil || w->on_progress_callback != Qnil) {
125
147
  status = yajl_gen_get_buf(w->encoder, &buffer, &len);
148
+ if (status != yajl_gen_status_ok) {
149
+ yajl_raise_encode_error_for_status(status, obj);
150
+ }
126
151
  if (len >= WRITE_BUFSIZE) {
127
152
  outBuff = rb_str_new((const char *)buffer, len);
128
153
  if (io != Qnil) {
@@ -136,7 +161,7 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
136
161
 
137
162
  switch (TYPE(obj)) {
138
163
  case T_HASH:
139
- status = yajl_gen_map_open(w->encoder);
164
+ CHECK_STATUS(yajl_gen_map_open(w->encoder));
140
165
 
141
166
  /* TODO: itterate through keys in the hash */
142
167
  keys = rb_funcall(obj, intern_keys, 0);
@@ -149,24 +174,24 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
149
174
  yajl_encode_part(w, rb_hash_aref(obj, entry), io);
150
175
  }
151
176
 
152
- status = yajl_gen_map_close(w->encoder);
177
+ CHECK_STATUS(yajl_gen_map_close(w->encoder));
153
178
  break;
154
179
  case T_ARRAY:
155
- status = yajl_gen_array_open(w->encoder);
180
+ CHECK_STATUS(yajl_gen_array_open(w->encoder));
156
181
  for(idx=0; idx<RARRAY_LEN(obj); idx++) {
157
182
  otherObj = rb_ary_entry(obj, idx);
158
183
  yajl_encode_part(w, otherObj, io);
159
184
  }
160
- status = yajl_gen_array_close(w->encoder);
185
+ CHECK_STATUS(yajl_gen_array_close(w->encoder));
161
186
  break;
162
187
  case T_NIL:
163
- status = yajl_gen_null(w->encoder);
188
+ CHECK_STATUS(yajl_gen_null(w->encoder));
164
189
  break;
165
190
  case T_TRUE:
166
- status = yajl_gen_bool(w->encoder, 1);
191
+ CHECK_STATUS(yajl_gen_bool(w->encoder, 1));
167
192
  break;
168
193
  case T_FALSE:
169
- status = yajl_gen_bool(w->encoder, 0);
194
+ CHECK_STATUS(yajl_gen_bool(w->encoder, 0));
170
195
  break;
171
196
  case T_FIXNUM:
172
197
  case T_FLOAT:
@@ -177,12 +202,12 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
177
202
  if (memcmp(cptr, "NaN", 3) == 0 || memcmp(cptr, "Infinity", 8) == 0 || memcmp(cptr, "-Infinity", 9) == 0) {
178
203
  rb_raise(cEncodeError, "'%s' is an invalid number", cptr);
179
204
  }
180
- status = yajl_gen_number(w->encoder, cptr, len);
205
+ CHECK_STATUS(yajl_gen_number(w->encoder, cptr, len));
181
206
  break;
182
207
  case T_STRING:
183
208
  cptr = RSTRING_PTR(obj);
184
209
  len = RSTRING_LEN(obj);
185
- status = yajl_gen_string(w->encoder, (const unsigned char *)cptr, len);
210
+ CHECK_STATUS(yajl_gen_string(w->encoder, (const unsigned char *)cptr, len));
186
211
  break;
187
212
  default:
188
213
  if (rb_respond_to(obj, intern_to_json)) {
@@ -190,23 +215,28 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
190
215
  Check_Type(str, T_STRING);
191
216
  cptr = RSTRING_PTR(str);
192
217
  len = RSTRING_LEN(str);
193
- status = yajl_gen_number(w->encoder, cptr, len);
218
+ CHECK_STATUS(yajl_gen_number(w->encoder, cptr, len));
194
219
  } else {
195
220
  str = rb_funcall(obj, intern_to_s, 0);
196
221
  Check_Type(str, T_STRING);
197
222
  cptr = RSTRING_PTR(str);
198
223
  len = RSTRING_LEN(str);
199
- status = yajl_gen_string(w->encoder, (const unsigned char *)cptr, len);
224
+ CHECK_STATUS(yajl_gen_string(w->encoder, (const unsigned char *)cptr, len));
200
225
  }
201
226
  break;
202
227
  }
228
+
229
+ if (status != yajl_gen_status_ok) {
230
+ yajl_raise_encode_error_for_status(status, obj);
231
+ rb_raise(cEncodeError, "Encountered unknown YAJL status %d during JSON generation", status);
232
+ }
203
233
  }
204
234
 
205
235
  void yajl_parser_wrapper_free(void * wrapper) {
206
236
  yajl_parser_wrapper * w = wrapper;
207
237
  if (w) {
208
238
  yajl_free(w->parser);
209
- free(w);
239
+ xfree(w);
210
240
  }
211
241
  }
212
242
 
@@ -384,7 +414,7 @@ static VALUE rb_yajl_parser_new(int argc, VALUE * argv, VALUE klass) {
384
414
  if (rb_hash_aref(opts, sym_check_utf8) == Qfalse) {
385
415
  checkUTF8 = 0;
386
416
  }
387
- if (rb_hash_aref(opts, sym_symbolize_keys) == Qtrue) {
417
+ if (rb_hash_aref(opts, sym_symbolize_keys) == Qtrue || rb_hash_aref(opts, sym_symbolize_names) == Qtrue) {
388
418
  symbolizeKeys = 1;
389
419
  }
390
420
  }
@@ -574,7 +604,7 @@ static VALUE rb_yajl_encoder_new(int argc, VALUE * argv, VALUE klass) {
574
604
  indent = rb_str_export_to_enc(indent, utf8Encoding);
575
605
  #endif
576
606
  Check_Type(indent, T_STRING);
577
- indentString = (unsigned char*)malloc(RSTRING_LEN(indent)+1);
607
+ indentString = (unsigned char*)xmalloc(RSTRING_LEN(indent)+1);
578
608
  memcpy(indentString, RSTRING_PTR(indent), RSTRING_LEN(indent));
579
609
  indentString[RSTRING_LEN(indent)] = '\0';
580
610
  actualIndent = indentString;
@@ -863,6 +893,8 @@ static VALUE rb_yajl_encoder_enable_json_gem_ext(VALUE klass) {
863
893
  void Init_yajl() {
864
894
  mYajl = rb_define_module("Yajl");
865
895
 
896
+ rb_define_const(mYajl, "MAX_DEPTH", INT2NUM(YAJL_MAX_DEPTH));
897
+
866
898
  cParseError = rb_define_class_under(mYajl, "ParseError", rb_eStandardError);
867
899
  cEncodeError = rb_define_class_under(mYajl, "EncodeError", rb_eStandardError);
868
900
 
@@ -898,6 +930,7 @@ void Init_yajl() {
898
930
  sym_html_safe = ID2SYM(rb_intern("html_safe"));
899
931
  sym_terminator = ID2SYM(rb_intern("terminator"));
900
932
  sym_symbolize_keys = ID2SYM(rb_intern("symbolize_keys"));
933
+ sym_symbolize_names = ID2SYM(rb_intern("symbolize_names"));
901
934
 
902
935
  #ifdef HAVE_RUBY_ENCODING_H
903
936
  utf8Encoding = rb_utf8_encoding();
@@ -24,9 +24,9 @@
24
24
  #include "api/yajl_parse.h"
25
25
  #include "api/yajl_gen.h"
26
26
 
27
- // tell rbx not to use it's caching compat layer
28
- // by doing this we're making a promize to RBX that
29
- // we'll never modify the pointers we get back from RSTRING_PTR
27
+ /* tell rbx not to use it's caching compat layer
28
+ by doing this we're making a promize to RBX that
29
+ we'll never modify the pointers we get back from RSTRING_PTR */
30
30
  #define RSTRING_NOT_MODIFIED
31
31
 
32
32
  #include <ruby.h>
@@ -56,15 +56,15 @@ static rb_encoding *utf8Encoding;
56
56
  static VALUE cParseError, cEncodeError, mYajl, cParser, cEncoder;
57
57
  static ID intern_io_read, intern_call, intern_keys, intern_to_s,
58
58
  intern_to_json, intern_has_key, intern_to_sym, intern_as_json;
59
- static ID sym_allow_comments, sym_check_utf8, sym_pretty, sym_indent, sym_terminator, sym_symbolize_keys, sym_html_safe;
59
+ static ID sym_allow_comments, sym_check_utf8, sym_pretty, sym_indent, sym_terminator, sym_symbolize_keys, sym_symbolize_names, sym_html_safe;
60
60
 
61
- #define GetParser(obj, sval) (sval = (yajl_parser_wrapper*)DATA_PTR(obj));
62
- #define GetEncoder(obj, sval) (sval = (yajl_encoder_wrapper*)DATA_PTR(obj));
61
+ #define GetParser(obj, sval) Data_Get_Struct(obj, yajl_parser_wrapper, sval);
62
+ #define GetEncoder(obj, sval) Data_Get_Struct(obj, yajl_encoder_wrapper, sval);
63
63
 
64
64
  static void yajl_check_and_fire_callback(void * ctx);
65
65
  static void yajl_set_static_value(void * ctx, VALUE val);
66
- void yajl_encode_part(void * wrapper, VALUE obj, VALUE io);
67
- void yajl_parse_chunk(const unsigned char * chunk, unsigned int len, yajl_handle parser);
66
+ static void yajl_encode_part(void * wrapper, VALUE obj, VALUE io);
67
+ static void yajl_parse_chunk(const unsigned char * chunk, unsigned int len, yajl_handle parser);
68
68
 
69
69
  static int yajl_found_null(void * ctx);
70
70
  static int yajl_found_boolean(void * ctx, int boolean);
@@ -132,4 +132,4 @@ static VALUE rb_yajl_json_ext_false_to_json(int argc, VALUE * argv, VALUE self);
132
132
  static VALUE rb_yajl_json_ext_nil_to_json(int argc, VALUE * argv, VALUE self);
133
133
  static VALUE rb_yajl_encoder_enable_json_gem_ext(VALUE klass);
134
134
 
135
- void Init_yajl();
135
+ void Init_yajl();
@@ -63,12 +63,16 @@ typedef enum {
63
63
 
64
64
  typedef struct yajl_lexer_t * yajl_lexer;
65
65
 
66
+
67
+ YAJL_API
66
68
  yajl_lexer yajl_lex_alloc(yajl_alloc_funcs * alloc,
67
69
  unsigned int allowComments,
68
70
  unsigned int validateUTF8);
69
71
 
72
+ YAJL_API
70
73
  yajl_lexer yajl_lex_realloc(yajl_lexer orig);
71
74
 
75
+ YAJL_API
72
76
  void yajl_lex_free(yajl_lexer lexer);
73
77
 
74
78
  /**
@@ -93,11 +97,13 @@ n * error messages.
93
97
  * implications which require that the client choose a reasonable chunk
94
98
  * size to get adequate performance.
95
99
  */
100
+ YAJL_API
96
101
  yajl_tok yajl_lex_lex(yajl_lexer lexer, const unsigned char * jsonText,
97
102
  unsigned int jsonTextLen, unsigned int * offset,
98
103
  const unsigned char ** outBuf, unsigned int * outLen);
99
104
 
100
105
  /** have a peek at the next token, but don't move the lexer forward */
106
+ YAJL_API
101
107
  yajl_tok yajl_lex_peek(yajl_lexer lexer, const unsigned char * jsonText,
102
108
  unsigned int jsonTextLen, unsigned int offset);
103
109
 
@@ -116,20 +122,25 @@ typedef enum {
116
122
  yajl_lex_unallowed_comment
117
123
  } yajl_lex_error;
118
124
 
125
+ YAJL_API
119
126
  const char * yajl_lex_error_to_string(yajl_lex_error error);
120
127
 
121
128
  /** allows access to more specific information about the lexical
122
129
  * error when yajl_lex_lex returns yajl_tok_error. */
130
+ YAJL_API
123
131
  yajl_lex_error yajl_lex_get_error(yajl_lexer lexer);
124
132
 
125
133
  /** get the current offset into the most recently lexed json string. */
134
+ YAJL_API
126
135
  unsigned int yajl_lex_current_offset(yajl_lexer lexer);
127
136
 
128
137
  /** get the number of lines lexed by this lexer instance */
138
+ YAJL_API
129
139
  unsigned int yajl_lex_current_line(yajl_lexer lexer);
130
140
 
131
141
  /** get the number of chars lexed by this lexer instance since the last
132
142
  * \n or \r */
143
+ YAJL_API
133
144
  unsigned int yajl_lex_current_char(yajl_lexer lexer);
134
145
 
135
146
  #endif
@@ -70,10 +70,12 @@ struct yajl_handle_t {
70
70
  yajl_alloc_funcs alloc;
71
71
  };
72
72
 
73
+ YAJL_API
73
74
  yajl_status
74
75
  yajl_do_parse(yajl_handle handle, const unsigned char * jsonText,
75
76
  unsigned int jsonTextLen);
76
77
 
78
+ YAJL_API
77
79
  unsigned char *
78
80
  yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText,
79
81
  unsigned int jsonTextLen, int verbose);
@@ -12,6 +12,7 @@ require 'yajl/yajl'
12
12
  #
13
13
  # Ruby bindings to the excellent Yajl (Yet Another JSON Parser) ANSI C library.
14
14
  module Yajl
15
+
15
16
  # For compatibility, has the same signature of Yajl::Parser.parse
16
17
  def self.load(str_or_io, options={}, read_bufsize=nil, &block)
17
18
  Parser.parse(str_or_io, options, read_bufsize, &block)
@@ -65,7 +66,7 @@ module Yajl
65
66
  args.each do |arg|
66
67
  if arg.is_a?(Hash)
67
68
  options = arg
68
- elsif arg.respond_to?(:read)
69
+ elsif arg.respond_to?(:write)
69
70
  io = arg
70
71
  end
71
72
  end if args.any?
@@ -17,17 +17,16 @@ module JSON
17
17
  class JSONError < StandardError; end unless defined?(JSON::JSONError)
18
18
  class GeneratorError < JSONError; end unless defined?(JSON::GeneratorError)
19
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
20
+ def self.generate(obj, opts=nil)
21
+ opts ||= {}
22
+ options_map = {}
23
+ if opts.has_key?(:indent)
24
+ options_map[:pretty] = true
25
+ options_map[:indent] = opts[:indent]
30
26
  end
27
+ Yajl::Encoder.encode(obj, options_map)
28
+ rescue Yajl::EncodeError => e
29
+ raise JSON::GeneratorError, e.message
31
30
  end
32
31
 
33
32
  def self.pretty_generate(obj, opts={})
@@ -1,3 +1,3 @@
1
1
  module Yajl
2
- VERSION = '1.1.0'
2
+ VERSION = '1.2.0'
3
3
  end
@@ -0,0 +1,5 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ cd "$(dirname "$0")/.."
5
+ exec bundle install --binstubs --path vendor/gems "$@"
@@ -1,5 +1,7 @@
1
1
  # encoding: UTF-8
2
2
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
3
+ require 'tmpdir'
4
+ require 'zlib'
3
5
 
4
6
  class Dummy2
5
7
  def to_json
@@ -23,7 +25,7 @@ describe "Yajl JSON encoder" do
23
25
  FILES = Dir[File.dirname(__FILE__)+'/../../benchmark/subjects/*.json']
24
26
 
25
27
  FILES.each do |file|
26
- it "should encode #{File.basename(file)} to an IO" do
28
+ it "should encode #{File.basename(file)} to an StringIO" do
27
29
  # we don't care about testing the stream subject as it has multiple JSON strings in it
28
30
  if File.basename(file) != 'twitter_stream.json'
29
31
  input = File.new(File.expand_path(file), 'r')
@@ -40,6 +42,27 @@ describe "Yajl JSON encoder" do
40
42
  end
41
43
  end
42
44
 
45
+ FILES.each do |file|
46
+ it "should encode #{File.basename(file)} to a Zlib::GzipWriter" do
47
+ # we don't care about testing the stream subject as it has multiple JSON strings in it
48
+ if File.basename(file) != 'twitter_stream.json'
49
+ hash = File.open(File.expand_path(file), 'r') do |input|
50
+ Yajl::Parser.parse(input)
51
+ end
52
+ hash2 = Dir.mktmpdir do |tmp_dir|
53
+ output_filename = File.join(tmp_dir, 'output.json')
54
+ Zlib::GzipWriter.open(output_filename) do |writer|
55
+ Yajl::Encoder.encode(hash, writer)
56
+ end
57
+ Zlib::GzipReader.open(output_filename) do |reader|
58
+ Yajl::Parser.parse(reader.read)
59
+ end
60
+ end
61
+ hash.should == hash2
62
+ end
63
+ end
64
+ end
65
+
43
66
  FILES.each do |file|
44
67
  it "should encode #{File.basename(file)} and return a String" do
45
68
  # we don't care about testing the stream subject as it has multiple JSON strings in it
@@ -271,4 +294,22 @@ describe "Yajl JSON encoder" do
271
294
  Yajl::Encoder.encode(TheMindKillerDuce.new)
272
295
  }.should raise_error(TypeError)
273
296
  end
297
+
298
+ it "should raise an exception for deeply nested arrays" do
299
+ root = []
300
+ a = root
301
+ (Yajl::MAX_DEPTH + 1).times { |_| a << []; a = a[0] }
302
+ lambda {
303
+ Yajl::Encoder.encode(root)
304
+ }.should raise_error(Yajl::EncodeError)
305
+ end
306
+
307
+ it "should raise an exception for deeply nested hashes" do
308
+ root = {}
309
+ a = root
310
+ (Yajl::MAX_DEPTH + 1).times { |_| a["a"] = {}; a = a["a"] }
311
+ lambda {
312
+ Yajl::Encoder.encode(root)
313
+ }.should raise_error(Yajl::EncodeError)
314
+ end
274
315
  end
@@ -51,6 +51,10 @@ describe "JSON Gem compatability API" do
51
51
  JSON.default_options[:symbolize_keys] = default # ensure the rest of the test cases expect the default
52
52
  end
53
53
 
54
+ it "should also allow the json gem's symbolize_names key" do
55
+ JSON.parse('{"foo": 1234}', :symbolize_names => true).should === {:foo => 1234}
56
+ end
57
+
54
58
  it "should encode arbitrary classes via their default to_json method" do
55
59
  d = Dummy.new
56
60
  d.to_json.should == "\"#{d.to_s}\""
metadata CHANGED
@@ -1,93 +1,79 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: yajl-ruby
3
- version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease:
6
- segments:
7
- - 1
8
- - 1
9
- - 0
10
- version: 1.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Brian Lopez
14
8
  - Lloyd Hilaiel
15
9
  autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
-
19
- date: 2011-11-09 00:00:00 -08:00
20
- default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
12
+ date: 2013-12-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
23
15
  name: rake-compiler
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
26
- none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 9
31
- segments:
32
- - 0
33
- - 7
34
- - 5
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '>='
19
+ - !ruby/object:Gem::Version
35
20
  version: 0.7.5
36
21
  type: :development
37
- version_requirements: *id001
38
- - !ruby/object:Gem::Dependency
39
- name: rspec
40
22
  prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- hash: 15
47
- segments:
48
- - 2
49
- - 0
50
- - 0
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '>='
26
+ - !ruby/object:Gem::Version
27
+ version: 0.7.5
28
+ - !ruby/object:Gem::Dependency
29
+ name: rspec
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
51
34
  version: 2.0.0
52
35
  type: :development
53
- version_requirements: *id002
54
- - !ruby/object:Gem::Dependency
55
- name: activesupport
56
36
  prerelease: false
57
- requirement: &id003 !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- hash: 3
63
- segments:
64
- - 0
65
- version: "0"
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: 2.0.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: activesupport
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
66
49
  type: :development
67
- version_requirements: *id003
68
- - !ruby/object:Gem::Dependency
69
- name: json
70
50
  prerelease: false
71
- requirement: &id004 !ruby/object:Gem::Requirement
72
- none: false
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- hash: 3
77
- segments:
78
- - 0
79
- version: "0"
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: json
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
80
63
  type: :development
81
- version_requirements: *id004
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
82
70
  description:
83
71
  email: seniorlopez@gmail.com
84
72
  executables: []
85
-
86
- extensions:
73
+ extensions:
87
74
  - ext/yajl/extconf.rb
88
75
  extra_rdoc_files: []
89
-
90
- files:
76
+ files:
91
77
  - .gitignore
92
78
  - .rspec
93
79
  - .travis.yml
@@ -155,6 +141,7 @@ files:
155
141
  - lib/yajl/json_gem/encoding.rb
156
142
  - lib/yajl/json_gem/parsing.rb
157
143
  - lib/yajl/version.rb
144
+ - script/bootstrap
158
145
  - spec/encoding/encoding_spec.rb
159
146
  - spec/global/global_spec.rb
160
147
  - spec/http/fixtures/http.bzip2.dump
@@ -237,43 +224,30 @@ files:
237
224
  - tasks/compile.rake
238
225
  - tasks/rspec.rake
239
226
  - yajl-ruby.gemspec
240
- has_rdoc: true
241
227
  homepage: http://github.com/brianmario/yajl-ruby
242
228
  licenses: []
243
-
229
+ metadata: {}
244
230
  post_install_message:
245
231
  rdoc_options: []
246
-
247
- require_paths:
232
+ require_paths:
248
233
  - lib
249
- required_ruby_version: !ruby/object:Gem::Requirement
250
- none: false
251
- requirements:
252
- - - ">="
253
- - !ruby/object:Gem::Version
254
- hash: 59
255
- segments:
256
- - 1
257
- - 8
258
- - 6
234
+ required_ruby_version: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - '>='
237
+ - !ruby/object:Gem::Version
259
238
  version: 1.8.6
260
- required_rubygems_version: !ruby/object:Gem::Requirement
261
- none: false
262
- requirements:
263
- - - ">="
264
- - !ruby/object:Gem::Version
265
- hash: 3
266
- segments:
267
- - 0
268
- version: "0"
239
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - '>='
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
269
244
  requirements: []
270
-
271
245
  rubyforge_project:
272
- rubygems_version: 1.6.2
246
+ rubygems_version: 2.0.3
273
247
  signing_key:
274
- specification_version: 3
248
+ specification_version: 4
275
249
  summary: Ruby C bindings to the excellent Yajl JSON stream-based parser library.
276
- test_files:
250
+ test_files:
277
251
  - examples/encoding/chunked_encoding.rb
278
252
  - examples/encoding/one_shot.rb
279
253
  - examples/encoding/to_an_io.rb