oj 3.13.11 → 3.15.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.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +74 -0
  3. data/README.md +4 -2
  4. data/ext/oj/buf.h +11 -6
  5. data/ext/oj/cache.c +25 -24
  6. data/ext/oj/cache8.c +10 -9
  7. data/ext/oj/circarray.c +8 -6
  8. data/ext/oj/circarray.h +2 -2
  9. data/ext/oj/code.c +17 -24
  10. data/ext/oj/code.h +2 -2
  11. data/ext/oj/compat.c +17 -44
  12. data/ext/oj/custom.c +70 -141
  13. data/ext/oj/debug.c +3 -9
  14. data/ext/oj/dump.c +128 -118
  15. data/ext/oj/dump.h +12 -8
  16. data/ext/oj/dump_compat.c +564 -641
  17. data/ext/oj/dump_leaf.c +17 -63
  18. data/ext/oj/dump_object.c +70 -199
  19. data/ext/oj/dump_strict.c +22 -46
  20. data/ext/oj/encoder.c +1 -1
  21. data/ext/oj/err.c +2 -13
  22. data/ext/oj/err.h +9 -12
  23. data/ext/oj/extconf.rb +14 -5
  24. data/ext/oj/fast.c +75 -103
  25. data/ext/oj/intern.c +52 -50
  26. data/ext/oj/intern.h +4 -8
  27. data/ext/oj/mem.c +318 -0
  28. data/ext/oj/mem.h +53 -0
  29. data/ext/oj/mimic_json.c +75 -47
  30. data/ext/oj/object.c +49 -66
  31. data/ext/oj/odd.c +89 -67
  32. data/ext/oj/odd.h +15 -15
  33. data/ext/oj/oj.c +140 -99
  34. data/ext/oj/oj.h +80 -51
  35. data/ext/oj/parse.c +162 -184
  36. data/ext/oj/parse.h +7 -10
  37. data/ext/oj/parser.c +89 -34
  38. data/ext/oj/parser.h +18 -7
  39. data/ext/oj/rails.c +82 -146
  40. data/ext/oj/rails.h +1 -1
  41. data/ext/oj/reader.c +11 -12
  42. data/ext/oj/reader.h +4 -2
  43. data/ext/oj/resolve.c +3 -4
  44. data/ext/oj/rxclass.c +6 -5
  45. data/ext/oj/rxclass.h +1 -1
  46. data/ext/oj/saj.c +20 -31
  47. data/ext/oj/saj2.c +329 -93
  48. data/ext/oj/saj2.h +23 -0
  49. data/ext/oj/scp.c +3 -14
  50. data/ext/oj/sparse.c +26 -70
  51. data/ext/oj/stream_writer.c +12 -22
  52. data/ext/oj/strict.c +20 -52
  53. data/ext/oj/string_writer.c +21 -21
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +105 -150
  56. data/ext/oj/usual.h +68 -0
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +1 -1
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/validate.c +21 -26
  61. data/ext/oj/wab.c +31 -68
  62. data/lib/oj/active_support_helper.rb +0 -1
  63. data/lib/oj/bag.rb +7 -1
  64. data/lib/oj/easy_hash.rb +4 -5
  65. data/lib/oj/error.rb +0 -1
  66. data/lib/oj/json.rb +4 -2
  67. data/lib/oj/mimic.rb +4 -2
  68. data/lib/oj/saj.rb +20 -6
  69. data/lib/oj/state.rb +9 -6
  70. data/lib/oj/version.rb +1 -2
  71. data/lib/oj.rb +2 -0
  72. data/pages/Compatibility.md +1 -1
  73. data/pages/InstallOptions.md +20 -0
  74. data/pages/Options.md +10 -0
  75. data/test/_test_active.rb +8 -9
  76. data/test/_test_active_mimic.rb +7 -8
  77. data/test/_test_mimic_rails.rb +17 -20
  78. data/test/activerecord/result_test.rb +5 -6
  79. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  80. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  81. data/test/{activesupport5 → activesupport7}/encoding_test.rb +20 -34
  82. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  83. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  84. data/test/files.rb +15 -15
  85. data/test/foo.rb +9 -71
  86. data/test/helper.rb +11 -8
  87. data/test/isolated/shared.rb +3 -2
  88. data/test/json_gem/json_addition_test.rb +2 -2
  89. data/test/json_gem/json_common_interface_test.rb +4 -4
  90. data/test/json_gem/json_encoding_test.rb +0 -0
  91. data/test/json_gem/json_ext_parser_test.rb +1 -0
  92. data/test/json_gem/json_fixtures_test.rb +3 -2
  93. data/test/json_gem/json_generator_test.rb +48 -36
  94. data/test/json_gem/json_generic_object_test.rb +11 -11
  95. data/test/json_gem/json_parser_test.rb +54 -47
  96. data/test/json_gem/json_string_matching_test.rb +9 -9
  97. data/test/json_gem/test_helper.rb +7 -3
  98. data/test/mem.rb +13 -12
  99. data/test/perf.rb +21 -26
  100. data/test/perf_compat.rb +31 -33
  101. data/test/perf_dump.rb +50 -0
  102. data/test/perf_fast.rb +80 -82
  103. data/test/perf_file.rb +27 -29
  104. data/test/perf_object.rb +65 -69
  105. data/test/perf_once.rb +12 -11
  106. data/test/perf_parser.rb +42 -48
  107. data/test/perf_saj.rb +46 -54
  108. data/test/perf_scp.rb +57 -69
  109. data/test/perf_simple.rb +41 -39
  110. data/test/perf_strict.rb +68 -70
  111. data/test/perf_wab.rb +67 -69
  112. data/test/prec.rb +3 -3
  113. data/test/sample/change.rb +0 -1
  114. data/test/sample/dir.rb +0 -1
  115. data/test/sample/doc.rb +0 -1
  116. data/test/sample/file.rb +0 -1
  117. data/test/sample/group.rb +0 -1
  118. data/test/sample/hasprops.rb +0 -1
  119. data/test/sample/layer.rb +0 -1
  120. data/test/sample/rect.rb +0 -1
  121. data/test/sample/shape.rb +0 -1
  122. data/test/sample/text.rb +0 -1
  123. data/test/sample.rb +16 -16
  124. data/test/sample_json.rb +8 -8
  125. data/test/test_compat.rb +76 -42
  126. data/test/test_custom.rb +72 -51
  127. data/test/test_debian.rb +7 -10
  128. data/test/test_fast.rb +86 -90
  129. data/test/test_file.rb +41 -30
  130. data/test/test_gc.rb +16 -5
  131. data/test/test_generate.rb +5 -5
  132. data/test/test_hash.rb +4 -4
  133. data/test/test_integer_range.rb +9 -9
  134. data/test/test_null.rb +20 -20
  135. data/test/test_object.rb +85 -96
  136. data/test/test_parser.rb +6 -22
  137. data/test/test_parser_debug.rb +27 -0
  138. data/test/test_parser_saj.rb +115 -23
  139. data/test/test_parser_usual.rb +6 -6
  140. data/test/test_rails.rb +2 -2
  141. data/test/test_saj.rb +10 -8
  142. data/test/test_scp.rb +37 -39
  143. data/test/test_strict.rb +30 -32
  144. data/test/test_various.rb +147 -99
  145. data/test/test_wab.rb +48 -44
  146. data/test/test_writer.rb +47 -47
  147. data/test/tests.rb +13 -4
  148. data/test/tests_mimic.rb +12 -3
  149. data/test/tests_mimic_addition.rb +12 -3
  150. metadata +33 -144
  151. data/test/activesupport4/decoding_test.rb +0 -108
  152. data/test/activesupport4/encoding_test.rb +0 -531
  153. data/test/activesupport4/test_helper.rb +0 -41
  154. data/test/activesupport5/test_helper.rb +0 -72
  155. data/test/bar.rb +0 -16
  156. data/test/baz.rb +0 -16
  157. data/test/bug.rb +0 -16
  158. data/test/zoo.rb +0 -13
data/test/perf_scp.rb CHANGED
@@ -1,61 +1,58 @@
1
1
  #!/usr/bin/env ruby -wW1
2
- # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << '.'
5
- $: << File.join(File.dirname(__FILE__), "../lib")
6
- $: << File.join(File.dirname(__FILE__), "../ext")
4
+ $LOAD_PATH << '.'
5
+ $LOAD_PATH << File.join(__dir__, '../lib')
6
+ $LOAD_PATH << File.join(__dir__, '../ext')
7
7
 
8
8
  require 'optparse'
9
- require 'yajl'
9
+ # require 'yajl'
10
10
  require 'perf'
11
11
  require 'json'
12
12
  require 'json/ext'
13
13
  require 'oj'
14
14
 
15
- $verbose = false
16
- $indent = 0
17
- $iter = 50_000
18
- $with_bignum = false
19
- $size = 1
15
+ @verbose = false
16
+ @indent = 0
17
+ @iter = 50_000
18
+ @with_bignum = false
19
+ @size = 1
20
20
 
21
21
  opts = OptionParser.new
22
- opts.on("-v", "verbose") { $verbose = true }
23
- opts.on("-c", "--count [Int]", Integer, "iterations") { |i| $iter = i }
24
- opts.on("-i", "--indent [Int]", Integer, "indentation") { |i| $indent = i }
25
- opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)") { |i| $size = i }
26
- opts.on("-b", "with bignum") { $with_bignum = true }
27
- opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
28
- files = opts.parse(ARGV)
29
-
30
- $obj = {
22
+ opts.on('-v', 'verbose') { @verbose = true }
23
+ opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| @iter = i }
24
+ opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| @indent = i }
25
+ opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| @size = i }
26
+ opts.on('-b', 'with bignum') { @with_bignum = true }
27
+ opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
28
+ opts.parse(ARGV)
29
+
30
+ @obj = {
31
31
  'a' => 'Alpha', # string
32
32
  'b' => true, # boolean
33
- 'c' => 12345, # number
34
- 'd' => [ true, [false, [-123456789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
33
+ 'c' => 12_345, # number
34
+ 'd' => [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
35
35
  'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
36
36
  'f' => nil, # nil
37
37
  'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
38
38
  'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
39
39
  }
40
- $obj['g'] = 12345678901234567890123456789 if $with_bignum
40
+ @obj['g'] = 12_345_678_901_234_567_890_123_456_789 if @with_bignum
41
41
 
42
- if 0 < $size
43
- o = $obj
44
- $obj = []
45
- (4 * $size).times do
46
- $obj << o
42
+ if 0 < @size
43
+ ob = @obj
44
+ @obj = []
45
+ (4 * @size).times do
46
+ @obj << ob
47
47
  end
48
48
  end
49
49
 
50
- Oj.default_options = { :indent => $indent, :mode => :strict, cache_keys: true, cache_str: 5 }
50
+ Oj.default_options = { :indent => @indent, :mode => :strict, cache_keys: true, cache_str: 5 }
51
51
 
52
- $json = Oj.dump($obj)
53
- $failed = {} # key is same as String used in tests later
52
+ @json = Oj.dump(@obj)
53
+ @failed = {} # key is same as String used in tests later
54
54
 
55
55
  class AllSaj < Oj::Saj
56
- def initialize()
57
- end
58
-
59
56
  def hash_start(key)
60
57
  end
61
58
 
@@ -73,31 +70,24 @@ class AllSaj < Oj::Saj
73
70
  end # AllSaj
74
71
 
75
72
  class NoSaj < Oj::Saj
76
- def initialize()
77
- end
78
73
  end # NoSaj
79
74
 
80
75
  class NoHandler < Oj::ScHandler
81
- def initialize()
82
- end
83
76
  end # NoHandler
84
77
 
85
78
  class AllHandler < Oj::ScHandler
86
- def initialize()
79
+ def hash_start
80
+ nil
87
81
  end
88
82
 
89
- def hash_start()
90
- return nil
83
+ def hash_end
91
84
  end
92
85
 
93
- def hash_end()
86
+ def array_start
87
+ nil
94
88
  end
95
89
 
96
- def array_start()
97
- return nil
98
- end
99
-
100
- def array_end()
90
+ def array_end
101
91
  end
102
92
 
103
93
  def add_value(value)
@@ -118,35 +108,33 @@ sc_handler = AllHandler.new()
118
108
  no_handler = NoHandler.new()
119
109
 
120
110
  def capture_error(tag, orig, load_key, dump_key, &blk)
121
- begin
122
- obj = blk.call(orig)
123
- raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
124
- rescue Exception => e
125
- $failed[tag] = "#{e.class}: #{e.message}"
126
- end
111
+ obj = blk.call(orig)
112
+ raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
113
+ rescue Exception => e
114
+ @failed[tag] = "#{e.class}: #{e.message}"
127
115
  end
128
116
 
129
117
  # Verify that all packages dump and load correctly and return the same Object as the original.
130
- capture_error('Yajl', $obj, 'encode', 'parse') { |o| Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
131
- capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o| JSON.generator = JSON::Ext::Generator; JSON::Ext::Parser.new(JSON.generate(o)).parse }
118
+ # capture_error('Yajl', @obj, 'encode', 'parse') { |o| Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
119
+ capture_error('JSON::Ext', @obj, 'generate', 'parse') { |o| JSON.generator = JSON::Ext::Generator; JSON::Ext::Parser.new(JSON.generate(o)).parse }
132
120
 
133
- if $verbose
134
- puts "json:\n#{$json}\n"
121
+ if @verbose
122
+ puts "json:\n#{@json}\n"
135
123
  end
136
124
 
137
125
  puts '-' * 80
138
- puts "Parse Performance"
126
+ puts 'Parse Performance'
139
127
  perf = Perf.new()
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) }
145
- perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
146
- perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new($json).parse } unless $failed.has_key?('JSON::Ext')
147
- perf.run($iter)
148
-
149
- unless $failed.empty?
150
- puts "The following packages were not included for the reason listed"
151
- $failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
128
+ perf.add('Oj::Saj.all', 'all') { Oj.saj_parse(saj_handler, @json) }
129
+ perf.add('Oj::Saj.none', 'none') { Oj.saj_parse(no_saj, @json) }
130
+ perf.add('Oj::Scp.all', 'all') { Oj.sc_parse(sc_handler, @json) }
131
+ perf.add('Oj::Scp.none', 'none') { Oj.sc_parse(no_handler, @json) }
132
+ perf.add('Oj::load', 'none') { Oj.wab_load(@json) }
133
+ # perf.add('Yajl', 'parse') { Yajl::Parser.parse(@json) } unless @failed.has_key?('Yajl')
134
+ perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new(@json).parse } unless @failed.key?('JSON::Ext')
135
+ perf.run(@iter)
136
+
137
+ unless @failed.empty?
138
+ puts 'The following packages were not included for the reason listed'
139
+ @failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
152
140
  end
data/test/perf_simple.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby -wW1
2
- # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.join(File.dirname(__FILE__), "../lib")
5
- $: << File.join(File.dirname(__FILE__), "../ext")
4
+ $LOAD_PATH << File.join(__dir__, '../lib')
5
+ $LOAD_PATH << File.join(__dir__, '../ext')
6
6
 
7
7
  require 'optparse'
8
8
  require 'yajl'
@@ -14,14 +14,15 @@ require 'oj'
14
14
  require 'ox'
15
15
 
16
16
  class Jazz
17
- def initialize()
17
+ def initialize
18
18
  @boolean = true
19
19
  @number = 58
20
- @string = "A string"
20
+ @string = 'A string'
21
21
  @array = [true, false, nil]
22
22
  @hash = { 'one' => 1, 'two' => 2 }
23
23
  end
24
- def to_json()
24
+
25
+ def to_json(*_args)
25
26
  %{
26
27
  { "boolean":#{@boolean},
27
28
  "number":#{@number},
@@ -31,7 +32,8 @@ class Jazz
31
32
  }
32
33
  }
33
34
  end
34
- def to_hash()
35
+
36
+ def to_hash
35
37
  { 'boolean' => @boolean,
36
38
  'number' => @number,
37
39
  'string' => @string,
@@ -39,37 +41,38 @@ class Jazz
39
41
  'hash' => @hash,
40
42
  }
41
43
  end
44
+
42
45
  def to_msgpack(out='')
43
46
  to_hash().to_msgpack(out)
44
47
  end
45
48
  end
46
49
 
47
50
  $indent = 2
48
- $iter = 10000
51
+ $iter = 10_000
49
52
  $with_object = true
50
53
  $with_bignum = true
51
54
  $with_nums = true
52
55
 
53
56
  opts = OptionParser.new
54
- opts.on("-c", "--count [Int]", Integer, "iterations") { |i| $iter = i }
55
- opts.on("-i", "--indent [Int]", Integer, "indentation") { |i| $indent = i }
56
- opts.on("-o", "without objects") { $with_object = false }
57
- opts.on("-b", "without bignum") { $with_bignum = false }
58
- opts.on("-n", "without numbers") { $with_nums = false }
59
- opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
60
- files = opts.parse(ARGV)
57
+ opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| $iter = i }
58
+ opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| $indent = i }
59
+ opts.on('-o', 'without objects') { $with_object = false }
60
+ opts.on('-b', 'without bignum') { $with_bignum = false }
61
+ opts.on('-n', 'without numbers') { $with_nums = false }
62
+ opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
63
+ opts.parse(ARGV)
61
64
 
62
65
  if $with_nums
63
66
  obj = {
64
67
  'a' => 'Alpha',
65
68
  'b' => true,
66
- 'c' => 12345,
67
- 'd' => [ true, [false, [12345, nil], 3.967, ['something', false], nil]],
69
+ 'c' => 12_345,
70
+ 'd' => [ true, [false, [12_345, nil], 3.967, ['something', false], nil]],
68
71
  'e' => { 'one' => 1, 'two' => 2 },
69
72
  'f' => nil,
70
73
  }
71
74
  obj['g'] = Jazz.new() if $with_object
72
- obj['h'] = 12345678901234567890123456789 if $with_bignum
75
+ obj['h'] = 12_345_678_901_234_567_890_123_456_789 if $with_bignum
73
76
  else
74
77
  obj = {
75
78
  'a' => 'Alpha',
@@ -102,7 +105,7 @@ end
102
105
  dt = Time.now - start
103
106
  base_dt = dt
104
107
  parse_results[:oj] = dt
105
- puts "%d Oj.load()s in %0.3f seconds or %0.1f loads/msec" % [$iter, dt, $iter/dt/1000.0]
108
+ puts '%d Oj.load()s in %0.3f seconds or %0.1f loads/msec' % [$iter, dt, $iter/dt/1000.0]
106
109
 
107
110
  start = Time.now
108
111
  $iter.times do
@@ -114,7 +117,7 @@ if base_dt < dt
114
117
  base_name = 'Yajl'
115
118
  end
116
119
  parse_results[:yajl] = dt
117
- puts "%d Yajl::Parser.parse()s in %0.3f seconds or %0.1f parses/msec" % [$iter, dt, $iter/dt/1000.0]
120
+ puts '%d Yajl::Parser.parse()s in %0.3f seconds or %0.1f parses/msec' % [$iter, dt, $iter/dt/1000.0]
118
121
 
119
122
  begin
120
123
  JSON.parser = JSON::Ext::Parser
@@ -128,7 +131,7 @@ begin
128
131
  base_name = 'JSON::Ext'
129
132
  end
130
133
  parse_results[:ext] = dt
131
- puts "%d JSON::Ext::Parser parse()s in %0.3f seconds or %0.1f parses/msec" % [$iter, dt, $iter/dt/1000.0]
134
+ puts '%d JSON::Ext::Parser parse()s in %0.3f seconds or %0.1f parses/msec' % [$iter, dt, $iter/dt/1000.0]
132
135
  rescue Exception => e
133
136
  puts "JSON::Ext failed: #{e.class}: #{e.message}"
134
137
  end
@@ -145,7 +148,7 @@ begin
145
148
  base_name = 'JSON::Pure'
146
149
  end
147
150
  parse_results[:pure] = dt
148
- puts "%d JSON::Pure::Parser parse()s in %0.3f seconds or %0.1f parses/msec" % [$iter, dt, $iter/dt/1000.0]
151
+ puts '%d JSON::Pure::Parser parse()s in %0.3f seconds or %0.1f parses/msec' % [$iter, dt, $iter/dt/1000.0]
149
152
  rescue Exception => e
150
153
  puts "JSON::Pure failed: #{e.class}: #{e.message}"
151
154
  end
@@ -162,7 +165,7 @@ begin
162
165
  base_name = 'MessagePack'
163
166
  end
164
167
  parse_results[:msgpack] = dt
165
- puts "%d MessagePack.unpack()s in %0.3f seconds or %0.1f packs/msec" % [$iter, dt, $iter/dt/1000.0]
168
+ puts '%d MessagePack.unpack()s in %0.3f seconds or %0.1f packs/msec' % [$iter, dt, $iter/dt/1000.0]
166
169
  rescue Exception => e
167
170
  puts "MessagePack failed: #{e.class}: #{e.message}"
168
171
  end
@@ -173,23 +176,22 @@ $iter.times do
173
176
  end
174
177
  dt = Time.now - start
175
178
  parse_results[:ox] = dt
176
- puts "%d Ox.load()s in %0.3f seconds or %0.1f loads/msec" % [$iter, dt, $iter/dt/1000.0]
179
+ puts '%d Ox.load()s in %0.3f seconds or %0.1f loads/msec' % [$iter, dt, $iter/dt/1000.0]
177
180
 
178
- puts "Parser results:"
181
+ puts 'Parser results:'
179
182
  puts "gem seconds parses/msec X faster than #{base_name} (higher is better)"
180
- parse_results.each do |name,dt|
181
- if 0.0 == dt
183
+ parse_results.each do |name, dt2|
184
+ if dt2 <= 0.0
182
185
  puts "#{name} failed to generate JSON"
183
186
  next
184
187
  end
185
- puts "%-7s %6.3f %5.1f %4.1f" % [name, dt, $iter/dt/1000.0, base_dt/dt]
188
+ puts '%-7s %6.3f %5.1f %4.1f' % [name, dt2, $iter/dt/1000.0, base_dt/dt2]
186
189
  end
187
190
 
188
191
  puts
189
192
 
190
193
  # Back to object mode for best performance when dumping.
191
194
  Oj.default_options = { :indent => $indent, :mode => :object }
192
- dump_results = { :oj => 0.0, :yajl => 0.0, :msgpack => 0.0, :pure => 0.0, :ext => 0.0, :ox => 0.0 }
193
195
 
194
196
  start = Time.now
195
197
  $iter.times do
@@ -199,7 +201,7 @@ dt = Time.now - start
199
201
  base_dt = dt
200
202
  base_name = 'Oj'
201
203
  parse_results[:oj] = dt
202
- puts "%d Oj.dump()s in %0.3f seconds or %0.1f dumps/msec" % [$iter, dt, $iter/dt/1000.0]
204
+ puts '%d Oj.dump()s in %0.3f seconds or %0.1f dumps/msec' % [$iter, dt, $iter/dt/1000.0]
203
205
 
204
206
  start = Time.now
205
207
  $iter.times do
@@ -211,7 +213,7 @@ if base_dt < dt
211
213
  base_name = 'Yajl'
212
214
  end
213
215
  parse_results[:yajl] = dt
214
- puts "%d Yajl::Encoder.encode()s in %0.3f seconds or %0.1f encodes/msec" % [$iter, dt, $iter/dt/1000.0]
216
+ puts '%d Yajl::Encoder.encode()s in %0.3f seconds or %0.1f encodes/msec' % [$iter, dt, $iter/dt/1000.0]
215
217
 
216
218
  begin
217
219
  JSON.parser = JSON::Ext::Parser
@@ -225,7 +227,7 @@ begin
225
227
  base_name = 'JSON::Ext'
226
228
  end
227
229
  parse_results[:pure] = dt
228
- puts "%d JSON::Ext generate()s in %0.3f seconds or %0.1f generates/msec" % [$iter, dt, $iter/dt/1000.0]
230
+ puts '%d JSON::Ext generate()s in %0.3f seconds or %0.1f generates/msec' % [$iter, dt, $iter/dt/1000.0]
229
231
  rescue Exception => e
230
232
  parse_results[:ext] = 0.0
231
233
  puts "JSON::Ext failed: #{e.class}: #{e.message}"
@@ -243,7 +245,7 @@ begin
243
245
  base_name = 'JSON::Pure'
244
246
  end
245
247
  parse_results[:pure] = dt
246
- puts "%d JSON::Pure generate()s in %0.3f seconds or %0.1f generates/msec" % [$iter, dt, $iter/dt/1000.0]
248
+ puts '%d JSON::Pure generate()s in %0.3f seconds or %0.1f generates/msec' % [$iter, dt, $iter/dt/1000.0]
247
249
  rescue Exception => e
248
250
  parse_results[:pure] = 0.0
249
251
  puts "JSON::Pure failed: #{e.class}: #{e.message}"
@@ -260,7 +262,7 @@ begin
260
262
  base_name = 'MessagePack'
261
263
  end
262
264
  parse_results[:msgpack] = dt
263
- puts "%d Msgpack()s in %0.3f seconds or %0.1f unpacks/msec" % [$iter, dt, $iter/dt/1000.0]
265
+ puts '%d Msgpack()s in %0.3f seconds or %0.1f unpacks/msec' % [$iter, dt, $iter/dt/1000.0]
264
266
  rescue Exception => e
265
267
  parse_results[:msgpack] = 0.0
266
268
  puts "MessagePack failed: #{e.class}: #{e.message}"
@@ -272,16 +274,16 @@ $iter.times do
272
274
  end
273
275
  dt = Time.now - start
274
276
  parse_results[:ox] = dt
275
- puts "%d Ox.dump()s in %0.3f seconds or %0.1f dumps/msec" % [$iter, dt, $iter/dt/1000.0]
277
+ puts '%d Ox.dump()s in %0.3f seconds or %0.1f dumps/msec' % [$iter, dt, $iter/dt/1000.0]
276
278
 
277
- puts "Parser results:"
279
+ puts 'Parser results:'
278
280
  puts "gem seconds dumps/msec X faster than #{base_name} (higher is better)"
279
- parse_results.each do |name,dt|
280
- if 0.0 == dt
281
+ parse_results.each do |name, dt2|
282
+ if dt2 <= 0.0
281
283
  puts "#{name} failed to generate JSON"
282
284
  next
283
285
  end
284
- puts "%-7s %6.3f %5.1f %4.1f" % [name, dt, $iter/dt/1000.0, base_dt/dt]
286
+ puts '%-7s %6.3f %5.1f %4.1f' % [name, dt2, $iter/dt/1000.0, base_dt/dt2]
285
287
  end
286
288
 
287
289
  puts
data/test/perf_strict.rb CHANGED
@@ -1,49 +1,49 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << '.'
5
- $: << File.join(File.dirname(__FILE__), "../lib")
6
- $: << File.join(File.dirname(__FILE__), "../ext")
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'
10
10
  require 'oj'
11
11
 
12
- $verbose = false
13
- $indent = 0
14
- $iter = 20000
15
- $with_bignum = false
16
- $with_nums = true
17
- $size = 0
18
- $symbolize = false
19
- $cache_keys = true
12
+ @verbose = false
13
+ @indent = 0
14
+ @iter = 20_000
15
+ @with_bignum = false
16
+ @with_nums = true
17
+ @size = 0
18
+ @symbolize = false
19
+ @cache_keys = true
20
20
 
21
21
  opts = OptionParser.new
22
- opts.on("-v", "verbose") { $verbose = true }
23
- opts.on("-c", "--count [Int]", Integer, "iterations") { |i| $iter = i }
24
- opts.on("-i", "--indent [Int]", Integer, "indentation") { |i| $indent = i }
25
- opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)") { |i| $size = i }
26
- opts.on("-b", "with bignum") { $with_bignum = true }
27
- opts.on("-n", "without numbers") { $with_nums = false }
28
- opts.on("-z", "--symbolize", "symbolize keys") { $symbolize = true }
29
- opts.on("-k", "--no-cache", "turn off key caching") { $cache_keys = false }
30
- opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
31
- files = opts.parse(ARGV)
32
-
33
- if $with_nums
34
- $obj = {
22
+ opts.on('-v', 'verbose') { @verbose = true }
23
+ opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| @iter = i }
24
+ opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| @indent = i }
25
+ opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| @size = i }
26
+ opts.on('-b', 'with bignum') { @with_bignum = true }
27
+ opts.on('-n', 'without numbers') { @with_nums = false }
28
+ opts.on('-z', '--symbolize', 'symbolize keys') { @symbolize = true }
29
+ opts.on('-k', '--no-cache', 'turn off key caching') { @cache_keys = false }
30
+ opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
31
+ opts.parse(ARGV)
32
+
33
+ if @with_nums
34
+ @obj = {
35
35
  'a' => 'Alpha', # string
36
36
  'b' => true, # boolean
37
- 'c' => 12345, # number
38
- 'd' => [ true, [false, [-123456789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
37
+ 'c' => 12_345, # number
38
+ 'd' => [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
39
39
  'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
40
40
  'f' => nil, # nil
41
41
  'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
42
42
  'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
43
43
  }
44
- $obj['g'] = 12345678901234567890123456789 if $with_bignum
44
+ @obj['g'] = 12_345_678_901_234_567_890_123_456_789 if @with_bignum
45
45
  else
46
- $obj = {
46
+ @obj = {
47
47
  'a' => 'Alpha',
48
48
  'b' => true,
49
49
  'c' => '12345',
@@ -55,37 +55,35 @@ else
55
55
  }
56
56
  end
57
57
 
58
- Oj.default_options = { :indent => $indent, :mode => :strict, cache_keys: $cache_keys, cache_str: 5 }
58
+ Oj.default_options = { :indent => @indent, :mode => :strict, cache_keys: @cache_keys, cache_str: 5 }
59
59
 
60
- if 0 < $size
61
- o = $obj
62
- $obj = []
63
- (4 * $size).times do
64
- $obj << o
60
+ if 0 < @size
61
+ ob = @obj
62
+ @obj = []
63
+ (4 * @size).times do
64
+ @obj << ob
65
65
  end
66
66
  end
67
67
 
68
- $json = Oj.dump($obj)
69
- $failed = {} # key is same as String used in tests later
68
+ @json = Oj.dump(@obj)
69
+ @failed = {} # key is same as String used in tests later
70
70
 
71
71
  def capture_error(tag, orig, load_key, dump_key, &blk)
72
- begin
73
- obj = blk.call(orig)
74
- raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
75
- rescue Exception => e
76
- $failed[tag] = "#{e.class}: #{e.message}"
77
- end
72
+ obj = blk.call(orig)
73
+ raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
74
+ rescue Exception => e
75
+ @failed[tag] = "#{e.class}: #{e.message}"
78
76
  end
79
77
 
80
78
  # Verify that all packages dump and load correctly and return the same Object as the original.
81
- capture_error('Oj:strict', $obj, 'load', 'dump') { |o|
79
+ capture_error('Oj:strict', @obj, 'load', 'dump') { |o|
82
80
  Oj.strict_load(Oj.dump(o))
83
81
  }
84
- capture_error('Yajl', $obj, 'encode', 'parse') { |o|
82
+ capture_error('Yajl', @obj, 'encode', 'parse') { |o|
85
83
  require 'yajl'
86
84
  Yajl::Parser.parse(Yajl::Encoder.encode(o))
87
85
  }
88
- capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
86
+ capture_error('JSON::Ext', @obj, 'generate', 'parse') { |o|
89
87
  require 'json'
90
88
  require 'json/ext'
91
89
  JSON.generator = JSON::Ext::Generator
@@ -93,47 +91,47 @@ capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
93
91
  JSON.parse(JSON.generate(o))
94
92
  }
95
93
 
96
- Oj.default_options = { symbol_keys: $symbolize }
94
+ Oj.default_options = { symbol_keys: @symbolize }
97
95
 
98
- if $verbose
99
- puts "json:\n#{$json}\n"
100
- puts "Oj loaded object:\n#{Oj.strict_load($json)}\n"
101
- puts "Yajl loaded object:\n#{Yajl::Parser.parse($json)}\n"
102
- puts "JSON loaded object:\n#{JSON::Ext::Parser.new($json).parse}\n"
96
+ if @verbose
97
+ puts "json:\n#{@json}\n"
98
+ puts "Oj loaded object:\n#{Oj.strict_load(@json)}\n"
99
+ puts "Yajl loaded object:\n#{Yajl::Parser.parse(@json)}\n"
100
+ puts "JSON loaded object:\n#{JSON::Ext::Parser.new(@json).parse}\n"
103
101
  end
104
102
 
105
103
  puts '-' * 80
106
- puts "Strict Parse Performance"
104
+ puts 'Strict Parse Performance'
107
105
  perf = Perf.new()
108
- unless $failed.has_key?('JSON::Ext')
109
- perf.add('JSON::Ext', 'parse') { JSON.parse($json, symbolize_names: $symbolize) }
106
+ unless @failed.key?('JSON::Ext')
107
+ perf.add('JSON::Ext', 'parse') { JSON.parse(@json, symbolize_names: @symbolize) }
110
108
  perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
111
109
  end
112
- unless $failed.has_key?('Oj:strict')
113
- perf.add('Oj:strict', 'strict_load') { Oj.strict_load($json) }
114
- perf.add('Oj:wab', 'wab_load') { Oj.wab_load($json) }
110
+ unless @failed.key?('Oj:strict')
111
+ perf.add('Oj:strict', 'strict_load') { Oj.strict_load(@json) }
112
+ perf.add('Oj:wab', 'wab_load') { Oj.wab_load(@json) }
115
113
  end
116
- perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
117
- perf.run($iter)
114
+ perf.add('Yajl', 'parse') { Yajl::Parser.parse(@json) } unless @failed.key?('Yajl')
115
+ perf.run(@iter)
118
116
 
119
117
  puts '-' * 80
120
- puts "Strict Dump Performance"
118
+ puts 'Strict Dump Performance'
121
119
  perf = Perf.new()
122
- unless $failed.has_key?('JSON::Ext')
123
- perf.add('JSON::Ext', 'dump') { JSON.generate($obj) }
120
+ unless @failed.key?('JSON::Ext')
121
+ perf.add('JSON::Ext', 'dump') { JSON.generate(@obj) }
124
122
  perf.before('JSON::Ext') { JSON.generator = JSON::Ext::Generator }
125
123
  end
126
- unless $failed.has_key?('Oj:strict')
127
- perf.add('Oj:strict', 'dump') { Oj.dump($obj) }
124
+ unless @failed.key?('Oj:strict')
125
+ perf.add('Oj:strict', 'dump') { Oj.dump(@obj) }
128
126
  end
129
- perf.add('Yajl', 'encode') { Yajl::Encoder.encode($obj) } unless $failed.has_key?('Yajl')
130
- perf.run($iter)
127
+ perf.add('Yajl', 'encode') { Yajl::Encoder.encode(@obj) } unless @failed.key?('Yajl')
128
+ perf.run(@iter)
131
129
 
132
130
  puts
133
131
  puts '-' * 80
134
132
  puts
135
133
 
136
- unless $failed.empty?
137
- puts "The following packages were not included for the reason listed"
138
- $failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
134
+ unless @failed.empty?
135
+ puts 'The following packages were not included for the reason listed'
136
+ @failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
139
137
  end