ffi-yajl 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f424af28e01cb3f1253f61010285bd3811b7a76e
4
- data.tar.gz: 1008ba36c8873d22d35a50de9fc03a8efb26c803
3
+ metadata.gz: a8b85bcd696b335e58ae66d7d6152d8c82712d64
4
+ data.tar.gz: 97199ad459ab9d164231563dc91fe26d4923c22f
5
5
  SHA512:
6
- metadata.gz: 0094f0e84b108549bf70bc2f4e5e37509ca3a06498201e8a26034f0d2142e52dc023656cd8abab5946d607dce10cec4d080fe50810b3c654662499d11717b1ff
7
- data.tar.gz: de12c5a201956bcb7b35d5ca71b99e515063c94b181cabe698f9969075dd5c4cb180ded3fba81c8e97dbfa12db88a6d1da15fd0952bc3f622ea0df9c73246ac6
6
+ metadata.gz: 32dca551da8cd71f0674033e1816d65eb3b245291dd4b63d5431248ae43f6ba4e407019030cbd46f20a81cd632315c9e03c4056d6891ef66aed6f5699ad2e64a
7
+ data.tar.gz: c4e9a16d122714c1446e82993ac4b979aaf4ad0373b1110581ac5fb683c767908ae90dace4aafb1d89456c858945e62004bae3975c92d8de5e6695c169b6b077
@@ -78,19 +78,30 @@ static VALUE rb_cHash_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
78
78
  struct yajl_gen_t *yajl_gen;
79
79
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
80
80
 
81
- extra = rb_hash_new(); /* FIXME: reduce garbage */
81
+ if ( rb_hash_aref(state, rb_str_new2("processing_key")) == Qtrue ) {
82
+ ID sym_to_s = rb_intern("to_s");
83
+ VALUE str = rb_funcall(self, sym_to_s, 0);
84
+ char *cptr = RSTRING_PTR(str);
85
+ int len = RSTRING_LEN(str);
86
+
87
+ CHECK_STATUS(
88
+ yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
89
+ );
90
+ } else {
91
+ extra = rb_hash_new(); /* FIXME: reduce garbage */
82
92
 
83
- rb_hash_aset(extra, rb_str_new2("yajl_gen"), rb_yajl_gen);
93
+ rb_hash_aset(extra, rb_str_new2("yajl_gen"), rb_yajl_gen);
84
94
 
85
- rb_hash_aset(extra, rb_str_new2("state"), state);
95
+ rb_hash_aset(extra, rb_str_new2("state"), state);
86
96
 
87
- CHECK_STATUS(
88
- yajl_gen_map_open(yajl_gen)
89
- );
90
- rb_hash_foreach(self, rb_cHash_ffi_yajl_callback, extra);
91
- CHECK_STATUS(
92
- yajl_gen_map_close(yajl_gen)
93
- );
97
+ CHECK_STATUS(
98
+ yajl_gen_map_open(yajl_gen)
99
+ );
100
+ rb_hash_foreach(self, rb_cHash_ffi_yajl_callback, extra);
101
+ CHECK_STATUS(
102
+ yajl_gen_map_close(yajl_gen)
103
+ );
104
+ }
94
105
 
95
106
  return Qnil;
96
107
  }
@@ -103,16 +114,27 @@ static VALUE rb_cArray_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
103
114
  struct yajl_gen_t *yajl_gen;
104
115
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
105
116
 
106
- CHECK_STATUS(
107
- yajl_gen_array_open(yajl_gen)
108
- );
109
- for(i=0; i<RARRAY_LEN(self); i++) {
110
- val = rb_ary_entry(self, i);
111
- rb_funcall(val, sym_ffi_yajl, 2, rb_yajl_gen, state);
117
+ if ( rb_hash_aref(state, rb_str_new2("processing_key")) == Qtrue ) {
118
+ ID sym_to_s = rb_intern("to_s");
119
+ VALUE str = rb_funcall(self, sym_to_s, 0);
120
+ char *cptr = RSTRING_PTR(str);
121
+ int len = RSTRING_LEN(str);
122
+
123
+ CHECK_STATUS(
124
+ yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
125
+ );
126
+ } else {
127
+ CHECK_STATUS(
128
+ yajl_gen_array_open(yajl_gen)
129
+ );
130
+ for(i=0; i<RARRAY_LEN(self); i++) {
131
+ val = rb_ary_entry(self, i);
132
+ rb_funcall(val, sym_ffi_yajl, 2, rb_yajl_gen, state);
133
+ }
134
+ CHECK_STATUS(
135
+ yajl_gen_array_close(yajl_gen)
136
+ );
112
137
  }
113
- CHECK_STATUS(
114
- yajl_gen_array_close(yajl_gen)
115
- );
116
138
 
117
139
  return Qnil;
118
140
  }
@@ -121,9 +143,22 @@ static VALUE rb_cNilClass_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
121
143
  yajl_gen_status status;
122
144
  struct yajl_gen_t *yajl_gen;
123
145
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
124
- CHECK_STATUS(
125
- yajl_gen_null(yajl_gen)
126
- );
146
+
147
+ if ( rb_hash_aref(state, rb_str_new2("processing_key")) == Qtrue ) {
148
+ ID sym_to_s = rb_intern("to_s");
149
+ VALUE str = rb_funcall(self, sym_to_s, 0);
150
+ char *cptr = RSTRING_PTR(str);
151
+ int len = RSTRING_LEN(str);
152
+
153
+ CHECK_STATUS(
154
+ yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
155
+ );
156
+ } else {
157
+ CHECK_STATUS(
158
+ yajl_gen_null(yajl_gen)
159
+ );
160
+ }
161
+
127
162
  return Qnil;
128
163
  }
129
164
 
@@ -131,9 +166,22 @@ static VALUE rb_cTrueClass_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state)
131
166
  yajl_gen_status status;
132
167
  struct yajl_gen_t *yajl_gen;
133
168
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
134
- CHECK_STATUS(
135
- yajl_gen_bool(yajl_gen, 1)
136
- );
169
+
170
+ if ( rb_hash_aref(state, rb_str_new2("processing_key")) == Qtrue ) {
171
+ ID sym_to_s = rb_intern("to_s");
172
+ VALUE str = rb_funcall(self, sym_to_s, 0);
173
+ char *cptr = RSTRING_PTR(str);
174
+ int len = RSTRING_LEN(str);
175
+
176
+ CHECK_STATUS(
177
+ yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
178
+ );
179
+ } else {
180
+ CHECK_STATUS(
181
+ yajl_gen_bool(yajl_gen, 1)
182
+ );
183
+ }
184
+
137
185
  return Qnil;
138
186
  }
139
187
 
@@ -141,9 +189,22 @@ static VALUE rb_cFalseClass_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state)
141
189
  yajl_gen_status status;
142
190
  struct yajl_gen_t *yajl_gen;
143
191
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
144
- CHECK_STATUS(
145
- yajl_gen_bool(yajl_gen, 0)
146
- );
192
+
193
+ if ( rb_hash_aref(state, rb_str_new2("processing_key")) == Qtrue ) {
194
+ ID sym_to_s = rb_intern("to_s");
195
+ VALUE str = rb_funcall(self, sym_to_s, 0);
196
+ char *cptr = RSTRING_PTR(str);
197
+ int len = RSTRING_LEN(str);
198
+
199
+ CHECK_STATUS(
200
+ yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
201
+ );
202
+ } else {
203
+ CHECK_STATUS(
204
+ yajl_gen_bool(yajl_gen, 0)
205
+ );
206
+ }
207
+
147
208
  return Qnil;
148
209
  }
149
210
 
@@ -168,6 +229,7 @@ static VALUE rb_cFixnum_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
168
229
  yajl_gen_number(yajl_gen, cptr, len)
169
230
  );
170
231
  }
232
+
171
233
  return Qnil;
172
234
  }
173
235
 
@@ -179,6 +241,7 @@ static VALUE rb_cBignum_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
179
241
  int len = RSTRING_LEN(str);
180
242
  struct yajl_gen_t *yajl_gen;
181
243
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
244
+
182
245
  if (memcmp(cptr, "NaN", 3) == 0 || memcmp(cptr, "Infinity", 8) == 0 || memcmp(cptr, "-Infinity", 9) == 0) {
183
246
  rb_raise(cEncodeError, "'%s' is an invalid number", cptr);
184
247
  }
@@ -191,6 +254,7 @@ static VALUE rb_cBignum_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
191
254
  yajl_gen_number(yajl_gen, cptr, len)
192
255
  );
193
256
  }
257
+
194
258
  return Qnil;
195
259
  }
196
260
 
@@ -202,6 +266,7 @@ static VALUE rb_cFloat_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
202
266
  int len = RSTRING_LEN(str);
203
267
  struct yajl_gen_t *yajl_gen;
204
268
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
269
+
205
270
  if (memcmp(cptr, "NaN", 3) == 0 || memcmp(cptr, "Infinity", 8) == 0 || memcmp(cptr, "-Infinity", 9) == 0) {
206
271
  rb_raise(cEncodeError, "'%s' is an invalid number", cptr);
207
272
  }
@@ -214,6 +279,7 @@ static VALUE rb_cFloat_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
214
279
  yajl_gen_number(yajl_gen, cptr, len)
215
280
  );
216
281
  }
282
+
217
283
  return Qnil;
218
284
  }
219
285
 
@@ -221,9 +287,11 @@ static VALUE rb_cString_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
221
287
  yajl_gen_status status;
222
288
  struct yajl_gen_t *yajl_gen;
223
289
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
290
+
224
291
  CHECK_STATUS(
225
292
  yajl_gen_string(yajl_gen, (unsigned char *)RSTRING_PTR(self), RSTRING_LEN(self))
226
293
  );
294
+
227
295
  return Qnil;
228
296
  }
229
297
 
@@ -236,9 +304,11 @@ static VALUE object_to_s_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
236
304
  int len = RSTRING_LEN(str);
237
305
  struct yajl_gen_t *yajl_gen;
238
306
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
307
+
239
308
  CHECK_STATUS(
240
309
  yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
241
310
  );
311
+
242
312
  return Qnil;
243
313
  }
244
314
 
@@ -258,9 +328,11 @@ static VALUE rb_cTime_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
258
328
  int len = RSTRING_LEN(str);
259
329
  struct yajl_gen_t *yajl_gen;
260
330
  Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
331
+
261
332
  CHECK_STATUS(
262
333
  yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
263
334
  );
335
+
264
336
  return Qnil;
265
337
  }
266
338
 
@@ -23,7 +23,7 @@ if RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc|clang/
23
23
  end
24
24
 
25
25
  def windows?
26
- !!(RUBY_PLATFORM =~ /mswin|mingw|windows/)
26
+ !!(RUBY_PLATFORM =~ /mswin|mingw|cygwin|windows/)
27
27
  end
28
28
 
29
29
  if windows?
@@ -23,7 +23,7 @@ if RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc|clang/
23
23
  end
24
24
 
25
25
  def windows?
26
- !!(RUBY_PLATFORM =~ /mswin|mingw|windows/)
26
+ !!(RUBY_PLATFORM =~ /mswin|mingw|cygwin|windows/)
27
27
  end
28
28
 
29
29
  if windows?
@@ -26,6 +26,7 @@ void set_value(CTX *ctx, VALUE val) {
26
26
  rb_hash_aset(last, key, val);
27
27
  break;
28
28
  default:
29
+ rb_ary_push(stack, val);
29
30
  break;
30
31
  }
31
32
  }
@@ -49,8 +50,6 @@ void end_object(CTX *ctx) {
49
50
  rb_ivar_set(ctx->self, rb_intern("key"), rb_ary_pop(key_stack));
50
51
  if ( RARRAY_LEN(stack) > 1 ) {
51
52
  set_value(ctx, rb_ary_pop(stack));
52
- } else {
53
- rb_ivar_set(ctx->self, rb_intern("finished"), rb_ary_pop(stack));
54
53
  }
55
54
  }
56
55
 
@@ -211,7 +210,7 @@ static VALUE mParser_do_yajl_parse(VALUE self, VALUE str, VALUE yajl_opts) {
211
210
  goto raise;
212
211
  }
213
212
  yajl_free(hand);
214
- return rb_ivar_get(self, rb_intern("finished"));
213
+ return rb_ary_pop(rb_ivar_get(self, rb_intern("stack")));
215
214
 
216
215
  raise:
217
216
  if (hand) {
@@ -230,4 +229,3 @@ void Init_parser() {
230
229
  utf8Encoding = rb_utf8_encoding();
231
230
  #endif
232
231
  }
233
-
@@ -1,14 +1,33 @@
1
1
 
2
+ #
3
+ # Precedence:
4
+ #
5
+ # - The FORCE_FFI_YAJL env var takes precedence over everything else, the user
6
+ # theoretically knows best
7
+ # - Java always gets ffi because jruby only supports ffi
8
+ # - There is a conflict between loading libyajl 1.x and 2.x in the same VM
9
+ # process (on a fundamental basis, simply guru medidate about how the
10
+ # c-symbols work if you load both libs). For some reason the ffi interface
11
+ # seems to work fine sometimes (i'm not sure how) so we fall back to that--
12
+ # this is much more likely to be converted into a raise than to have the warn
13
+ # dropped, so don't bother asking for that.
14
+ # - Then we try the c-ext and rescue into ffi that fails
15
+ #
2
16
  if ENV['FORCE_FFI_YAJL'] == "ext"
3
17
  require 'ffi_yajl/ext'
4
- elsif ENV['FORCE_FFI_YAJL'] == "ffi" || defined?(Yajl) || RUBY_VERSION.to_f < 1.9
5
- # - can't dynlink our libyajl2 c-ext and Yajl's libyajl1 c-ext into the same binary
6
- # - c-extension segfaults on ruby 1.8.7
18
+ elsif ENV['FORCE_FFI_YAJL'] == "ffi"
19
+ require 'ffi_yajl/ffi'
20
+ elsif RUBY_PLATFORM == "java"
21
+ require 'ffi_yajl/ffi'
22
+ elsif defined?(Yajl)
23
+ warn "the ffi-yajl and yajl-ruby gems have incompatible C libyajl libs and should not be loaded in the same Ruby VM"
24
+ warn "falling back to ffi which might work (or might not, no promises)"
7
25
  require 'ffi_yajl/ffi'
8
26
  else
9
27
  begin
10
28
  require 'ffi_yajl/ext'
11
29
  rescue LoadError
30
+ warn "failed to load the ffi-yajl c-extension, falling back to ffi interface"
12
31
  require 'ffi_yajl/ffi'
13
32
  end
14
33
  end
@@ -61,7 +61,7 @@ module FFI_Yajl
61
61
  end
62
62
 
63
63
  unless try_fiddle_dlopen(libpath) || try_dl_dlopen(libpath) || try_ffi_dlopen(libpath)
64
- raise "cannot find dlopen vi Fiddle, DL or FFI, what am I supposed to do?"
64
+ raise "cannot find dlopen via Fiddle, DL or FFI, what am I supposed to do?"
65
65
  end
66
66
 
67
67
  class Parser
@@ -46,56 +46,91 @@ end
46
46
 
47
47
  class Hash
48
48
  def ffi_yajl(yajl_gen, state)
49
- if ( status = FFI_Yajl.yajl_gen_map_open(yajl_gen) ) != 0
50
- FFI_Yajl::Encoder.raise_error_for_status(status)
51
- end
52
- self.each do |key, value|
53
- # Perf Fix: mutate state hash rather than creating new copy
54
- state[:processing_key] = true
55
- key.ffi_yajl(yajl_gen, state)
56
- state[:processing_key] = false
57
- value.ffi_yajl(yajl_gen, state)
58
- end
59
- if ( status = FFI_Yajl.yajl_gen_map_close(yajl_gen) ) != 0
60
- FFI_Yajl::Encoder.raise_error_for_status(status)
49
+ if state[:processing_key]
50
+ str = self.to_s
51
+ if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0
52
+ FFI_Yajl::Encoder.raise_error_for_status(status)
53
+ end
54
+ else
55
+ if ( status = FFI_Yajl.yajl_gen_map_open(yajl_gen) ) != 0
56
+ FFI_Yajl::Encoder.raise_error_for_status(status)
57
+ end
58
+ self.each do |key, value|
59
+ # Perf Fix: mutate state hash rather than creating new copy
60
+ state[:processing_key] = true
61
+ key.ffi_yajl(yajl_gen, state)
62
+ state[:processing_key] = false
63
+ value.ffi_yajl(yajl_gen, state)
64
+ end
65
+ if ( status = FFI_Yajl.yajl_gen_map_close(yajl_gen) ) != 0
66
+ FFI_Yajl::Encoder.raise_error_for_status(status)
67
+ end
61
68
  end
62
69
  end
63
70
  end
64
71
 
65
72
  class Array
66
73
  def ffi_yajl(yajl_gen, state)
67
- if ( status = FFI_Yajl.yajl_gen_array_open(yajl_gen) ) != 0
68
- FFI_Yajl::Encoder.raise_error_for_status(status)
69
- end
70
- self.each do |value|
71
- value.ffi_yajl(yajl_gen, state)
72
- end
73
- if ( status = FFI_Yajl.yajl_gen_array_close(yajl_gen) ) != 0
74
- FFI_Yajl::Encoder.raise_error_for_status(status)
74
+ if state[:processing_key]
75
+ str = self.to_s
76
+ if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0
77
+ FFI_Yajl::Encoder.raise_error_for_status(status)
78
+ end
79
+ else
80
+ if ( status = FFI_Yajl.yajl_gen_array_open(yajl_gen) ) != 0
81
+ FFI_Yajl::Encoder.raise_error_for_status(status)
82
+ end
83
+ self.each do |value|
84
+ value.ffi_yajl(yajl_gen, state)
85
+ end
86
+ if ( status = FFI_Yajl.yajl_gen_array_close(yajl_gen) ) != 0
87
+ FFI_Yajl::Encoder.raise_error_for_status(status)
88
+ end
75
89
  end
76
90
  end
77
91
  end
78
92
 
79
93
  class NilClass
80
94
  def ffi_yajl(yajl_gen, state)
81
- if ( status = FFI_Yajl.yajl_gen_null(yajl_gen) ) != 0
82
- FFI_Yajl::Encoder.raise_error_for_status(status)
95
+ if state[:processing_key]
96
+ str = self.to_s
97
+ if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0
98
+ FFI_Yajl::Encoder.raise_error_for_status(status)
99
+ end
100
+ else
101
+ if ( status = FFI_Yajl.yajl_gen_null(yajl_gen) ) != 0
102
+ FFI_Yajl::Encoder.raise_error_for_status(status)
103
+ end
83
104
  end
84
105
  end
85
106
  end
86
107
 
87
108
  class TrueClass
88
109
  def ffi_yajl(yajl_gen, state)
89
- if ( status = FFI_Yajl.yajl_gen_bool(yajl_gen, 1) ) != 0
90
- FFI_Yajl::Encoder.raise_error_for_status(status)
110
+ if state[:processing_key]
111
+ str = self.to_s
112
+ if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0
113
+ FFI_Yajl::Encoder.raise_error_for_status(status)
114
+ end
115
+ else
116
+ if ( status = FFI_Yajl.yajl_gen_bool(yajl_gen, 1) ) != 0
117
+ FFI_Yajl::Encoder.raise_error_for_status(status)
118
+ end
91
119
  end
92
120
  end
93
121
  end
94
122
 
95
123
  class FalseClass
96
124
  def ffi_yajl(yajl_gen, state)
97
- if ( status = FFI_Yajl.yajl_gen_bool(yajl_gen, 0) ) != 0
98
- FFI_Yajl::Encoder.raise_error_for_status(status)
125
+ if state[:processing_key]
126
+ str = self.to_s
127
+ if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0
128
+ FFI_Yajl::Encoder.raise_error_for_status(status)
129
+ end
130
+ else
131
+ if ( status = FFI_Yajl.yajl_gen_bool(yajl_gen, 0) ) != 0
132
+ FFI_Yajl::Encoder.raise_error_for_status(status)
133
+ end
99
134
  end
100
135
  end
101
136
  end
@@ -13,15 +13,13 @@ module FFI_Yajl
13
13
  when Array
14
14
  stack.last.push(val)
15
15
  else
16
- raise FFI_Yajl::ParseError.new("internal error: object not a hash or array")
16
+ stack.push(val)
17
17
  end
18
18
  end
19
19
 
20
20
  def stack_pop
21
21
  if stack.length > 1
22
22
  set_value( stack.pop )
23
- else
24
- @finished = stack.pop
25
23
  end
26
24
  end
27
25
 
@@ -138,11 +136,10 @@ module FFI_Yajl
138
136
  error = ::FFI_Yajl.yajl_get_error(yajl_handle, 1, str, str.bytesize)
139
137
  raise ::FFI_Yajl::ParseError.new(error)
140
138
  end
141
- finished
139
+ stack.pop
142
140
  ensure
143
141
  ::FFI_Yajl.yajl_free(yajl_handle) if yajl_handle
144
142
  end
145
143
  end
146
144
  end
147
145
  end
148
-
@@ -3,6 +3,8 @@
3
3
 
4
4
  require 'ffi_yajl' unless defined?(FFI_Yajl::Parser)
5
5
 
6
+ warn "ffi-yajl/json_gem is deprecated, these monkeypatches will be dropped shortly"
7
+
6
8
  module JSON
7
9
  class JSONError < StandardError; end unless defined?(JSON::JSONError)
8
10
  class GeneratorError < JSONError; end unless defined?(JSON::GeneratorError)
@@ -31,6 +31,8 @@ module FFI_Yajl
31
31
  end
32
32
 
33
33
  def parse(str)
34
+ raise FFI_Yajl::ParseError, "input must be a string or IO" unless str.is_a?(String) || str.respond_to?(:read)
35
+
34
36
  # initialization that we can do in pure ruby
35
37
  yajl_opts = {}
36
38
 
@@ -1,3 +1,3 @@
1
1
  module FFI_Yajl
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -7,6 +7,31 @@ describe "FFI_Yajl::Encoder" do
7
7
 
8
8
  let(:encoder) { FFI_Yajl::Encoder.new }
9
9
 
10
+ it "encodes hashes in keys as strings", :ruby_gte_193 => true do
11
+ ruby = { {'a' => 'b'} => 2 }
12
+ expect(encoder.encode(ruby)).to eq('{"{\"a\"=>\"b\"}":2}')
13
+ end
14
+
15
+ it "encodes arrays in keys as strings", :ruby_gte_193 => true do
16
+ ruby = { [0,1] => 2 }
17
+ expect(encoder.encode(ruby)).to eq('{"[0, 1]":2}')
18
+ end
19
+
20
+ it "encodes nil in keys as strings" do
21
+ ruby = { nil => 2 }
22
+ expect(encoder.encode(ruby)).to eq('{"":2}')
23
+ end
24
+
25
+ it "encodes true in keys as strings" do
26
+ ruby = { true => 2 }
27
+ expect(encoder.encode(ruby)).to eq('{"true":2}')
28
+ end
29
+
30
+ it "encodes false in keys as strings" do
31
+ ruby = { false => 2 }
32
+ expect(encoder.encode(ruby)).to eq('{"false":2}')
33
+ end
34
+
10
35
  it "encodes fixnums in keys as strings" do
11
36
  ruby = { 1 => 2 }
12
37
  expect(encoder.encode(ruby)).to eq('{"1":2}')
@@ -14,6 +14,55 @@ describe "FFI_Yajl::Parser" do
14
14
  end
15
15
  end
16
16
 
17
+ context "when parsing nil" do
18
+ let(:json) { nil }
19
+ it "should not coredump ruby" do
20
+ expect{ parser }.to raise_error(FFI_Yajl::ParseError)
21
+ end
22
+ end
23
+
24
+ context "when parsing bare int" do
25
+ let(:json) { "1" }
26
+ it "should parse to the int value" do
27
+ expect( parser ).to eq(1)
28
+ end
29
+ end
30
+
31
+ context "when parsing bare string" do
32
+ let(:json) { '"a"' }
33
+ it "should parse to the string value" do
34
+ expect( parser ).to eq("a")
35
+ end
36
+ end
37
+
38
+ context "when parsing bare true" do
39
+ let(:json) { "true" }
40
+ it "should parse to the true value" do
41
+ expect( parser ).to eq(true)
42
+ end
43
+ end
44
+
45
+ context "when parsing bare false" do
46
+ let(:json) { "false" }
47
+ it "should parse to the false value" do
48
+ expect( parser ).to eq(false)
49
+ end
50
+ end
51
+
52
+ context "when parsing bare null" do
53
+ let(:json) { "null" }
54
+ it "should parse to the nil value" do
55
+ expect( parser ).to eq(nil)
56
+ end
57
+ end
58
+
59
+ context "when parsing bare float" do
60
+ let(:json) { "1.1" }
61
+ it "should parse to the a float" do
62
+ expect( parser ).to eq(1.1)
63
+ end
64
+ end
65
+
17
66
  context "when json has comments" do
18
67
  let(:json) { '{"key": /* this is a comment */ "value"}' }
19
68
 
@@ -482,4 +531,3 @@ describe "FFI_Yajl::Parser" do
482
531
  end
483
532
  end
484
533
  end
485
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-yajl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lamont Granquist
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-10 00:00:00.000000000 Z
11
+ date: 2014-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.0'
103
+ version: '1.2'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.0'
110
+ version: '1.2'
111
111
  description: Ruby FFI wrapper around YAJL 2.x
112
112
  email: lamont@getchef.com
113
113
  executables: