oj 3.14.3 → 3.15.1
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 +10 -0
- data/ext/oj/code.c +3 -10
- data/ext/oj/compat.c +5 -18
- data/ext/oj/custom.c +10 -28
- data/ext/oj/dump.c +40 -10
- data/ext/oj/dump.h +1 -4
- data/ext/oj/extconf.rb +4 -2
- data/ext/oj/fast.c +3 -6
- data/ext/oj/mimic_json.c +21 -1
- data/ext/oj/object.c +7 -21
- data/ext/oj/oj.c +24 -4
- data/ext/oj/oj.h +10 -6
- data/ext/oj/parse.c +3 -5
- data/ext/oj/parse.h +16 -14
- data/ext/oj/parser.h +2 -2
- data/ext/oj/reader.c +1 -3
- data/ext/oj/saj.c +1 -1
- data/ext/oj/strict.c +9 -27
- data/ext/oj/wab.c +9 -27
- data/lib/oj/active_support_helper.rb +2 -3
- data/lib/oj/json.rb +156 -149
- data/lib/oj/mimic.rb +3 -1
- data/lib/oj/version.rb +1 -1
- data/lib/oj.rb +3 -0
- data/pages/Options.md +4 -0
- data/test/_test_active.rb +8 -8
- data/test/_test_active_mimic.rb +7 -7
- data/test/_test_mimic_rails.rb +17 -19
- data/test/files.rb +14 -14
- data/test/foo.rb +15 -10
- data/test/helper.rb +4 -4
- data/test/mem.rb +8 -7
- data/test/perf.rb +21 -26
- data/test/perf_compat.rb +30 -32
- data/test/perf_dump.rb +27 -27
- data/test/perf_fast.rb +80 -82
- data/test/perf_file.rb +27 -29
- data/test/perf_object.rb +65 -68
- data/test/perf_once.rb +8 -7
- data/test/perf_parser.rb +40 -46
- data/test/perf_saj.rb +46 -53
- data/test/perf_scp.rb +57 -69
- data/test/perf_simple.rb +40 -38
- data/test/perf_strict.rb +68 -70
- data/test/perf_wab.rb +67 -69
- data/test/prec.rb +3 -3
- data/test/sample.rb +16 -15
- data/test/sample_json.rb +8 -7
- data/test/test_compat.rb +44 -46
- data/test/test_custom.rb +56 -42
- data/test/test_debian.rb +6 -9
- data/test/test_fast.rb +78 -72
- data/test/test_file.rb +16 -21
- data/test/test_gc.rb +5 -5
- data/test/test_generate.rb +5 -5
- data/test/test_hash.rb +4 -4
- data/test/test_integer_range.rb +9 -9
- data/test/test_null.rb +18 -20
- data/test/test_object.rb +76 -86
- data/test/test_parser.rb +4 -4
- data/test/test_parser_debug.rb +4 -4
- data/test/test_parser_saj.rb +31 -31
- data/test/test_parser_usual.rb +3 -3
- data/test/test_rails.rb +2 -2
- data/test/test_saj.rb +8 -8
- data/test/test_scp.rb +29 -29
- data/test/test_strict.rb +25 -31
- data/test/test_various.rb +121 -75
- data/test/test_wab.rb +43 -42
- data/test/test_writer.rb +46 -46
- data/test/tests.rb +7 -7
- data/test/tests_mimic.rb +6 -6
- data/test/tests_mimic_addition.rb +6 -6
- metadata +3 -6
- data/test/bar.rb +0 -11
- data/test/baz.rb +0 -16
- data/test/bug.rb +0 -16
- data/test/zoo.rb +0 -13
data/pages/Options.md
CHANGED
@@ -265,6 +265,10 @@ to true.
|
|
265
265
|
|
266
266
|
The number of digits after the decimal when dumping the seconds of time.
|
267
267
|
|
268
|
+
### :skip_null_byte [Boolean]
|
269
|
+
|
270
|
+
If true, null bytes in strings will be omitted when dumping.
|
271
|
+
|
268
272
|
### :space
|
269
273
|
|
270
274
|
String inserted after the ':' character when dumping a JSON object. The
|
data/test/_test_active.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
%w(lib ext test).each do |dir|
|
6
6
|
$LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
|
7
7
|
end
|
@@ -13,14 +13,14 @@ require 'sqlite3'
|
|
13
13
|
require 'active_record'
|
14
14
|
require 'oj'
|
15
15
|
|
16
|
-
#Oj.mimic_JSON()
|
16
|
+
# Oj.mimic_JSON()
|
17
17
|
Oj.default_options = {mode: :compat, indent: 2}
|
18
18
|
|
19
|
-
#ActiveRecord::Base.logger = Logger.new(STDERR)
|
19
|
+
# ActiveRecord::Base.logger = Logger.new(STDERR)
|
20
20
|
|
21
21
|
ActiveRecord::Base.establish_connection(
|
22
|
-
:adapter =>
|
23
|
-
:database =>
|
22
|
+
:adapter => 'sqlite3',
|
23
|
+
:database => ':memory:'
|
24
24
|
)
|
25
25
|
|
26
26
|
ActiveRecord::Schema.define do
|
@@ -37,8 +37,8 @@ end
|
|
37
37
|
class ActiveTest < Minitest::Test
|
38
38
|
|
39
39
|
def test_active
|
40
|
-
User.find_or_create_by(first_name:
|
41
|
-
User.find_or_create_by(first_name:
|
40
|
+
User.find_or_create_by(first_name: 'John', last_name: 'Smith', email: 'john@example.com')
|
41
|
+
User.find_or_create_by(first_name: 'Joan', last_name: 'Smith', email: 'joan@example.com')
|
42
42
|
|
43
43
|
# Single instance.
|
44
44
|
assert_equal(%|{
|
data/test/_test_active_mimic.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
%w(lib ext test).each do |dir|
|
6
6
|
$LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
|
7
7
|
end
|
@@ -16,11 +16,11 @@ require 'oj'
|
|
16
16
|
Oj.mimic_JSON()
|
17
17
|
Oj.default_options = {mode: :compat, indent: 2}
|
18
18
|
|
19
|
-
#ActiveRecord::Base.logger = Logger.new(STDERR)
|
19
|
+
# ActiveRecord::Base.logger = Logger.new(STDERR)
|
20
20
|
|
21
21
|
ActiveRecord::Base.establish_connection(
|
22
|
-
:adapter =>
|
23
|
-
:database =>
|
22
|
+
:adapter => 'sqlite3',
|
23
|
+
:database => ':memory:'
|
24
24
|
)
|
25
25
|
|
26
26
|
ActiveRecord::Schema.define do
|
@@ -37,8 +37,8 @@ end
|
|
37
37
|
class ActiveTest < Minitest::Test
|
38
38
|
|
39
39
|
def test_active
|
40
|
-
User.find_or_create_by(first_name:
|
41
|
-
User.find_or_create_by(first_name:
|
40
|
+
User.find_or_create_by(first_name: 'John', last_name: 'Smith', email: 'john@example.com')
|
41
|
+
User.find_or_create_by(first_name: 'Joan', last_name: 'Smith', email: 'joan@example.com')
|
42
42
|
|
43
43
|
# Single instance.
|
44
44
|
assert_equal(%|{
|
data/test/_test_mimic_rails.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
|
6
6
|
require 'helper'
|
7
|
-
#Oj.mimic_JSON
|
7
|
+
# Oj.mimic_JSON
|
8
8
|
require 'rails/all'
|
9
9
|
|
10
10
|
require 'active_model'
|
@@ -36,14 +36,12 @@ end
|
|
36
36
|
class MimicRails < Minitest::Test
|
37
37
|
|
38
38
|
def test_mimic_exception
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
assert(false, 'Expected a JSON::ParserError')
|
46
|
-
end
|
39
|
+
ActiveSupport::JSON.decode('{')
|
40
|
+
puts 'Failed'
|
41
|
+
rescue ActiveSupport::JSON.parse_error
|
42
|
+
assert(true)
|
43
|
+
rescue Exception
|
44
|
+
assert(false, 'Expected a JSON::ParserError')
|
47
45
|
end
|
48
46
|
|
49
47
|
def test_dump_string
|
@@ -84,11 +82,11 @@ class MimicRails < Minitest::Test
|
|
84
82
|
category = Category.new(1, 'test')
|
85
83
|
serializer = CategorySerializer.new(category)
|
86
84
|
|
87
|
-
|
85
|
+
serializer.to_json()
|
88
86
|
puts "*** serializer.to_json() #{serializer.to_json()}"
|
89
|
-
|
87
|
+
serializer.as_json()
|
90
88
|
puts "*** serializer.as_json() #{serializer.as_json()}"
|
91
|
-
|
89
|
+
JSON.dump(serializer)
|
92
90
|
puts "*** JSON.dump(serializer) #{JSON.dump(serializer)}"
|
93
91
|
|
94
92
|
puts "*** category.to_json() #{category.to_json()}"
|
@@ -103,7 +101,7 @@ class MimicRails < Minitest::Test
|
|
103
101
|
cat2 = Category.new(2, 'test')
|
104
102
|
a = Array.wrap([cat1, cat2])
|
105
103
|
|
106
|
-
#serializer = CategorySerializer.new(a)
|
104
|
+
# serializer = CategorySerializer.new(a)
|
107
105
|
|
108
106
|
puts "*** a.to_json() #{a.to_json()}"
|
109
107
|
puts "*** a.as_json() #{a.as_json()}"
|
@@ -113,13 +111,13 @@ class MimicRails < Minitest::Test
|
|
113
111
|
|
114
112
|
def test_dump_time
|
115
113
|
Oj.default_options= {:indent => 2}
|
116
|
-
now = ActiveSupport::TimeZone['America/Chicago'].parse(
|
114
|
+
now = ActiveSupport::TimeZone['America/Chicago'].parse('2014-11-01 13:20:47')
|
117
115
|
json = Oj.dump(now, mode: :object, time_format: :xmlschema)
|
118
|
-
#puts "*** json: #{json}"
|
116
|
+
# puts "*** json: #{json}"
|
119
117
|
|
120
118
|
oj_dump = Oj.load(json, mode: :object, time_format: :xmlschema)
|
121
|
-
#puts "Now: #{now}\n Oj: #{oj_dump}"
|
122
|
-
assert_equal(
|
119
|
+
# puts "Now: #{now}\n Oj: #{oj_dump}"
|
120
|
+
assert_equal('2014-11-01T13:20:47-05:00', oj_dump.xmlschema)
|
123
121
|
end
|
124
122
|
|
125
123
|
end # MimicRails
|
data/test/files.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
#!/usr/bin/env ruby -wW2
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
if $
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
if $PROGRAM_NAME == __FILE__
|
5
|
+
$LOAD_PATH << '.'
|
6
|
+
$LOAD_PATH << '..'
|
7
|
+
$LOAD_PATH << '../lib'
|
8
|
+
$LOAD_PATH << '../ext'
|
8
9
|
end
|
9
10
|
|
10
11
|
require 'sample/file'
|
11
12
|
require 'sample/dir'
|
12
13
|
|
13
14
|
def files(dir)
|
14
|
-
d =
|
15
|
+
d = Sample::Dir.new(dir)
|
15
16
|
Dir.new(dir).each do |fn|
|
16
17
|
next if fn.start_with?('.')
|
17
18
|
|
18
19
|
filename = File.join(dir, fn)
|
19
|
-
#filename = '.' == dir ? fn : File.join(dir, fn)
|
20
|
-
if File.directory?(filename)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
# filename = '.' == dir ? fn : File.join(dir, fn)
|
21
|
+
d << if File.directory?(filename)
|
22
|
+
files(filename)
|
23
|
+
else
|
24
|
+
Sample::File.new(filename)
|
25
|
+
end
|
25
26
|
end
|
26
|
-
#pp d
|
27
|
+
# pp d
|
27
28
|
d
|
28
29
|
end
|
29
|
-
|
data/test/foo.rb
CHANGED
@@ -1,15 +1,20 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
4
|
+
$LOAD_PATH << '.'
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
6
7
|
|
7
|
-
require
|
8
|
+
require 'active_support'
|
9
|
+
require 'json'
|
10
|
+
require 'oj'
|
8
11
|
|
9
|
-
|
12
|
+
Oj.mimic_JSON()
|
13
|
+
# Oj::Rails.mimic_JSON()
|
10
14
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
15
|
+
begin
|
16
|
+
::JSON.parse('{ "foo": 84e }')
|
17
|
+
#::JSON.parse('{ "foo": 84eb234 }')
|
18
|
+
rescue Exception => e
|
19
|
+
puts "#{e.class}: #{e.message}"
|
20
|
+
end
|
data/test/helper.rb
CHANGED
@@ -20,8 +20,8 @@ require 'oj'
|
|
20
20
|
def verify_gc_compaction
|
21
21
|
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
|
22
22
|
# move objects around, helping to find object movement bugs.
|
23
|
-
if defined?(GC.verify_compaction_references) == 'method' &&
|
24
|
-
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new(
|
23
|
+
if defined?(GC.verify_compaction_references) == 'method' && RbConfig::CONFIG['host_os'] !~ /(mingw|mswin)/
|
24
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.2.0')
|
25
25
|
GC.verify_compaction_references(expand_heap: true, toward: :empty)
|
26
26
|
else
|
27
27
|
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
@@ -33,7 +33,7 @@ $ruby = RUBY_DESCRIPTION.split(' ')[0]
|
|
33
33
|
$ruby = 'ree' if 'ruby' == $ruby && RUBY_DESCRIPTION.include?('Ruby Enterprise Edition')
|
34
34
|
|
35
35
|
class Range
|
36
|
-
def to_hash
|
37
|
-
{ 'begin' => self.begin, 'end' => self.end, 'exclude_end' =>
|
36
|
+
def to_hash
|
37
|
+
{ 'begin' => self.begin, 'end' => self.end, 'exclude_end' => exclude_end? }
|
38
38
|
end
|
39
39
|
end
|
data/test/mem.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
require 'English'
|
5
|
+
$LOAD_PATH << '.'
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
7
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
8
|
|
8
9
|
require 'oj'
|
9
10
|
|
10
11
|
Oj.default_options = { mode: :rails, cache_keys: false, cache_str: -1 }
|
11
12
|
|
12
13
|
def mem
|
13
|
-
`ps -o rss= -p #{
|
14
|
+
`ps -o rss= -p #{$PROCESS_ID}`.to_i
|
14
15
|
end
|
15
16
|
|
16
17
|
('a'..'z').each { |a|
|
@@ -20,8 +21,8 @@ end
|
|
20
21
|
('a'..'z').each { |e|
|
21
22
|
('a'..'z').each { |f|
|
22
23
|
key = "#{a}#{b}#{c}#{d}#{e}#{f}"
|
23
|
-
|
24
|
-
#Oj.dump(x)
|
24
|
+
Oj.load(%|{ "#{key}": 101}|)
|
25
|
+
# Oj.dump(x)
|
25
26
|
}
|
26
27
|
}
|
27
28
|
}
|
data/test/perf.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Perf
|
2
4
|
|
3
|
-
def initialize
|
5
|
+
def initialize
|
4
6
|
@items = []
|
5
7
|
end
|
6
8
|
|
@@ -18,7 +20,7 @@ class Perf
|
|
18
20
|
end
|
19
21
|
|
20
22
|
def run(iter)
|
21
|
-
base = Item.new(nil, nil) {
|
23
|
+
base = Item.new(nil, nil) {}
|
22
24
|
base.run(iter, 0.0)
|
23
25
|
@items.each do |i|
|
24
26
|
i.run(iter, base.duration)
|
@@ -31,9 +33,7 @@ class Perf
|
|
31
33
|
summary()
|
32
34
|
end
|
33
35
|
|
34
|
-
def summary
|
35
|
-
fastest = nil
|
36
|
-
slowest = nil
|
36
|
+
def summary
|
37
37
|
width = 6
|
38
38
|
@items.each do |i|
|
39
39
|
next if i.duration.nil?
|
@@ -44,23 +44,20 @@ class Perf
|
|
44
44
|
iva.delete_if { |i| i.duration.nil? }
|
45
45
|
iva = iva.sort_by { |i| i.duration }
|
46
46
|
puts
|
47
|
-
puts
|
48
|
-
puts
|
47
|
+
puts 'Summary:'
|
48
|
+
puts '%*s time (secs) rate (ops/sec)' % [width, 'System']
|
49
49
|
puts "#{'-' * width} ----------- --------------"
|
50
50
|
iva.each do |i|
|
51
|
-
|
52
|
-
else
|
53
|
-
puts "%*s %11.3f %14.3f" % [width, i.title, i.duration, i.rate ]
|
54
|
-
end
|
51
|
+
puts '%*s %11.3f %14.3f' % [width, i.title, i.duration, i.rate ] unless i.duration.nil?
|
55
52
|
end
|
56
53
|
puts
|
57
54
|
puts "Comparison Matrix\n(performance factor, 2.0 means row is twice as fast as column)"
|
58
|
-
puts ([' ' * width] + iva.map { |i|
|
59
|
-
puts (['-' * width] + iva.map { |
|
55
|
+
puts ([' ' * width] + iva.map { |i| '%*s' % [width, i.title] }).join(' ')
|
56
|
+
puts (['-' * width] + iva.map { |_i| '-' * width }).join(' ')
|
60
57
|
iva.each do |i|
|
61
|
-
line = [
|
58
|
+
line = ['%*s' % [width, i.title]]
|
62
59
|
iva.each do |o|
|
63
|
-
line << (
|
60
|
+
line << ('%*.2f' % [width, o.duration / i.duration])
|
64
61
|
end
|
65
62
|
puts line.join(' ')
|
66
63
|
end
|
@@ -90,17 +87,15 @@ class Perf
|
|
90
87
|
end
|
91
88
|
|
92
89
|
def run(iter, base)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
@error = "#{e.class}: #{e.message}"
|
103
|
-
end
|
90
|
+
GC.start
|
91
|
+
@before.call unless @before.nil?
|
92
|
+
start = Time.now
|
93
|
+
iter.times { @blk.call }
|
94
|
+
@duration = Time.now - start - base
|
95
|
+
@duration = 0.0 if @duration < 0.0
|
96
|
+
@rate = iter / @duration
|
97
|
+
rescue Exception => e
|
98
|
+
@error = "#{e.class}: #{e.message}"
|
104
99
|
end
|
105
100
|
|
106
101
|
end # Item
|
data/test/perf_compat.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
$LOAD_PATH << '.'
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
7
|
|
8
8
|
require 'optparse'
|
9
9
|
require 'perf'
|
@@ -11,25 +11,23 @@ require 'oj'
|
|
11
11
|
|
12
12
|
$verbose = false
|
13
13
|
$indent = 0
|
14
|
-
$iter =
|
14
|
+
$iter = 20_000
|
15
15
|
$size = 0
|
16
16
|
|
17
17
|
opts = OptionParser.new
|
18
|
-
opts.on(
|
19
|
-
opts.on(
|
20
|
-
opts.on(
|
21
|
-
opts.on(
|
22
|
-
opts.on(
|
23
|
-
|
18
|
+
opts.on('-v', 'verbose') { $verbose = true }
|
19
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| $iter = i }
|
20
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| $indent = i }
|
21
|
+
opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| $size = i }
|
22
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
23
|
+
opts.parse(ARGV)
|
24
24
|
|
25
25
|
def capture_error(tag, orig, load_key, dump_key, &blk)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
$failed[tag] = "#{e.class}: #{e.message}"
|
32
|
-
end
|
26
|
+
obj = blk.call(orig)
|
27
|
+
puts obj unless orig == obj
|
28
|
+
raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
|
29
|
+
rescue Exception => e
|
30
|
+
$failed[tag] = "#{e.class}: #{e.message}"
|
33
31
|
end
|
34
32
|
|
35
33
|
# Verify that all packages dump and load correctly and return the same Object as the original.
|
@@ -39,7 +37,7 @@ capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
|
|
39
37
|
require 'json/ext'
|
40
38
|
JSON.generator = JSON::Ext::Generator
|
41
39
|
JSON.parser = JSON::Ext::Parser
|
42
|
-
JSON.
|
40
|
+
JSON.parse(JSON.generate(o))
|
43
41
|
}
|
44
42
|
|
45
43
|
module One
|
@@ -47,7 +45,7 @@ module One
|
|
47
45
|
module Three
|
48
46
|
class Empty
|
49
47
|
|
50
|
-
def initialize
|
48
|
+
def initialize
|
51
49
|
@a = 1
|
52
50
|
@b = 2
|
53
51
|
@c = 3
|
@@ -58,16 +56,16 @@ module One
|
|
58
56
|
end
|
59
57
|
alias == eql?
|
60
58
|
|
61
|
-
def as_json(*
|
59
|
+
def as_json(*_a)
|
62
60
|
{JSON.create_id => self.class.name, 'a' => @a, 'b' => @b, 'c' => @c }
|
63
61
|
end
|
64
|
-
|
65
|
-
def to_json(*
|
62
|
+
|
63
|
+
def to_json(*_a)
|
66
64
|
JSON.generate(as_json())
|
67
65
|
end
|
68
66
|
|
69
|
-
def self.json_create(
|
70
|
-
|
67
|
+
def self.json_create(_h)
|
68
|
+
new()
|
71
69
|
end
|
72
70
|
end # Empty
|
73
71
|
end # Three
|
@@ -77,8 +75,8 @@ end # One
|
|
77
75
|
$obj = {
|
78
76
|
'a' => 'Alpha', # string
|
79
77
|
'b' => true, # boolean
|
80
|
-
'c' =>
|
81
|
-
'd' => [ true, [false, [-
|
78
|
+
'c' => 12_345, # number
|
79
|
+
'd' => [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
|
82
80
|
'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
|
83
81
|
'f' => nil, # nil
|
84
82
|
'g' => One::Two::Three::Empty.new(),
|
@@ -109,13 +107,13 @@ if $verbose
|
|
109
107
|
end
|
110
108
|
|
111
109
|
puts '-' * 80
|
112
|
-
puts
|
110
|
+
puts 'Compat Parse Performance'
|
113
111
|
perf = Perf.new()
|
114
|
-
unless $failed.
|
115
|
-
perf.add('JSON::Ext', 'parse') { JSON.
|
112
|
+
unless $failed.key?('JSON::Ext')
|
113
|
+
perf.add('JSON::Ext', 'parse') { JSON.parse($json) }
|
116
114
|
perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
|
117
115
|
end
|
118
|
-
unless $failed.
|
116
|
+
unless $failed.key?('Oj:compat')
|
119
117
|
perf.add('Oj:compat', 'compat_load') { Oj.compat_load($json) }
|
120
118
|
end
|
121
119
|
perf.run($iter)
|
@@ -125,6 +123,6 @@ puts '-' * 80
|
|
125
123
|
puts
|
126
124
|
|
127
125
|
unless $failed.empty?
|
128
|
-
puts
|
126
|
+
puts 'The following packages were not included for the reason listed'
|
129
127
|
$failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
|
130
128
|
end
|
data/test/perf_dump.rb
CHANGED
@@ -1,50 +1,50 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
$LOAD_PATH << '.'
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
7
|
|
8
8
|
require 'optparse'
|
9
9
|
require 'oj'
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
@verbose = false
|
12
|
+
@indent = 2
|
13
|
+
@iter = 100_000
|
14
|
+
@size = 2
|
15
15
|
|
16
16
|
opts = OptionParser.new
|
17
|
-
opts.on(
|
18
|
-
opts.on(
|
19
|
-
opts.on(
|
20
|
-
opts.on(
|
21
|
-
opts.on(
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
opts.on('-v', 'verbose') { @verbose = true }
|
18
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| @iter = i }
|
19
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| @indent = i }
|
20
|
+
opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| @size = i }
|
21
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
22
|
+
opts.parse(ARGV)
|
23
|
+
|
24
|
+
@obj = {
|
25
25
|
'a' => 'Alpha', # string
|
26
26
|
'b' => true, # boolean
|
27
|
-
'c' =>
|
28
|
-
'd' => [ true, [false, [-
|
27
|
+
'c' => 12_345, # number
|
28
|
+
'd' => [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
|
29
29
|
'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
|
30
30
|
'f' => nil, # nil
|
31
31
|
'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
|
32
32
|
'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
33
33
|
}
|
34
34
|
|
35
|
-
Oj.default_options = { :indent =>
|
35
|
+
Oj.default_options = { :indent => @indent, :mode => :strict }
|
36
36
|
|
37
|
-
if 0 <
|
38
|
-
o =
|
39
|
-
|
40
|
-
(4 *
|
41
|
-
|
37
|
+
if 0 < @size
|
38
|
+
o = @obj
|
39
|
+
@obj = []
|
40
|
+
(4 * @size).times do
|
41
|
+
@obj << o
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
@json = Oj.dump(@obj)
|
46
46
|
GC.start
|
47
47
|
start = Time.now
|
48
|
-
|
48
|
+
@iter.times { Oj.dump(@obj) }
|
49
49
|
duration = Time.now - start
|
50
|
-
puts "Dumped #{
|
50
|
+
puts "Dumped #{@json.length} byte JSON #{@iter} times in %0.3f seconds or %0.3f iteration/sec." % [duration, @iter / duration]
|