oj 3.10.6 → 3.12.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 +6 -1
- data/ext/oj/buf.h +36 -68
- data/ext/oj/cache8.c +59 -62
- data/ext/oj/cache8.h +9 -36
- data/ext/oj/circarray.c +36 -42
- data/ext/oj/circarray.h +12 -13
- data/ext/oj/code.c +172 -179
- data/ext/oj/code.h +22 -24
- data/ext/oj/compat.c +168 -181
- data/ext/oj/custom.c +800 -864
- data/ext/oj/dump.c +774 -776
- data/ext/oj/dump.h +50 -55
- data/ext/oj/dump_compat.c +2 -4
- data/ext/oj/dump_leaf.c +118 -162
- data/ext/oj/dump_object.c +610 -632
- data/ext/oj/dump_strict.c +319 -331
- data/ext/oj/encode.h +4 -33
- data/ext/oj/err.c +40 -29
- data/ext/oj/err.h +25 -44
- data/ext/oj/extconf.rb +2 -1
- data/ext/oj/fast.c +1054 -1081
- data/ext/oj/hash.c +78 -95
- data/ext/oj/hash.h +10 -35
- data/ext/oj/hash_test.c +451 -472
- data/ext/oj/mimic_json.c +415 -402
- data/ext/oj/object.c +588 -532
- data/ext/oj/odd.c +124 -132
- data/ext/oj/odd.h +28 -29
- data/ext/oj/oj.c +1178 -905
- data/ext/oj/oj.h +289 -298
- data/ext/oj/parse.c +946 -870
- data/ext/oj/parse.h +81 -79
- data/ext/oj/rails.c +837 -842
- data/ext/oj/rails.h +8 -11
- data/ext/oj/reader.c +139 -147
- data/ext/oj/reader.h +68 -84
- data/ext/oj/resolve.c +44 -47
- data/ext/oj/resolve.h +4 -6
- data/ext/oj/rxclass.c +69 -73
- data/ext/oj/rxclass.h +13 -14
- data/ext/oj/saj.c +453 -484
- data/ext/oj/scp.c +88 -113
- data/ext/oj/sparse.c +783 -714
- data/ext/oj/stream_writer.c +123 -157
- data/ext/oj/strict.c +133 -106
- data/ext/oj/string_writer.c +199 -247
- data/ext/oj/trace.c +34 -41
- data/ext/oj/trace.h +15 -15
- data/ext/oj/util.c +104 -104
- data/ext/oj/util.h +4 -3
- data/ext/oj/val_stack.c +48 -76
- data/ext/oj/val_stack.h +80 -115
- data/ext/oj/wab.c +317 -328
- data/lib/oj.rb +0 -8
- data/lib/oj/bag.rb +1 -0
- data/lib/oj/easy_hash.rb +5 -4
- data/lib/oj/mimic.rb +45 -13
- data/lib/oj/version.rb +1 -1
- data/pages/Modes.md +1 -0
- data/pages/Options.md +23 -11
- data/test/activerecord/result_test.rb +7 -2
- data/test/foo.rb +8 -40
- data/test/helper.rb +10 -0
- data/test/json_gem/json_common_interface_test.rb +8 -3
- data/test/json_gem/json_generator_test.rb +15 -3
- data/test/json_gem/test_helper.rb +8 -0
- data/test/perf.rb +1 -1
- data/test/perf_scp.rb +11 -10
- data/test/perf_strict.rb +17 -23
- data/test/prec.rb +23 -0
- data/test/sample_json.rb +1 -1
- data/test/test_compat.rb +16 -3
- data/test/test_custom.rb +11 -0
- data/test/test_fast.rb +32 -2
- data/test/test_generate.rb +21 -0
- data/test/test_hash.rb +10 -0
- data/test/test_rails.rb +9 -0
- data/test/test_scp.rb +1 -1
- data/test/test_various.rb +4 -2
- metadata +89 -85
data/lib/oj.rb
CHANGED
@@ -2,14 +2,6 @@
|
|
2
2
|
module Oj
|
3
3
|
end
|
4
4
|
|
5
|
-
begin
|
6
|
-
# This require exists to get around Rubinius failing to load bigdecimal from
|
7
|
-
# the C extension.
|
8
|
-
require 'bigdecimal'
|
9
|
-
rescue Exception
|
10
|
-
# ignore
|
11
|
-
end
|
12
|
-
|
13
5
|
require 'oj/version'
|
14
6
|
require 'oj/bag'
|
15
7
|
require 'oj/easy_hash'
|
data/lib/oj/bag.rb
CHANGED
data/lib/oj/easy_hash.rb
CHANGED
@@ -12,13 +12,14 @@ module Oj
|
|
12
12
|
|
13
13
|
# Replaces the Object.respond_to?() method.
|
14
14
|
# @param [Symbol] m method symbol
|
15
|
+
# @param [Boolean] include_all whether to include private and protected methods in the search
|
15
16
|
# @return [Boolean] true for any method that matches an instance
|
16
17
|
# variable reader, otherwise false.
|
17
|
-
def respond_to?(m)
|
18
|
+
def respond_to?(m, include_all = false)
|
18
19
|
return true if super
|
19
|
-
return true if has_key?(
|
20
|
-
return true if has_key?(
|
21
|
-
has_key?(
|
20
|
+
return true if has_key?(m)
|
21
|
+
return true if has_key?(m.to_s)
|
22
|
+
has_key?(m.to_sym)
|
22
23
|
end
|
23
24
|
|
24
25
|
def [](key)
|
data/lib/oj/mimic.rb
CHANGED
@@ -8,6 +8,50 @@ end
|
|
8
8
|
|
9
9
|
module Oj
|
10
10
|
|
11
|
+
##
|
12
|
+
# Custom mode can be used to emulate the compat mode with some minor
|
13
|
+
# differences. These are the options that setup the custom mode to be like
|
14
|
+
# the compat mode.
|
15
|
+
CUSTOM_MIMIC_JSON_OPTIONS = {
|
16
|
+
allow_gc: true,
|
17
|
+
allow_invalid_unicode: false,
|
18
|
+
allow_nan: false,
|
19
|
+
array_class: nil,
|
20
|
+
array_nl: nil,
|
21
|
+
auto_define: false,
|
22
|
+
bigdecimal_as_decimal: false,
|
23
|
+
bigdecimal_load: :auto,
|
24
|
+
circular: false,
|
25
|
+
class_cache: false,
|
26
|
+
create_additions: false,
|
27
|
+
create_id: "json_class",
|
28
|
+
empty_string: false,
|
29
|
+
escape_mode: :unicode_xss,
|
30
|
+
float_precision: 0,
|
31
|
+
hash_class: nil,
|
32
|
+
ignore: nil,
|
33
|
+
ignore_under: false,
|
34
|
+
indent: 0,
|
35
|
+
integer_range: nil,
|
36
|
+
mode: :custom,
|
37
|
+
nan: :raise,
|
38
|
+
nilnil: false,
|
39
|
+
object_nl: nil,
|
40
|
+
omit_nil: false,
|
41
|
+
quirks_mode: true,
|
42
|
+
safe: false,
|
43
|
+
second_precision: 3,
|
44
|
+
space: nil,
|
45
|
+
space_before: nil,
|
46
|
+
symbol_keys: false,
|
47
|
+
time_format: :ruby,
|
48
|
+
trace: false,
|
49
|
+
use_as_json: false,
|
50
|
+
use_raw_json: false,
|
51
|
+
use_to_hash: false,
|
52
|
+
use_to_json: true,
|
53
|
+
}
|
54
|
+
|
11
55
|
# A bit hack-ish but does the trick. The JSON.dump_default_options is a Hash
|
12
56
|
# but in mimic we use a C struct to store defaults. This class creates a view
|
13
57
|
# onto that struct.
|
@@ -38,7 +82,7 @@ module Oj
|
|
38
82
|
|
39
83
|
jfile = File.join(d, 'json.rb')
|
40
84
|
$LOADED_FEATURES << jfile unless $LOADED_FEATURES.include?(jfile) if File.exist?(jfile)
|
41
|
-
|
85
|
+
|
42
86
|
Dir.glob(File.join(d, 'json', '**', '*.rb')).each do |file|
|
43
87
|
# allow json/add/xxx to be loaded. User can override with Oj.add_to_json(xxx).
|
44
88
|
$LOADED_FEATURES << file unless $LOADED_FEATURES.include?(file) unless file.include?('add')
|
@@ -89,18 +133,6 @@ module Oj
|
|
89
133
|
end
|
90
134
|
end
|
91
135
|
|
92
|
-
Date.class_eval do
|
93
|
-
# Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
|
94
|
-
unless defined?(self.as_json)
|
95
|
-
def as_json(*)
|
96
|
-
{ JSON.create_id => 'Date', 'y' => year, 'm' => month, 'd' => day, 'sg' => start }
|
97
|
-
end
|
98
|
-
end
|
99
|
-
def self.json_create(h)
|
100
|
-
civil(h['y'], h['m'], h['d'], h['sg'])
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
136
|
DateTime.class_eval do
|
105
137
|
# Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
|
106
138
|
unless defined?(self.as_json)
|
data/lib/oj/version.rb
CHANGED
data/pages/Modes.md
CHANGED
@@ -96,6 +96,7 @@ information.
|
|
96
96
|
| :auto_define | Boolean | | | | | x | x | |
|
97
97
|
| :bigdecimal_as_decimal | Boolean | | | | 3 | x | x | |
|
98
98
|
| :bigdecimal_load | Boolean | | | | | | x | |
|
99
|
+
| :compat_bigdecimal | Boolean | | | x | | | x | |
|
99
100
|
| :circular | Boolean | x | x | x | x | x | x | |
|
100
101
|
| :class_cache | Boolean | | | | | x | x | |
|
101
102
|
| :create_additions | Boolean | | | x | x | | x | |
|
data/pages/Options.md
CHANGED
@@ -66,6 +66,18 @@ 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
|
+
|
73
|
+
### :compat_bigdecimal [Boolean]
|
74
|
+
|
75
|
+
Determines how to load decimals when in `:compat` mode.
|
76
|
+
|
77
|
+
- `true` convert all decimal numbers to BigDecimal.
|
78
|
+
|
79
|
+
- `false` convert all decimal numbers to Float.
|
80
|
+
|
69
81
|
### :circular [Boolean]
|
70
82
|
|
71
83
|
Detect circular references while dumping. In :compat mode raise a
|
@@ -80,16 +92,16 @@ dynamically modifying classes or reloading classes then don't use this.
|
|
80
92
|
|
81
93
|
### :create_additions
|
82
94
|
|
83
|
-
A flag indicating the :create_id key when encountered during parsing
|
84
|
-
|
85
|
-
with the key.
|
95
|
+
A flag indicating that the :create_id key, when encountered during parsing,
|
96
|
+
should create an Object matching the class name specified in the value
|
97
|
+
associated with the key.
|
86
98
|
|
87
99
|
### :create_id [String]
|
88
100
|
|
89
101
|
The :create_id option specifies that key is used for dumping and loading when
|
90
102
|
specifying the class for an encoded object. The default is `json_create`.
|
91
103
|
|
92
|
-
In the `:custom` mode setting the `:create_id` to nil will cause Complex,
|
104
|
+
In the `:custom` mode, setting the `:create_id` to nil will cause Complex,
|
93
105
|
Rational, Range, and Regexp to be output as strings instead of as JSON
|
94
106
|
objects.
|
95
107
|
|
@@ -179,7 +191,7 @@ customization.
|
|
179
191
|
### :nan [Symbol]
|
180
192
|
|
181
193
|
How to dump Infinity, -Infinity, and NaN in :null, :strict, and :compat
|
182
|
-
mode. Default is :auto but is ignored in the :compat and :rails
|
194
|
+
mode. Default is :auto but is ignored in the :compat and :rails modes.
|
183
195
|
|
184
196
|
- `:null` places a null
|
185
197
|
|
@@ -252,7 +264,7 @@ The :time_format when dumping.
|
|
252
264
|
|
253
265
|
- `:unix` time is output as a decimal number in seconds since epoch including fractions of a second.
|
254
266
|
|
255
|
-
- `:unix_zone` similar to the `:unix` format but with the timezone encoded in
|
267
|
+
- `:unix_zone` is similar to the `:unix` format but with the timezone encoded in
|
256
268
|
the exponent of the decimal number of seconds since epoch.
|
257
269
|
|
258
270
|
- `:xmlschema` time is output as a string that follows the XML schema definition.
|
@@ -262,16 +274,16 @@ The :time_format when dumping.
|
|
262
274
|
### :use_as_json [Boolean]
|
263
275
|
|
264
276
|
Call `as_json()` methods on dump, default is false. The option is ignored in
|
265
|
-
the :compat and :rails
|
277
|
+
the :compat and :rails modes.
|
266
278
|
|
267
279
|
|
268
280
|
### :use_raw_json [Boolean]
|
269
281
|
|
270
282
|
Call `raw_json()` methods on dump, default is false. The option is
|
271
|
-
accepted in the :compat and :rails
|
283
|
+
accepted in the :compat and :rails modes even though it is not
|
272
284
|
supported by other JSON gems. It provides a means to optimize dump or
|
273
285
|
generate performance. The `raw_json(depth, indent)` method should be
|
274
|
-
called only by Oj. It is not intended for any other use. This is
|
286
|
+
called only by Oj. It is not intended for any other use. This is meant
|
275
287
|
to replace the abused `to_json` methods. Calling `Oj.dump` inside the
|
276
288
|
`raw_json` with the object itself when `:use_raw_json` is true will
|
277
289
|
result in an infinite loop.
|
@@ -279,9 +291,9 @@ result in an infinite loop.
|
|
279
291
|
### :use_to_hash [Boolean]
|
280
292
|
|
281
293
|
Call `to_hash()` methods on dump, default is false. The option is ignored in
|
282
|
-
the :compat and :rails
|
294
|
+
the :compat and :rails modes.
|
283
295
|
|
284
296
|
### :use_to_json [Boolean]
|
285
297
|
|
286
298
|
Call `to_json()` methods on dump, default is false. The option is ignored in
|
287
|
-
the :compat and :rails
|
299
|
+
the :compat and :rails modes.
|
@@ -21,7 +21,12 @@ class ActiveRecordResultTest < Minitest::Test
|
|
21
21
|
["row 3 col 1", "row 3 col 2"],
|
22
22
|
])
|
23
23
|
#puts "*** result: #{Oj.dump(result, indent: 2)}"
|
24
|
-
|
25
|
-
|
24
|
+
json_result = if ActiveRecord.version >= Gem::Version.new("6")
|
25
|
+
result.to_a
|
26
|
+
else
|
27
|
+
result.to_hash
|
28
|
+
end
|
29
|
+
|
30
|
+
assert_equal Oj.dump(result, mode: :rails), Oj.dump(json_result)
|
26
31
|
end
|
27
32
|
end
|
data/test/foo.rb
CHANGED
@@ -6,47 +6,15 @@ $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
|
|
6
6
|
$: << File.join($oj_dir, dir)
|
7
7
|
end
|
8
8
|
|
9
|
-
require 'json'
|
10
|
-
|
11
|
-
t = [Time.now.utc]
|
12
|
-
|
13
|
-
puts "t.to_json - #{t.to_json}"
|
14
|
-
|
15
|
-
puts "--- active support"
|
16
|
-
|
17
|
-
require 'active_support'
|
18
|
-
require "active_support/json"
|
19
|
-
|
20
|
-
ActiveSupport::JSON::Encoding.use_standard_json_time_format = false
|
21
|
-
|
22
|
-
puts "t.as_json - #{t.as_json}"
|
23
|
-
puts "t.to_json - #{t.to_json}"
|
24
|
-
|
25
9
|
require 'oj'
|
26
|
-
|
27
|
-
t = [Time.now.utc]
|
28
|
-
|
29
|
-
puts "-----------------------"
|
30
|
-
|
31
|
-
#puts "t.as_json - #{t.as_json}"
|
32
|
-
puts "t.to_json - #{t.to_json}"
|
33
|
-
|
34
|
-
#Oj.mimic_JSON
|
35
|
-
|
36
|
-
#puts "Oj - t.as_json - #{t.as_json}"
|
37
|
-
|
38
|
-
puts "--- active support"
|
39
|
-
|
40
10
|
require 'active_support'
|
41
|
-
require "active_support/json"
|
42
|
-
|
43
|
-
ActiveSupport::JSON::Encoding.use_standard_json_time_format = false
|
44
|
-
|
45
|
-
puts "t.as_json - #{t.as_json}"
|
46
|
-
puts "t.to_json - #{t.to_json}"
|
47
11
|
|
48
|
-
|
49
|
-
Oj.optimize_rails
|
12
|
+
Oj.default_options = {trace: true}
|
50
13
|
|
51
|
-
|
52
|
-
|
14
|
+
Oj::Rails.mimic_JSON
|
15
|
+
#Oj.mimic_JSON
|
16
|
+
begin
|
17
|
+
::JSON.load('foo=&bar')
|
18
|
+
rescue Exception => e
|
19
|
+
puts "*** #{e.class}: #{e.message}"
|
20
|
+
end
|
data/test/helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
1
3
|
# Ubuntu does not accept arguments to ruby when called using env. To get warnings to show up the -w options is
|
2
4
|
# required. That can be set in the RUBYOPT environment variable.
|
3
5
|
# export RUBYOPT=-w
|
@@ -16,6 +18,14 @@ require 'bigdecimal'
|
|
16
18
|
require 'pp'
|
17
19
|
require 'oj'
|
18
20
|
|
21
|
+
|
22
|
+
if defined?(GC.verify_compaction_references) == 'method'
|
23
|
+
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
|
24
|
+
# move objects around, helping to find object movement bugs.
|
25
|
+
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
26
|
+
end
|
27
|
+
|
28
|
+
|
19
29
|
$ruby = RUBY_DESCRIPTION.split(' ')[0]
|
20
30
|
$ruby = 'ree' if 'ruby' == $ruby && RUBY_DESCRIPTION.include?('Ruby Enterprise Edition')
|
21
31
|
|
@@ -15,7 +15,7 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
|
|
15
15
|
def setup
|
16
16
|
@hash = {
|
17
17
|
'a' => 2,
|
18
|
-
'b' => 5.23683071,
|
18
|
+
#'b' => 5.23683071,
|
19
19
|
'c' => 'c',
|
20
20
|
'd' => [ 1, "b", 3.14 ],
|
21
21
|
'e' => { 'foo' => 'bar' },
|
@@ -23,8 +23,13 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
|
|
23
23
|
'h' => 1000.0,
|
24
24
|
'i' => 0.001
|
25
25
|
}
|
26
|
-
|
27
|
-
|
26
|
+
# Tired of chasing floating point rounding and precision. Oj now uses the
|
27
|
+
# Ruby float parser in compat mode yet on i386 machines there are issues
|
28
|
+
# with this test when the float is included.
|
29
|
+
#@json = '{"a":2,"b":5.23683071,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
|
30
|
+
#'"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
|
31
|
+
@json = '{"a":2,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
|
32
|
+
'"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
|
28
33
|
end
|
29
34
|
|
30
35
|
def test_index
|
@@ -136,6 +136,10 @@ EOT
|
|
136
136
|
|
137
137
|
def test_pretty_state
|
138
138
|
state = JSON::PRETTY_STATE_PROTOTYPE.dup
|
139
|
+
# In come cases in Ruby 3.0 an :escape_slash is included in the state. It
|
140
|
+
# seems to occur on travis but not locally.
|
141
|
+
actual = state.to_h
|
142
|
+
actual.delete(:escape_slash)
|
139
143
|
assert_equal({
|
140
144
|
:allow_nan => false,
|
141
145
|
:array_nl => "\n",
|
@@ -147,11 +151,15 @@ EOT
|
|
147
151
|
:object_nl => "\n",
|
148
152
|
:space => " ",
|
149
153
|
:space_before => "",
|
150
|
-
}.sort_by { |n,| n.to_s },
|
154
|
+
}.sort_by { |n,| n.to_s }, actual.sort_by { |n,| n.to_s })
|
151
155
|
end
|
152
156
|
|
153
157
|
def test_safe_state
|
154
158
|
state = JSON::SAFE_STATE_PROTOTYPE.dup
|
159
|
+
# In come cases in Ruby 3.0 an :escape_slash is included in the state. It
|
160
|
+
# seems to occur on travis but not locally.
|
161
|
+
actual = state.to_h
|
162
|
+
actual.delete(:escape_slash)
|
155
163
|
assert_equal({
|
156
164
|
:allow_nan => false,
|
157
165
|
:array_nl => "",
|
@@ -163,11 +171,15 @@ EOT
|
|
163
171
|
:object_nl => "",
|
164
172
|
:space => "",
|
165
173
|
:space_before => "",
|
166
|
-
}.sort_by { |n,| n.to_s },
|
174
|
+
}.sort_by { |n,| n.to_s }, actual.sort_by { |n,| n.to_s })
|
167
175
|
end
|
168
176
|
|
169
177
|
def test_fast_state
|
170
178
|
state = JSON::FAST_STATE_PROTOTYPE.dup
|
179
|
+
# In come cases in Ruby 3.0 an :escape_slash is included in the state. It
|
180
|
+
# seems to occur on travis but not locally.
|
181
|
+
actual = state.to_h
|
182
|
+
actual.delete(:escape_slash)
|
171
183
|
assert_equal({
|
172
184
|
:allow_nan => false,
|
173
185
|
:array_nl => "",
|
@@ -179,7 +191,7 @@ EOT
|
|
179
191
|
:object_nl => "",
|
180
192
|
:space => "",
|
181
193
|
:space_before => "",
|
182
|
-
}.sort_by { |n,| n.to_s },
|
194
|
+
}.sort_by { |n,| n.to_s }, actual.sort_by { |n,| n.to_s })
|
183
195
|
end
|
184
196
|
|
185
197
|
def test_allow_nan
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
$: << File.dirname(__FILE__)
|
2
4
|
$oj_dir = File.dirname(File.dirname(File.expand_path(File.dirname(__FILE__))))
|
3
5
|
%w(lib ext).each do |dir|
|
@@ -12,6 +14,12 @@ if ENV['REAL_JSON_GEM']
|
|
12
14
|
else
|
13
15
|
require 'oj'
|
14
16
|
Oj.mimic_JSON
|
17
|
+
|
18
|
+
if defined?(GC.verify_compaction_references) == 'method'
|
19
|
+
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
|
20
|
+
# move objects around, helping to find object movement bugs.
|
21
|
+
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
22
|
+
end
|
15
23
|
end
|
16
24
|
|
17
25
|
NaN = JSON::NaN if defined?(JSON::NaN)
|
data/test/perf.rb
CHANGED
data/test/perf_scp.rb
CHANGED
@@ -14,16 +14,16 @@ require 'oj'
|
|
14
14
|
|
15
15
|
$verbose = false
|
16
16
|
$indent = 0
|
17
|
-
$iter =
|
17
|
+
$iter = 50_000
|
18
18
|
$with_bignum = false
|
19
|
-
$size =
|
19
|
+
$size = 1
|
20
20
|
|
21
21
|
opts = OptionParser.new
|
22
22
|
opts.on("-v", "verbose") { $verbose = true }
|
23
23
|
opts.on("-c", "--count [Int]", Integer, "iterations") { |i| $iter = i }
|
24
24
|
opts.on("-i", "--indent [Int]", Integer, "indentation") { |i| $indent = i }
|
25
|
-
opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)")
|
26
|
-
opts.on("-b", "with bignum")
|
25
|
+
opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)") { |i| $size = i }
|
26
|
+
opts.on("-b", "with bignum") { $with_bignum = true }
|
27
27
|
opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
|
28
28
|
files = opts.parse(ARGV)
|
29
29
|
|
@@ -47,7 +47,7 @@ if 0 < $size
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
Oj.default_options = { :indent => $indent, :mode => :
|
50
|
+
Oj.default_options = { :indent => $indent, :mode => :strict, cache_keys: true, cache_str: 5 }
|
51
51
|
|
52
52
|
$json = Oj.dump($obj)
|
53
53
|
$failed = {} # key is same as String used in tests later
|
@@ -105,7 +105,7 @@ class AllHandler < Oj::ScHandler
|
|
105
105
|
|
106
106
|
def hash_set(h, key, value)
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
def array_append(a, value)
|
110
110
|
end
|
111
111
|
|
@@ -137,10 +137,11 @@ end
|
|
137
137
|
puts '-' * 80
|
138
138
|
puts "Parse Performance"
|
139
139
|
perf = Perf.new()
|
140
|
-
perf.add('Oj::Saj', 'all') { Oj.saj_parse(saj_handler, $json) }
|
141
|
-
perf.add('Oj::Saj', 'none') { Oj.saj_parse(no_saj, $json) }
|
142
|
-
perf.add('Oj::Scp', 'all') { Oj.sc_parse(sc_handler, $json) }
|
143
|
-
perf.add('Oj::Scp', 'none') { Oj.sc_parse(no_handler, $json) }
|
140
|
+
perf.add('Oj::Saj.all', 'all') { Oj.saj_parse(saj_handler, $json) }
|
141
|
+
perf.add('Oj::Saj.none', 'none') { Oj.saj_parse(no_saj, $json) }
|
142
|
+
perf.add('Oj::Scp.all', 'all') { Oj.sc_parse(sc_handler, $json) }
|
143
|
+
perf.add('Oj::Scp.none', 'none') { Oj.sc_parse(no_handler, $json) }
|
144
|
+
perf.add('Oj::load', 'none') { Oj.wab_load($json) }
|
144
145
|
perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
|
145
146
|
perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new($json).parse } unless $failed.has_key?('JSON::Ext')
|
146
147
|
perf.run($iter)
|