oj 2.17.5 → 2.18.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
- ---
2
- SHA1:
3
- metadata.gz: f9904f1f35cca59ff6e3e9f9f3a2e391cdc29404
4
- data.tar.gz: 77f647f9b93058861cbe1f2fe84e1063169fc5b1
5
- SHA512:
6
- metadata.gz: eb5d9a18cc205da2c52035750f274ea4c9a41fbe71b383eff0e032c4006c37c87c8b3a3fb238239e4e4e4f8ee9920007666fe3daa9de1b001e2cc118d1ebcf22
7
- data.tar.gz: 8e414158909fcdf69bb16fc1465b6d710ec36f1845849f716c021629162873026d6fa38cf19330e92a65911804df69eaea6e982b84b7b153853e0e09df303651
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 49295a5c6be0e45972d2cf83173fabb2db55fcc3
4
+ data.tar.gz: 645d5ec2b8214eeb596fd98cb5a9c0e1e2a9836e
5
+ SHA512:
6
+ metadata.gz: 0731c01c050cc7aff03be4510be0ad026ed0a320f1fee34fb6318bcdcb5888455c13e9dfb6ec2e7b4d6436e5c04cf43a6d43ff257bb076cc1ec5b8ee5c224cc4
7
+ data.tar.gz: ce82256a18f92155498d0ee6b74c06704eb51782cd3411a3c7c2308af252386e668c43216831b32999a349cea83ff5804515314ec1ef9dfc1df36fac388c56dc
data/README.md CHANGED
@@ -170,9 +170,16 @@ Oj.default_options = {:mode => :compat }
170
170
 
171
171
  ## Releases
172
172
 
173
- **Future Release 2.17.5**
173
+ ** Release 2.18.0**
174
174
 
175
- - Added additional code to check for as_json arguments and recursive calls.
175
+ - Rubinius compilation fixes.
176
+
177
+ - Added a separate option for as_json instead of piggy backing on the
178
+ use_to_json. This changes the API slightly.
179
+
180
+ - Ready for Ruby 2.4.
181
+
182
+ - Thanks to faucct for fixing mimic to not redefine JSON::ParseError.
176
183
 
177
184
  [Older release notes](http://www.ohler.com/dev/oj_misc/release_notes.html).
178
185
 
@@ -1118,7 +1118,7 @@ dump_time(VALUE obj, Out out, int withZone) {
1118
1118
  long tzsecs = NUM2LONG(rb_funcall2(obj, oj_utc_offset_id, 0, 0));
1119
1119
  int zneg = (0 > tzsecs);
1120
1120
 
1121
- if (0 == tzsecs && Qtrue == rb_funcall2(obj, oj_utcq_id, 0, 0)) {
1121
+ if (0 == tzsecs && rb_funcall2(obj, oj_utcq_id, 0, 0)) {
1122
1122
  tzsecs = 86400;
1123
1123
  }
1124
1124
  if (zneg) {
@@ -1251,7 +1251,7 @@ dump_xml_time(VALUE obj, Out out) {
1251
1251
  }
1252
1252
  #endif
1253
1253
  if (0 == nsec || 0 == out->opts->sec_prec) {
1254
- if (0 == tzsecs && Qtrue == rb_funcall2(obj, oj_utcq_id, 0, 0)) {
1254
+ if (0 == tzsecs && rb_funcall2(obj, oj_utcq_id, 0, 0)) {
1255
1255
  sprintf(buf, "%04d-%02d-%02dT%02d:%02d:%02dZ",
1256
1256
  tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
1257
1257
  tm->tm_hour, tm->tm_min, tm->tm_sec);
@@ -1263,7 +1263,7 @@ dump_xml_time(VALUE obj, Out out) {
1263
1263
  tzsign, tzhour, tzmin);
1264
1264
  dump_cstr(buf, 25, 0, 0, out);
1265
1265
  }
1266
- } else if (0 == tzsecs && Qtrue == rb_funcall2(obj, oj_utcq_id, 0, 0)) {
1266
+ } else if (0 == tzsecs && rb_funcall2(obj, oj_utcq_id, 0, 0)) {
1267
1267
  char format[64] = "%04d-%02d-%02dT%02d:%02d:%02d.%09ldZ";
1268
1268
  int len = 30;
1269
1269
 
@@ -1321,7 +1321,7 @@ static void
1321
1321
  dump_data_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok) {
1322
1322
  VALUE clas = rb_obj_class(obj);
1323
1323
 
1324
- if (as_ok && rb_respond_to(obj, oj_to_hash_id)) {
1324
+ if (as_ok && Yes == out->opts->to_json && rb_respond_to(obj, oj_to_hash_id)) {
1325
1325
  volatile VALUE h = rb_funcall(obj, oj_to_hash_id, 0);
1326
1326
 
1327
1327
  if (T_HASH != rb_type(h)) {
@@ -1333,14 +1333,14 @@ dump_data_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok)
1333
1333
  dump_val(h, depth, out, 0, 0, false);
1334
1334
  }
1335
1335
  dump_hash(h, Qundef, depth, out->opts->mode, out);
1336
-
1337
1336
  } else if (Yes == out->opts->bigdec_as_num && oj_bigdecimal_class == clas) {
1338
1337
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
1339
1338
 
1340
1339
  dump_raw(rb_string_value_ptr((VALUE*)&rstr), RSTRING_LEN(rstr), out);
1341
- } else if (as_ok && rb_respond_to(obj, oj_as_json_id)) {
1340
+ } else if (as_ok && Yes == out->opts->as_json && rb_respond_to(obj, oj_as_json_id)) {
1342
1341
  volatile VALUE aj;
1343
1342
 
1343
+ #if HAS_METHOD_ARITY
1344
1344
  // Some classes elect to not take an options argument so check the arity
1345
1345
  // of as_json.
1346
1346
  switch (rb_obj_method_arity(obj, oj_as_json_id)) {
@@ -1361,6 +1361,9 @@ dump_data_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok)
1361
1361
  aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1362
1362
  break;
1363
1363
  }
1364
+ #else
1365
+ aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1366
+ #endif
1364
1367
  // Catch the obvious brain damaged recursive dumping.
1365
1368
  if (aj == obj) {
1366
1369
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
@@ -1451,7 +1454,7 @@ dump_data_obj(VALUE obj, int depth, Out out) {
1451
1454
 
1452
1455
  static void
1453
1456
  dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok) {
1454
- if (as_ok && rb_respond_to(obj, oj_to_hash_id)) {
1457
+ if (as_ok && Yes == out->opts->to_json && rb_respond_to(obj, oj_to_hash_id)) {
1455
1458
  volatile VALUE h = rb_funcall(obj, oj_to_hash_id, 0);
1456
1459
 
1457
1460
  if (T_HASH != rb_type(h)) {
@@ -1464,9 +1467,10 @@ dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok)
1464
1467
  } else {
1465
1468
  dump_hash(h, Qundef, depth, out->opts->mode, out);
1466
1469
  }
1467
- } else if (as_ok && rb_respond_to(obj, oj_as_json_id)) {
1470
+ } else if (as_ok && Yes == out->opts->as_json && rb_respond_to(obj, oj_as_json_id)) {
1468
1471
  volatile VALUE aj;
1469
1472
 
1473
+ #if HAS_METHOD_ARITY
1470
1474
  // Some classes elect to not take an options argument so check the arity
1471
1475
  // of as_json.
1472
1476
  switch (rb_obj_method_arity(obj, oj_as_json_id)) {
@@ -1487,6 +1491,9 @@ dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok)
1487
1491
  aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1488
1492
  break;
1489
1493
  }
1494
+ #else
1495
+ aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1496
+ #endif
1490
1497
  // Catch the obvious brain damaged recursive dumping.
1491
1498
  if (aj == obj) {
1492
1499
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
@@ -1774,7 +1781,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
1774
1781
  }
1775
1782
  #endif
1776
1783
  #if HAS_EXCEPTION_MAGIC
1777
- if (Qtrue == rb_obj_is_kind_of(obj, rb_eException)) {
1784
+ if (rb_obj_is_kind_of(obj, rb_eException)) {
1778
1785
  volatile VALUE rv;
1779
1786
 
1780
1787
  if (',' != *(out->cur - 1)) {
@@ -1816,7 +1823,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
1816
1823
 
1817
1824
  static void
1818
1825
  dump_struct_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok) {
1819
- if (as_ok && rb_respond_to(obj, oj_to_hash_id)) {
1826
+ if (as_ok && Yes == out->opts->to_json && rb_respond_to(obj, oj_to_hash_id)) {
1820
1827
  volatile VALUE h = rb_funcall(obj, oj_to_hash_id, 0);
1821
1828
 
1822
1829
  if (T_HASH != rb_type(h)) {
@@ -1828,9 +1835,10 @@ dump_struct_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_o
1828
1835
  dump_val(h, depth, out, 0, 0, false);
1829
1836
  }
1830
1837
  dump_hash(h, Qundef, depth, out->opts->mode, out);
1831
- } else if (as_ok && rb_respond_to(obj, oj_as_json_id)) {
1838
+ } else if (as_ok && Yes == out->opts->as_json && rb_respond_to(obj, oj_as_json_id)) {
1832
1839
  volatile VALUE aj;
1833
1840
 
1841
+ #if HAS_METHOD_ARITY
1834
1842
  // Some classes elect to not take an options argument so check the arity
1835
1843
  // of as_json.
1836
1844
  switch (rb_obj_method_arity(obj, oj_as_json_id)) {
@@ -1851,6 +1859,9 @@ dump_struct_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_o
1851
1859
  aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1852
1860
  break;
1853
1861
  }
1862
+ #else
1863
+ aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1864
+ #endif
1854
1865
  // Catch the obvious brain damaged recursive dumping.
1855
1866
  if (aj == obj) {
1856
1867
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
@@ -1899,6 +1910,7 @@ dump_struct_obj(VALUE obj, int depth, Out out) {
1899
1910
  *out->cur++ = '"';
1900
1911
  *out->cur++ = ':';
1901
1912
  *out->cur++ = '[';
1913
+ #if HAS_STRUCT_MEMBERS
1902
1914
  if ('#' == *class_name) {
1903
1915
  VALUE ma = rb_struct_s_members(clas);
1904
1916
  const char *name;
@@ -1922,6 +1934,9 @@ dump_struct_obj(VALUE obj, int depth, Out out) {
1922
1934
  }
1923
1935
  *out->cur++ = ']';
1924
1936
  } else {
1937
+ #else
1938
+ if (true) {
1939
+ #endif
1925
1940
  fill_indent(out, d3);
1926
1941
  *out->cur++ = '"';
1927
1942
  memcpy(out->cur, class_name, len);
@@ -1932,17 +1947,21 @@ dump_struct_obj(VALUE obj, int depth, Out out) {
1932
1947
  size = d3 * out->indent + 2;
1933
1948
  #ifdef RSTRUCT_LEN
1934
1949
  {
1935
- const VALUE *vp;
1936
-
1937
- #ifndef RSTRUCT_CONST_PTR
1938
- # define RSTRUCT_CONST_PTR(st) (const VALUE *)RSTRUCT_PTR(st)
1939
- #endif
1940
- for (i = (int)RSTRUCT_LEN(obj), vp = RSTRUCT_CONST_PTR(obj); 0 < i; i--, vp++) {
1950
+ VALUE v;
1951
+ int cnt;
1952
+ #if UNIFY_FIXNUM_AND_BIGNUM
1953
+ cnt = (int)NUM2LONG(RSTRUCT_LEN(obj));
1954
+ #else // UNIFY_FIXNUM_AND_INTEGER
1955
+ cnt = (int)RSTRUCT_LEN(obj);
1956
+ #endif // UNIFY_FIXNUM_AND_INTEGER
1957
+
1958
+ for (i = 0; i < cnt; i++) {
1959
+ v = RSTRUCT_GET(obj, i);
1941
1960
  if (out->end - out->cur <= (long)size) {
1942
1961
  grow(out, size);
1943
1962
  }
1944
1963
  fill_indent(out, d3);
1945
- dump_val(*vp, d3, out, 0, 0, true);
1964
+ dump_val(v, d3, out, 0, 0, true);
1946
1965
  *out->cur++ = ',';
1947
1966
  }
1948
1967
  }
@@ -1957,7 +1976,7 @@ dump_struct_obj(VALUE obj, int depth, Out out) {
1957
1976
  grow(out, size);
1958
1977
  }
1959
1978
  fill_indent(out, d3);
1960
- dump_val(rb_struct_aref(obj, INT2FIX(i)), d3, out, 0, 0);
1979
+ dump_val(rb_struct_aref(obj, INT2FIX(i)), d3, out, 0, 0, true);
1961
1980
  *out->cur++ = ',';
1962
1981
  }
1963
1982
  }
@@ -35,6 +35,9 @@ dflags = {
35
35
  'DATETIME_1_8' => ('ruby' == type && ('1' == version[0] && '8' == version[1])) ? 1 : 0,
36
36
  'NO_TIME_ROUND_PAD' => ('rubinius' == type) ? 1 : 0,
37
37
  'HAS_DATA_OBJECT_WRAP' => ('ruby' == type && '2' == version[0] && '3' <= version[1]) ? 1 : 0,
38
+ 'HAS_METHOD_ARITY' => ('rubinius' == type) ? 0 : 1,
39
+ 'HAS_STRUCT_MEMBERS' => ('rubinius' == type) ? 0 : 1,
40
+ 'UNIFY_FIXNUM_AND_BIGNUM' => ('ruby' == type && '2' == version[0] && '4' <= version[1]) ? 1 : 0,
38
41
  }
39
42
  # This is a monster hack to get around issues with 1.9.3-p0 on CentOS 5.4. SO
40
43
  # some reason math.h and string.h contents are not processed. Might be a
@@ -390,7 +390,8 @@ hat_value(ParseInfo pi, Val parent, const char *key, size_t klen, volatile VALUE
390
390
  if (2 == klen && 'u' == key[1]) {
391
391
  volatile VALUE sc;
392
392
  volatile VALUE e1;
393
-
393
+ int slen;
394
+
394
395
  if (0 == len) {
395
396
  oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "Invalid struct data");
396
397
  return 1;
@@ -415,27 +416,24 @@ hat_value(ParseInfo pi, Val parent, const char *key, size_t klen, volatile VALUE
415
416
  parent->val = rb_obj_alloc(sc);
416
417
  // If the JSON array has more entries than the struct class allows, we record an error.
417
418
  #ifdef RSTRUCT_LEN
419
+ #if UNIFY_FIXNUM_AND_BIGNUM
420
+ slen = (int)NUM2LONG(RSTRUCT_LEN(parent->val));
421
+ #else // UNIFY_FIXNUM_AND_INTEGER
422
+ slen = (int)RSTRUCT_LEN(parent->val);
423
+ #endif // UNIFY_FIXNUM_AND_INTEGER
424
+ #else
425
+ slen = FIX2INT(rb_funcall2(parent->val, oj_length_id, 0, 0));
426
+ #endif
418
427
  // MRI >= 1.9
419
- if (len - 1 > RSTRUCT_LEN(parent->val)) {
428
+ if (len - 1 > slen) {
420
429
  oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "Invalid struct data");
421
430
  } else {
422
- MEMCPY(RSTRUCT_PTR(parent->val), RARRAY_PTR(value) + 1, VALUE, len - 1);
423
- }
424
- #else
425
- {
426
- // MRI < 1.9 or Rubinius
427
- int slen = FIX2INT(rb_funcall2(parent->val, oj_length_id, 0, 0));
428
431
  int i;
429
432
 
430
- if (len - 1 > slen) {
431
- oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "Invalid struct data");
432
- } else {
433
- for (i = 0; i < slen; i++) {
434
- rb_struct_aset(parent->val, INT2FIX(i), RARRAY_PTR(value)[i + 1]);
435
- }
433
+ for (i = 0; i < slen; i++) {
434
+ rb_struct_aset(parent->val, INT2FIX(i), RARRAY_PTR(value)[i + 1]);
436
435
  }
437
436
  }
438
- #endif
439
437
  return 1;
440
438
  } else if (3 <= klen && '#' == key[1]) {
441
439
  volatile VALUE *a;
@@ -142,6 +142,7 @@ static VALUE symbol_keys_sym;
142
142
  static VALUE time_format_sym;
143
143
  static VALUE unix_sym;
144
144
  static VALUE unix_zone_sym;
145
+ static VALUE use_as_json_sym;
145
146
  static VALUE use_to_json_sym;
146
147
  static VALUE word_sym;
147
148
  static VALUE xmlschema_sym;
@@ -180,7 +181,8 @@ struct _Options oj_default_options = {
180
181
  UnixZTime, // time_format
181
182
  Yes, // bigdec_as_num
182
183
  AutoDec, // bigdec_load
183
- Yes, // to_json
184
+ No, // to_json
185
+ No, // as_json
184
186
  No, // nilnil
185
187
  Yes, // allow_gc
186
188
  Yes, // quirks_mode
@@ -227,6 +229,7 @@ static VALUE define_mimic_json(int argc, VALUE *argv, VALUE self);
227
229
  * - second_precision: [Fixnum|nil] number of digits after the decimal when dumping the seconds portion of time
228
230
  * - float_precision: [Fixnum|nil] number of digits of precision when dumping floats, 0 indicates use Ruby
229
231
  * - use_to_json: [true|false|nil] call to_json() methods on dump, default is false
232
+ * - use_as_json: [true|false|nil] call as_json() methods on dump, default is false
230
233
  * - nilnil: [true|false|nil] if true a nil input to load will return nil and not raise an Exception
231
234
  * - allow_gc: [true|false|nil] allow or prohibit GC during parsing, default is true (allow)
232
235
  * - quirks_mode: [true,|false|nil] Allow single JSON values instead of documents, default is true (allow)
@@ -257,6 +260,7 @@ get_def_opts(VALUE self) {
257
260
  rb_hash_aset(opts, symbol_keys_sym, (Yes == oj_default_options.sym_key) ? Qtrue : ((No == oj_default_options.sym_key) ? Qfalse : Qnil));
258
261
  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));
259
262
  rb_hash_aset(opts, use_to_json_sym, (Yes == oj_default_options.to_json) ? Qtrue : ((No == oj_default_options.to_json) ? Qfalse : Qnil));
263
+ rb_hash_aset(opts, use_as_json_sym, (Yes == oj_default_options.as_json) ? Qtrue : ((No == oj_default_options.as_json) ? Qfalse : Qnil));
260
264
  rb_hash_aset(opts, nilnil_sym, (Yes == oj_default_options.nilnil) ? Qtrue : ((No == oj_default_options.nilnil) ? Qfalse : Qnil));
261
265
  rb_hash_aset(opts, allow_gc_sym, (Yes == oj_default_options.allow_gc) ? Qtrue : ((No == oj_default_options.allow_gc) ? Qfalse : Qnil));
262
266
  rb_hash_aset(opts, quirks_mode_sym, (Yes == oj_default_options.quirks_mode) ? Qtrue : ((No == oj_default_options.quirks_mode) ? Qfalse : Qnil));
@@ -341,6 +345,7 @@ get_def_opts(VALUE self) {
341
345
  * @param [Fixnum|nil] :second_precision number of digits after the decimal when dumping the seconds portion of time
342
346
  * @param [Fixnum|nil] :float_precision number of digits of precision when dumping floats, 0 indicates use Ruby
343
347
  * @param [true|false|nil] :use_to_json call to_json() methods on dump, default is false
348
+ * @param [true|false|nil] :use_as_json call as_json() methods on dump, default is false
344
349
  * @param [true|false|nil] :nilnil if true a nil input to load will return nil and not raise an Exception
345
350
  * @param [true|false|nil] :allow_gc allow or prohibit GC during parsing, default is true (allow)
346
351
  * @param [true|false|nil] :quirks_mode allow single JSON values instead of documents, default is true (allow)
@@ -371,6 +376,7 @@ oj_parse_options(VALUE ropts, Options copts) {
371
376
  { class_cache_sym, &copts->class_cache },
372
377
  { bigdecimal_as_decimal_sym, &copts->bigdec_as_num },
373
378
  { use_to_json_sym, &copts->to_json },
379
+ { use_as_json_sym, &copts->as_json },
374
380
  { nilnil_sym, &copts->nilnil },
375
381
  { allow_gc_sym, &copts->allow_gc },
376
382
  { quirks_mode_sym, &copts->quirks_mode },
@@ -1908,6 +1914,7 @@ static struct _Options mimic_object_to_json_options = {
1908
1914
  No, // bigdec_as_num
1909
1915
  FloatDec, // bigdec_load
1910
1916
  No, // to_json
1917
+ Yes, // as_json
1911
1918
  Yes, // nilnil
1912
1919
  Yes, // allow_gc
1913
1920
  Yes, // quirks_mode
@@ -2049,13 +2056,15 @@ define_mimic_json(int argc, VALUE *argv, VALUE self) {
2049
2056
  symbolize_names_sym = ID2SYM(rb_intern("symbolize_names")); rb_gc_register_address(&symbolize_names_sym);
2050
2057
 
2051
2058
  if (rb_const_defined_at(mimic, rb_intern("JSONError"))) {
2052
- rb_funcall(mimic, rb_intern("remove_const"), 1, ID2SYM(rb_intern("JSONError")));
2059
+ json_error = rb_const_get(mimic, rb_intern("JSONError"));
2060
+ } else {
2061
+ json_error = rb_define_class_under(mimic, "JSONError", rb_eStandardError);
2053
2062
  }
2054
- json_error = rb_define_class_under(mimic, "JSONError", rb_eStandardError);
2055
2063
  if (rb_const_defined_at(mimic, rb_intern("ParserError"))) {
2056
- rb_funcall(mimic, rb_intern("remove_const"), 1, ID2SYM(rb_intern("ParserError")));
2064
+ json_parser_error_class = rb_const_get(mimic, rb_intern("ParserError"));
2065
+ } else {
2066
+ json_parser_error_class = rb_define_class_under(mimic, "ParserError", json_error);
2057
2067
  }
2058
- json_parser_error_class = rb_define_class_under(mimic, "ParserError", json_error);
2059
2068
 
2060
2069
  if (!rb_const_defined_at(mimic, rb_intern("State"))) {
2061
2070
  rb_define_class_under(mimic, "State", rb_cObject);
@@ -2262,6 +2271,7 @@ void Init_oj() {
2262
2271
  time_format_sym = ID2SYM(rb_intern("time_format")); rb_gc_register_address(&time_format_sym);
2263
2272
  unix_sym = ID2SYM(rb_intern("unix")); rb_gc_register_address(&unix_sym);
2264
2273
  unix_zone_sym = ID2SYM(rb_intern("unix_zone")); rb_gc_register_address(&unix_zone_sym);
2274
+ use_as_json_sym = ID2SYM(rb_intern("use_as_json")); rb_gc_register_address(&use_as_json_sym);
2265
2275
  use_to_json_sym = ID2SYM(rb_intern("use_to_json")); rb_gc_register_address(&use_to_json_sym);
2266
2276
  word_sym = ID2SYM(rb_intern("word")); rb_gc_register_address(&word_sym);
2267
2277
  xmlschema_sym = ID2SYM(rb_intern("xmlschema")); rb_gc_register_address(&xmlschema_sym);
@@ -154,6 +154,7 @@ typedef struct _Options {
154
154
  char bigdec_as_num; // YesNo
155
155
  char bigdec_load; // BigLoad
156
156
  char to_json; // YesNo
157
+ char as_json; // YesNo
157
158
  char nilnil; // YesNo
158
159
  char allow_gc; // allow GC during parse
159
160
  char quirks_mode; // allow single JSON values instead of documents
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Oj
3
3
  # Current version of the module.
4
- VERSION = '2.17.5'
4
+ VERSION = '2.18.0'
5
5
  end
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), '..')
5
+
6
+ require 'helper'
7
+
8
+ class MimicRedefine < Minitest::Test
9
+ def test_mimic_redefine
10
+ require 'json'
11
+ parser_error = JSON::ParserError
12
+ Oj.mimic_JSON
13
+ assert_equal(parser_error, JSON::ParserError)
14
+ end
15
+ end # MimicSingle
@@ -331,18 +331,20 @@ class CompatJuice < Minitest::Test
331
331
 
332
332
  def test_json_object_compat
333
333
  obj = Jeez.new(true, 58)
334
- Oj.default_options = { :mode => :compat, :use_to_json => true }
334
+ Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
335
335
  dump_and_load(obj, false)
336
336
  end
337
337
 
338
338
  def test_json_module_object
339
+ Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
339
340
  obj = One::Two::Three::Deep.new()
340
341
  dump_and_load(obj, false)
341
342
  end
342
343
 
343
344
  def test_json_object_create_id
345
+ Oj.default_options = { :mode => :compat, :use_as_json => false, :use_to_json => false }
344
346
  expected = Jeez.new(true, 58)
345
- json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_to_json => true)
347
+ json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_to_json => true, :use_as_json => true)
346
348
  obj = Oj.compat_load(json)
347
349
  assert_equal(expected, obj)
348
350
  end
@@ -359,6 +361,7 @@ class CompatJuice < Minitest::Test
359
361
  end
360
362
 
361
363
  def test_json_object_create_cache
364
+ Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
362
365
  expected = Jeez.new(true, 58)
363
366
  json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_to_json => true)
364
367
  obj = Oj.compat_load(json, :class_cache => true)
@@ -368,14 +371,16 @@ class CompatJuice < Minitest::Test
368
371
  end
369
372
 
370
373
  def test_json_object_create_id_other
374
+ Oj.default_options = { :mode => :compat, :use_as_json => false, :use_to_json => false }
371
375
  expected = Jeez.new(true, 58)
372
- json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_to_json => true)
376
+ json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_as_json => true)
373
377
  json.gsub!('json_class', '_class_')
374
378
  obj = Oj.compat_load(json, :create_id => "_class_")
375
379
  assert_equal(expected, obj)
376
380
  end
377
381
 
378
382
  def test_json_object_create_deep
383
+ Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
379
384
  expected = One::Two::Three::Deep.new()
380
385
  json = Oj.dump(expected, :indent => 2, :mode => :compat)
381
386
  obj = Oj.compat_load(json)
@@ -36,7 +36,7 @@ class DebJuice < Minitest::Test
36
36
  end
37
37
 
38
38
  def test_as_json_object_compat_hash_cached
39
- Oj.default_options = { :mode => :compat, :class_cache => true, :use_to_json => true }
39
+ Oj.default_options = { :mode => :compat, :class_cache => true, :use_as_json => true }
40
40
  obj = Orange.new(true, 58)
41
41
  json = Oj.dump(obj, :indent => 2)
42
42
  assert(!json.nil?)
@@ -157,7 +157,7 @@ class FileJuice < Minitest::Test
157
157
  end
158
158
 
159
159
  def test_as_json_object_compat_hash
160
- Oj.default_options = { :mode => :compat, :use_to_json => true }
160
+ Oj.default_options = { :mode => :compat, :use_as_json => true }
161
161
  obj = Orange.new(true, 58)
162
162
  json = Oj.dump(obj, :indent => 2)
163
163
  assert(!json.nil?)
@@ -126,6 +126,7 @@ class Juice < Minitest::Test
126
126
  :symbol_keys=>true,
127
127
  :bigdecimal_as_decimal=>false,
128
128
  :use_to_json=>false,
129
+ :use_as_json=>false,
129
130
  :nilnil=>true,
130
131
  :allow_gc=>false,
131
132
  :quirks_mode=>false,
@@ -759,6 +760,7 @@ class Juice < Minitest::Test
759
760
  assert_equal('null', json)
760
761
  end
761
762
  def test_to_hash_object_compat
763
+ Oj.default_options = { :use_to_json => true }
762
764
  obj = Jazz.new(true, 58)
763
765
  json = Oj.dump(obj, :mode => :compat, :indent => 2)
764
766
  h = Oj.load(json, :mode => :strict)
@@ -802,7 +804,7 @@ class Juice < Minitest::Test
802
804
  end
803
805
 
804
806
  def test_as_json_object_compat_hash
805
- Oj.default_options = { :mode => :compat, :use_to_json => true }
807
+ Oj.default_options = { :mode => :compat, :use_as_json => true }
806
808
  obj = Orange.new(true, 58)
807
809
  json = Oj.dump(obj, :indent => 2)
808
810
  assert(!json.nil?)
@@ -810,7 +812,7 @@ class Juice < Minitest::Test
810
812
  end
811
813
 
812
814
  def test_as_json_object_compat_non_hash
813
- Oj.default_options = { :mode => :compat, :use_to_json => true }
815
+ Oj.default_options = { :mode => :compat, :use_as_json => true }
814
816
  obj = Melon.new(true, 58)
815
817
  json = Oj.dump(obj, :indent => 2)
816
818
  assert_equal(%{"true 58"}, json)
@@ -942,6 +944,7 @@ class Juice < Minitest::Test
942
944
  assert_equal('null', json)
943
945
  end
944
946
  def test_range_compat
947
+ Oj.default_options = { :use_to_json => true }
945
948
  json = Oj.dump(1..7, :mode => :compat)
946
949
  h = Oj.load(json, :mode => :strict)
947
950
  assert_equal({'begin' => 1, 'end' => 7, 'exclude_end' => false}, h)
@@ -1022,6 +1025,7 @@ class Juice < Minitest::Test
1022
1025
  assert_equal(orig.to_f, bg)
1023
1026
  end
1024
1027
  def test_bigdecimal_compat_as_json
1028
+ Oj.default_options = { :use_as_json => true }
1025
1029
  orig = BigDecimal.new('80.51')
1026
1030
  BigDecimal.send(:define_method, :as_json) do
1027
1031
  %{this is big}
metadata CHANGED
@@ -1,65 +1,55 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: oj
3
- version: !ruby/object:Gem::Version
4
- version: 2.17.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.18.0
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-19 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
11
+
12
+ date: 2016-11-26 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
14
15
  name: rake-compiler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '0.9'
20
- type: :development
21
16
  prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '0.9'
27
- - !ruby/object:Gem::Dependency
28
- name: minitest
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '5'
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: "0.9"
34
22
  type: :development
23
+ version_requirements: *id001
24
+ - !ruby/object:Gem::Dependency
25
+ name: minitest
35
26
  prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '5'
41
- - !ruby/object:Gem::Dependency
42
- name: rails
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '4'
27
+ requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ~>
30
+ - !ruby/object:Gem::Version
31
+ version: "5"
48
32
  type: :development
33
+ version_requirements: *id002
34
+ - !ruby/object:Gem::Dependency
35
+ name: rails
49
36
  prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '4'
55
- description: 'The fastest JSON parser and object serializer. '
37
+ requirement: &id003 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: "4"
42
+ type: :development
43
+ version_requirements: *id003
44
+ description: "The fastest JSON parser and object serializer. "
56
45
  email: peter@ohler.com
57
46
  executables: []
58
- extensions:
47
+
48
+ extensions:
59
49
  - ext/oj/extconf.rb
60
- extra_rdoc_files:
50
+ extra_rdoc_files:
61
51
  - README.md
62
- files:
52
+ files:
63
53
  - LICENSE
64
54
  - README.md
65
55
  - ext/oj/buf.h
@@ -127,6 +117,7 @@ files:
127
117
  - test/isolated/test_mimic_rails_after.rb
128
118
  - test/isolated/test_mimic_rails_before.rb
129
119
  - test/isolated/test_mimic_rails_datetime.rb
120
+ - test/isolated/test_mimic_redefine.rb
130
121
  - test/mod.rb
131
122
  - test/perf.rb
132
123
  - test/perf_compat.rb
@@ -169,32 +160,33 @@ files:
169
160
  - test/test_writer.rb
170
161
  - test/write_timebars.rb
171
162
  homepage: http://www.ohler.com/oj
172
- licenses:
163
+ licenses:
173
164
  - MIT
174
165
  metadata: {}
166
+
175
167
  post_install_message:
176
- rdoc_options:
177
- - "--main"
168
+ rdoc_options:
169
+ - --main
178
170
  - README.md
179
- require_paths:
171
+ require_paths:
180
172
  - lib
181
- required_ruby_version: !ruby/object:Gem::Requirement
182
- requirements:
183
- - - ">="
184
- - !ruby/object:Gem::Version
185
- version: '0'
186
- required_rubygems_version: !ruby/object:Gem::Requirement
187
- requirements:
188
- - - ">="
189
- - !ruby/object:Gem::Version
190
- version: '0'
173
+ required_ruby_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - &id004
176
+ - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: "0"
179
+ required_rubygems_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - *id004
191
182
  requirements: []
183
+
192
184
  rubyforge_project: oj
193
- rubygems_version: 2.5.1
185
+ rubygems_version: 2.2.2
194
186
  signing_key:
195
187
  specification_version: 4
196
188
  summary: A fast JSON parser and serializer.
197
- test_files:
189
+ test_files:
198
190
  - test/_test_active.rb
199
191
  - test/_test_active_mimic.rb
200
192
  - test/_test_mimic_rails.rb
@@ -210,15 +202,6 @@ test_files:
210
202
  - test/foo.rb
211
203
  - test/helper.rb
212
204
  - test/io.rb
213
- - test/isolated/shared.rb
214
- - test/isolated/test_mimic_after.rb
215
- - test/isolated/test_mimic_alone.rb
216
- - test/isolated/test_mimic_as_json.rb
217
- - test/isolated/test_mimic_before.rb
218
- - test/isolated/test_mimic_define.rb
219
- - test/isolated/test_mimic_rails_after.rb
220
- - test/isolated/test_mimic_rails_before.rb
221
- - test/isolated/test_mimic_rails_datetime.rb
222
205
  - test/mod.rb
223
206
  - test/perf.rb
224
207
  - test/perf_compat.rb
@@ -231,18 +214,6 @@ test_files:
231
214
  - test/perf_strict.rb
232
215
  - test/rails.rb
233
216
  - test/russian.rb
234
- - test/sample/change.rb
235
- - test/sample/dir.rb
236
- - test/sample/doc.rb
237
- - test/sample/file.rb
238
- - test/sample/group.rb
239
- - test/sample/hasprops.rb
240
- - test/sample/layer.rb
241
- - test/sample/line.rb
242
- - test/sample/oval.rb
243
- - test/sample/rect.rb
244
- - test/sample/shape.rb
245
- - test/sample/text.rb
246
217
  - test/sample.rb
247
218
  - test/sample_json.rb
248
219
  - test/struct.rb
@@ -260,4 +231,25 @@ test_files:
260
231
  - test/test_various.rb
261
232
  - test/test_writer.rb
262
233
  - test/write_timebars.rb
263
- has_rdoc: true
234
+ - test/isolated/shared.rb
235
+ - test/isolated/test_mimic_after.rb
236
+ - test/isolated/test_mimic_alone.rb
237
+ - test/isolated/test_mimic_as_json.rb
238
+ - test/isolated/test_mimic_before.rb
239
+ - test/isolated/test_mimic_define.rb
240
+ - test/isolated/test_mimic_rails_after.rb
241
+ - test/isolated/test_mimic_rails_before.rb
242
+ - test/isolated/test_mimic_rails_datetime.rb
243
+ - test/isolated/test_mimic_redefine.rb
244
+ - test/sample/change.rb
245
+ - test/sample/dir.rb
246
+ - test/sample/doc.rb
247
+ - test/sample/file.rb
248
+ - test/sample/group.rb
249
+ - test/sample/hasprops.rb
250
+ - test/sample/layer.rb
251
+ - test/sample/line.rb
252
+ - test/sample/oval.rb
253
+ - test/sample/rect.rb
254
+ - test/sample/shape.rb
255
+ - test/sample/text.rb