oj 3.10.6 → 3.10.7
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 +4 -4
- data/ext/oj/parse.c +39 -11
- data/ext/oj/sparse.c +14 -5
- data/lib/oj/version.rb +1 -1
- data/pages/Options.md +11 -11
- data/test/prec.rb +23 -0
- data/test/test_custom.rb +5 -0
- data/test/test_various.rb +1 -2
- metadata +4 -2
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/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) {
|
@@ -810,22 +819,35 @@ oj_num_as_value(NumInfo ni) {
|
|
810
819
|
}
|
811
820
|
} else {
|
812
821
|
double d;
|
822
|
+
double d2;
|
813
823
|
|
814
824
|
ld = roundl(ld);
|
815
825
|
// You would expect that staying with a long double would be
|
816
826
|
// more accurate but it fails to match what Ruby generates so
|
817
827
|
// drop down to a double.
|
818
828
|
if (0 < x) {
|
819
|
-
d = (double)ld *
|
829
|
+
d = (double)(ld * powl(10.0, x));
|
830
|
+
d2 = (double)ld * pow(10.0, x);
|
820
831
|
} else if (0 > x) {
|
821
|
-
d = (double)ld /
|
832
|
+
d = (double)(ld / powl(10.0, -x));
|
833
|
+
d2 = (double)ld / pow(10.0, -x);
|
822
834
|
} else {
|
823
835
|
d = (double)ld;
|
836
|
+
d2 = d;
|
824
837
|
}
|
825
|
-
if (
|
826
|
-
|
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);
|
827
850
|
}
|
828
|
-
rnum = rb_float_new(d);
|
829
851
|
}
|
830
852
|
}
|
831
853
|
}
|
@@ -848,6 +870,12 @@ oj_set_error_at(ParseInfo pi, VALUE err_clas, const char* file, int line, const
|
|
848
870
|
if (p + 3 < end) {
|
849
871
|
*p++ = ' ';
|
850
872
|
*p++ = '(';
|
873
|
+
*p++ = 'a';
|
874
|
+
*p++ = 'f';
|
875
|
+
*p++ = 't';
|
876
|
+
*p++ = 'e';
|
877
|
+
*p++ = 'r';
|
878
|
+
*p++ = ' ';
|
851
879
|
start = p;
|
852
880
|
for (vp = pi->stack.head; vp < pi->stack.tail; vp++) {
|
853
881
|
if (end <= p + 1 + vp->klen) {
|
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/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_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
|
@@ -289,6 +290,7 @@ 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
|