oj 3.13.10 → 3.13.11
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/CHANGELOG.md +3 -0
- data/ext/oj/dump.c +63 -74
- data/ext/oj/encoder.c +43 -0
- data/lib/oj/version.rb +1 -1
- data/test/foo.rb +67 -25
- data/test/test_saj.rb +1 -1
- data/test/test_various.rb +27 -2
- data/test/tests.rb +0 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcb5f80ad6384640d44889424c39f91ee2db778b17c91b9505b5b3b4c280abf1
|
4
|
+
data.tar.gz: 85b70200f48f46019ecf1020ca8e1b8ea604bca1161120b3747a8aeac2903682
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f96776be4f9431b160f1d9f588e8688fb7e0c4a431c58a10fa43a71f5a6f95781456287f40db5dfba03bb69350946ad36f246d0b59c196f9dc95218f51005f7a
|
7
|
+
data.tar.gz: e106b88134f86d82b9740f3e836ecb2aaa4af7ad643b96a4600eaa09392ba5f630c402101a6fb476823c41bc127b5c3d9625c6900a033cf6f9830ca01e57d459
|
data/CHANGELOG.md
CHANGED
data/ext/oj/dump.c
CHANGED
@@ -10,6 +10,9 @@
|
|
10
10
|
#include <stdlib.h>
|
11
11
|
#include <string.h>
|
12
12
|
#include <unistd.h>
|
13
|
+
#if !IS_WINDOWS
|
14
|
+
#include <poll.h>
|
15
|
+
#endif
|
13
16
|
|
14
17
|
#include "cache8.h"
|
15
18
|
#include "odd.h"
|
@@ -113,49 +116,39 @@ static char rails_friendly_chars[256] = "\
|
|
113
116
|
11111111111111111111111111111111";
|
114
117
|
|
115
118
|
static void raise_strict(VALUE obj) {
|
116
|
-
rb_raise(rb_eTypeError,
|
117
|
-
"Failed to dump %s Object to JSON in strict mode.",
|
118
|
-
rb_class2name(rb_obj_class(obj)));
|
119
|
+
rb_raise(rb_eTypeError, "Failed to dump %s Object to JSON in strict mode.", rb_class2name(rb_obj_class(obj)));
|
119
120
|
}
|
120
121
|
|
121
|
-
inline static size_t
|
122
|
+
inline static size_t calculate_string_size(const uint8_t *str, size_t len, const char *table) {
|
122
123
|
size_t size = 0;
|
123
124
|
size_t i = len;
|
124
125
|
|
125
|
-
for (;
|
126
|
-
size +=
|
126
|
+
for (; 3 < i; i -= 4) {
|
127
|
+
size += table[*str++];
|
128
|
+
size += table[*str++];
|
129
|
+
size += table[*str++];
|
130
|
+
size += table[*str++];
|
131
|
+
}
|
132
|
+
for (; 0 < i; i--) {
|
133
|
+
size += table[*str++];
|
127
134
|
}
|
128
135
|
return size - len * (size_t)'0';
|
129
136
|
}
|
130
137
|
|
131
|
-
inline static size_t
|
132
|
-
|
133
|
-
|
138
|
+
inline static size_t newline_friendly_size(const uint8_t *str, size_t len) {
|
139
|
+
return calculate_string_size(str, len, newline_friendly_chars);
|
140
|
+
}
|
134
141
|
|
135
|
-
|
136
|
-
|
137
|
-
}
|
138
|
-
return size - len * (size_t)'0';
|
142
|
+
inline static size_t hibit_friendly_size(const uint8_t *str, size_t len) {
|
143
|
+
return calculate_string_size(str, len, hibit_friendly_chars);
|
139
144
|
}
|
140
145
|
|
141
146
|
inline static size_t ascii_friendly_size(const uint8_t *str, size_t len) {
|
142
|
-
|
143
|
-
size_t i = len;
|
144
|
-
|
145
|
-
for (; 0 < i; str++, i--) {
|
146
|
-
size += ascii_friendly_chars[*str];
|
147
|
-
}
|
148
|
-
return size - len * (size_t)'0';
|
147
|
+
return calculate_string_size(str, len, ascii_friendly_chars);
|
149
148
|
}
|
150
149
|
|
151
150
|
inline static size_t xss_friendly_size(const uint8_t *str, size_t len) {
|
152
|
-
|
153
|
-
size_t i = len;
|
154
|
-
|
155
|
-
for (; 0 < i; str++, i--) {
|
156
|
-
size += xss_friendly_chars[*str];
|
157
|
-
}
|
158
|
-
return size - len * (size_t)'0';
|
151
|
+
return calculate_string_size(str, len, xss_friendly_chars);
|
159
152
|
}
|
160
153
|
|
161
154
|
inline static size_t hixss_friendly_size(const uint8_t *str, size_t len) {
|
@@ -188,13 +181,7 @@ inline static long rails_xss_friendly_size(const uint8_t *str, size_t len) {
|
|
188
181
|
}
|
189
182
|
|
190
183
|
inline static size_t rails_friendly_size(const uint8_t *str, size_t len) {
|
191
|
-
|
192
|
-
size_t i = len;
|
193
|
-
|
194
|
-
for (; 0 < i; str++, i--) {
|
195
|
-
size += rails_friendly_chars[*str];
|
196
|
-
}
|
197
|
-
return size - len * (size_t)'0';
|
184
|
+
return calculate_string_size(str, len, rails_friendly_chars);
|
198
185
|
}
|
199
186
|
|
200
187
|
const char *oj_nan_str(VALUE obj, int opt, int mode, bool plus, int *lenp) {
|
@@ -535,14 +522,7 @@ void oj_dump_xml_time(VALUE obj, Out out) {
|
|
535
522
|
}
|
536
523
|
if ((0 == nsec && !out->opts->sec_prec_set) || 0 == out->opts->sec_prec) {
|
537
524
|
if (0 == tzsecs && rb_funcall2(obj, oj_utcq_id, 0, 0)) {
|
538
|
-
int len = sprintf(buf,
|
539
|
-
"%04d-%02d-%02dT%02d:%02d:%02dZ",
|
540
|
-
ti.year,
|
541
|
-
ti.mon,
|
542
|
-
ti.day,
|
543
|
-
ti.hour,
|
544
|
-
ti.min,
|
545
|
-
ti.sec);
|
525
|
+
int len = sprintf(buf, "%04d-%02d-%02dT%02d:%02d:%02dZ", ti.year, ti.mon, ti.day, ti.hour, ti.min, ti.sec);
|
546
526
|
oj_dump_cstr(buf, len, 0, 0, out);
|
547
527
|
} else {
|
548
528
|
int len = sprintf(buf,
|
@@ -574,18 +554,7 @@ void oj_dump_xml_time(VALUE obj, Out out) {
|
|
574
554
|
if (9 > out->opts->sec_prec) {
|
575
555
|
format[32] = '0' + out->opts->sec_prec;
|
576
556
|
}
|
577
|
-
len = sprintf(buf,
|
578
|
-
format,
|
579
|
-
ti.year,
|
580
|
-
ti.mon,
|
581
|
-
ti.day,
|
582
|
-
ti.hour,
|
583
|
-
ti.min,
|
584
|
-
ti.sec,
|
585
|
-
(long)nsec,
|
586
|
-
tzsign,
|
587
|
-
tzhour,
|
588
|
-
tzmin);
|
557
|
+
len = sprintf(buf, format, ti.year, ti.mon, ti.day, ti.hour, ti.min, ti.sec, (long)nsec, tzsign, tzhour, tzmin);
|
589
558
|
oj_dump_cstr(buf, len, 0, 0, out);
|
590
559
|
}
|
591
560
|
}
|
@@ -666,6 +635,21 @@ void oj_write_obj_to_file(VALUE obj, const char *path, Options copts) {
|
|
666
635
|
}
|
667
636
|
}
|
668
637
|
|
638
|
+
static void write_ready(int fd) {
|
639
|
+
struct pollfd pp;
|
640
|
+
int i;
|
641
|
+
|
642
|
+
pp.fd = fd;
|
643
|
+
pp.events = POLLERR | POLLOUT;
|
644
|
+
pp.revents = 0;
|
645
|
+
if (0 >= (i = poll(&pp, 1, 5000))) {
|
646
|
+
if (0 == i || EAGAIN == errno) {
|
647
|
+
rb_raise(rb_eIOError, "write timed out");
|
648
|
+
}
|
649
|
+
rb_raise(rb_eIOError, "write failed. %d %s.", errno, strerror(errno));
|
650
|
+
}
|
651
|
+
}
|
652
|
+
|
669
653
|
void oj_write_obj_to_stream(VALUE obj, VALUE stream, Options copts) {
|
670
654
|
char buf[4096];
|
671
655
|
struct _out out;
|
@@ -685,13 +669,24 @@ void oj_write_obj_to_stream(VALUE obj, VALUE stream, Options copts) {
|
|
685
669
|
if (oj_stringio_class == clas) {
|
686
670
|
rb_funcall(stream, oj_write_id, 1, rb_str_new(out.buf, size));
|
687
671
|
#if !IS_WINDOWS
|
688
|
-
} else if (rb_respond_to(stream, oj_fileno_id) &&
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
672
|
+
} else if (rb_respond_to(stream, oj_fileno_id) && Qnil != (s = rb_funcall(stream, oj_fileno_id, 0)) &&
|
673
|
+
0 != (fd = FIX2INT(s))) {
|
674
|
+
ssize_t cnt;
|
675
|
+
ssize_t total = 0;
|
676
|
+
|
677
|
+
while (true) {
|
678
|
+
if (0 > (cnt = write(fd, out.buf + total, size - total))) {
|
679
|
+
if (EAGAIN != errno) {
|
680
|
+
rb_raise(rb_eIOError, "write failed. %d %s.", errno, strerror(errno));
|
681
|
+
break;
|
682
|
+
}
|
683
|
+
}
|
684
|
+
total += cnt;
|
685
|
+
if (size <= total) {
|
686
|
+
// Completed
|
687
|
+
break;
|
693
688
|
}
|
694
|
-
|
689
|
+
write_ready(fd);
|
695
690
|
}
|
696
691
|
#endif
|
697
692
|
} else if (rb_respond_to(stream, oj_write_id)) {
|
@@ -835,8 +830,7 @@ void oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out ou
|
|
835
830
|
for (; str < end; str++) {
|
836
831
|
switch (cmap[(uint8_t)*str]) {
|
837
832
|
case '1':
|
838
|
-
if ((JXEsc == out->opts->escape_mode || RailsXEsc == out->opts->escape_mode) &&
|
839
|
-
check_start <= str) {
|
833
|
+
if ((JXEsc == out->opts->escape_mode || RailsXEsc == out->opts->escape_mode) && check_start <= str) {
|
840
834
|
if (0 != (0x80 & (uint8_t)*str)) {
|
841
835
|
if (0xC0 == (0xC0 & (uint8_t)*str)) {
|
842
836
|
check_start = check_unicode(str, end, orig);
|
@@ -860,11 +854,9 @@ void oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out ou
|
|
860
854
|
}
|
861
855
|
break;
|
862
856
|
case '3': // Unicode
|
863
|
-
if (0xe2 == (uint8_t)*str &&
|
864
|
-
(JXEsc == out->opts->escape_mode || RailsXEsc == out->opts->escape_mode) &&
|
857
|
+
if (0xe2 == (uint8_t)*str && (JXEsc == out->opts->escape_mode || RailsXEsc == out->opts->escape_mode) &&
|
865
858
|
2 <= end - str) {
|
866
|
-
if (0x80 == (uint8_t)str[1] &&
|
867
|
-
(0xa8 == (uint8_t)str[2] || 0xa9 == (uint8_t)str[2])) {
|
859
|
+
if (0x80 == (uint8_t)str[1] && (0xa8 == (uint8_t)str[2] || 0xa9 == (uint8_t)str[2])) {
|
868
860
|
str = dump_unicode(str, end, out, orig);
|
869
861
|
} else {
|
870
862
|
check_start = check_unicode(str, end, orig);
|
@@ -883,10 +875,8 @@ void oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out ou
|
|
883
875
|
dump_hex((uint8_t)*str, out);
|
884
876
|
} else {
|
885
877
|
if (0xe2 == (uint8_t)*str &&
|
886
|
-
(JXEsc == out->opts->escape_mode || RailsXEsc == out->opts->escape_mode) &&
|
887
|
-
2
|
888
|
-
if (0x80 == (uint8_t)str[1] &&
|
889
|
-
(0xa8 == (uint8_t)str[2] || 0xa9 == (uint8_t)str[2])) {
|
878
|
+
(JXEsc == out->opts->escape_mode || RailsXEsc == out->opts->escape_mode) && 2 <= end - str) {
|
879
|
+
if (0x80 == (uint8_t)str[1] && (0xa8 == (uint8_t)str[2] || 0xa9 == (uint8_t)str[2])) {
|
890
880
|
str = dump_unicode(str, end, out, orig);
|
891
881
|
} else {
|
892
882
|
check_start = check_unicode(str, end, orig);
|
@@ -902,8 +892,8 @@ void oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out ou
|
|
902
892
|
}
|
903
893
|
*out->cur++ = '"';
|
904
894
|
}
|
905
|
-
if ((JXEsc == out->opts->escape_mode || RailsXEsc == out->opts->escape_mode) &&
|
906
|
-
0
|
895
|
+
if ((JXEsc == out->opts->escape_mode || RailsXEsc == out->opts->escape_mode) && 0 < str - orig &&
|
896
|
+
0 != (0x80 & *(str - 1))) {
|
907
897
|
uint8_t c = (uint8_t) * (str - 1);
|
908
898
|
int i;
|
909
899
|
int scnt = (int)(str - orig);
|
@@ -1064,8 +1054,7 @@ void oj_dump_bignum(VALUE obj, int depth, Out out, bool as_ok) {
|
|
1064
1054
|
int cnt = (int)RSTRING_LEN(rs);
|
1065
1055
|
bool dump_as_string = false;
|
1066
1056
|
|
1067
|
-
if (out->opts->int_range_max != 0 ||
|
1068
|
-
out->opts->int_range_min != 0) { // Bignum cannot be inside of Fixnum range
|
1057
|
+
if (out->opts->int_range_max != 0 || out->opts->int_range_min != 0) { // Bignum cannot be inside of Fixnum range
|
1069
1058
|
dump_as_string = true;
|
1070
1059
|
assure_size(out, cnt + 2);
|
1071
1060
|
*out->cur++ = '"';
|
data/ext/oj/encoder.c
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
// Copyright (c) 2011, 2022 Peter Ohler. All rights reserved.
|
2
|
+
// Licensed under the MIT License. See LICENSE file in the project root for license details.
|
3
|
+
|
4
|
+
#include "oj.h"
|
5
|
+
|
6
|
+
typedef struct _encoder {
|
7
|
+
int indent; // indention for dump, default 2
|
8
|
+
char circular; // YesNo
|
9
|
+
char escape_mode; // Escape_Mode
|
10
|
+
char mode; // Mode
|
11
|
+
char time_format; // TimeFormat
|
12
|
+
char bigdec_as_num; // YesNo
|
13
|
+
char to_hash; // YesNo
|
14
|
+
char to_json; // YesNo
|
15
|
+
char as_json; // YesNo
|
16
|
+
char raw_json; // YesNo
|
17
|
+
char trace; // YesNo
|
18
|
+
char sec_prec_set; // boolean (0 or 1)
|
19
|
+
char ignore_under; // YesNo - ignore attrs starting with _ if true in object and custom modes
|
20
|
+
int64_t int_range_min; // dump numbers below as string
|
21
|
+
int64_t int_range_max; // dump numbers above as string
|
22
|
+
const char* create_id; // 0 or string
|
23
|
+
size_t create_id_len; // length of create_id
|
24
|
+
int sec_prec; // second precision when dumping time
|
25
|
+
char float_prec; // float precision, linked to float_fmt
|
26
|
+
char float_fmt[7]; // float format for dumping, if empty use Ruby
|
27
|
+
struct _dumpOpts dump_opts;
|
28
|
+
struct _rxClass str_rx;
|
29
|
+
VALUE* ignore; // Qnil terminated array of classes or NULL
|
30
|
+
} * Encoder;
|
31
|
+
|
32
|
+
/*
|
33
|
+
rb_define_module_function(Oj, "encode", encode, -1);
|
34
|
+
rb_define_module_function(Oj, "to_file", to_file, -1); // or maybe just write
|
35
|
+
rb_define_module_function(Oj, "to_stream", to_stream, -1);
|
36
|
+
*/
|
37
|
+
|
38
|
+
// write(to, obj)
|
39
|
+
// if to is a string then open file
|
40
|
+
// else if stream then write to stream
|
41
|
+
// handle non-blocking
|
42
|
+
|
43
|
+
// should each mode have a different encoder or use delegates like the parser?
|
data/lib/oj/version.rb
CHANGED
data/test/foo.rb
CHANGED
@@ -4,32 +4,74 @@ $: << '.'
|
|
4
4
|
$: << File.join(File.dirname(__FILE__), "../lib")
|
5
5
|
$: << File.join(File.dirname(__FILE__), "../ext")
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
7
|
+
require "oj"
|
8
|
+
require "socket"
|
9
|
+
require 'io/nonblock'
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
=begin
|
12
|
+
#pid = spawn("nc -d 0.1 -l 5000", out: "/dev/null")
|
13
|
+
pid = spawn("nc -i 1 -l 7777", out: "/dev/null")
|
14
|
+
at_exit { Process.kill 9, pid }
|
15
|
+
sleep 0.2
|
16
|
+
s = Socket.tcp("localhost", 7777)
|
17
|
+
#s.nonblock = false
|
18
|
+
1_000_000.times do |x|
|
19
|
+
Oj.to_stream(s, { x: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]})
|
18
20
|
end
|
21
|
+
=end
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
Oj.
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
=begin
|
24
|
+
IO.pipe do |r, w|
|
25
|
+
if fork
|
26
|
+
r.close
|
27
|
+
#w.nonblock = false
|
28
|
+
1_000_000.times do |i|
|
29
|
+
begin
|
30
|
+
Oj.to_stream(w, { x: i})
|
31
|
+
rescue IOError => e
|
32
|
+
puts "*** #{i} raised #{e.class}: #{e}"
|
33
|
+
IO.select(nil, [w])
|
34
|
+
retry
|
35
|
+
end
|
36
|
+
w.puts
|
37
|
+
end
|
38
|
+
else
|
39
|
+
w.close
|
40
|
+
sleep(0.1)
|
41
|
+
r.each_line { |b|
|
42
|
+
#print b
|
43
|
+
}
|
44
|
+
r.close
|
45
|
+
Process.exit(0)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
=end
|
32
49
|
|
33
|
-
|
34
|
-
|
35
|
-
|
50
|
+
IO.pipe do |r, w|
|
51
|
+
if fork
|
52
|
+
r.close
|
53
|
+
#w.nonblock = false
|
54
|
+
a = []
|
55
|
+
10_000.times do |i|
|
56
|
+
a << i
|
57
|
+
end
|
58
|
+
begin
|
59
|
+
Oj.to_stream(w, a, indent: 2)
|
60
|
+
rescue IOError => e
|
61
|
+
puts "*** raised #{e.class}: #{e}"
|
62
|
+
puts "*** fileno: #{w.fileno}"
|
63
|
+
puts "*** is an IO?: #{w.kind_of?(IO)}"
|
64
|
+
IO.select(nil, [w])
|
65
|
+
retry
|
66
|
+
end
|
67
|
+
w.puts
|
68
|
+
else
|
69
|
+
w.close
|
70
|
+
sleep(0.5)
|
71
|
+
r.each_line { |b|
|
72
|
+
#print b
|
73
|
+
}
|
74
|
+
r.close
|
75
|
+
Process.exit(0)
|
76
|
+
end
|
77
|
+
end
|
data/test/test_saj.rb
CHANGED
@@ -180,7 +180,7 @@ class SajTest < Minitest::Test
|
|
180
180
|
assert_equal([:add_value, 12345, nil], handler.calls.first)
|
181
181
|
type, message, line, column = handler.calls.last
|
182
182
|
assert_equal([:error, 1, 6], [type, line, column])
|
183
|
-
assert_match(%r{invalid format, extra characters at line 1, column 6 \[(?:[a-z\.]+/)*saj\.c:\d+\]}, message)
|
183
|
+
assert_match(%r{invalid format, extra characters at line 1, column 6 \[(?:[A-Za-z]:\/)?(?:[a-z\.]+/)*saj\.c:\d+\]}, message)
|
184
184
|
end
|
185
185
|
|
186
186
|
end
|
data/test/test_various.rb
CHANGED
@@ -528,7 +528,7 @@ class Juice < Minitest::Test
|
|
528
528
|
assert_equal(58, obj.y)
|
529
529
|
end
|
530
530
|
|
531
|
-
# Stream Deeply Nested
|
531
|
+
# Stream Deeply Nested
|
532
532
|
def test_deep_nest_dump
|
533
533
|
begin
|
534
534
|
a = []
|
@@ -541,7 +541,7 @@ class Juice < Minitest::Test
|
|
541
541
|
assert(false, "*** expected an exception")
|
542
542
|
end
|
543
543
|
|
544
|
-
# Stream IO
|
544
|
+
# Stream IO
|
545
545
|
def test_io_string
|
546
546
|
src = { 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}
|
547
547
|
output = StringIO.open("", "w+")
|
@@ -553,6 +553,9 @@ class Juice < Minitest::Test
|
|
553
553
|
end
|
554
554
|
|
555
555
|
def test_io_file
|
556
|
+
# Windows does not support fork
|
557
|
+
return if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
|
558
|
+
|
556
559
|
src = { 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}
|
557
560
|
filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
|
558
561
|
File.open(filename, "w") { |f|
|
@@ -564,6 +567,28 @@ class Juice < Minitest::Test
|
|
564
567
|
assert_equal(src, obj)
|
565
568
|
end
|
566
569
|
|
570
|
+
def test_io_stream
|
571
|
+
IO.pipe do |r, w|
|
572
|
+
if fork
|
573
|
+
r.close
|
574
|
+
#w.nonblock = false
|
575
|
+
a = []
|
576
|
+
10_000.times do |i|
|
577
|
+
a << i
|
578
|
+
end
|
579
|
+
Oj.to_stream(w, a, indent: 2)
|
580
|
+
w.close
|
581
|
+
else
|
582
|
+
w.close
|
583
|
+
sleep(0.1) # to force a busy
|
584
|
+
cnt = 0
|
585
|
+
r.each_line { cnt += 1 }
|
586
|
+
r.close
|
587
|
+
Process.exit(0)
|
588
|
+
end
|
589
|
+
end
|
590
|
+
end
|
591
|
+
|
567
592
|
# comments
|
568
593
|
def test_comment_slash
|
569
594
|
json = %{{
|
data/test/tests.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.13.
|
4
|
+
version: 3.13.11
|
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: 2022-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -117,6 +117,7 @@ files:
|
|
117
117
|
- ext/oj/dump_object.c
|
118
118
|
- ext/oj/dump_strict.c
|
119
119
|
- ext/oj/encode.h
|
120
|
+
- ext/oj/encoder.c
|
120
121
|
- ext/oj/err.c
|
121
122
|
- ext/oj/err.h
|
122
123
|
- ext/oj/extconf.rb
|