oj 2.13.1 → 2.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +177 -104
- data/ext/oj/dump.c +60 -60
- data/ext/oj/oj.c +319 -343
- data/ext/oj/oj.h +27 -25
- data/ext/oj/parse.c +19 -9
- data/lib/oj/version.rb +1 -1
- data/test/test_various.rb +47 -32
- metadata +2 -4
- data/test/zip.rb +0 -34
data/ext/oj/oj.h
CHANGED
@@ -46,6 +46,7 @@ extern "C" {
|
|
46
46
|
#endif
|
47
47
|
|
48
48
|
#include "stdint.h"
|
49
|
+
#include "stdbool.h"
|
49
50
|
|
50
51
|
#if USE_PTHREAD_MUTEX
|
51
52
|
#include <pthread.h>
|
@@ -114,11 +115,12 @@ typedef enum {
|
|
114
115
|
} StreamWriterType;
|
115
116
|
|
116
117
|
typedef struct _DumpOpts {
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
118
|
+
bool use;
|
119
|
+
char indent_str[16];
|
120
|
+
char before_sep[16];
|
121
|
+
char after_sep[16];
|
122
|
+
char hash_nl[16];
|
123
|
+
char array_nl[16];
|
122
124
|
uint8_t indent_size;
|
123
125
|
uint8_t before_size;
|
124
126
|
uint8_t after_size;
|
@@ -127,26 +129,26 @@ typedef struct _DumpOpts {
|
|
127
129
|
} *DumpOpts;
|
128
130
|
|
129
131
|
typedef struct _Options {
|
130
|
-
int
|
131
|
-
char
|
132
|
-
char
|
133
|
-
char
|
134
|
-
char
|
135
|
-
char
|
136
|
-
char
|
137
|
-
char
|
138
|
-
char
|
139
|
-
char
|
140
|
-
char
|
141
|
-
char
|
142
|
-
char
|
143
|
-
char
|
144
|
-
const char
|
145
|
-
size_t
|
146
|
-
int
|
147
|
-
|
148
|
-
char
|
149
|
-
|
132
|
+
int indent; // indention for dump, default 2
|
133
|
+
char circular; // YesNo
|
134
|
+
char auto_define; // YesNo
|
135
|
+
char sym_key; // YesNo
|
136
|
+
char escape_mode; // Escape_Mode
|
137
|
+
char mode; // Mode
|
138
|
+
char class_cache; // YesNo
|
139
|
+
char time_format; // TimeFormat
|
140
|
+
char bigdec_as_num; // YesNo
|
141
|
+
char bigdec_load; // BigLoad
|
142
|
+
char to_json; // YesNo
|
143
|
+
char nilnil; // YesNo
|
144
|
+
char allow_gc; // allow GC during parse
|
145
|
+
char quirks_mode; // allow single JSON values instead of documents
|
146
|
+
const char *create_id; // 0 or string
|
147
|
+
size_t create_id_len; // length of create_id
|
148
|
+
int sec_prec; // second precision when dumping time
|
149
|
+
char float_prec; // float precision, linked to float_fmt
|
150
|
+
char float_fmt[7]; // float format for dumping, if empty use Ruby
|
151
|
+
struct _DumpOpts dump_opts;
|
150
152
|
} *Options;
|
151
153
|
|
152
154
|
typedef struct _Out {
|
data/ext/oj/parse.c
CHANGED
@@ -720,16 +720,26 @@ oj_num_as_value(NumInfo ni) {
|
|
720
720
|
double d = (double)ni->i * (double)ni->div + (double)ni->num;
|
721
721
|
int x = ni->exp - ni->di;
|
722
722
|
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
723
|
+
// Rounding sometimes cuts off the last digit even if there are only
|
724
|
+
// 15 digits. This attempts to fix those few cases where this
|
725
|
+
// occurs.
|
726
|
+
if ((double)INT64_MAX > d && (int64_t)d != (ni->i * ni->div + ni->num)) {
|
727
|
+
rnum = rb_funcall(oj_bigdecimal_class, oj_new_id, 1, rb_str_new(ni->str, ni->len));
|
728
|
+
if (ni->no_big) {
|
729
|
+
rnum = rb_funcall(rnum, rb_intern("to_f"), 0);
|
730
|
+
}
|
731
|
+
} else {
|
732
|
+
d = round(d);
|
733
|
+
if (0 < x) {
|
734
|
+
d *= pow(10.0L, x);
|
735
|
+
} else if (0 > x) {
|
736
|
+
d /= pow(10.0L, -x);
|
737
|
+
}
|
738
|
+
if (ni->neg) {
|
739
|
+
d = -d;
|
740
|
+
}
|
741
|
+
rnum = rb_float_new(d);
|
731
742
|
}
|
732
|
-
rnum = rb_float_new(d);
|
733
743
|
}
|
734
744
|
}
|
735
745
|
return rnum;
|
data/lib/oj/version.rb
CHANGED
data/test/test_various.rb
CHANGED
@@ -115,27 +115,10 @@ class Juice < Minitest::Test
|
|
115
115
|
end
|
116
116
|
=end
|
117
117
|
def test_set_options
|
118
|
-
orig =
|
119
|
-
|
120
|
-
:
|
121
|
-
:
|
122
|
-
:class_cache=>true,
|
123
|
-
:auto_define=>false,
|
124
|
-
:symbol_keys=>false,
|
125
|
-
:bigdecimal_as_decimal=>true,
|
126
|
-
:use_to_json=>true,
|
127
|
-
:nilnil=>false,
|
128
|
-
:allow_gc=>true,
|
129
|
-
:quirks_mode=>true,
|
130
|
-
:float_precision=>15,
|
131
|
-
:mode=>:object,
|
132
|
-
:escape_mode=>:json,
|
133
|
-
:time_format=>:unix,
|
134
|
-
:bigdecimal_load=>:auto,
|
135
|
-
:create_id=>'json_class'}
|
136
|
-
o2 = {
|
137
|
-
:indent=>4,
|
138
|
-
:second_precision=>7,
|
118
|
+
orig = Oj.default_options()
|
119
|
+
alt ={
|
120
|
+
:indent=>" - ",
|
121
|
+
:second_precision=>5,
|
139
122
|
:circular=>true,
|
140
123
|
:class_cache=>false,
|
141
124
|
:auto_define=>true,
|
@@ -144,19 +127,26 @@ class Juice < Minitest::Test
|
|
144
127
|
:use_to_json=>false,
|
145
128
|
:nilnil=>true,
|
146
129
|
:allow_gc=>false,
|
147
|
-
:quirks_mode=>
|
148
|
-
:float_precision=>
|
149
|
-
:mode=>:
|
150
|
-
:escape_mode=>:
|
151
|
-
:time_format=>:
|
152
|
-
:bigdecimal_load=>:
|
153
|
-
:create_id=>
|
154
|
-
|
155
|
-
|
130
|
+
:quirks_mode=>false,
|
131
|
+
:float_precision=>13,
|
132
|
+
:mode=>:strict,
|
133
|
+
:escape_mode=>:ascii,
|
134
|
+
:time_format=>:unix_zone,
|
135
|
+
:bigdecimal_load=>:float,
|
136
|
+
:create_id=>'classy',
|
137
|
+
:space=>'z',
|
138
|
+
:array_nl=>'a',
|
139
|
+
:object_nl=>'o',
|
140
|
+
:space_before=>'b',
|
141
|
+
}
|
142
|
+
Oj.default_options = alt
|
156
143
|
opts = Oj.default_options()
|
157
|
-
assert_equal(
|
158
|
-
|
144
|
+
assert_equal(alt, opts);
|
145
|
+
|
159
146
|
Oj.default_options = orig # return to original
|
147
|
+
# verify back to original
|
148
|
+
opts = Oj.default_options()
|
149
|
+
assert_equal(orig, opts);
|
160
150
|
end
|
161
151
|
|
162
152
|
def test_nil
|
@@ -260,6 +250,31 @@ class Juice < Minitest::Test
|
|
260
250
|
assert_equal(json, json2)
|
261
251
|
end
|
262
252
|
|
253
|
+
def test_dump_options
|
254
|
+
json = Oj.dump({ 'a' => 1, 'b' => [true, false]},
|
255
|
+
:mode => :compat,
|
256
|
+
:indent => "--",
|
257
|
+
:array_nl => "\n",
|
258
|
+
:object_nl => "#\n",
|
259
|
+
:space => "*",
|
260
|
+
:space_before => "~")
|
261
|
+
assert(%{{#
|
262
|
+
--"a"~:*1,#
|
263
|
+
--"b"~:*[
|
264
|
+
----true,
|
265
|
+
----false
|
266
|
+
--]#
|
267
|
+
}} == json ||
|
268
|
+
%{{#
|
269
|
+
--"b"~:*[
|
270
|
+
----true,
|
271
|
+
----false
|
272
|
+
--],#
|
273
|
+
--"a"~:*1#
|
274
|
+
}} == json)
|
275
|
+
|
276
|
+
end
|
277
|
+
|
263
278
|
def test_null_char
|
264
279
|
assert_raises(Oj::ParseError) { Oj.load("\"\0\"") }
|
265
280
|
assert_raises(Oj::ParseError) { Oj.load("\"\\\0\"") }
|
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: 2.
|
4
|
+
version: 2.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -161,7 +161,6 @@ files:
|
|
161
161
|
- test/test_various.rb
|
162
162
|
- test/test_writer.rb
|
163
163
|
- test/write_timebars.rb
|
164
|
-
- test/zip.rb
|
165
164
|
homepage: http://www.ohler.com/oj
|
166
165
|
licenses:
|
167
166
|
- MIT
|
@@ -248,5 +247,4 @@ test_files:
|
|
248
247
|
- test/test_various.rb
|
249
248
|
- test/test_writer.rb
|
250
249
|
- test/write_timebars.rb
|
251
|
-
- test/zip.rb
|
252
250
|
has_rdoc: true
|
data/test/zip.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
$: << File.dirname(__FILE__)
|
5
|
-
|
6
|
-
require 'helper'
|
7
|
-
|
8
|
-
require 'zlib'
|
9
|
-
|
10
|
-
File.open('test.json.gz', 'r') do |file|
|
11
|
-
Zlib::GzipReader.wrap(file) do |f2|
|
12
|
-
puts "*** f2: #{f2}"
|
13
|
-
Oj.load(f2) do |val|
|
14
|
-
puts val
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
=begin
|
20
|
-
And a json file with the following contents (then gzipped):
|
21
|
-
|
22
|
-
{"a":2}
|
23
|
-
{"b":2}
|
24
|
-
The output is:
|
25
|
-
|
26
|
-
{"a"=>2}
|
27
|
-
{"b"=>2}
|
28
|
-
bin/test:8:in `load': undefined method `new' for #<EOFError: end of file reached> (NoMethodError)
|
29
|
-
from bin/test:8:in `block (2 levels) in <main>'
|
30
|
-
from bin/test:7:in `wrap'
|
31
|
-
from bin/test:7:in `block in <main>'
|
32
|
-
from bin/test:6:in `open'
|
33
|
-
from bin/test:6:in `<main>'
|
34
|
-
=end
|