oj 2.13.1 → 2.14.0
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/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
|