oj 3.10.1 → 3.10.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/oj/dump.c +1 -1
- data/ext/oj/dump_object.c +1 -1
- data/ext/oj/object.c +2 -1
- data/ext/oj/oj.c +5 -5
- data/ext/oj/parse.c +49 -14
- data/ext/oj/rails.c +0 -1
- data/ext/oj/sparse.c +14 -5
- data/lib/oj/version.rb +1 -1
- data/pages/Options.md +11 -11
- data/pages/Rails.md +39 -0
- data/test/bar.rb +21 -8
- data/test/json_gem/json_common_interface_test.rb +2 -2
- data/test/prec.rb +23 -0
- data/test/test_custom.rb +5 -0
- data/test/test_object.rb +8 -0
- data/test/test_various.rb +1 -2
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21e870cbb9a2f1c2b99efd6522ce9c284828865b922e299232e60abd4e916f7e
|
4
|
+
data.tar.gz: d1d93c3d58b7ed858e1a4ea89698861485bbeeb19b01bc66e3e8890ab7d93583
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c5d6b2d7a7830b80ecc23436e50b0f42f53e82febe31ceb0168f440e5368ed323c19433894724beea83e7587013170b6a38be92b65b073d9881f8176a8d283b
|
7
|
+
data.tar.gz: 1558090a4a1b066418b9f36064c845ab99e423246f26af8aff682e8f09b8cfce29531f6e677c6e4d8b16056406251b2fe54b463e4ddef121adced8c9d3c167b2
|
data/ext/oj/dump.c
CHANGED
@@ -111,7 +111,7 @@ static char rails_friendly_chars[256] = "\
|
|
111
111
|
11111111111111111111111111111111\
|
112
112
|
11111111111111111111111111111111\
|
113
113
|
11111111111111111111111111111111\
|
114
|
-
|
114
|
+
11111111111111111111111111111111";
|
115
115
|
|
116
116
|
static void
|
117
117
|
raise_strict(VALUE obj) {
|
data/ext/oj/dump_object.c
CHANGED
@@ -618,7 +618,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
618
618
|
vid = rb_to_id(*np);
|
619
619
|
attr = rb_id2name(vid);
|
620
620
|
if (Yes == out->opts->ignore_under && '@' == *attr && '_' == attr[1]) {
|
621
|
-
|
621
|
+
continue;
|
622
622
|
}
|
623
623
|
value = rb_ivar_get(obj, vid);
|
624
624
|
|
data/ext/oj/object.c
CHANGED
@@ -669,7 +669,8 @@ static void
|
|
669
669
|
array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
670
670
|
volatile VALUE rval = Qnil;
|
671
671
|
|
672
|
-
|
672
|
+
// orig lets us know whether the string was ^r1 or \u005er1
|
673
|
+
if (3 <= len && 0 != pi->circ_array && '^' == orig[0] && 0 == rb_array_len(stack_peek(&pi->stack)->val)) {
|
673
674
|
if ('i' == str[1]) {
|
674
675
|
long i = read_long(str + 2, len - 2);
|
675
676
|
|
data/ext/oj/oj.c
CHANGED
@@ -803,7 +803,7 @@ oj_parse_opt_match_string(RxClass rc, VALUE ropts) {
|
|
803
803
|
}
|
804
804
|
|
805
805
|
/* Document-method: load
|
806
|
-
* call-seq: load(json, options) { _|_obj, start, len_|_ }
|
806
|
+
* call-seq: load(json, options={}) { _|_obj, start, len_|_ }
|
807
807
|
*
|
808
808
|
* Parses a JSON document String into a Object, Hash, Array, String, Fixnum,
|
809
809
|
* Float, true, false, or nil according to the default mode or the mode
|
@@ -887,7 +887,7 @@ load(int argc, VALUE *argv, VALUE self) {
|
|
887
887
|
}
|
888
888
|
|
889
889
|
/* Document-method: load_file
|
890
|
-
* call-seq: load_file(path, options) { _|_obj, start, len_|_ }
|
890
|
+
* call-seq: load_file(path, options={}) { _|_obj, start, len_|_ }
|
891
891
|
*
|
892
892
|
* Parses a JSON document String into a Object, Hash, Array, String, Fixnum,
|
893
893
|
* Float, true, false, or nil according to the default mode or the mode
|
@@ -1045,7 +1045,7 @@ safe_load(VALUE self, VALUE doc) {
|
|
1045
1045
|
*/
|
1046
1046
|
|
1047
1047
|
/* Document-method: dump
|
1048
|
-
* call-seq: dump(obj, options)
|
1048
|
+
* call-seq: dump(obj, options={})
|
1049
1049
|
*
|
1050
1050
|
* Dumps an Object (obj) to a string.
|
1051
1051
|
* - *obj* [_Object_] Object to serialize as an JSON document String
|
@@ -1143,7 +1143,7 @@ to_json(int argc, VALUE *argv, VALUE self) {
|
|
1143
1143
|
}
|
1144
1144
|
|
1145
1145
|
/* Document-method: to_file
|
1146
|
-
* call-seq: to_file(file_path, obj, options)
|
1146
|
+
* call-seq: to_file(file_path, obj, options={})
|
1147
1147
|
*
|
1148
1148
|
* Dumps an Object to the specified file.
|
1149
1149
|
* - *file* [_String_] _path file path to write the JSON document to
|
@@ -1166,7 +1166,7 @@ to_file(int argc, VALUE *argv, VALUE self) {
|
|
1166
1166
|
}
|
1167
1167
|
|
1168
1168
|
/* Document-method: to_stream
|
1169
|
-
* call-seq: to_stream(io, obj, options)
|
1169
|
+
* call-seq: to_stream(io, obj, options={})
|
1170
1170
|
*
|
1171
1171
|
* Dumps an Object to the specified IO stream.
|
1172
1172
|
* - *io* [_IO_] IO stream to write the JSON document to
|
data/ext/oj/parse.c
CHANGED
@@ -453,6 +453,7 @@ read_num(ParseInfo pi) {
|
|
453
453
|
// except when mimicing the JSON gem or in strict mode.
|
454
454
|
if (StrictMode == pi->options.mode || CompatMode == pi->options.mode) {
|
455
455
|
int pos = (int)(pi->cur - ni.str);
|
456
|
+
|
456
457
|
if (1 == pos || (2 == pos && ni.neg)) {
|
457
458
|
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number");
|
458
459
|
return;
|
@@ -468,11 +469,19 @@ read_num(ParseInfo pi) {
|
|
468
469
|
if (0 < ni.num || 0 < ni.i) {
|
469
470
|
dec_cnt++;
|
470
471
|
}
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
472
|
+
if (INT64_MAX <= ni.div) {
|
473
|
+
if (!ni.no_big) {
|
474
|
+
ni.big = true;
|
475
|
+
}
|
476
|
+
} else {
|
477
|
+
ni.num = ni.num * 10 + d;
|
478
|
+
ni.div *= 10;
|
479
|
+
ni.di++;
|
480
|
+
if (INT64_MAX <= ni.div || DEC_MAX < dec_cnt) {
|
481
|
+
if (!ni.no_big) {
|
482
|
+
ni.big = true;
|
483
|
+
}
|
484
|
+
}
|
476
485
|
}
|
477
486
|
}
|
478
487
|
}
|
@@ -490,7 +499,7 @@ read_num(ParseInfo pi) {
|
|
490
499
|
for (; '0' <= *pi->cur && *pi->cur <= '9'; pi->cur++) {
|
491
500
|
ni.exp = ni.exp * 10 + (*pi->cur - '0');
|
492
501
|
if (EXP_MAX <= ni.exp) {
|
493
|
-
ni.big =
|
502
|
+
ni.big = true;
|
494
503
|
}
|
495
504
|
}
|
496
505
|
if (eneg) {
|
@@ -795,13 +804,13 @@ oj_num_as_value(NumInfo ni) {
|
|
795
804
|
}
|
796
805
|
} else {
|
797
806
|
// All these machinations are to get rounding to work better.
|
798
|
-
long double
|
807
|
+
long double ld = (long double)ni->i * (long double)ni->div + (long double)ni->num;
|
799
808
|
int x = (int)((int64_t)ni->exp - ni->di);
|
800
809
|
|
801
810
|
// Rounding sometimes cuts off the last digit even if there are only
|
802
811
|
// 15 digits. This attempts to fix those few cases where this
|
803
812
|
// occurs.
|
804
|
-
if ((long double)INT64_MAX >
|
813
|
+
if ((long double)INT64_MAX > ld && (int64_t)ld != (ni->i * ni->div + ni->num)) {
|
805
814
|
volatile VALUE bd = rb_str_new(ni->str, ni->len);
|
806
815
|
|
807
816
|
rnum = rb_rescue2(parse_big_decimal, bd, rescue_big_decimal, bd, rb_eException, 0);
|
@@ -809,16 +818,36 @@ oj_num_as_value(NumInfo ni) {
|
|
809
818
|
rnum = rb_funcall(rnum, rb_intern("to_f"), 0);
|
810
819
|
}
|
811
820
|
} else {
|
812
|
-
d
|
821
|
+
double d;
|
822
|
+
double d2;
|
823
|
+
|
824
|
+
ld = roundl(ld);
|
825
|
+
// You would expect that staying with a long double would be
|
826
|
+
// more accurate but it fails to match what Ruby generates so
|
827
|
+
// drop down to a double.
|
813
828
|
if (0 < x) {
|
814
|
-
d
|
829
|
+
d = (double)(ld * powl(10.0, x));
|
830
|
+
d2 = (double)ld * pow(10.0, x);
|
815
831
|
} else if (0 > x) {
|
816
|
-
d
|
832
|
+
d = (double)(ld / powl(10.0, -x));
|
833
|
+
d2 = (double)ld / pow(10.0, -x);
|
834
|
+
} else {
|
835
|
+
d = (double)ld;
|
836
|
+
d2 = d;
|
817
837
|
}
|
818
|
-
if (
|
819
|
-
|
838
|
+
if (d != d2) {
|
839
|
+
volatile VALUE bd = rb_str_new(ni->str, ni->len);
|
840
|
+
|
841
|
+
rnum = rb_rescue2(parse_big_decimal, bd, rescue_big_decimal, bd, rb_eException, 0);
|
842
|
+
if (ni->no_big) {
|
843
|
+
rnum = rb_funcall(rnum, rb_intern("to_f"), 0);
|
844
|
+
}
|
845
|
+
} else {
|
846
|
+
if (ni->neg) {
|
847
|
+
d = -d;
|
848
|
+
}
|
849
|
+
rnum = rb_float_new(d);
|
820
850
|
}
|
821
|
-
rnum = rb_float_new((double)d);
|
822
851
|
}
|
823
852
|
}
|
824
853
|
}
|
@@ -841,6 +870,12 @@ oj_set_error_at(ParseInfo pi, VALUE err_clas, const char* file, int line, const
|
|
841
870
|
if (p + 3 < end) {
|
842
871
|
*p++ = ' ';
|
843
872
|
*p++ = '(';
|
873
|
+
*p++ = 'a';
|
874
|
+
*p++ = 'f';
|
875
|
+
*p++ = 't';
|
876
|
+
*p++ = 'e';
|
877
|
+
*p++ = 'r';
|
878
|
+
*p++ = ' ';
|
844
879
|
start = p;
|
845
880
|
for (vp = pi->stack.head; vp < pi->stack.tail; vp++) {
|
846
881
|
if (end <= p + 1 + vp->klen) {
|
data/ext/oj/rails.c
CHANGED
data/ext/oj/sparse.c
CHANGED
@@ -409,6 +409,7 @@ read_num(ParseInfo pi) {
|
|
409
409
|
ni.neg = 0;
|
410
410
|
ni.hasExp = 0;
|
411
411
|
ni.no_big = (FloatDec == pi->options.bigdec_load);
|
412
|
+
|
412
413
|
c = reader_get(&pi->rd);
|
413
414
|
if ('-' == c) {
|
414
415
|
c = reader_get(&pi->rd);
|
@@ -469,11 +470,19 @@ read_num(ParseInfo pi) {
|
|
469
470
|
if (0 < ni.num || 0 < ni.i) {
|
470
471
|
dec_cnt++;
|
471
472
|
}
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
473
|
+
if (INT64_MAX <= ni.div) {
|
474
|
+
if (!ni.no_big) {
|
475
|
+
ni.big = true;
|
476
|
+
}
|
477
|
+
} else {
|
478
|
+
ni.num = ni.num * 10 + d;
|
479
|
+
ni.div *= 10;
|
480
|
+
ni.di++;
|
481
|
+
if (INT64_MAX <= ni.div || DEC_MAX < dec_cnt) {
|
482
|
+
if (!ni.no_big) {
|
483
|
+
ni.big = true;
|
484
|
+
}
|
485
|
+
}
|
477
486
|
}
|
478
487
|
}
|
479
488
|
}
|
data/lib/oj/version.rb
CHANGED
data/pages/Options.md
CHANGED
@@ -80,16 +80,16 @@ dynamically modifying classes or reloading classes then don't use this.
|
|
80
80
|
|
81
81
|
### :create_additions
|
82
82
|
|
83
|
-
A flag indicating the :create_id key when encountered during parsing
|
84
|
-
|
85
|
-
with the key.
|
83
|
+
A flag indicating that the :create_id key, when encountered during parsing,
|
84
|
+
should create an Object matching the class name specified in the value
|
85
|
+
associated with the key.
|
86
86
|
|
87
87
|
### :create_id [String]
|
88
88
|
|
89
89
|
The :create_id option specifies that key is used for dumping and loading when
|
90
90
|
specifying the class for an encoded object. The default is `json_create`.
|
91
91
|
|
92
|
-
In the `:custom` mode setting the `:create_id` to nil will cause Complex,
|
92
|
+
In the `:custom` mode, setting the `:create_id` to nil will cause Complex,
|
93
93
|
Rational, Range, and Regexp to be output as strings instead of as JSON
|
94
94
|
objects.
|
95
95
|
|
@@ -179,7 +179,7 @@ customization.
|
|
179
179
|
### :nan [Symbol]
|
180
180
|
|
181
181
|
How to dump Infinity, -Infinity, and NaN in :null, :strict, and :compat
|
182
|
-
mode. Default is :auto but is ignored in the :compat and :rails
|
182
|
+
mode. Default is :auto but is ignored in the :compat and :rails modes.
|
183
183
|
|
184
184
|
- `:null` places a null
|
185
185
|
|
@@ -252,7 +252,7 @@ The :time_format when dumping.
|
|
252
252
|
|
253
253
|
- `:unix` time is output as a decimal number in seconds since epoch including fractions of a second.
|
254
254
|
|
255
|
-
- `:unix_zone` similar to the `:unix` format but with the timezone encoded in
|
255
|
+
- `:unix_zone` is similar to the `:unix` format but with the timezone encoded in
|
256
256
|
the exponent of the decimal number of seconds since epoch.
|
257
257
|
|
258
258
|
- `:xmlschema` time is output as a string that follows the XML schema definition.
|
@@ -262,16 +262,16 @@ The :time_format when dumping.
|
|
262
262
|
### :use_as_json [Boolean]
|
263
263
|
|
264
264
|
Call `as_json()` methods on dump, default is false. The option is ignored in
|
265
|
-
the :compat and :rails
|
265
|
+
the :compat and :rails modes.
|
266
266
|
|
267
267
|
|
268
268
|
### :use_raw_json [Boolean]
|
269
269
|
|
270
270
|
Call `raw_json()` methods on dump, default is false. The option is
|
271
|
-
accepted in the :compat and :rails
|
271
|
+
accepted in the :compat and :rails modes even though it is not
|
272
272
|
supported by other JSON gems. It provides a means to optimize dump or
|
273
273
|
generate performance. The `raw_json(depth, indent)` method should be
|
274
|
-
called only by Oj. It is not intended for any other use. This is
|
274
|
+
called only by Oj. It is not intended for any other use. This is meant
|
275
275
|
to replace the abused `to_json` methods. Calling `Oj.dump` inside the
|
276
276
|
`raw_json` with the object itself when `:use_raw_json` is true will
|
277
277
|
result in an infinite loop.
|
@@ -279,9 +279,9 @@ result in an infinite loop.
|
|
279
279
|
### :use_to_hash [Boolean]
|
280
280
|
|
281
281
|
Call `to_hash()` methods on dump, default is false. The option is ignored in
|
282
|
-
the :compat and :rails
|
282
|
+
the :compat and :rails modes.
|
283
283
|
|
284
284
|
### :use_to_json [Boolean]
|
285
285
|
|
286
286
|
Call `to_json()` methods on dump, default is false. The option is ignored in
|
287
|
-
the :compat and :rails
|
287
|
+
the :compat and :rails modes.
|
data/pages/Rails.md
CHANGED
@@ -80,6 +80,45 @@ The classes that can be put in optimized mode and are optimized when
|
|
80
80
|
The ActiveSupport decoder is the `JSON.parse()` method. Calling the
|
81
81
|
`Oj::Rails.set_decoder()` method replaces that method with the Oj equivalent.
|
82
82
|
|
83
|
+
### Usage in Rails 3
|
84
|
+
|
85
|
+
To support Rails 3 you can create a new module mixin to prepend to controllers:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
require 'oj'
|
89
|
+
|
90
|
+
module OjJsonEncoder
|
91
|
+
def render(options = nil, extra_options = {}, &block)
|
92
|
+
if options && options.is_a?(Hash) && options[:json]
|
93
|
+
obj = options.delete(:json)
|
94
|
+
obj = Oj.dump(obj, :mode => :rails) unless obj.is_a?(String)
|
95
|
+
options[:text] = obj
|
96
|
+
response.content_type ||= Mime::JSON
|
97
|
+
end
|
98
|
+
super
|
99
|
+
end
|
100
|
+
end
|
101
|
+
```
|
102
|
+
|
103
|
+
Usage:
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
class MyController < ApplicationController
|
107
|
+
prepend OjJsonEncoder
|
108
|
+
def index
|
109
|
+
render :json => { :hello => 'world' }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
```
|
113
|
+
|
114
|
+
### Older Ruby Version Support (Pre 2.3.0)
|
115
|
+
|
116
|
+
If you are using an older version of Ruby, you can pin `oj` to an earlier version in your Gemfile:
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
gem 'oj', '3.7.12'
|
120
|
+
```
|
121
|
+
|
83
122
|
### Notes:
|
84
123
|
|
85
124
|
1. Optimized Floats set the significant digits to 16. This is different than
|
data/test/bar.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
2
|
|
4
3
|
$: << File.dirname(__FILE__)
|
5
4
|
$oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
|
@@ -7,16 +6,30 @@ $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
|
|
7
6
|
$: << File.join($oj_dir, dir)
|
8
7
|
end
|
9
8
|
|
10
|
-
require 'rails'
|
11
9
|
require 'active_support'
|
12
|
-
require
|
10
|
+
require "active_support/json"
|
13
11
|
|
14
|
-
|
12
|
+
$s = "\u2014 & \n \u{1F618}"
|
13
|
+
|
14
|
+
=begin
|
15
|
+
def check(label)
|
16
|
+
puts "\n--- #{label} --------------------"
|
17
|
+
|
18
|
+
ActiveSupport::JSON::Encoding.use_standard_json_time_format = true
|
19
|
+
puts "with standard_json == true: t.to_json - #{$t.to_json}"
|
20
|
+
ActiveSupport::JSON::Encoding.use_standard_json_time_format = false
|
21
|
+
puts "with standard_json == false: t.to_json - #{$t.to_json}"
|
22
|
+
end
|
23
|
+
|
24
|
+
check('Before Oj')
|
25
|
+
=end
|
15
26
|
|
16
|
-
|
27
|
+
require 'oj'
|
17
28
|
|
18
|
-
|
29
|
+
ActiveSupport::JSON::Encoding.escape_html_entities_in_json = false
|
30
|
+
puts "ActiveSupport.encode(s) - #{ActiveSupport::JSON.encode($s)}"
|
19
31
|
|
20
|
-
|
32
|
+
Oj.optimize_rails
|
33
|
+
Oj.default_options = { mode: :rails }
|
21
34
|
|
22
|
-
puts Oj.dump(
|
35
|
+
puts "Oj.dump(s) - #{Oj.dump($s)}"
|
@@ -15,7 +15,7 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
|
|
15
15
|
def setup
|
16
16
|
@hash = {
|
17
17
|
'a' => 2,
|
18
|
-
'b' =>
|
18
|
+
'b' => 5.23683071,
|
19
19
|
'c' => 'c',
|
20
20
|
'd' => [ 1, "b", 3.14 ],
|
21
21
|
'e' => { 'foo' => 'bar' },
|
@@ -23,7 +23,7 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
|
|
23
23
|
'h' => 1000.0,
|
24
24
|
'i' => 0.001
|
25
25
|
}
|
26
|
-
@json = '{"a":2,"b":
|
26
|
+
@json = '{"a":2,"b":5.23683071,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
|
27
27
|
'"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
|
28
28
|
end
|
29
29
|
|
data/test/prec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'oj'
|
4
|
+
|
5
|
+
extras = {"locationLng" => -97.14690769100295}
|
6
|
+
|
7
|
+
Oj.default_options = {float_precision: 17}
|
8
|
+
|
9
|
+
encoded = Oj.dump(extras)
|
10
|
+
puts encoded
|
11
|
+
puts Oj.load(encoded)
|
12
|
+
|
13
|
+
require "active_record"
|
14
|
+
|
15
|
+
Oj::Rails.set_encoder()
|
16
|
+
Oj::Rails.set_decoder()
|
17
|
+
|
18
|
+
Oj.default_options = {float_precision: 17}
|
19
|
+
# Using Oj rails encoder, gets the correct value: {"locationLng":-97.14690769100295}
|
20
|
+
encoded = ActiveSupport::JSON.encode(extras)
|
21
|
+
puts encoded
|
22
|
+
puts ActiveSupport::JSON.decode(encoded)
|
23
|
+
puts Oj.load(encoded)
|
data/test/test_custom.rb
CHANGED
@@ -118,6 +118,11 @@ class CustomJuice < Minitest::Test
|
|
118
118
|
dump_and_load(-2.48e100 * 1.0e10, false)
|
119
119
|
end
|
120
120
|
|
121
|
+
def test_float_parse
|
122
|
+
f = Oj.load("12.123456789012345678", mode: :custom, bigdecimal_load: :float);
|
123
|
+
assert_equal(Float, f.class)
|
124
|
+
end
|
125
|
+
|
121
126
|
def test_nan_dump
|
122
127
|
assert_equal('null', Oj.dump(0/0.0, :nan => :null))
|
123
128
|
assert_equal('3.3e14159265358979323846', Oj.dump(0/0.0, :nan => :huge))
|
data/test/test_object.rb
CHANGED
@@ -869,6 +869,14 @@ class ObjectJuice < Minitest::Test
|
|
869
869
|
assert_equal(a2[1].__id__, a2.__id__)
|
870
870
|
end
|
871
871
|
|
872
|
+
def test_circular_array3
|
873
|
+
a = ['^r1']
|
874
|
+
json = Oj.dump(a, mode: :object, circular: true)
|
875
|
+
assert_equal(%{["^i1","\\u005er1"]}, json)
|
876
|
+
a2 = Oj.load(json, mode: :object, circular: true)
|
877
|
+
assert_equal(a, a2)
|
878
|
+
end
|
879
|
+
|
872
880
|
def test_circular_hash2
|
873
881
|
h = { 'a' => 7 }
|
874
882
|
h['b'] = h
|
data/test/test_various.rb
CHANGED
@@ -185,7 +185,6 @@ class Juice < Minitest::Test
|
|
185
185
|
n = Oj.load('-0.000012345678901234567')
|
186
186
|
assert_equal(BigDecimal, n.class)
|
187
187
|
assert_equal('-0.12345678901234567E-4', n.to_s.upcase)
|
188
|
-
|
189
188
|
end
|
190
189
|
|
191
190
|
=begin
|
@@ -671,7 +670,7 @@ class Juice < Minitest::Test
|
|
671
670
|
raise e
|
672
671
|
end
|
673
672
|
}
|
674
|
-
assert_equal('first[2].third', msg.split('(')[1].split(')')[0])
|
673
|
+
assert_equal('after first[2].third', msg.split('(')[1].split(')')[0])
|
675
674
|
end
|
676
675
|
|
677
676
|
def test_bad_bignum
|
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.10.
|
4
|
+
version: 3.10.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -219,6 +219,7 @@ files:
|
|
219
219
|
- test/perf_simple.rb
|
220
220
|
- test/perf_strict.rb
|
221
221
|
- test/perf_wab.rb
|
222
|
+
- test/prec.rb
|
222
223
|
- test/sample.rb
|
223
224
|
- test/sample/change.rb
|
224
225
|
- test/sample/dir.rb
|
@@ -283,12 +284,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
283
284
|
- !ruby/object:Gem::Version
|
284
285
|
version: '0'
|
285
286
|
requirements: []
|
286
|
-
rubygems_version: 3.
|
287
|
+
rubygems_version: 3.1.2
|
287
288
|
signing_key:
|
288
289
|
specification_version: 4
|
289
290
|
summary: A fast JSON parser and serializer.
|
290
291
|
test_files:
|
291
292
|
- test/foo.rb
|
293
|
+
- test/prec.rb
|
292
294
|
- test/test_integer_range.rb
|
293
295
|
- test/test_strict.rb
|
294
296
|
- test/perf_strict.rb
|