oj 2.2.2 → 2.2.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of oj might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +6 -0
- data/ext/oj/object.c +25 -40
- data/ext/oj/oj.c +44 -10
- data/ext/oj/oj.h +7 -1
- data/ext/oj/parse.c +5 -1
- data/ext/oj/parse.h +1 -0
- data/ext/oj/scp.c +2 -1
- data/ext/oj/val_stack.c +3 -2
- data/lib/oj/version.rb +1 -1
- data/test/struct.rb +29 -0
- data/test/test_scp.rb +1 -1
- data/test/tests.rb +10 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf666d35187060e360daf53c2d0bedd178d3c686
|
4
|
+
data.tar.gz: 3e855525649cf4cec80eaa2e49b1d895f2db9eee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b6c183e662e435f8eaf00079f8caa2e306d20f8fbfafcd30b7d86e8e5f715d8fe3ebf6ceaadc4e217ce140df7b572807cb5a980af22836b76a8cd971a540440
|
7
|
+
data.tar.gz: fa4fe7655132ab085ce93ca6604dcfba71cfa925480c279db93dc2baf2ede9fe5d8592c101af7045587656d6e418d2ee7e7049ef49ef681a066e95a80ed9f372
|
data/README.md
CHANGED
@@ -20,6 +20,12 @@ Follow [@peterohler on Twitter](http://twitter.com/#!/peterohler) for announceme
|
|
20
20
|
|
21
21
|
[![Build Status](https://secure.travis-ci.org/ohler55/oj.png?branch=master)](http://travis-ci.org/ohler55/oj)
|
22
22
|
|
23
|
+
### Current Release 2.2.3
|
24
|
+
|
25
|
+
- Fixed struct segfault on load.
|
26
|
+
|
27
|
+
- Added option to force float on load if a decimal number.
|
28
|
+
|
23
29
|
### Current Release 2.2.2
|
24
30
|
|
25
31
|
- Added mutex support for Windows.
|
data/ext/oj/object.c
CHANGED
@@ -181,50 +181,35 @@ hat_num(ParseInfo pi, Val parent, const char *key, size_t klen, NumInfo ni) {
|
|
181
181
|
|
182
182
|
static int
|
183
183
|
hat_value(ParseInfo pi, Val parent, const char *key, size_t klen, volatile VALUE value) {
|
184
|
-
if (
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
#if HAS_ENCODING_SUPPORT
|
200
|
-
s = rb_struct_alloc_noinit(sc);
|
201
|
-
#else
|
202
|
-
s = rb_struct_new(sc, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, Qnil);
|
203
|
-
#endif
|
204
|
-
sv = RSTRUCT_PTR(s);
|
205
|
-
if (RSTRUCT_LEN(s) < len - 1) {
|
206
|
-
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "Too many elements for Struct");
|
184
|
+
if (T_ARRAY == rb_type(value)) {
|
185
|
+
int len = (int)RARRAY_LEN(value);
|
186
|
+
|
187
|
+
if (2 == klen && 'u' == key[1]) {
|
188
|
+
volatile VALUE sc;
|
189
|
+
|
190
|
+
if (0 == len) {
|
191
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "Invalid struct data");
|
192
|
+
return 1;
|
193
|
+
}
|
194
|
+
// If struct is not defined of new is not supported on the class then
|
195
|
+
// let this fail and raise an exception.
|
196
|
+
sc = rb_const_get(oj_struct_class, rb_to_id(*RARRAY_PTR(value)));
|
197
|
+
parent->val = rb_funcall2(sc, oj_new_id, len - 1, RARRAY_PTR(value) + 1);
|
198
|
+
|
207
199
|
return 1;
|
208
|
-
}
|
209
|
-
|
210
|
-
*sv = *a;
|
211
|
-
}
|
212
|
-
parent->val = s;
|
213
|
-
#else
|
214
|
-
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "Ruby structs not supported with this version of Ruby");
|
215
|
-
#endif
|
216
|
-
return 1;
|
217
|
-
} else if (3 <= klen && '#' == key[1] && T_ARRAY == rb_type(value)) {
|
218
|
-
long len = RARRAY_LEN(value);
|
219
|
-
volatile VALUE *a = RARRAY_PTR(value);
|
200
|
+
} else if (3 <= klen && '#' == key[1]) {
|
201
|
+
volatile VALUE *a;
|
220
202
|
|
221
|
-
|
222
|
-
|
203
|
+
if (2 != len) {
|
204
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "invalid hash pair");
|
205
|
+
return 1;
|
206
|
+
}
|
207
|
+
parent->val = rb_hash_new();
|
208
|
+
a = RARRAY_PTR(value);
|
209
|
+
rb_hash_aset(parent->val, *a, a[1]);
|
210
|
+
|
223
211
|
return 1;
|
224
212
|
}
|
225
|
-
parent->val = rb_hash_new();
|
226
|
-
rb_hash_aset(parent->val, *a, a[1]);
|
227
|
-
return 1;
|
228
213
|
}
|
229
214
|
return 0;
|
230
215
|
}
|
data/ext/oj/oj.c
CHANGED
@@ -90,22 +90,24 @@ VALUE oj_time_class;
|
|
90
90
|
|
91
91
|
VALUE oj_slash_string;
|
92
92
|
|
93
|
-
static VALUE ascii_sym;
|
94
93
|
static VALUE ascii_only_sym;
|
94
|
+
static VALUE ascii_sym;
|
95
95
|
static VALUE auto_define_sym;
|
96
|
+
static VALUE auto_sym;
|
96
97
|
static VALUE bigdecimal_as_decimal_sym;
|
97
98
|
static VALUE bigdecimal_load_sym;
|
99
|
+
static VALUE bigdecimal_sym;
|
98
100
|
static VALUE circular_sym;
|
99
101
|
static VALUE class_cache_sym;
|
100
102
|
static VALUE compat_sym;
|
101
103
|
static VALUE create_id_sym;
|
102
104
|
static VALUE escape_mode_sym;
|
105
|
+
static VALUE float_sym;
|
103
106
|
static VALUE indent_sym;
|
104
107
|
static VALUE json_sym;
|
105
108
|
static VALUE mode_sym;
|
106
109
|
static VALUE null_sym;
|
107
110
|
static VALUE object_sym;
|
108
|
-
static VALUE xss_safe_sym;
|
109
111
|
static VALUE ruby_sym;
|
110
112
|
static VALUE sec_prec_sym;
|
111
113
|
static VALUE strict_sym;
|
@@ -113,6 +115,7 @@ static VALUE symbol_keys_sym;
|
|
113
115
|
static VALUE time_format_sym;
|
114
116
|
static VALUE unix_sym;
|
115
117
|
static VALUE xmlschema_sym;
|
118
|
+
static VALUE xss_safe_sym;
|
116
119
|
|
117
120
|
static VALUE array_nl_sym;
|
118
121
|
static VALUE create_additions_sym;
|
@@ -146,7 +149,7 @@ struct _Options oj_default_options = {
|
|
146
149
|
Yes, // class_cache
|
147
150
|
UnixTime, // time_format
|
148
151
|
Yes, // bigdec_as_num
|
149
|
-
|
152
|
+
AutoDec, // bigdec_load
|
150
153
|
json_class, // create_id
|
151
154
|
10, // create_id_len
|
152
155
|
9, // sec_prec
|
@@ -167,7 +170,7 @@ static VALUE define_mimic_json(int argc, VALUE *argv, VALUE self);
|
|
167
170
|
* - mode: [:object|:strict|:compat|:null] load and dump modes to use for JSON
|
168
171
|
* - time_format: [:unix|:xmlschema|:ruby] time format when dumping in :compat mode
|
169
172
|
* - bigdecimal_as_decimal: [true|false|nil] dump BigDecimal as a decimal number or as a String
|
170
|
-
* - bigdecimal_load: [
|
173
|
+
* - bigdecimal_load: [:bigdecimal|:float|:auto] load decimals as BigDecimal instead of as a Float. :auto pick the most precise for the number of digits.
|
171
174
|
* - create_id: [String|nil] create id for json compatible object encoding, default is 'json_create'
|
172
175
|
* - second_precision: [Fixnum|nil] number of digits after the decimal when dumping the seconds portion of time
|
173
176
|
* @return [Hash] all current option settings.
|
@@ -183,7 +186,6 @@ get_def_opts(VALUE self) {
|
|
183
186
|
rb_hash_aset(opts, auto_define_sym, (Yes == oj_default_options.auto_define) ? Qtrue : ((No == oj_default_options.auto_define) ? Qfalse : Qnil));
|
184
187
|
rb_hash_aset(opts, symbol_keys_sym, (Yes == oj_default_options.sym_key) ? Qtrue : ((No == oj_default_options.sym_key) ? Qfalse : Qnil));
|
185
188
|
rb_hash_aset(opts, bigdecimal_as_decimal_sym, (Yes == oj_default_options.bigdec_as_num) ? Qtrue : ((No == oj_default_options.bigdec_as_num) ? Qfalse : Qnil));
|
186
|
-
rb_hash_aset(opts, bigdecimal_load_sym, (Yes == oj_default_options.bigdec_load) ? Qtrue : ((No == oj_default_options.bigdec_load) ? Qfalse : Qnil));
|
187
189
|
switch (oj_default_options.mode) {
|
188
190
|
case StrictMode: rb_hash_aset(opts, mode_sym, strict_sym); break;
|
189
191
|
case CompatMode: rb_hash_aset(opts, mode_sym, compat_sym); break;
|
@@ -203,6 +205,12 @@ get_def_opts(VALUE self) {
|
|
203
205
|
case UnixTime:
|
204
206
|
default: rb_hash_aset(opts, time_format_sym, unix_sym); break;
|
205
207
|
}
|
208
|
+
switch (oj_default_options.bigdec_load) {
|
209
|
+
case BigDec: rb_hash_aset(opts, bigdecimal_load_sym, bigdecimal_sym); break;
|
210
|
+
case FloatDec: rb_hash_aset(opts, bigdecimal_load_sym, float_sym); break;
|
211
|
+
case AutoDec:
|
212
|
+
default: rb_hash_aset(opts, bigdecimal_load_sym, auto_sym); break;
|
213
|
+
}
|
206
214
|
rb_hash_aset(opts, create_id_sym, (0 == oj_default_options.create_id) ? Qnil : rb_str_new2(oj_default_options.create_id));
|
207
215
|
|
208
216
|
return opts;
|
@@ -221,7 +229,7 @@ get_def_opts(VALUE self) {
|
|
221
229
|
* escaped sequences if :ascii, :json is standand UTF-8 JSON encoding,
|
222
230
|
* and :xss_safe escapes &, <, and >, and some others.
|
223
231
|
* @param [true|false|nil] :bigdecimal_as_decimal dump BigDecimal as a decimal number or as a String
|
224
|
-
* @param [
|
232
|
+
* @param [:bigdecimal|:float|:auto|nil] :bigdecimal_load load decimals as BigDecimal instead of as a Float. :auto pick the most precise for the number of digits.
|
225
233
|
* @param [:object|:strict|:compat|:null] load and dump mode to use for JSON
|
226
234
|
* :strict raises an exception when a non-supported Object is
|
227
235
|
* encountered. :compat attempts to extract variable values from an
|
@@ -246,7 +254,6 @@ set_def_opts(VALUE self, VALUE opts) {
|
|
246
254
|
{ symbol_keys_sym, &oj_default_options.sym_key },
|
247
255
|
{ class_cache_sym, &oj_default_options.class_cache },
|
248
256
|
{ bigdecimal_as_decimal_sym, &oj_default_options.bigdec_as_num },
|
249
|
-
{ bigdecimal_load_sym, &oj_default_options.bigdec_load },
|
250
257
|
{ Qnil, 0 }
|
251
258
|
};
|
252
259
|
YesNoOpt o;
|
@@ -313,6 +320,19 @@ set_def_opts(VALUE self, VALUE opts) {
|
|
313
320
|
rb_raise(rb_eArgError, ":encoding must be :json, :rails, or :ascii.");
|
314
321
|
}
|
315
322
|
|
323
|
+
v = rb_hash_lookup(opts, bigdecimal_load_sym);
|
324
|
+
if (Qnil == v) {
|
325
|
+
// ignore
|
326
|
+
} else if (bigdecimal_sym == v || Qtrue == v) {
|
327
|
+
oj_default_options.bigdec_load = BigDec;
|
328
|
+
} else if (float_sym == v) {
|
329
|
+
oj_default_options.bigdec_load = FloatDec;
|
330
|
+
} else if (auto_sym == v || Qfalse == v) {
|
331
|
+
oj_default_options.bigdec_load = AutoDec;
|
332
|
+
} else {
|
333
|
+
rb_raise(rb_eArgError, ":bigdecimal_load must be :bigdecimal, :float, or :auto.");
|
334
|
+
}
|
335
|
+
|
316
336
|
if (Qtrue == rb_funcall(opts, rb_intern("has_key?"), 1, create_id_sym)) {
|
317
337
|
if (0 != oj_default_options.create_id) {
|
318
338
|
if (json_class != oj_default_options.create_id) {
|
@@ -363,7 +383,6 @@ oj_parse_options(VALUE ropts, Options copts) {
|
|
363
383
|
{ symbol_keys_sym, &copts->sym_key },
|
364
384
|
{ class_cache_sym, &copts->class_cache },
|
365
385
|
{ bigdecimal_as_decimal_sym, &copts->bigdec_as_num },
|
366
|
-
{ bigdecimal_load_sym, &copts->bigdec_load },
|
367
386
|
{ Qnil, 0 }
|
368
387
|
};
|
369
388
|
YesNoOpt o;
|
@@ -428,6 +447,18 @@ oj_parse_options(VALUE ropts, Options copts) {
|
|
428
447
|
}
|
429
448
|
}
|
430
449
|
|
450
|
+
if (Qnil != (v = rb_hash_lookup(ropts, bigdecimal_load_sym))) {
|
451
|
+
if (bigdecimal_sym == v || Qtrue == v) {
|
452
|
+
copts->bigdec_load = BigDec;
|
453
|
+
} else if (float_sym == v) {
|
454
|
+
copts->bigdec_load = FloatDec;
|
455
|
+
} else if (auto_sym == v || Qfalse == v) {
|
456
|
+
copts->bigdec_load = AutoDec;
|
457
|
+
} else {
|
458
|
+
rb_raise(rb_eArgError, ":bigdecimal_load must be :bigdecimal, :float, or :auto.");
|
459
|
+
}
|
460
|
+
}
|
461
|
+
|
431
462
|
if (Qtrue == rb_funcall(ropts, rb_intern("has_key?"), 1, create_id_sym)) {
|
432
463
|
v = rb_hash_lookup(ropts, create_id_sym);
|
433
464
|
if (Qnil == v) {
|
@@ -1240,22 +1271,24 @@ void Init_oj() {
|
|
1240
1271
|
oj_struct_class = rb_const_get(rb_cObject, rb_intern("Struct"));
|
1241
1272
|
oj_time_class = rb_const_get(rb_cObject, rb_intern("Time"));
|
1242
1273
|
|
1243
|
-
ascii_sym = ID2SYM(rb_intern("ascii")); rb_gc_register_address(&ascii_sym);
|
1244
1274
|
ascii_only_sym = ID2SYM(rb_intern("ascii_only")); rb_gc_register_address(&ascii_only_sym);
|
1275
|
+
ascii_sym = ID2SYM(rb_intern("ascii")); rb_gc_register_address(&ascii_sym);
|
1245
1276
|
auto_define_sym = ID2SYM(rb_intern("auto_define")); rb_gc_register_address(&auto_define_sym);
|
1277
|
+
auto_sym = ID2SYM(rb_intern("auto")); rb_gc_register_address(&auto_sym);
|
1246
1278
|
bigdecimal_as_decimal_sym = ID2SYM(rb_intern("bigdecimal_as_decimal"));rb_gc_register_address(&bigdecimal_as_decimal_sym);
|
1247
1279
|
bigdecimal_load_sym = ID2SYM(rb_intern("bigdecimal_load"));rb_gc_register_address(&bigdecimal_load_sym);
|
1280
|
+
bigdecimal_sym = ID2SYM(rb_intern("bigdecimal")); rb_gc_register_address(&bigdecimal_sym);
|
1248
1281
|
circular_sym = ID2SYM(rb_intern("circular")); rb_gc_register_address(&circular_sym);
|
1249
1282
|
class_cache_sym = ID2SYM(rb_intern("class_cache")); rb_gc_register_address(&class_cache_sym);
|
1250
1283
|
compat_sym = ID2SYM(rb_intern("compat")); rb_gc_register_address(&compat_sym);
|
1251
1284
|
create_id_sym = ID2SYM(rb_intern("create_id")); rb_gc_register_address(&create_id_sym);
|
1252
1285
|
escape_mode_sym = ID2SYM(rb_intern("escape_mode")); rb_gc_register_address(&escape_mode_sym);
|
1286
|
+
float_sym = ID2SYM(rb_intern("float")); rb_gc_register_address(&float_sym);
|
1253
1287
|
indent_sym = ID2SYM(rb_intern("indent")); rb_gc_register_address(&indent_sym);
|
1254
1288
|
json_sym = ID2SYM(rb_intern("json")); rb_gc_register_address(&json_sym);
|
1255
1289
|
mode_sym = ID2SYM(rb_intern("mode")); rb_gc_register_address(&mode_sym);
|
1256
1290
|
null_sym = ID2SYM(rb_intern("null")); rb_gc_register_address(&null_sym);
|
1257
1291
|
object_sym = ID2SYM(rb_intern("object")); rb_gc_register_address(&object_sym);
|
1258
|
-
xss_safe_sym = ID2SYM(rb_intern("xss_safe")); rb_gc_register_address(&xss_safe_sym);
|
1259
1292
|
ruby_sym = ID2SYM(rb_intern("ruby")); rb_gc_register_address(&ruby_sym);
|
1260
1293
|
sec_prec_sym = ID2SYM(rb_intern("second_precision"));rb_gc_register_address(&sec_prec_sym);
|
1261
1294
|
strict_sym = ID2SYM(rb_intern("strict")); rb_gc_register_address(&strict_sym);
|
@@ -1263,6 +1296,7 @@ void Init_oj() {
|
|
1263
1296
|
time_format_sym = ID2SYM(rb_intern("time_format")); rb_gc_register_address(&time_format_sym);
|
1264
1297
|
unix_sym = ID2SYM(rb_intern("unix")); rb_gc_register_address(&unix_sym);
|
1265
1298
|
xmlschema_sym = ID2SYM(rb_intern("xmlschema")); rb_gc_register_address(&xmlschema_sym);
|
1299
|
+
xss_safe_sym = ID2SYM(rb_intern("xss_safe")); rb_gc_register_address(&xss_safe_sym);
|
1266
1300
|
|
1267
1301
|
oj_slash_string = rb_str_new2("/"); rb_gc_register_address(&oj_slash_string);
|
1268
1302
|
|
data/ext/oj/oj.h
CHANGED
@@ -92,6 +92,12 @@ typedef enum {
|
|
92
92
|
ASCIIEsc = 'a'
|
93
93
|
} Encoding;
|
94
94
|
|
95
|
+
typedef enum {
|
96
|
+
BigDec = 'b',
|
97
|
+
FloatDec = 'f',
|
98
|
+
AutoDec = 'a'
|
99
|
+
} BigLoad;
|
100
|
+
|
95
101
|
typedef struct _DumpOpts {
|
96
102
|
const char *indent;
|
97
103
|
const char *before_sep;
|
@@ -115,7 +121,7 @@ typedef struct _Options {
|
|
115
121
|
char class_cache; // YesNo
|
116
122
|
char time_format; // TimeFormat
|
117
123
|
char bigdec_as_num; // YesNo
|
118
|
-
char bigdec_load; //
|
124
|
+
char bigdec_load; // BigLoad
|
119
125
|
const char *create_id; // 0 or string
|
120
126
|
size_t create_id_len; // length of create_id
|
121
127
|
int sec_prec; // second precision when dumping time
|
data/ext/oj/parse.c
CHANGED
@@ -389,6 +389,7 @@ read_num(ParseInfo pi) {
|
|
389
389
|
ni.infinity = 0;
|
390
390
|
ni.nan = 0;
|
391
391
|
ni.neg = 0;
|
392
|
+
ni.no_big = (FloatDec == pi->options.bigdec_load);
|
392
393
|
|
393
394
|
if ('-' == *pi->cur) {
|
394
395
|
pi->cur++;
|
@@ -470,7 +471,7 @@ read_num(ParseInfo pi) {
|
|
470
471
|
ni.dec_cnt -= zero_cnt;
|
471
472
|
ni.len = pi->cur - ni.str;
|
472
473
|
}
|
473
|
-
if (
|
474
|
+
if (BigDec == pi->options.bigdec_load) {
|
474
475
|
ni.big = 1;
|
475
476
|
}
|
476
477
|
if (0 == parent) {
|
@@ -680,6 +681,9 @@ oj_num_as_value(NumInfo ni) {
|
|
680
681
|
} else { // decimal
|
681
682
|
if (ni->big) {
|
682
683
|
rnum = rb_funcall(oj_bigdecimal_class, oj_new_id, 1, rb_str_new(ni->str, ni->len));
|
684
|
+
if (ni->no_big) {
|
685
|
+
rnum = rb_funcall(rnum, rb_intern("to_f"), 0);
|
686
|
+
}
|
683
687
|
} else {
|
684
688
|
double d = (double)ni->i + (double)ni->num / (double)ni->div;
|
685
689
|
|
data/ext/oj/parse.h
CHANGED
data/ext/oj/scp.c
CHANGED
@@ -281,7 +281,8 @@ oj_sc_parse(int argc, VALUE *argv, VALUE self) {
|
|
281
281
|
#endif
|
282
282
|
} else if (rb_respond_to(input, oj_read_id)) {
|
283
283
|
s = rb_funcall2(input, oj_read_id, 0, 0);
|
284
|
-
pi.json =
|
284
|
+
pi.json = rb_string_value_cstr((VALUE*)&s);
|
285
|
+
|
285
286
|
} else {
|
286
287
|
rb_raise(rb_eArgError, "saj_parse() expected a String or IO Object.");
|
287
288
|
}
|
data/ext/oj/val_stack.c
CHANGED
data/lib/oj/version.rb
CHANGED
data/test/struct.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# Ubuntu does not accept arguments to ruby when called using env. To get warnings to show up the -w options is
|
5
|
+
# required. That can be set in the RUBYOPT environment variable.
|
6
|
+
# export RUBYOPT=-w
|
7
|
+
|
8
|
+
$VERBOSE = true
|
9
|
+
|
10
|
+
$: << File.join(File.dirname(__FILE__), "../lib")
|
11
|
+
$: << File.join(File.dirname(__FILE__), "../ext")
|
12
|
+
|
13
|
+
require 'oj'
|
14
|
+
|
15
|
+
A = Struct.new(:a,:b,:c,:d)
|
16
|
+
B = Struct.new(:e,:f)
|
17
|
+
|
18
|
+
obj = [A.new(55, B.new(1, 'X'), B.new(2, 'Y'), 3)]
|
19
|
+
|
20
|
+
s = Oj.dump(obj, :mode => :object)
|
21
|
+
|
22
|
+
100000.times do
|
23
|
+
Oj.load(s, :mode => :object)
|
24
|
+
# ds = Oj.dump(o, :mode => :object)
|
25
|
+
# if ds != s
|
26
|
+
# puts ds
|
27
|
+
# raise "holy crap"
|
28
|
+
# end
|
29
|
+
end
|
data/test/test_scp.rb
CHANGED
@@ -217,7 +217,7 @@ class ScpTest < ::Test::Unit::TestCase
|
|
217
217
|
begin
|
218
218
|
Oj.sc_parse(handler, json)
|
219
219
|
rescue Exception => e
|
220
|
-
assert_equal("unexpected character at line 1, column 6 [parse.c:
|
220
|
+
assert_equal("unexpected character at line 1, column 6 [parse.c:637]", e.message)
|
221
221
|
end
|
222
222
|
end
|
223
223
|
|
data/test/tests.rb
CHANGED
@@ -133,7 +133,7 @@ class Juice < ::Test::Unit::TestCase
|
|
133
133
|
:mode=>:object,
|
134
134
|
:time_format=>:unix,
|
135
135
|
:bigdecimal_as_decimal=>true,
|
136
|
-
:bigdecimal_load
|
136
|
+
:bigdecimal_load=>:auto,
|
137
137
|
:create_id=>'json_class'}, opts)
|
138
138
|
end
|
139
139
|
|
@@ -149,7 +149,7 @@ class Juice < ::Test::Unit::TestCase
|
|
149
149
|
:mode=>:object,
|
150
150
|
:time_format=>:unix,
|
151
151
|
:bigdecimal_as_decimal=>true,
|
152
|
-
:bigdecimal_load
|
152
|
+
:bigdecimal_load=>:auto,
|
153
153
|
:create_id=>'json_class'}
|
154
154
|
o2 = {
|
155
155
|
:indent=>4,
|
@@ -162,7 +162,7 @@ class Juice < ::Test::Unit::TestCase
|
|
162
162
|
:mode=>:compat,
|
163
163
|
:time_format=>:ruby,
|
164
164
|
:bigdecimal_as_decimal=>false,
|
165
|
-
:bigdecimal_load
|
165
|
+
:bigdecimal_load=>:bigdecimal,
|
166
166
|
:create_id=>nil}
|
167
167
|
o3 = { :indent => 4 }
|
168
168
|
Oj.default_options = o2
|
@@ -826,6 +826,13 @@ class Juice < ::Test::Unit::TestCase
|
|
826
826
|
assert_equal(BigDecimal, bg.class)
|
827
827
|
assert_equal(orig, bg)
|
828
828
|
end
|
829
|
+
def test_float_load
|
830
|
+
orig = BigDecimal.new('80.51')
|
831
|
+
json = Oj.dump(orig, :mode => :compat, :bigdecimal_as_decimal => true)
|
832
|
+
bg = Oj.load(json, :mode => :compat, :bigdecimal_load => :float)
|
833
|
+
assert_equal(Float, bg.class)
|
834
|
+
assert_equal(orig.to_f, bg)
|
835
|
+
end
|
829
836
|
def test_bigdecimal_compat_to_json
|
830
837
|
orig = BigDecimal.new('80.51')
|
831
838
|
BigDecimal.send(:define_method, :to_json) do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'The fastest JSON parser and object serializer. '
|
14
14
|
email: peter@ohler.com
|
@@ -83,6 +83,7 @@ files:
|
|
83
83
|
- test/sample/text.rb
|
84
84
|
- test/sample.rb
|
85
85
|
- test/sample_json.rb
|
86
|
+
- test/struct.rb
|
86
87
|
- test/test_compat.rb
|
87
88
|
- test/test_fast.rb
|
88
89
|
- test/test_gc.rb
|