oj 3.10.17 → 3.11.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/oj/mimic_json.c +4 -9
- data/ext/oj/oj.c +21 -7
- data/ext/oj/oj.h +1 -0
- data/ext/oj/parse.c +12 -3
- data/ext/oj/sparse.c +33 -8
- data/lib/oj/easy_hash.rb +5 -4
- data/lib/oj/mimic.rb +45 -1
- data/lib/oj/version.rb +1 -1
- data/pages/Modes.md +2 -1
- data/pages/Options.md +8 -0
- data/test/helper.rb +10 -0
- data/test/json_gem/json_generator_test.rb +15 -3
- data/test/json_gem/test_helper.rb +8 -0
- data/test/test_compat.rb +3 -3
- data/test/test_hash.rb +10 -0
- data/test/test_various.rb +1 -0
- metadata +82 -82
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac386a7ea62cf364370a1800bb9e96a05a66a0631681efbf5e8efda33a328a08
|
4
|
+
data.tar.gz: 8aa230bfdc9fb73c191eb826464ad47a7fdcc8018f57c7ab17227f511364a204
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7344b60e4e26f9418e32692bc961bacb0cc9e519856d8a6ebd7211ba3d2f768040bc299654581f8e09b95015b9e35099eef1e984f03229c0148f22d130374c3b
|
7
|
+
data.tar.gz: 48bbf893276a31dd93eda88a0a0d874c979d4a70e0c6b80c0ca5360be4b8bf2cc6281c27694d5fb991608164c9e7c33e2d982ba21b20b1f1a4b954567722206f
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# [![{}j](http://www.ohler.com/dev/images/oj_comet_64.svg)](http://www.ohler.com/oj) gem
|
2
2
|
|
3
|
-
[![Build Status](https://img.shields.io/travis/ohler55/oj/master.svg?logo=travis)](http://travis-ci.org/ohler55/oj?branch=master)
|
3
|
+
[![Build Status](https://img.shields.io/travis/ohler55/oj/master.svg?logo=travis)](http://travis-ci.org/ohler55/oj?branch=master) ![Gem](https://img.shields.io/gem/v/oj.svg) ![Gem](https://img.shields.io/gem/dt/oj.svg) [![SemVer compatibility](https://api.dependabot.com/badges/compatibility_score?dependency-name=oj&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=oj&package-manager=bundler&version-scheme=semver) [![TideLift](https://tidelift.com/badges/github/ohler55/oj)](https://tidelift.com/subscription/pkg/rubygems-oj?utm_source=rubygems-oj&utm_medium=referral&utm_campaign=readme)
|
4
4
|
|
5
5
|
A *fast* JSON parser and Object marshaller as a Ruby gem.
|
6
6
|
|
data/ext/oj/mimic_json.c
CHANGED
@@ -364,7 +364,6 @@ mimic_generate_core(int argc, VALUE *argv, Options copts) {
|
|
364
364
|
struct _out out;
|
365
365
|
VALUE rstr;
|
366
366
|
|
367
|
-
// TBD
|
368
367
|
memset(buf, 0, sizeof(buf));
|
369
368
|
|
370
369
|
out.buf = buf;
|
@@ -510,6 +509,7 @@ mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
|
|
510
509
|
pi.options.create_ok = No;
|
511
510
|
pi.options.allow_nan = (bang ? Yes : No);
|
512
511
|
pi.options.nilnil = No;
|
512
|
+
pi.options.bigdec_load = RubyDec;
|
513
513
|
pi.options.mode = CompatMode;
|
514
514
|
pi.max_depth = 100;
|
515
515
|
|
@@ -560,14 +560,7 @@ mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
|
|
560
560
|
}
|
561
561
|
}
|
562
562
|
if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, oj_decimal_class_sym)) {
|
563
|
-
|
564
|
-
if (rb_cFloat == v) {
|
565
|
-
pi.options.bigdec_load = FloatDec;
|
566
|
-
} else if (oj_bigdecimal_class == v) {
|
567
|
-
pi.options.bigdec_load = BigDec;
|
568
|
-
} else if (Qnil == v) {
|
569
|
-
pi.options.bigdec_load = AutoDec;
|
570
|
-
}
|
563
|
+
pi.options.compat_bigdec = (oj_bigdecimal_class == rb_hash_lookup(ropts, oj_decimal_class_sym));
|
571
564
|
}
|
572
565
|
v = rb_hash_lookup(ropts, oj_max_nesting_sym);
|
573
566
|
if (Qtrue == v) {
|
@@ -693,6 +686,7 @@ static struct _options mimic_object_to_json_options = {
|
|
693
686
|
RubyTime, // time_format
|
694
687
|
No, // bigdec_as_num
|
695
688
|
RubyDec, // bigdec_load
|
689
|
+
false, // compat_bigdec
|
696
690
|
No, // to_hash
|
697
691
|
No, // to_json
|
698
692
|
No, // as_json
|
@@ -847,6 +841,7 @@ oj_mimic_json_methods(VALUE json) {
|
|
847
841
|
}
|
848
842
|
// Pull in the JSON::State mimic file.
|
849
843
|
state_class = rb_const_get_at(generator, rb_intern("State"));
|
844
|
+
rb_gc_register_mark_object(state_class);
|
850
845
|
|
851
846
|
symbolize_names_sym = ID2SYM(rb_intern("symbolize_names")); rb_gc_register_address(&symbolize_names_sym);
|
852
847
|
}
|
data/ext/oj/oj.c
CHANGED
@@ -107,6 +107,7 @@ static VALUE bigdecimal_load_sym;
|
|
107
107
|
static VALUE bigdecimal_sym;
|
108
108
|
static VALUE circular_sym;
|
109
109
|
static VALUE class_cache_sym;
|
110
|
+
static VALUE compat_bigdecimal_sym;
|
110
111
|
static VALUE compat_sym;
|
111
112
|
static VALUE create_id_sym;
|
112
113
|
static VALUE custom_sym;
|
@@ -168,6 +169,7 @@ struct _options oj_default_options = {
|
|
168
169
|
UnixTime, // time_format
|
169
170
|
NotSet, // bigdec_as_num
|
170
171
|
AutoDec, // bigdec_load
|
172
|
+
false, // compat_bigdec
|
171
173
|
No, // to_hash
|
172
174
|
No, // to_json
|
173
175
|
No, // as_json
|
@@ -221,7 +223,7 @@ struct _options oj_default_options = {
|
|
221
223
|
*
|
222
224
|
* Returns the default load and dump options as a Hash. The options are
|
223
225
|
* - *:indent* [_Fixnum_|_String_|_nil_] number of spaces to indent each element in an JSON document, zero or nil is no newline between JSON elements, negative indicates no newline between top level JSON elements in a stream, a String indicates the string should be used for indentation
|
224
|
-
* - *:circular* [_Boolean_|_nil_] support circular references while dumping
|
226
|
+
* - *:circular* [_Boolean_|_nil_] support circular references while dumping as well as shared references
|
225
227
|
* - *:auto_define* [_Boolean_|_nil_] automatically define classes if they do not exist
|
226
228
|
* - *:symbol_keys* [_Boolean_|_nil_] use symbols instead of strings for hash keys
|
227
229
|
* - *:escape_mode* [_:newline_|_:json_|_:xss_safe_|_:ascii_|_unicode_xss_|_nil_] determines the characters to escape
|
@@ -230,6 +232,7 @@ struct _options oj_default_options = {
|
|
230
232
|
* - *:time_format* [_:unix_|_:unix_zone_|_:xmlschema_|_:ruby_] time format when dumping
|
231
233
|
* - *:bigdecimal_as_decimal* [_Boolean_|_nil_] dump BigDecimal as a decimal number or as a String
|
232
234
|
* - *:bigdecimal_load* [_:bigdecimal_|_:float_|_:auto_|_:fast_] load decimals as BigDecimal instead of as a Float. :auto pick the most precise for the number of digits. :float should be the same as ruby. :fast may require rounding but is must faster.
|
235
|
+
* - *:compat_bigdecimal* [_true_|_false_] load decimals as BigDecimal instead of as a Float when in compat or rails mode.
|
233
236
|
* - *:create_id* [_String_|_nil_] create id for json compatible object encoding, default is 'json_class'
|
234
237
|
* - *:create_additions* [_Boolean_|_nil_] if true allow creation of instances using create_id on load.
|
235
238
|
* - *:second_precision* [_Fixnum_|_nil_] number of digits after the decimal when dumping the seconds portion of time
|
@@ -334,6 +337,7 @@ get_def_opts(VALUE self) {
|
|
334
337
|
case AutoDec:
|
335
338
|
default: rb_hash_aset(opts, bigdecimal_load_sym, auto_sym); break;
|
336
339
|
}
|
340
|
+
rb_hash_aset(opts, compat_bigdecimal_sym, oj_default_options.compat_bigdec ? Qtrue : Qfalse);
|
337
341
|
rb_hash_aset(opts, create_id_sym, (NULL == oj_default_options.create_id) ? Qnil : rb_str_new2(oj_default_options.create_id));
|
338
342
|
rb_hash_aset(opts, oj_space_sym, (0 == oj_default_options.dump_opts.after_size) ? Qnil : rb_str_new2(oj_default_options.dump_opts.after_sep));
|
339
343
|
rb_hash_aset(opts, oj_space_before_sym, (0 == oj_default_options.dump_opts.before_size) ? Qnil : rb_str_new2(oj_default_options.dump_opts.before_sep));
|
@@ -379,6 +383,7 @@ get_def_opts(VALUE self) {
|
|
379
383
|
* - *:escape* [_:newline_|_:json_|_:xss_safe_|_:ascii_|_unicode_xss_|_nil_] mode encodes all high-bit characters as escaped sequences if :ascii, :json is standand UTF-8 JSON encoding, :newline is the same as :json but newlines are not escaped, :unicode_xss allows unicode but escapes &, <, and >, and any \u20xx characters along with some others, and :xss_safe escapes &, <, and >, and some others.
|
380
384
|
* - *:bigdecimal_as_decimal* [_Boolean_|_nil_] dump BigDecimal as a decimal number or as a String.
|
381
385
|
* - *:bigdecimal_load* [_:bigdecimal_|_:float_|_:auto_|_nil_] load decimals as BigDecimal instead of as a Float. :auto pick the most precise for the number of digits.
|
386
|
+
* - *:compat_bigdecimal* [_true_|_false_] load decimals as BigDecimal instead of as a Float in compat mode.
|
382
387
|
* - *:mode* [_:object_|_:strict_|_:compat_|_:null_|_:custom_|_:rails_|_:wab_] load and dump mode to use for JSON :strict raises an exception when a non-supported Object is encountered. :compat attempts to extract variable values from an Object using to_json() or to_hash() then it walks the Object's variables if neither is found. The :object mode ignores to_hash() and to_json() methods and encodes variables using code internal to the Oj gem. The :null mode ignores non-supported Objects and replaces them with a null. The :custom mode honors all dump options. The :rails more mimics rails and Active behavior.
|
383
388
|
* - *:time_format* [_:unix_|_:xmlschema_|_:ruby_] time format when dumping in :compat mode :unix decimal number denoting the number of seconds since 1/1/1970, :unix_zone decimal number denoting the number of seconds since 1/1/1970 plus the utc_offset in the exponent, :xmlschema date-time format taken from XML Schema as a String, :ruby Time.to_s formatted String.
|
384
389
|
* - *:create_id* [_String_|_nil_] create id for json compatible object encoding
|
@@ -582,19 +587,19 @@ oj_parse_options(VALUE ropts, Options copts) {
|
|
582
587
|
rb_raise(rb_eArgError, ":bigdecimal_load must be :bigdecimal, :float, or :auto.");
|
583
588
|
}
|
584
589
|
}
|
590
|
+
if (Qnil != (v = rb_hash_lookup(ropts, compat_bigdecimal_sym))) {
|
591
|
+
copts->compat_bigdec = (Qtrue == v);
|
592
|
+
}
|
585
593
|
if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, oj_decimal_class_sym)) {
|
586
594
|
v = rb_hash_lookup(ropts, oj_decimal_class_sym);
|
587
595
|
if (rb_cFloat == v) {
|
588
|
-
copts->
|
596
|
+
copts->compat_bigdec = false;
|
589
597
|
} else if (oj_bigdecimal_class == v) {
|
590
|
-
copts->
|
591
|
-
} else if (Qnil == v) {
|
592
|
-
copts->bigdec_load = AutoDec;
|
598
|
+
copts->compat_bigdec = true;
|
593
599
|
} else {
|
594
|
-
rb_raise(rb_eArgError, ":decimal_class must be BigDecimal
|
600
|
+
rb_raise(rb_eArgError, ":decimal_class must be BigDecimal or Float.");
|
595
601
|
}
|
596
602
|
}
|
597
|
-
|
598
603
|
if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, create_id_sym)) {
|
599
604
|
v = rb_hash_lookup(ropts, create_id_sym);
|
600
605
|
if (Qnil == v) {
|
@@ -1642,13 +1647,21 @@ Init_oj() {
|
|
1642
1647
|
rb_require("oj/schandler");
|
1643
1648
|
|
1644
1649
|
oj_bag_class = rb_const_get_at(Oj, rb_intern("Bag"));
|
1650
|
+
rb_gc_register_mark_object(oj_bag_class);
|
1645
1651
|
oj_bigdecimal_class = rb_const_get(rb_cObject, rb_intern("BigDecimal"));
|
1652
|
+
rb_gc_register_mark_object(oj_bigdecimal_class);
|
1646
1653
|
oj_date_class = rb_const_get(rb_cObject, rb_intern("Date"));
|
1654
|
+
rb_gc_register_mark_object(oj_date_class);
|
1647
1655
|
oj_datetime_class = rb_const_get(rb_cObject, rb_intern("DateTime"));
|
1656
|
+
rb_gc_register_mark_object(oj_datetime_class);
|
1648
1657
|
oj_enumerable_class = rb_const_get(rb_cObject, rb_intern("Enumerable"));
|
1658
|
+
rb_gc_register_mark_object(oj_enumerable_class);
|
1649
1659
|
oj_parse_error_class = rb_const_get_at(Oj, rb_intern("ParseError"));
|
1660
|
+
rb_gc_register_mark_object(oj_parse_error_class);
|
1650
1661
|
oj_stringio_class = rb_const_get(rb_cObject, rb_intern("StringIO"));
|
1662
|
+
rb_gc_register_mark_object(oj_stringio_class);
|
1651
1663
|
oj_struct_class = rb_const_get(rb_cObject, rb_intern("Struct"));
|
1664
|
+
rb_gc_register_mark_object(oj_struct_class);
|
1652
1665
|
oj_json_parser_error_class = rb_eEncodingError; // replaced if mimic is called
|
1653
1666
|
oj_json_generator_error_class = rb_eEncodingError; // replaced if mimic is called
|
1654
1667
|
|
@@ -1663,6 +1676,7 @@ Init_oj() {
|
|
1663
1676
|
bigdecimal_sym = ID2SYM(rb_intern("bigdecimal")); rb_gc_register_address(&bigdecimal_sym);
|
1664
1677
|
circular_sym = ID2SYM(rb_intern("circular")); rb_gc_register_address(&circular_sym);
|
1665
1678
|
class_cache_sym = ID2SYM(rb_intern("class_cache")); rb_gc_register_address(&class_cache_sym);
|
1679
|
+
compat_bigdecimal_sym = ID2SYM(rb_intern("compat_bigdecimal"));rb_gc_register_address(&compat_bigdecimal_sym);
|
1666
1680
|
compat_sym = ID2SYM(rb_intern("compat")); rb_gc_register_address(&compat_sym);
|
1667
1681
|
create_id_sym = ID2SYM(rb_intern("create_id")); rb_gc_register_address(&create_id_sym);
|
1668
1682
|
custom_sym = ID2SYM(rb_intern("custom")); rb_gc_register_address(&custom_sym);
|
data/ext/oj/oj.h
CHANGED
data/ext/oj/parse.c
CHANGED
@@ -385,8 +385,13 @@ read_num(ParseInfo pi) {
|
|
385
385
|
ni.nan = 0;
|
386
386
|
ni.neg = 0;
|
387
387
|
ni.has_exp = 0;
|
388
|
-
|
389
|
-
|
388
|
+
if (CompatMode == pi->options.mode) {
|
389
|
+
ni.no_big = !pi->options.compat_bigdec;
|
390
|
+
ni.bigdec_load = pi->options.compat_bigdec;
|
391
|
+
} else {
|
392
|
+
ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load || RubyDec == pi->options.bigdec_load);
|
393
|
+
ni.bigdec_load = pi->options.bigdec_load;
|
394
|
+
}
|
390
395
|
|
391
396
|
if ('-' == *pi->cur) {
|
392
397
|
pi->cur++;
|
@@ -511,7 +516,11 @@ read_num(ParseInfo pi) {
|
|
511
516
|
ni.nan = 1;
|
512
517
|
}
|
513
518
|
}
|
514
|
-
if (
|
519
|
+
if (CompatMode == pi->options.mode) {
|
520
|
+
if (pi->options.compat_bigdec) {
|
521
|
+
ni.big = 1;
|
522
|
+
}
|
523
|
+
} else if (BigDec == pi->options.bigdec_load) {
|
515
524
|
ni.big = 1;
|
516
525
|
}
|
517
526
|
if (0 == parent) {
|
data/ext/oj/sparse.c
CHANGED
@@ -400,8 +400,13 @@ read_num(ParseInfo pi) {
|
|
400
400
|
ni.nan = 0;
|
401
401
|
ni.neg = 0;
|
402
402
|
ni.has_exp = 0;
|
403
|
-
|
404
|
-
|
403
|
+
if (CompatMode == pi->options.mode) {
|
404
|
+
ni.no_big = !pi->options.compat_bigdec;
|
405
|
+
ni.bigdec_load = pi->options.compat_bigdec;
|
406
|
+
} else {
|
407
|
+
ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load || RubyDec == pi->options.bigdec_load);
|
408
|
+
ni.bigdec_load = pi->options.bigdec_load;
|
409
|
+
}
|
405
410
|
|
406
411
|
c = reader_get(&pi->rd);
|
407
412
|
if ('-' == c) {
|
@@ -518,7 +523,11 @@ read_num(ParseInfo pi) {
|
|
518
523
|
ni.nan = 1;
|
519
524
|
}
|
520
525
|
}
|
521
|
-
if (
|
526
|
+
if (CompatMode == pi->options.mode) {
|
527
|
+
if (pi->options.compat_bigdec) {
|
528
|
+
ni.big = 1;
|
529
|
+
}
|
530
|
+
} else if (BigDec == pi->options.bigdec_load) {
|
522
531
|
ni.big = 1;
|
523
532
|
}
|
524
533
|
add_num_value(pi, &ni);
|
@@ -541,15 +550,24 @@ read_nan(ParseInfo pi) {
|
|
541
550
|
ni.infinity = 0;
|
542
551
|
ni.nan = 1;
|
543
552
|
ni.neg = 0;
|
544
|
-
|
545
|
-
|
553
|
+
if (CompatMode == pi->options.mode) {
|
554
|
+
ni.no_big = !pi->options.compat_bigdec;
|
555
|
+
ni.bigdec_load = pi->options.compat_bigdec;
|
556
|
+
} else {
|
557
|
+
ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load || RubyDec == pi->options.bigdec_load);
|
558
|
+
ni.bigdec_load = pi->options.bigdec_load;
|
559
|
+
}
|
546
560
|
|
547
561
|
if ('a' != reader_get(&pi->rd) ||
|
548
562
|
('N' != (c = reader_get(&pi->rd)) && 'n' != c)) {
|
549
563
|
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
|
550
564
|
return;
|
551
565
|
}
|
552
|
-
if (
|
566
|
+
if (CompatMode == pi->options.mode) {
|
567
|
+
if (pi->options.compat_bigdec) {
|
568
|
+
ni.big = 1;
|
569
|
+
}
|
570
|
+
} else if (BigDec == pi->options.bigdec_load) {
|
553
571
|
ni.big = 1;
|
554
572
|
}
|
555
573
|
add_num_value(pi, &ni);
|
@@ -739,8 +757,15 @@ oj_sparse2(ParseInfo pi) {
|
|
739
757
|
ni.infinity = 0;
|
740
758
|
ni.nan = 1;
|
741
759
|
ni.neg = 0;
|
742
|
-
|
743
|
-
|
760
|
+
if (CompatMode == pi->options.mode) {
|
761
|
+
ni.no_big = !pi->options.compat_bigdec;
|
762
|
+
ni.bigdec_load = pi->options.compat_bigdec;
|
763
|
+
} else {
|
764
|
+
ni.no_big = (FloatDec == pi->options.bigdec_load ||
|
765
|
+
FastDec == pi->options.bigdec_load ||
|
766
|
+
RubyDec == pi->options.bigdec_load);
|
767
|
+
ni.bigdec_load = pi->options.bigdec_load;
|
768
|
+
}
|
744
769
|
add_num_value(pi, &ni);
|
745
770
|
} else {
|
746
771
|
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "invalid token");
|
data/lib/oj/easy_hash.rb
CHANGED
@@ -12,13 +12,14 @@ module Oj
|
|
12
12
|
|
13
13
|
# Replaces the Object.respond_to?() method.
|
14
14
|
# @param [Symbol] m method symbol
|
15
|
+
# @param [Boolean] include_all whether to include private and protected methods in the search
|
15
16
|
# @return [Boolean] true for any method that matches an instance
|
16
17
|
# variable reader, otherwise false.
|
17
|
-
def respond_to?(m)
|
18
|
+
def respond_to?(m, include_all = false)
|
18
19
|
return true if super
|
19
|
-
return true if has_key?(
|
20
|
-
return true if has_key?(
|
21
|
-
has_key?(
|
20
|
+
return true if has_key?(m)
|
21
|
+
return true if has_key?(m.to_s)
|
22
|
+
has_key?(m.to_sym)
|
22
23
|
end
|
23
24
|
|
24
25
|
def [](key)
|
data/lib/oj/mimic.rb
CHANGED
@@ -8,6 +8,50 @@ end
|
|
8
8
|
|
9
9
|
module Oj
|
10
10
|
|
11
|
+
##
|
12
|
+
# Custom mode can be used to emulate the compat mode with some minor
|
13
|
+
# differences. These are the options that setup the custom mode to be like
|
14
|
+
# the compat mode.
|
15
|
+
CUSTOM_MIMIC_JSON_OPTIONS = {
|
16
|
+
allow_gc: true,
|
17
|
+
allow_invalid_unicode: false,
|
18
|
+
allow_nan: false,
|
19
|
+
array_class: nil,
|
20
|
+
array_nl: nil,
|
21
|
+
auto_define: false,
|
22
|
+
bigdecimal_as_decimal: false,
|
23
|
+
bigdecimal_load: :auto,
|
24
|
+
circular: false,
|
25
|
+
class_cache: false,
|
26
|
+
create_additions: false,
|
27
|
+
create_id: "json_class",
|
28
|
+
empty_string: false,
|
29
|
+
escape_mode: :unicode_xss,
|
30
|
+
float_precision: 0,
|
31
|
+
hash_class: nil,
|
32
|
+
ignore: nil,
|
33
|
+
ignore_under: false,
|
34
|
+
indent: 0,
|
35
|
+
integer_range: nil,
|
36
|
+
mode: :custom,
|
37
|
+
nan: :raise,
|
38
|
+
nilnil: false,
|
39
|
+
object_nl: nil,
|
40
|
+
omit_nil: false,
|
41
|
+
quirks_mode: true,
|
42
|
+
safe: false,
|
43
|
+
second_precision: 3,
|
44
|
+
space: nil,
|
45
|
+
space_before: nil,
|
46
|
+
symbol_keys: false,
|
47
|
+
time_format: :ruby,
|
48
|
+
trace: false,
|
49
|
+
use_as_json: false,
|
50
|
+
use_raw_json: false,
|
51
|
+
use_to_hash: false,
|
52
|
+
use_to_json: true,
|
53
|
+
}
|
54
|
+
|
11
55
|
# A bit hack-ish but does the trick. The JSON.dump_default_options is a Hash
|
12
56
|
# but in mimic we use a C struct to store defaults. This class creates a view
|
13
57
|
# onto that struct.
|
@@ -38,7 +82,7 @@ module Oj
|
|
38
82
|
|
39
83
|
jfile = File.join(d, 'json.rb')
|
40
84
|
$LOADED_FEATURES << jfile unless $LOADED_FEATURES.include?(jfile) if File.exist?(jfile)
|
41
|
-
|
85
|
+
|
42
86
|
Dir.glob(File.join(d, 'json', '**', '*.rb')).each do |file|
|
43
87
|
# allow json/add/xxx to be loaded. User can override with Oj.add_to_json(xxx).
|
44
88
|
$LOADED_FEATURES << file unless $LOADED_FEATURES.include?(file) unless file.include?('add')
|
data/lib/oj/version.rb
CHANGED
data/pages/Modes.md
CHANGED
@@ -94,8 +94,9 @@ information.
|
|
94
94
|
| :array_nl | String | | | | | | x | |
|
95
95
|
| :ascii_only | Boolean | x | x | 2 | 2 | x | x | |
|
96
96
|
| :auto_define | Boolean | | | | | x | x | |
|
97
|
-
| :bigdecimal_as_decimal | Boolean | | |
|
97
|
+
| :bigdecimal_as_decimal | Boolean | | | | 3 | x | x | |
|
98
98
|
| :bigdecimal_load | Boolean | | | | | | x | |
|
99
|
+
| :compat_bigdecimal | Boolean | | | x | | | x | |
|
99
100
|
| :circular | Boolean | x | x | x | x | x | x | |
|
100
101
|
| :class_cache | Boolean | | | | | x | x | |
|
101
102
|
| :create_additions | Boolean | | | x | x | | x | |
|
data/pages/Options.md
CHANGED
@@ -70,6 +70,14 @@ This can also be set with `:decimal_class` when used as a load or
|
|
70
70
|
parse option to match the JSON gem. In that case either `Float`,
|
71
71
|
`BigDecimal`, or `nil` can be provided.
|
72
72
|
|
73
|
+
### :compat_bigdecimal [Boolean]
|
74
|
+
|
75
|
+
Determines how to load decimals when in `:compat` mode.
|
76
|
+
|
77
|
+
- `true` convert all decimal numbers to BigDecimal.
|
78
|
+
|
79
|
+
- `false` convert all decimal numbers to Float.
|
80
|
+
|
73
81
|
### :circular [Boolean]
|
74
82
|
|
75
83
|
Detect circular references while dumping. In :compat mode raise a
|
data/test/helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
1
3
|
# Ubuntu does not accept arguments to ruby when called using env. To get warnings to show up the -w options is
|
2
4
|
# required. That can be set in the RUBYOPT environment variable.
|
3
5
|
# export RUBYOPT=-w
|
@@ -16,6 +18,14 @@ require 'bigdecimal'
|
|
16
18
|
require 'pp'
|
17
19
|
require 'oj'
|
18
20
|
|
21
|
+
|
22
|
+
if defined?(GC.verify_compaction_references) == 'method'
|
23
|
+
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
|
24
|
+
# move objects around, helping to find object movement bugs.
|
25
|
+
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
26
|
+
end
|
27
|
+
|
28
|
+
|
19
29
|
$ruby = RUBY_DESCRIPTION.split(' ')[0]
|
20
30
|
$ruby = 'ree' if 'ruby' == $ruby && RUBY_DESCRIPTION.include?('Ruby Enterprise Edition')
|
21
31
|
|
@@ -136,6 +136,10 @@ EOT
|
|
136
136
|
|
137
137
|
def test_pretty_state
|
138
138
|
state = JSON::PRETTY_STATE_PROTOTYPE.dup
|
139
|
+
# In come cases in Ruby 3.0 an :escape_slash is included in the state. It
|
140
|
+
# seems to occur on travis but not locally.
|
141
|
+
actual = state.to_h
|
142
|
+
actual.delete(:escape_slash)
|
139
143
|
assert_equal({
|
140
144
|
:allow_nan => false,
|
141
145
|
:array_nl => "\n",
|
@@ -147,11 +151,15 @@ EOT
|
|
147
151
|
:object_nl => "\n",
|
148
152
|
:space => " ",
|
149
153
|
:space_before => "",
|
150
|
-
}.sort_by { |n,| n.to_s },
|
154
|
+
}.sort_by { |n,| n.to_s }, actual.sort_by { |n,| n.to_s })
|
151
155
|
end
|
152
156
|
|
153
157
|
def test_safe_state
|
154
158
|
state = JSON::SAFE_STATE_PROTOTYPE.dup
|
159
|
+
# In come cases in Ruby 3.0 an :escape_slash is included in the state. It
|
160
|
+
# seems to occur on travis but not locally.
|
161
|
+
actual = state.to_h
|
162
|
+
actual.delete(:escape_slash)
|
155
163
|
assert_equal({
|
156
164
|
:allow_nan => false,
|
157
165
|
:array_nl => "",
|
@@ -163,11 +171,15 @@ EOT
|
|
163
171
|
:object_nl => "",
|
164
172
|
:space => "",
|
165
173
|
:space_before => "",
|
166
|
-
}.sort_by { |n,| n.to_s },
|
174
|
+
}.sort_by { |n,| n.to_s }, actual.sort_by { |n,| n.to_s })
|
167
175
|
end
|
168
176
|
|
169
177
|
def test_fast_state
|
170
178
|
state = JSON::FAST_STATE_PROTOTYPE.dup
|
179
|
+
# In come cases in Ruby 3.0 an :escape_slash is included in the state. It
|
180
|
+
# seems to occur on travis but not locally.
|
181
|
+
actual = state.to_h
|
182
|
+
actual.delete(:escape_slash)
|
171
183
|
assert_equal({
|
172
184
|
:allow_nan => false,
|
173
185
|
:array_nl => "",
|
@@ -179,7 +191,7 @@ EOT
|
|
179
191
|
:object_nl => "",
|
180
192
|
:space => "",
|
181
193
|
:space_before => "",
|
182
|
-
}.sort_by { |n,| n.to_s },
|
194
|
+
}.sort_by { |n,| n.to_s }, actual.sort_by { |n,| n.to_s })
|
183
195
|
end
|
184
196
|
|
185
197
|
def test_allow_nan
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
$: << File.dirname(__FILE__)
|
2
4
|
$oj_dir = File.dirname(File.dirname(File.expand_path(File.dirname(__FILE__))))
|
3
5
|
%w(lib ext).each do |dir|
|
@@ -12,6 +14,12 @@ if ENV['REAL_JSON_GEM']
|
|
12
14
|
else
|
13
15
|
require 'oj'
|
14
16
|
Oj.mimic_JSON
|
17
|
+
|
18
|
+
if defined?(GC.verify_compaction_references) == 'method'
|
19
|
+
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
|
20
|
+
# move objects around, helping to find object movement bugs.
|
21
|
+
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
22
|
+
end
|
15
23
|
end
|
16
24
|
|
17
25
|
NaN = JSON::NaN if defined?(JSON::NaN)
|
data/test/test_compat.rb
CHANGED
@@ -178,7 +178,7 @@ class CompatJuice < Minitest::Test
|
|
178
178
|
assert_equal('"abc"', json)
|
179
179
|
end
|
180
180
|
|
181
|
-
def
|
181
|
+
def test_time_xml_schema
|
182
182
|
t = Time.xmlschema("2012-01-05T23:58:07.123456000+09:00")
|
183
183
|
#t = Time.local(2012, 1, 5, 23, 58, 7, 123456)
|
184
184
|
json = Oj.dump(t, :mode => :compat)
|
@@ -283,7 +283,7 @@ class CompatJuice < Minitest::Test
|
|
283
283
|
assert_equal('"0.314159265358979323846e1"', json.downcase)
|
284
284
|
end
|
285
285
|
|
286
|
-
def
|
286
|
+
def test_decimal_class
|
287
287
|
big = BigDecimal('3.14159265358979323846')
|
288
288
|
# :decimal_class is the undocumented feature.
|
289
289
|
json = Oj.load('3.14159265358979323846', mode: :compat, decimal_class: BigDecimal)
|
@@ -297,7 +297,7 @@ class CompatJuice < Minitest::Test
|
|
297
297
|
end
|
298
298
|
|
299
299
|
# Time
|
300
|
-
def
|
300
|
+
def test_time_from_time_object
|
301
301
|
t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
|
302
302
|
expect = '"' + t.to_s + '"'
|
303
303
|
json = Oj.dump(t)
|
data/test/test_hash.rb
CHANGED
@@ -25,5 +25,15 @@ class Hashi < Minitest::Test
|
|
25
25
|
assert_equal(3, obj[:abc])
|
26
26
|
assert_equal(3, obj.abc())
|
27
27
|
end
|
28
|
+
|
29
|
+
def test_marshal
|
30
|
+
h = Oj::EasyHash.new()
|
31
|
+
h['abc'] = 3
|
32
|
+
out = Marshal.dump(h)
|
33
|
+
|
34
|
+
obj = Marshal.load(out)
|
35
|
+
assert_equal(Oj::EasyHash, obj.class)
|
36
|
+
assert_equal(3, obj[:abc])
|
37
|
+
end
|
28
38
|
|
29
39
|
end # HashTest
|
data/test/test_various.rb
CHANGED
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: 3.
|
4
|
+
version: 3.11.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:
|
11
|
+
date: 2021-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -79,16 +79,16 @@ extensions:
|
|
79
79
|
- ext/oj/extconf.rb
|
80
80
|
extra_rdoc_files:
|
81
81
|
- README.md
|
82
|
-
- pages/Rails.md
|
83
|
-
- pages/JsonGem.md
|
84
|
-
- pages/Encoding.md
|
85
|
-
- pages/WAB.md
|
86
|
-
- pages/Custom.md
|
87
82
|
- pages/Advanced.md
|
88
|
-
- pages/Options.md
|
89
83
|
- pages/Compatibility.md
|
84
|
+
- pages/Custom.md
|
85
|
+
- pages/Encoding.md
|
86
|
+
- pages/JsonGem.md
|
90
87
|
- pages/Modes.md
|
88
|
+
- pages/Options.md
|
89
|
+
- pages/Rails.md
|
91
90
|
- pages/Security.md
|
91
|
+
- pages/WAB.md
|
92
92
|
files:
|
93
93
|
- LICENSE
|
94
94
|
- README.md
|
@@ -284,98 +284,98 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
284
284
|
- !ruby/object:Gem::Version
|
285
285
|
version: '0'
|
286
286
|
requirements: []
|
287
|
-
rubygems_version: 3.
|
287
|
+
rubygems_version: 3.2.3
|
288
288
|
signing_key:
|
289
289
|
specification_version: 4
|
290
290
|
summary: A fast JSON parser and serializer.
|
291
291
|
test_files:
|
292
|
+
- test/_test_active.rb
|
293
|
+
- test/_test_active_mimic.rb
|
294
|
+
- test/_test_mimic_rails.rb
|
295
|
+
- test/activerecord/result_test.rb
|
296
|
+
- test/activesupport4/decoding_test.rb
|
297
|
+
- test/activesupport4/encoding_test.rb
|
298
|
+
- test/activesupport4/test_helper.rb
|
299
|
+
- test/activesupport5/abstract_unit.rb
|
300
|
+
- test/activesupport5/decoding_test.rb
|
301
|
+
- test/activesupport5/encoding_test.rb
|
302
|
+
- test/activesupport5/encoding_test_cases.rb
|
303
|
+
- test/activesupport5/test_helper.rb
|
304
|
+
- test/activesupport5/time_zone_test_helpers.rb
|
305
|
+
- test/activesupport6/abstract_unit.rb
|
306
|
+
- test/activesupport6/decoding_test.rb
|
307
|
+
- test/activesupport6/encoding_test.rb
|
308
|
+
- test/activesupport6/encoding_test_cases.rb
|
309
|
+
- test/activesupport6/test_common.rb
|
310
|
+
- test/activesupport6/test_helper.rb
|
311
|
+
- test/activesupport6/time_zone_test_helpers.rb
|
312
|
+
- test/bar.rb
|
313
|
+
- test/baz.rb
|
314
|
+
- test/files.rb
|
292
315
|
- test/foo.rb
|
293
|
-
- test/prec.rb
|
294
|
-
- test/test_integer_range.rb
|
295
|
-
- test/test_strict.rb
|
296
|
-
- test/perf_strict.rb
|
297
|
-
- test/tests.rb
|
298
|
-
- test/perf_saj.rb
|
299
|
-
- test/test_compat.rb
|
300
316
|
- test/helper.rb
|
301
|
-
- test/
|
302
|
-
- test/
|
303
|
-
- test/
|
304
|
-
- test/
|
317
|
+
- test/isolated/shared.rb
|
318
|
+
- test/isolated/test_mimic_after.rb
|
319
|
+
- test/isolated/test_mimic_alone.rb
|
320
|
+
- test/isolated/test_mimic_as_json.rb
|
321
|
+
- test/isolated/test_mimic_before.rb
|
322
|
+
- test/isolated/test_mimic_define.rb
|
323
|
+
- test/isolated/test_mimic_rails_after.rb
|
324
|
+
- test/isolated/test_mimic_rails_before.rb
|
325
|
+
- test/isolated/test_mimic_redefine.rb
|
305
326
|
- test/json_gem/json_addition_test.rb
|
306
|
-
- test/json_gem/
|
327
|
+
- test/json_gem/json_common_interface_test.rb
|
328
|
+
- test/json_gem/json_encoding_test.rb
|
307
329
|
- test/json_gem/json_ext_parser_test.rb
|
308
|
-
- test/json_gem/
|
309
|
-
- test/json_gem/json_generic_object_test.rb
|
330
|
+
- test/json_gem/json_fixtures_test.rb
|
310
331
|
- test/json_gem/json_generator_test.rb
|
311
|
-
- test/json_gem/
|
312
|
-
- test/json_gem/json_encoding_test.rb
|
332
|
+
- test/json_gem/json_generic_object_test.rb
|
313
333
|
- test/json_gem/json_parser_test.rb
|
314
|
-
- test/
|
315
|
-
- test/
|
316
|
-
- test/
|
317
|
-
- test/
|
334
|
+
- test/json_gem/json_string_matching_test.rb
|
335
|
+
- test/json_gem/test_helper.rb
|
336
|
+
- test/perf.rb
|
337
|
+
- test/perf_compat.rb
|
338
|
+
- test/perf_fast.rb
|
339
|
+
- test/perf_file.rb
|
318
340
|
- test/perf_object.rb
|
319
|
-
- test/
|
320
|
-
- test/test_custom.rb
|
321
|
-
- test/bar.rb
|
322
|
-
- test/activesupport4/encoding_test.rb
|
323
|
-
- test/activesupport4/test_helper.rb
|
324
|
-
- test/activesupport4/decoding_test.rb
|
325
|
-
- test/sample_json.rb
|
326
|
-
- test/activesupport5/encoding_test_cases.rb
|
327
|
-
- test/activesupport5/encoding_test.rb
|
328
|
-
- test/activesupport5/abstract_unit.rb
|
329
|
-
- test/activesupport5/time_zone_test_helpers.rb
|
330
|
-
- test/activesupport5/test_helper.rb
|
331
|
-
- test/activesupport5/decoding_test.rb
|
332
|
-
- test/test_saj.rb
|
341
|
+
- test/perf_saj.rb
|
333
342
|
- test/perf_scp.rb
|
334
|
-
- test/
|
335
|
-
- test/
|
336
|
-
- test/
|
337
|
-
- test/
|
338
|
-
- test/test_fast.rb
|
339
|
-
- test/perf_fast.rb
|
343
|
+
- test/perf_simple.rb
|
344
|
+
- test/perf_strict.rb
|
345
|
+
- test/perf_wab.rb
|
346
|
+
- test/prec.rb
|
340
347
|
- test/sample/change.rb
|
341
|
-
- test/sample/
|
348
|
+
- test/sample/dir.rb
|
342
349
|
- test/sample/doc.rb
|
343
|
-
- test/sample/shape.rb
|
344
|
-
- test/sample/layer.rb
|
345
|
-
- test/sample/group.rb
|
346
350
|
- test/sample/file.rb
|
347
|
-
- test/sample/
|
351
|
+
- test/sample/group.rb
|
348
352
|
- test/sample/hasprops.rb
|
353
|
+
- test/sample/layer.rb
|
349
354
|
- test/sample/line.rb
|
350
|
-
- test/sample/dir.rb
|
351
355
|
- test/sample/oval.rb
|
352
|
-
- test/
|
353
|
-
- test/
|
354
|
-
- test/
|
355
|
-
- test/
|
356
|
-
- test/
|
357
|
-
- test/
|
358
|
-
- test/
|
359
|
-
- test/test_writer.rb
|
360
|
-
- test/test_rails.rb
|
361
|
-
- test/perf.rb
|
362
|
-
- test/isolated/test_mimic_define.rb
|
363
|
-
- test/isolated/test_mimic_after.rb
|
364
|
-
- test/isolated/test_mimic_rails_after.rb
|
365
|
-
- test/isolated/test_mimic_before.rb
|
366
|
-
- test/isolated/test_mimic_rails_before.rb
|
367
|
-
- test/isolated/test_mimic_redefine.rb
|
368
|
-
- test/isolated/shared.rb
|
369
|
-
- test/isolated/test_mimic_alone.rb
|
370
|
-
- test/isolated/test_mimic_as_json.rb
|
356
|
+
- test/sample/rect.rb
|
357
|
+
- test/sample/shape.rb
|
358
|
+
- test/sample/text.rb
|
359
|
+
- test/sample.rb
|
360
|
+
- test/sample_json.rb
|
361
|
+
- test/test_compat.rb
|
362
|
+
- test/test_custom.rb
|
371
363
|
- test/test_debian.rb
|
364
|
+
- test/test_fast.rb
|
365
|
+
- test/test_file.rb
|
372
366
|
- test/test_gc.rb
|
373
|
-
- test/
|
367
|
+
- test/test_hash.rb
|
368
|
+
- test/test_integer_range.rb
|
369
|
+
- test/test_null.rb
|
370
|
+
- test/test_object.rb
|
371
|
+
- test/test_rails.rb
|
372
|
+
- test/test_saj.rb
|
373
|
+
- test/test_scp.rb
|
374
|
+
- test/test_strict.rb
|
374
375
|
- test/test_various.rb
|
375
|
-
- test/
|
376
|
-
- test/
|
377
|
-
- test/
|
378
|
-
- test/
|
379
|
-
- test/
|
380
|
-
- test/
|
381
|
-
- test/activesupport6/decoding_test.rb
|
376
|
+
- test/test_wab.rb
|
377
|
+
- test/test_writer.rb
|
378
|
+
- test/tests.rb
|
379
|
+
- test/tests_mimic.rb
|
380
|
+
- test/tests_mimic_addition.rb
|
381
|
+
- test/zoo.rb
|