oj 3.10.16 → 3.10.17
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 +22 -9
- data/ext/oj/mimic_json.c +10 -2
- data/ext/oj/oj.c +15 -0
- data/ext/oj/oj.h +1 -0
- data/lib/oj/version.rb +1 -1
- data/pages/Modes.md +1 -1
- data/pages/Options.md +4 -0
- data/test/test_compat.rb +8 -1
- data/test/test_rails.rb +9 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6089f48d996b2561868c1d0098388cb09a484b0554f713d2ba1bb6da87c90cd7
|
4
|
+
data.tar.gz: 3068e3d291d958f5b0e89f95461b83fd4e766e27bc6a7be7bc6062c893802924
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16e0bb20797dbfcca9784c976931347086adb66b3658a8b6548c0941324e9517ae246777813d70a9434d31e9dd0591ec83363ae38b2bbd9d7c86c4ca79c9110c
|
7
|
+
data.tar.gz: e1b1d8232e68addab4c44ef0c9e2bfd46ecedf2a888024bacec093f67c3b44d4b99c43770b07aebfb5242532b685fe35a2b783a13d0c22fa11748b14141ab5a1
|
data/ext/oj/dump.c
CHANGED
@@ -174,15 +174,20 @@ hixss_friendly_size(const uint8_t *str, size_t len) {
|
|
174
174
|
return size - len * (size_t)'0' + check;
|
175
175
|
}
|
176
176
|
|
177
|
-
inline static
|
177
|
+
inline static long
|
178
178
|
rails_xss_friendly_size(const uint8_t *str, size_t len) {
|
179
|
-
|
179
|
+
long size = 0;
|
180
180
|
size_t i = len;
|
181
|
+
uint8_t hi = 0;
|
181
182
|
|
182
183
|
for (; 0 < i; str++, i--) {
|
183
184
|
size += rails_xss_friendly_chars[*str];
|
185
|
+
hi |= *str & 0x80;
|
184
186
|
}
|
185
|
-
|
187
|
+
if (0 == hi) {
|
188
|
+
return size - len * (size_t)'0';
|
189
|
+
}
|
190
|
+
return -(size - len * (size_t)'0');
|
186
191
|
}
|
187
192
|
|
188
193
|
inline static size_t
|
@@ -249,7 +254,6 @@ dump_hex(uint8_t c, Out out) {
|
|
249
254
|
|
250
255
|
static void
|
251
256
|
raise_invalid_unicode(const char *str, int len, int pos) {
|
252
|
-
char buf[len + 1];
|
253
257
|
char c;
|
254
258
|
char code[32];
|
255
259
|
char *cp = code;
|
@@ -268,8 +272,7 @@ raise_invalid_unicode(const char *str, int len, int pos) {
|
|
268
272
|
cp--;
|
269
273
|
*cp++ = ']';
|
270
274
|
*cp = '\0';
|
271
|
-
|
272
|
-
rb_raise(oj_json_generator_error_class, "Invalid Unicode %s at %d in '%s'", code, pos, buf);
|
275
|
+
rb_raise(oj_json_generator_error_class, "Invalid Unicode %s at %d", code, pos);
|
273
276
|
}
|
274
277
|
|
275
278
|
static const char*
|
@@ -767,6 +770,7 @@ oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out) {
|
|
767
770
|
size_t size;
|
768
771
|
char *cmap;
|
769
772
|
const char *orig = str;
|
773
|
+
bool has_hi = false;
|
770
774
|
|
771
775
|
switch (out->opts->escape_mode) {
|
772
776
|
case NLEsc:
|
@@ -785,10 +789,19 @@ oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out) {
|
|
785
789
|
cmap = hixss_friendly_chars;
|
786
790
|
size = hixss_friendly_size((uint8_t*)str, cnt);
|
787
791
|
break;
|
788
|
-
case RailsXEsc:
|
792
|
+
case RailsXEsc: {
|
793
|
+
long sz;
|
794
|
+
|
789
795
|
cmap = rails_xss_friendly_chars;
|
790
|
-
|
796
|
+
sz = rails_xss_friendly_size((uint8_t*)str, cnt);
|
797
|
+
if (sz < 0) {
|
798
|
+
has_hi = true;
|
799
|
+
size = (size_t)-sz;
|
800
|
+
} else {
|
801
|
+
size = (size_t)sz;
|
802
|
+
}
|
791
803
|
break;
|
804
|
+
}
|
792
805
|
case RailsEsc:
|
793
806
|
cmap = rails_friendly_chars;
|
794
807
|
size = rails_friendly_size((uint8_t*)str, cnt);
|
@@ -812,7 +825,7 @@ oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out) {
|
|
812
825
|
str++;
|
813
826
|
is_sym = 0; // just to make sure
|
814
827
|
}
|
815
|
-
if (cnt == size) {
|
828
|
+
if (cnt == size && !has_hi) {
|
816
829
|
if (is_sym) {
|
817
830
|
*out->cur++ = ':';
|
818
831
|
}
|
data/ext/oj/mimic_json.c
CHANGED
@@ -510,8 +510,6 @@ mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
|
|
510
510
|
pi.options.create_ok = No;
|
511
511
|
pi.options.allow_nan = (bang ? Yes : No);
|
512
512
|
pi.options.nilnil = No;
|
513
|
-
//pi.options.bigdec_load = FloatDec;
|
514
|
-
pi.options.bigdec_load = RubyDec;
|
515
513
|
pi.options.mode = CompatMode;
|
516
514
|
pi.max_depth = 100;
|
517
515
|
|
@@ -561,6 +559,16 @@ mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
|
|
561
559
|
pi.options.array_class = v;
|
562
560
|
}
|
563
561
|
}
|
562
|
+
if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, oj_decimal_class_sym)) {
|
563
|
+
v = rb_hash_lookup(ropts, oj_decimal_class_sym);
|
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
|
+
}
|
571
|
+
}
|
564
572
|
v = rb_hash_lookup(ropts, oj_max_nesting_sym);
|
565
573
|
if (Qtrue == v) {
|
566
574
|
pi.max_depth = 100;
|
data/ext/oj/oj.c
CHANGED
@@ -88,6 +88,7 @@ VALUE oj_slash_string;
|
|
88
88
|
VALUE oj_allow_nan_sym;
|
89
89
|
VALUE oj_array_class_sym;
|
90
90
|
VALUE oj_create_additions_sym;
|
91
|
+
VALUE oj_decimal_class_sym;
|
91
92
|
VALUE oj_hash_class_sym;
|
92
93
|
VALUE oj_indent_sym;
|
93
94
|
VALUE oj_object_class_sym;
|
@@ -581,6 +582,19 @@ oj_parse_options(VALUE ropts, Options copts) {
|
|
581
582
|
rb_raise(rb_eArgError, ":bigdecimal_load must be :bigdecimal, :float, or :auto.");
|
582
583
|
}
|
583
584
|
}
|
585
|
+
if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, oj_decimal_class_sym)) {
|
586
|
+
v = rb_hash_lookup(ropts, oj_decimal_class_sym);
|
587
|
+
if (rb_cFloat == v) {
|
588
|
+
copts->bigdec_load = FloatDec;
|
589
|
+
} else if (oj_bigdecimal_class == v) {
|
590
|
+
copts->bigdec_load = BigDec;
|
591
|
+
} else if (Qnil == v) {
|
592
|
+
copts->bigdec_load = AutoDec;
|
593
|
+
} else {
|
594
|
+
rb_raise(rb_eArgError, ":decimal_class must be BigDecimal, Float, or nil.");
|
595
|
+
}
|
596
|
+
}
|
597
|
+
|
584
598
|
if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, create_id_sym)) {
|
585
599
|
v = rb_hash_lookup(ropts, create_id_sym);
|
586
600
|
if (Qnil == v) {
|
@@ -1674,6 +1688,7 @@ Init_oj() {
|
|
1674
1688
|
oj_array_nl_sym = ID2SYM(rb_intern("array_nl")); rb_gc_register_address(&oj_array_nl_sym);
|
1675
1689
|
oj_ascii_only_sym = ID2SYM(rb_intern("ascii_only")); rb_gc_register_address(&oj_ascii_only_sym);
|
1676
1690
|
oj_create_additions_sym = ID2SYM(rb_intern("create_additions"));rb_gc_register_address(&oj_create_additions_sym);
|
1691
|
+
oj_decimal_class_sym = ID2SYM(rb_intern("decimal_class")); rb_gc_register_address(&oj_decimal_class_sym);
|
1677
1692
|
oj_hash_class_sym = ID2SYM(rb_intern("hash_class")); rb_gc_register_address(&oj_hash_class_sym);
|
1678
1693
|
oj_indent_sym = ID2SYM(rb_intern("indent")); rb_gc_register_address(&oj_indent_sym);
|
1679
1694
|
oj_max_nesting_sym = ID2SYM(rb_intern("max_nesting")); rb_gc_register_address(&oj_max_nesting_sym);
|
data/ext/oj/oj.h
CHANGED
@@ -310,6 +310,7 @@ extern VALUE oj_array_class_sym;
|
|
310
310
|
extern VALUE oj_array_nl_sym;
|
311
311
|
extern VALUE oj_ascii_only_sym;
|
312
312
|
extern VALUE oj_create_additions_sym;
|
313
|
+
extern VALUE oj_decimal_class_sym;
|
313
314
|
extern VALUE oj_hash_class_sym;
|
314
315
|
extern VALUE oj_indent_sym;
|
315
316
|
extern VALUE oj_max_nesting_sym;
|
data/lib/oj/version.rb
CHANGED
data/pages/Modes.md
CHANGED
@@ -94,7 +94,7 @@ 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 | | | x | 3 | x | x | |
|
98
98
|
| :bigdecimal_load | Boolean | | | | | | x | |
|
99
99
|
| :circular | Boolean | x | x | x | x | x | x | |
|
100
100
|
| :class_cache | Boolean | | | | | x | x | |
|
data/pages/Options.md
CHANGED
@@ -66,6 +66,10 @@ Determines how to load decimals.
|
|
66
66
|
|
67
67
|
- `:auto` the most precise for the number of digits is used.
|
68
68
|
|
69
|
+
This can also be set with `:decimal_class` when used as a load or
|
70
|
+
parse option to match the JSON gem. In that case either `Float`,
|
71
|
+
`BigDecimal`, or `nil` can be provided.
|
72
|
+
|
69
73
|
### :circular [Boolean]
|
70
74
|
|
71
75
|
Detect circular references while dumping. In :compat mode raise a
|
data/test/test_compat.rb
CHANGED
@@ -277,12 +277,19 @@ class CompatJuice < Minitest::Test
|
|
277
277
|
# BigDecimal
|
278
278
|
def test_bigdecimal
|
279
279
|
# BigDecimals are dumped as strings and can not be restored to the
|
280
|
-
# original value.
|
280
|
+
# original value without using an undocumented feature of the JSON gem.
|
281
281
|
json = Oj.dump(BigDecimal('3.14159265358979323846'))
|
282
282
|
# 2.4.0 changes the exponent to lowercase
|
283
283
|
assert_equal('"0.314159265358979323846e1"', json.downcase)
|
284
284
|
end
|
285
285
|
|
286
|
+
def test_bigdecimal_load
|
287
|
+
big = BigDecimal('3.14159265358979323846')
|
288
|
+
# :decimal_class is the undocumented feature.
|
289
|
+
json = Oj.load('3.14159265358979323846', mode: :compat, decimal_class: BigDecimal)
|
290
|
+
assert_equal(big, json)
|
291
|
+
end
|
292
|
+
|
286
293
|
def test_infinity
|
287
294
|
assert_raises(Oj::ParseError) { Oj.load('Infinity', :mode => :strict) }
|
288
295
|
x = Oj.load('Infinity', :mode => :compat)
|
data/test/test_rails.rb
CHANGED
@@ -23,4 +23,13 @@ class RailsJuice < Minitest::Test
|
|
23
23
|
assert_equal('0.123e3', json.downcase)
|
24
24
|
end
|
25
25
|
|
26
|
+
def test_invalid_encoding
|
27
|
+
assert_raises(EncodingError) {
|
28
|
+
Oj.dump("\"\xf3j", mode: :rails)
|
29
|
+
}
|
30
|
+
assert_raises(EncodingError) {
|
31
|
+
Oj.dump("\xf3j", mode: :rails)
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
26
35
|
end
|
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.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -265,7 +265,7 @@ metadata:
|
|
265
265
|
homepage_uri: http://www.ohler.com/oj/
|
266
266
|
source_code_uri: https://github.com/ohler55/oj
|
267
267
|
wiki_uri: https://github.com/ohler55/oj/wiki
|
268
|
-
post_install_message:
|
268
|
+
post_install_message:
|
269
269
|
rdoc_options:
|
270
270
|
- "--title"
|
271
271
|
- Oj
|
@@ -285,7 +285,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
285
285
|
version: '0'
|
286
286
|
requirements: []
|
287
287
|
rubygems_version: 3.1.2
|
288
|
-
signing_key:
|
288
|
+
signing_key:
|
289
289
|
specification_version: 4
|
290
290
|
summary: A fast JSON parser and serializer.
|
291
291
|
test_files:
|