oj 2.17.5 → 2.18.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.
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