oj 2.12.11 → 2.12.12
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 +7 -0
- data/README.md +5 -1
- data/ext/oj/dump.c +31 -26
- data/ext/oj/oj.c +1 -1
- data/ext/oj/oj.h +1 -0
- data/lib/oj/version.rb +1 -1
- data/test/bug.rb +40 -51
- data/test/bug2.rb +10 -0
- data/test/bug3.rb +46 -0
- data/test/bug_fast.rb +32 -0
- data/test/bug_load.rb +24 -0
- data/test/example.rb +11 -0
- data/test/io.rb +48 -0
- data/test/isolated/test_mimic_as_json.rb +45 -0
- data/test/{test_range.rb → mod.rb} +6 -9
- data/test/struct.rb +29 -0
- data/test/test_serializer.rb +59 -0
- data/test/write_timebars.rb +31 -0
- data/test/zip.rb +34 -0
- metadata +50 -51
- data/test/perf1.rb +0 -64
- data/test/perf2.rb +0 -76
- data/test/perf_obj_old.rb +0 -213
- data/test/test_bigd.rb +0 -63
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 13e345b717fb9e6ce7ab0c1f7e96c23586148c16
|
4
|
+
data.tar.gz: 19dd28489fcd97c301e4ea744f3b9114c3de107b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cdc08e19e3621678e07531b89831fda57c23b4b4efa1f50ec94573058e0f82864dab1cfd62b4a9bc4a97732d17fb77c49d1f88bad7c7503334cc78e15981095e
|
7
|
+
data.tar.gz: 46a77fd33b9b2b2424082f84e401d39bad85da74887e35cc4450310c4b0798f490e440a4a21e2987868e0f0c07486020bf885a1ec4d85314682164d0b7537d9a
|
data/README.md
CHANGED
@@ -26,7 +26,11 @@ Follow [@peterohler on Twitter](http://twitter.com/#!/peterohler) for announceme
|
|
26
26
|
|
27
27
|
[](http://travis-ci.org/ohler55/oj)
|
28
28
|
|
29
|
-
## Current Release 2.12.
|
29
|
+
## Current Release 2.12.12
|
30
|
+
|
31
|
+
- Thanks to asurin for adding support for arguments to to_json() that rails uses.
|
32
|
+
|
33
|
+
## Release 2.12.11
|
30
34
|
|
31
35
|
- Oj::ParseError is now thrown instead of SyntaxError when there are multiple
|
32
36
|
JSON documents in a string or file and there is no proc or block associated
|
data/ext/oj/dump.c
CHANGED
@@ -59,7 +59,7 @@
|
|
59
59
|
typedef unsigned long ulong;
|
60
60
|
|
61
61
|
static void raise_strict(VALUE obj);
|
62
|
-
static void dump_val(VALUE obj, int depth, Out out);
|
62
|
+
static void dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv);
|
63
63
|
static void dump_nil(Out out);
|
64
64
|
static void dump_true(Out out);
|
65
65
|
static void dump_false(Out out);
|
@@ -87,7 +87,7 @@ static void dump_data_strict(VALUE obj, Out out);
|
|
87
87
|
static void dump_data_null(VALUE obj, Out out);
|
88
88
|
static void dump_data_comp(VALUE obj, int depth, Out out);
|
89
89
|
static void dump_data_obj(VALUE obj, int depth, Out out);
|
90
|
-
static void dump_obj_comp(VALUE obj, int depth, Out out);
|
90
|
+
static void dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv);
|
91
91
|
static void dump_obj_obj(VALUE obj, int depth, Out out);
|
92
92
|
static void dump_struct_comp(VALUE obj, int depth, Out out);
|
93
93
|
static void dump_struct_obj(VALUE obj, int depth, Out out);
|
@@ -728,7 +728,7 @@ dump_array(VALUE a, VALUE clas, int depth, Out out) {
|
|
728
728
|
}
|
729
729
|
}
|
730
730
|
}
|
731
|
-
dump_val(rb_ary_entry(a, i), d2, out);
|
731
|
+
dump_val(rb_ary_entry(a, i), d2, out, 0, 0);
|
732
732
|
if (i < cnt) {
|
733
733
|
*out->cur++ = ',';
|
734
734
|
}
|
@@ -806,7 +806,7 @@ hash_cb_strict(VALUE key, VALUE value, Out out) {
|
|
806
806
|
out->cur += out->opts->dump_opts->after_size;
|
807
807
|
}
|
808
808
|
}
|
809
|
-
dump_val(value, depth, out);
|
809
|
+
dump_val(value, depth, out, 0, 0);
|
810
810
|
out->depth = depth;
|
811
811
|
*out->cur++ = ',';
|
812
812
|
|
@@ -870,7 +870,7 @@ hash_cb_compat(VALUE key, VALUE value, Out out) {
|
|
870
870
|
out->cur += out->opts->dump_opts->after_size;
|
871
871
|
}
|
872
872
|
}
|
873
|
-
dump_val(value, depth, out);
|
873
|
+
dump_val(value, depth, out, 0, 0);
|
874
874
|
out->depth = depth;
|
875
875
|
*out->cur++ = ',';
|
876
876
|
|
@@ -889,11 +889,11 @@ hash_cb_object(VALUE key, VALUE value, Out out) {
|
|
889
889
|
if (rb_type(key) == T_STRING) {
|
890
890
|
dump_str_obj(key, Qundef, depth, out);
|
891
891
|
*out->cur++ = ':';
|
892
|
-
dump_val(value, depth, out);
|
892
|
+
dump_val(value, depth, out, 0, 0);
|
893
893
|
} else if (rb_type(key) == T_SYMBOL) {
|
894
894
|
dump_sym_obj(key, out);
|
895
895
|
*out->cur++ = ':';
|
896
|
-
dump_val(value, depth, out);
|
896
|
+
dump_val(value, depth, out, 0, 0);
|
897
897
|
} else {
|
898
898
|
int d2 = depth + 1;
|
899
899
|
long s2 = size + out->indent + 1;
|
@@ -921,13 +921,13 @@ hash_cb_object(VALUE key, VALUE value, Out out) {
|
|
921
921
|
*out->cur++ = ':';
|
922
922
|
*out->cur++ = '[';
|
923
923
|
fill_indent(out, d2);
|
924
|
-
dump_val(key, d2, out);
|
924
|
+
dump_val(key, d2, out, 0, 0);
|
925
925
|
if (out->end - out->cur <= (long)s2) {
|
926
926
|
grow(out, s2);
|
927
927
|
}
|
928
928
|
*out->cur++ = ',';
|
929
929
|
fill_indent(out, d2);
|
930
|
-
dump_val(value, d2, out);
|
930
|
+
dump_val(value, d2, out, 0, 0);
|
931
931
|
if (out->end - out->cur <= (long)size) {
|
932
932
|
grow(out, size);
|
933
933
|
}
|
@@ -1266,7 +1266,7 @@ dump_data_comp(VALUE obj, int depth, Out out) {
|
|
1266
1266
|
|
1267
1267
|
dump_cstr(rb_string_value_ptr((VALUE*)&rstr), RSTRING_LEN(rstr), 0, 0, out);
|
1268
1268
|
} else {
|
1269
|
-
dump_val(aj, depth, out);
|
1269
|
+
dump_val(aj, depth, out, 0, 0);
|
1270
1270
|
}
|
1271
1271
|
} else if (Yes == out->opts->to_json && rb_respond_to(obj, oj_to_json_id)) {
|
1272
1272
|
volatile VALUE rs;
|
@@ -1349,7 +1349,7 @@ dump_data_obj(VALUE obj, int depth, Out out) {
|
|
1349
1349
|
}
|
1350
1350
|
|
1351
1351
|
static void
|
1352
|
-
dump_obj_comp(VALUE obj, int depth, Out out) {
|
1352
|
+
dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv) {
|
1353
1353
|
if (rb_respond_to(obj, oj_to_hash_id)) {
|
1354
1354
|
volatile VALUE h = rb_funcall(obj, oj_to_hash_id, 0);
|
1355
1355
|
|
@@ -1358,7 +1358,7 @@ dump_obj_comp(VALUE obj, int depth, Out out) {
|
|
1358
1358
|
}
|
1359
1359
|
dump_hash(h, Qundef, depth, out->opts->mode, out);
|
1360
1360
|
} else if (rb_respond_to(obj, oj_as_json_id)) {
|
1361
|
-
volatile VALUE aj =
|
1361
|
+
volatile VALUE aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
|
1362
1362
|
|
1363
1363
|
// Catch the obvious brain damaged recursive dumping.
|
1364
1364
|
if (aj == obj) {
|
@@ -1366,7 +1366,7 @@ dump_obj_comp(VALUE obj, int depth, Out out) {
|
|
1366
1366
|
|
1367
1367
|
dump_cstr(rb_string_value_ptr((VALUE*)&rstr), RSTRING_LEN(rstr), 0, 0, out);
|
1368
1368
|
} else {
|
1369
|
-
dump_val(aj, depth, out);
|
1369
|
+
dump_val(aj, depth, out, 0, 0);
|
1370
1370
|
}
|
1371
1371
|
} else if (Yes == out->opts->to_json && rb_respond_to(obj, oj_to_json_id)) {
|
1372
1372
|
volatile VALUE rs;
|
@@ -1477,7 +1477,7 @@ dump_attr_cb(ID key, VALUE value, Out out) {
|
|
1477
1477
|
dump_cstr(buf, strlen(buf), 0, 0, out);
|
1478
1478
|
}
|
1479
1479
|
*out->cur++ = ':';
|
1480
|
-
dump_val(value, depth, out);
|
1480
|
+
dump_val(value, depth, out, 0, 0);
|
1481
1481
|
out->depth = depth;
|
1482
1482
|
*out->cur++ = ',';
|
1483
1483
|
|
@@ -1631,7 +1631,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
1631
1631
|
dump_cstr(buf, strlen(attr) + 1, 0, 0, out);
|
1632
1632
|
}
|
1633
1633
|
*out->cur++ = ':';
|
1634
|
-
dump_val(rb_ivar_get(obj, vid), d2, out);
|
1634
|
+
dump_val(rb_ivar_get(obj, vid), d2, out, 0, 0);
|
1635
1635
|
if (out->end - out->cur <= 2) {
|
1636
1636
|
grow(out, 2);
|
1637
1637
|
}
|
@@ -1652,7 +1652,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
1652
1652
|
dump_cstr("~mesg", 5, 0, 0, out);
|
1653
1653
|
*out->cur++ = ':';
|
1654
1654
|
rv = rb_funcall2(obj, rb_intern("message"), 0, 0);
|
1655
|
-
dump_val(rv, d2, out);
|
1655
|
+
dump_val(rv, d2, out, 0, 0);
|
1656
1656
|
if (out->end - out->cur <= 2) {
|
1657
1657
|
grow(out, 2);
|
1658
1658
|
}
|
@@ -1665,7 +1665,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
1665
1665
|
dump_cstr("~bt", 3, 0, 0, out);
|
1666
1666
|
*out->cur++ = ':';
|
1667
1667
|
rv = rb_funcall2(obj, rb_intern("backtrace"), 0, 0);
|
1668
|
-
dump_val(rv, d2, out);
|
1668
|
+
dump_val(rv, d2, out, 0, 0);
|
1669
1669
|
if (out->end - out->cur <= 2) {
|
1670
1670
|
grow(out, 2);
|
1671
1671
|
}
|
@@ -1696,7 +1696,7 @@ dump_struct_comp(VALUE obj, int depth, Out out) {
|
|
1696
1696
|
|
1697
1697
|
dump_cstr(rb_string_value_ptr((VALUE*)&rstr), RSTRING_LEN(rstr), 0, 0, out);
|
1698
1698
|
} else {
|
1699
|
-
dump_val(aj, depth, out);
|
1699
|
+
dump_val(aj, depth, out, 0, 0);
|
1700
1700
|
}
|
1701
1701
|
} else if (Yes == out->opts->to_json && rb_respond_to(obj, oj_to_json_id)) {
|
1702
1702
|
volatile VALUE rs = rb_funcall(obj, oj_to_json_id, 0);
|
@@ -1778,7 +1778,7 @@ dump_struct_obj(VALUE obj, int depth, Out out) {
|
|
1778
1778
|
grow(out, size);
|
1779
1779
|
}
|
1780
1780
|
fill_indent(out, d3);
|
1781
|
-
dump_val(*vp, d3, out);
|
1781
|
+
dump_val(*vp, d3, out, 0, 0);
|
1782
1782
|
*out->cur++ = ',';
|
1783
1783
|
}
|
1784
1784
|
}
|
@@ -1793,7 +1793,7 @@ dump_struct_obj(VALUE obj, int depth, Out out) {
|
|
1793
1793
|
grow(out, size);
|
1794
1794
|
}
|
1795
1795
|
fill_indent(out, d3);
|
1796
|
-
dump_val(rb_struct_aref(obj, INT2FIX(i)), d3, out);
|
1796
|
+
dump_val(rb_struct_aref(obj, INT2FIX(i)), d3, out, 0, 0);
|
1797
1797
|
*out->cur++ = ',';
|
1798
1798
|
}
|
1799
1799
|
}
|
@@ -1876,7 +1876,7 @@ dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
|
|
1876
1876
|
fill_indent(out, d2);
|
1877
1877
|
dump_cstr(name, nlen, 0, 0, out);
|
1878
1878
|
*out->cur++ = ':';
|
1879
|
-
dump_val(v, d2, out);
|
1879
|
+
dump_val(v, d2, out, 0, 0);
|
1880
1880
|
if (out->end - out->cur <= 2) {
|
1881
1881
|
grow(out, 2);
|
1882
1882
|
}
|
@@ -1893,7 +1893,7 @@ raise_strict(VALUE obj) {
|
|
1893
1893
|
}
|
1894
1894
|
|
1895
1895
|
static void
|
1896
|
-
dump_val(VALUE obj, int depth, Out out) {
|
1896
|
+
dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv) {
|
1897
1897
|
int type = rb_type(obj);
|
1898
1898
|
|
1899
1899
|
if (MAX_DEPTH < depth) {
|
@@ -1965,7 +1965,7 @@ dump_val(VALUE obj, int depth, Out out) {
|
|
1965
1965
|
switch (out->opts->mode) {
|
1966
1966
|
case StrictMode: dump_data_strict(obj, out); break;
|
1967
1967
|
case NullMode: dump_data_null(obj, out); break;
|
1968
|
-
case CompatMode: dump_obj_comp(obj, depth, out); break;
|
1968
|
+
case CompatMode: dump_obj_comp(obj, depth, out, argc, argv); break;
|
1969
1969
|
case ObjectMode:
|
1970
1970
|
default: dump_obj_obj(obj, depth, out); break;
|
1971
1971
|
}
|
@@ -1988,7 +1988,7 @@ dump_val(VALUE obj, int depth, Out out) {
|
|
1988
1988
|
case NullMode: dump_nil(out); break;
|
1989
1989
|
case CompatMode:
|
1990
1990
|
case ObjectMode:
|
1991
|
-
default: dump_obj_comp(obj, depth, out); break;
|
1991
|
+
default: dump_obj_comp(obj, depth, out, argc, argv); break;
|
1992
1992
|
}
|
1993
1993
|
break;
|
1994
1994
|
default:
|
@@ -2002,6 +2002,11 @@ dump_val(VALUE obj, int depth, Out out) {
|
|
2002
2002
|
|
2003
2003
|
void
|
2004
2004
|
oj_dump_obj_to_json(VALUE obj, Options copts, Out out) {
|
2005
|
+
oj_dump_obj_to_json_using_params(obj, copts, out, 0, 0);
|
2006
|
+
}
|
2007
|
+
|
2008
|
+
void
|
2009
|
+
oj_dump_obj_to_json_using_params(VALUE obj, Options copts, Out out, int argc, VALUE *argv) {
|
2005
2010
|
if (0 == out->buf) {
|
2006
2011
|
out->buf = ALLOC_N(char, 4096);
|
2007
2012
|
out->end = out->buf + 4095 - BUFFER_EXTRA; // 1 less than end plus extra for possible errors
|
@@ -2015,7 +2020,7 @@ oj_dump_obj_to_json(VALUE obj, Options copts, Out out) {
|
|
2015
2020
|
oj_cache8_new(&out->circ_cache);
|
2016
2021
|
}
|
2017
2022
|
out->indent = copts->indent;
|
2018
|
-
dump_val(obj, 0, out);
|
2023
|
+
dump_val(obj, 0, out, argc, argv);
|
2019
2024
|
if (0 < out->indent) {
|
2020
2025
|
switch (*(out->cur - 1)) {
|
2021
2026
|
case ']':
|
@@ -2462,7 +2467,7 @@ oj_str_writer_push_value(StrWriter sw, VALUE val, const char *key) {
|
|
2462
2467
|
*sw->out.cur++ = ':';
|
2463
2468
|
}
|
2464
2469
|
}
|
2465
|
-
dump_val(val, sw->depth, &sw->out);
|
2470
|
+
dump_val(val, sw->depth, &sw->out, 0, 0);
|
2466
2471
|
}
|
2467
2472
|
|
2468
2473
|
void
|
data/ext/oj/oj.c
CHANGED
@@ -1821,7 +1821,7 @@ mimic_object_to_json(int argc, VALUE *argv, VALUE self) {
|
|
1821
1821
|
// To be strict the mimic_object_to_json_options should be used but people
|
1822
1822
|
// seem to prefer the option of changing that.
|
1823
1823
|
//oj_dump_obj_to_json(self, &mimic_object_to_json_options, &out);
|
1824
|
-
|
1824
|
+
oj_dump_obj_to_json_using_params(self, &copts, &out, argc, argv);
|
1825
1825
|
if (0 == out.buf) {
|
1826
1826
|
rb_raise(rb_eNoMemError, "Not enough memory.");
|
1827
1827
|
}
|
data/ext/oj/oj.h
CHANGED
@@ -216,6 +216,7 @@ extern VALUE oj_object_parse_cstr(int argc, VALUE *argv, char *json, size_t len)
|
|
216
216
|
extern void oj_parse_options(VALUE ropts, Options copts);
|
217
217
|
|
218
218
|
extern void oj_dump_obj_to_json(VALUE obj, Options copts, Out out);
|
219
|
+
extern void oj_dump_obj_to_json_using_params(VALUE obj, Options copts, Out out, int argc, VALUE *argv);
|
219
220
|
extern void oj_write_obj_to_file(VALUE obj, const char *path, Options copts);
|
220
221
|
extern void oj_write_obj_to_stream(VALUE obj, VALUE stream, Options copts);
|
221
222
|
extern void oj_dump_leaf_to_json(Leaf leaf, Options copts, Out out);
|
data/lib/oj/version.rb
CHANGED
data/test/bug.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
1
3
|
#!/usr/bin/env ruby
|
2
4
|
# encoding: UTF-8
|
3
5
|
|
@@ -5,60 +7,47 @@ $: << File.dirname(__FILE__)
|
|
5
7
|
|
6
8
|
require 'helper'
|
7
9
|
|
8
|
-
require 'oj'
|
9
|
-
require 'securerandom'
|
10
|
-
|
11
10
|
class Handler
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def
|
17
|
-
|
11
|
+
def initialize
|
12
|
+
@state = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def hash_start
|
16
|
+
@state << {}
|
17
|
+
@state.last
|
18
|
+
end
|
19
|
+
|
20
|
+
def hash_end
|
21
|
+
@state.pop
|
22
|
+
end
|
23
|
+
|
24
|
+
def hash_set(h,k,v)
|
25
|
+
h.store(k,v)
|
18
26
|
end
|
19
|
-
end
|
20
27
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
name = "/tmp/#{SecureRandom.uuid}"
|
25
|
-
`mkfifo #{name}`
|
26
|
-
if fork
|
27
|
-
open(name, 'r+') do |read_io|
|
28
|
-
p "start reading #{read_io.stat.ftype}"
|
29
|
-
Oj.sc_parse(Handler.new, read_io) {|v| p v}
|
30
|
-
p "stop reading"
|
31
|
-
end
|
32
|
-
else
|
33
|
-
open(name, 'w+') do |write_io|
|
34
|
-
p "start writing #{write_io.stat.ftype} autoclose: #{write_io.autoclose?}"
|
35
|
-
write_io.write json
|
36
|
-
write_io.write json
|
37
|
-
p "stop writing"
|
38
|
-
end
|
39
|
-
sleep(1) # make it obvious that there are two threads
|
40
|
-
open(name, 'w+') do |write_io|
|
41
|
-
p "start writing #{write_io.stat.ftype}"
|
42
|
-
write_io.write json
|
43
|
-
write_io.write json
|
44
|
-
p "stop writing"
|
45
|
-
end
|
28
|
+
def array_start
|
29
|
+
@state << []
|
30
|
+
@state.last
|
46
31
|
end
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
write_io.write json
|
60
|
-
p "stop writing"
|
61
|
-
write_io.close
|
62
|
-
end
|
32
|
+
|
33
|
+
|
34
|
+
def array_end
|
35
|
+
@state.pop
|
36
|
+
end
|
37
|
+
|
38
|
+
def array_append(a,v)
|
39
|
+
a << v
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_value(v)
|
43
|
+
p v
|
63
44
|
end
|
45
|
+
|
46
|
+
def error(message, line, column); p "ERROR: #{message}" end
|
64
47
|
end
|
48
|
+
|
49
|
+
$handler = Handler.new
|
50
|
+
|
51
|
+
IO.popen("cat tst") { |p| puts Oj.sc_parse($handler, p) }
|
52
|
+
|
53
|
+
#File.open('tst', 'r') { |file| Oj.sc_parse($handler, file) }
|
data/test/bug2.rb
ADDED
data/test/bug3.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#!/usr/bin/env ruby
|
4
|
+
# encoding: UTF-8
|
5
|
+
|
6
|
+
$: << File.dirname(__FILE__)
|
7
|
+
%w(lib ext test).each do |dir|
|
8
|
+
$LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'oj'
|
12
|
+
require 'stringio'
|
13
|
+
|
14
|
+
class Parser < Oj::Saj
|
15
|
+
|
16
|
+
def parse(json)
|
17
|
+
Oj.saj_parse(self, StringIO.new(json))
|
18
|
+
end
|
19
|
+
|
20
|
+
def hash_start(key)
|
21
|
+
puts "START: #{key}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def error(message, line, column)
|
25
|
+
puts "Error callback: #{message}"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
parser = Parser.new
|
31
|
+
|
32
|
+
begin
|
33
|
+
# truncated JSON, Oj.saj_parse raises, #error not called
|
34
|
+
parser.parse('{"foo{"bar":')
|
35
|
+
rescue Exception => e
|
36
|
+
puts "*** #{e.class}: #{e.message}"
|
37
|
+
end
|
38
|
+
|
39
|
+
puts "\n\n"
|
40
|
+
|
41
|
+
begin
|
42
|
+
# invalid JSON, doesn't raise an error
|
43
|
+
parser.parse('{"foo":{"bar":}')
|
44
|
+
rescue Exception => e
|
45
|
+
puts "*** #{e.class}: #{e.message}"
|
46
|
+
end
|
data/test/bug_fast.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
%w(lib ext test).each do |dir|
|
5
|
+
$LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'oj'
|
9
|
+
|
10
|
+
def create_item(doc)
|
11
|
+
#puts "#{doc.fetch('/id')}: #{doc.fetch('/labels/it/value')} - #{doc.fetch('/descriptions/it/value')}"
|
12
|
+
doc.fetch('/id')
|
13
|
+
doc.fetch('/labels/it/value')
|
14
|
+
doc.fetch('/descriptions/it/value')
|
15
|
+
end
|
16
|
+
|
17
|
+
100.times { |i|
|
18
|
+
File.open('dump_10k.json') { |f|
|
19
|
+
f.each { |line|
|
20
|
+
#Oj::Doc.open(line) { |doc|
|
21
|
+
doc = Oj::Doc.open(line)
|
22
|
+
begin
|
23
|
+
create_item(doc) if doc.fetch('/type') == 'item'
|
24
|
+
rescue Exception => e
|
25
|
+
puts "*** #{e.class}: #{e.message}"
|
26
|
+
end
|
27
|
+
doc.close
|
28
|
+
#}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
puts i
|
32
|
+
}
|