oj 3.13.11 → 3.15.0

Sign up to get free protection for your applications and to get access to all the features.
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_wab.rb CHANGED
@@ -1,131 +1,129 @@
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
12
+ @verbose = false
13
+ @indent = 0
14
+ @iter = 20_000
15
+ @with_bignum = false
16
+ @with_nums = true
17
+ @size = 0
18
18
 
19
19
  opts = OptionParser.new
20
- opts.on("-v", "verbose") { $verbose = true }
21
- opts.on("-c", "--count [Int]", Integer, "iterations") { |i| $iter = i }
22
- opts.on("-i", "--indent [Int]", Integer, "indentation") { |i| $indent = i }
23
- opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)") { |i| $size = i }
24
- opts.on("-b", "with bignum") { $with_bignum = true }
25
- opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
26
- files = opts.parse(ARGV)
20
+ opts.on('-v', 'verbose') { @verbose = true }
21
+ opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| @iter = i }
22
+ opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| @indent = i }
23
+ opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| @size = i }
24
+ opts.on('-b', 'with bignum') { @with_bignum = true }
25
+ opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
26
+ opts.parse(ARGV)
27
27
 
28
- $obj = {
28
+ @obj = {
29
29
  a: 'Alpha', # string
30
30
  b: true, # boolean
31
- c: 12345, # number
32
- d: [ true, [false, [-123456789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
31
+ c: 12_345, # number
32
+ d: [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
33
33
  e: { zero: nil, one: 1, two: 2, three: [3], four: [0, 1, 2, 3, 4] }, # hash
34
34
  f: nil, # nil
35
35
  h: { a: { b: { c: { d: {e: { f: { g: nil }}}}}}}, # deep hash, not that deep
36
36
  i: [[[[[[[nil]]]]]]] # deep array, again, not that deep
37
37
  }
38
- $obj[:g] = 12345678901234567890123456789 if $with_bignum
38
+ @obj[:g] = 12_345_678_901_234_567_890_123_456_789 if @with_bignum
39
39
 
40
- Oj.default_options = { :indent => $indent, :mode => :wab }
40
+ Oj.default_options = { :indent => @indent, :mode => :wab }
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
- $json = Oj.dump($obj)
51
- $obj_json = Oj.dump($obj, :mode => :object)
52
- #puts "*** size: #{$obj_json.size}"
53
- #puts "*** #{$obj_json}"
54
- $failed = {} # key is same as String used in tests later
50
+ @json = Oj.dump(@obj)
51
+ @obj_json = Oj.dump(@obj, :mode => :object)
52
+ # puts "*** size: #{@obj_json.size}"
53
+ # puts "*** #{@obj_json}"
54
+ @failed = {} # key is same as String used in tests later
55
55
 
56
56
  def capture_error(tag, orig, load_key, dump_key, &blk)
57
- begin
58
- obj = blk.call(orig)
59
- raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
60
- rescue Exception => e
61
- $failed[tag] = "#{e.class}: #{e.message}"
62
- end
57
+ obj = blk.call(orig)
58
+ raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
59
+ rescue Exception => e
60
+ @failed[tag] = "#{e.class}: #{e.message}"
63
61
  end
64
62
 
65
63
  # Verify that all packages dump and load correctly and return the same Object as the original.
66
- capture_error('Oj:wab', $obj, 'load', 'dump') { |o| Oj.wab_load(Oj.dump(o, :mode => :wab)) }
67
- capture_error('Yajl', $obj, 'encode', 'parse') { |o| require 'yajl'; Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
68
- capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
64
+ capture_error('Oj:wab', @obj, 'load', 'dump') { |o| Oj.wab_load(Oj.dump(o, :mode => :wab)) }
65
+ capture_error('Yajl', @obj, 'encode', 'parse') { |o| require 'yajl'; Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
66
+ capture_error('JSON::Ext', @obj, 'generate', 'parse') { |o|
69
67
  require 'json'
70
68
  require 'json/ext'
71
69
  JSON.generator = JSON::Ext::Generator
72
70
  JSON.parser = JSON::Ext::Parser
73
71
  JSON.parse(JSON.generate(o))
74
72
  }
75
- capture_error('JSON::Pure', $obj, 'generate', 'parse') { |o|
73
+ capture_error('JSON::Pure', @obj, 'generate', 'parse') { |o|
76
74
  require 'json/pure'
77
75
  JSON.generator = JSON::Pure::Generator
78
76
  JSON.parser = JSON::Pure::Parser
79
77
  JSON.parse(JSON.generate(o))
80
78
  }
81
79
 
82
- if $verbose
83
- puts "json:\n#{$json}\n"
84
- puts "object json:\n#{$obj_json}\n"
85
- puts "Oj loaded object:\n#{Oj.wab_load($json)}\n"
86
- puts "Yajl loaded object:\n#{Yajl::Parser.parse($json)}\n"
87
- puts "JSON loaded object:\n#{JSON::Ext::Parser.new($json).parse}\n"
80
+ if @verbose
81
+ puts "json:\n#{@json}\n"
82
+ puts "object json:\n#{@obj_json}\n"
83
+ puts "Oj loaded object:\n#{Oj.wab_load(@json)}\n"
84
+ puts "Yajl loaded object:\n#{Yajl::Parser.parse(@json)}\n"
85
+ puts "JSON loaded object:\n#{JSON::Ext::Parser.new(@json).parse}\n"
88
86
  end
89
87
 
90
88
  puts '-' * 80
91
- puts "Wab Parse Performance"
89
+ puts 'Wab Parse Performance'
92
90
  perf = Perf.new()
93
- unless $failed.has_key?('JSON::Ext')
94
- perf.add('JSON::Ext', 'parse') { JSON.parse($json) }
91
+ unless @failed.key?('JSON::Ext')
92
+ perf.add('JSON::Ext', 'parse') { JSON.parse(@json) }
95
93
  perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
96
94
  end
97
- unless $failed.has_key?('JSON::Pure')
98
- perf.add('JSON::Pure', 'parse') { JSON.parse($json) }
95
+ unless @failed.key?('JSON::Pure')
96
+ perf.add('JSON::Pure', 'parse') { JSON.parse(@json) }
99
97
  perf.before('JSON::Pure') { JSON.parser = JSON::Pure::Parser }
100
98
  end
101
- unless $failed.has_key?('Oj:wab')
102
- perf.add('Oj:wab', 'wab_load') { Oj.wab_load($json) }
99
+ unless @failed.key?('Oj:wab')
100
+ perf.add('Oj:wab', 'wab_load') { Oj.wab_load(@json) }
103
101
  end
104
- perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
105
- perf.run($iter)
102
+ perf.add('Yajl', 'parse') { Yajl::Parser.parse(@json) } unless @failed.key?('Yajl')
103
+ perf.run(@iter)
106
104
 
107
105
  puts '-' * 80
108
- puts "Wab Dump Performance"
106
+ puts 'Wab Dump Performance'
109
107
  perf = Perf.new()
110
- unless $failed.has_key?('JSON::Ext')
111
- perf.add('JSON::Ext', 'dump') { JSON.generate($obj) }
108
+ unless @failed.key?('JSON::Ext')
109
+ perf.add('JSON::Ext', 'dump') { JSON.generate(@obj) }
112
110
  perf.before('JSON::Ext') { JSON.generator = JSON::Ext::Generator }
113
111
  end
114
- unless $failed.has_key?('JSON::Pure')
115
- perf.add('JSON::Pure', 'generate') { JSON.generate($obj) }
112
+ unless @failed.key?('JSON::Pure')
113
+ perf.add('JSON::Pure', 'generate') { JSON.generate(@obj) }
116
114
  perf.before('JSON::Pure') { JSON.generator = JSON::Pure::Generator }
117
115
  end
118
- unless $failed.has_key?('Oj:wab')
119
- perf.add('Oj:wab', 'dump') { Oj.dump($obj, :mode => :wab) }
116
+ unless @failed.key?('Oj:wab')
117
+ perf.add('Oj:wab', 'dump') { Oj.dump(@obj, :mode => :wab) }
120
118
  end
121
- perf.add('Yajl', 'encode') { Yajl::Encoder.encode($obj) } unless $failed.has_key?('Yajl')
122
- perf.run($iter)
119
+ perf.add('Yajl', 'encode') { Yajl::Encoder.encode(@obj) } unless @failed.key?('Yajl')
120
+ perf.run(@iter)
123
121
 
124
122
  puts
125
123
  puts '-' * 80
126
124
  puts
127
125
 
128
- unless $failed.empty?
129
- puts "The following packages were not included for the reason listed"
130
- $failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
126
+ unless @failed.empty?
127
+ puts 'The following packages were not included for the reason listed'
128
+ @failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
131
129
  end
data/test/prec.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'oj'
4
4
 
5
- extras = {"locationLng" => -97.14690769100295}
5
+ extras = {'locationLng' => -97.14690769100295}
6
6
 
7
7
  Oj.default_options = {float_precision: 17}
8
8
 
@@ -10,13 +10,13 @@ encoded = Oj.dump(extras)
10
10
  puts encoded
11
11
  puts Oj.load(encoded)
12
12
 
13
- require "active_record"
13
+ require 'active_record'
14
14
 
15
15
  Oj::Rails.set_encoder()
16
16
  Oj::Rails.set_decoder()
17
17
 
18
18
  Oj.default_options = {float_precision: 17}
19
- # Using Oj rails encoder, gets the correct value: {"locationLng":-97.14690769100295}
19
+ # Using Oj rails encoder, gets the correct value: {'locationLng':-97.14690769100295}
20
20
  encoded = ActiveSupport::JSON.encode(extras)
21
21
  puts encoded
22
22
  puts ActiveSupport::JSON.decode(encoded)
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Change
4
3
  attr_accessor :time
data/test/sample/dir.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  require 'etc'
3
2
 
4
3
  module Sample
data/test/sample/doc.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  require 'sample/hasprops'
3
2
  require 'sample/group'
4
3
  require 'sample/layer'
data/test/sample/file.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  require 'etc'
3
2
 
4
3
  module Sample
data/test/sample/group.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Group
4
3
  attr_reader :members
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  module HasProps
4
3
 
data/test/sample/layer.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Layer < Group
4
3
  attr_accessor :name
data/test/sample/rect.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Rect < Shape
4
3
 
data/test/sample/shape.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Shape
4
3
  include HasProps
data/test/sample/text.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Sample
3
2
  class Text < Shape
4
3
  attr_accessor :text
data/test/sample.rb CHANGED
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env ruby -wW2
2
+ # frozen_string_literal: true
2
3
 
3
- if $0 == __FILE__
4
- $: << '.'
5
- $: << '..'
6
- $: << '../lib'
7
- $: << '../ext'
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
- require 'pp'
11
11
  require 'sample/doc'
12
12
 
13
13
  def sample_doc(size=3)
14
14
  colors = [ :black, :gray, :white, :red, :blue, :yellow, :green, :purple, :orange ]
15
15
 
16
- d = ::Sample::Doc.new('Sample')
16
+ d = Sample::Doc.new('Sample')
17
17
 
18
18
  # add some history
19
19
  (0..size * 10).each do |i|
@@ -22,22 +22,22 @@ def sample_doc(size=3)
22
22
 
23
23
  # add some layers
24
24
  (1..size).each do |i|
25
- layer = ::Sample::Layer.new("Layer-#{i}")
25
+ layer = Sample::Layer.new("Layer-#{i}")
26
26
  (1..size).each do |j|
27
- g = ::Sample::Group.new
27
+ g = Sample::Group.new
28
28
  (1..size).each do |k|
29
- g2 = ::Sample::Group.new
30
- r = ::Sample::Rect.new(j * 40 + 10.0, i * 10.0,
31
- 10.123456 / k, 10.0 / k, colors[(i + j + k) % colors.size])
29
+ g2 = Sample::Group.new
30
+ r = Sample::Rect.new((j * 40) + 10.0, i * 10.0,
31
+ 10.123456 / k, 10.0 / k, colors[(i + j + k) % colors.size])
32
32
  r.add_prop(:part_of, layer.name)
33
33
  g2 << r
34
- g2 << ::Sample::Text.new("#{k} in #{j}", r.left, r.top, r.width, r.height)
34
+ g2 << Sample::Text.new("#{k} in #{j}", r.left, r.top, r.width, r.height)
35
35
  g << g2
36
36
  end
37
- g2 = ::Sample::Group.new
37
+ g2 = Sample::Group.new
38
38
  (1..size).each do |k|
39
- o = ::Sample::Oval.new(j * 40 + 12.0, i * 10.0 + 2.0,
40
- 6.0 / k, 6.0 / k, colors[(i + j + k) % colors.size])
39
+ o = Sample::Oval.new((j * 40) + 12.0, (i * 10.0) + 2.0,
40
+ 6.0 / k, 6.0 / k, colors[(i + j + k) % colors.size])
41
41
  o.add_prop(:inside, true)
42
42
  g << o
43
43
  end
data/test/sample_json.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- if $0 == __FILE__
4
- $: << '.'
5
- $: << '..'
6
- $: << '../lib'
7
- $: << '../ext'
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
- require 'pp'
11
11
  require 'oj'
12
12
 
13
13
  def sample_json(size=3)
@@ -32,6 +32,6 @@ def sample_json(size=3)
32
32
  container
33
33
  end
34
34
 
35
- if $0 == __FILE__
36
- File.open('sample.json', "w") { |f| f.write(Oj.dump(sample_json(3), :indent => 2)) }
35
+ if $PROGRAM_NAME == __FILE__
36
+ File.write('sample.json', Oj.dump(sample_json(3), :indent => 2))
37
37
  end
data/test/test_compat.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: utf-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
5
- $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
4
+ $LOAD_PATH << __dir__
5
+ @oj_dir = File.dirname(File.expand_path(__dir__))
6
6
  %w(lib ext).each do |dir|
7
- $: << File.join($oj_dir, dir)
7
+ $LOAD_PATH << File.join(@oj_dir, dir)
8
8
  end
9
9
 
10
10
  require 'minitest'
@@ -29,18 +29,16 @@ class CompatJuice < Minitest::Test
29
29
  end
30
30
  alias == eql?
31
31
 
32
- def to_json(*a)
33
- %|{"json_class":"#{self.class.to_s}","x":#{@x},"y":#{@y}}|
32
+ def to_json(*_a)
33
+ %|{"json_class":"#{self.class}","x":#{@x},"y":#{@y}}|
34
34
  end
35
35
 
36
36
  def self.json_create(h)
37
- self.new(h['x'], h['y'])
37
+ new(h['x'], h['y'])
38
38
  end
39
39
  end # Jeez
40
40
 
41
41
  class Argy
42
- def initialize()
43
- end
44
42
 
45
43
  def to_json(*a)
46
44
  %|{"args":"#{a}"}|
@@ -48,10 +46,8 @@ class CompatJuice < Minitest::Test
48
46
  end # Argy
49
47
 
50
48
  class Stringy
51
- def initialize()
52
- end
53
49
 
54
- def to_s()
50
+ def to_s
55
51
  %|[1,2]|
56
52
  end
57
53
  end # Stringy
@@ -61,20 +57,17 @@ class CompatJuice < Minitest::Test
61
57
  module Three
62
58
  class Deep
63
59
 
64
- def initialize()
65
- end
66
-
67
60
  def eql?(o)
68
61
  self.class == o.class
69
62
  end
70
63
  alias == eql?
71
64
 
72
- def to_json(*a)
65
+ def to_json(*_a)
73
66
  %|{"json_class":"#{self.class.name}"}|
74
67
  end
75
68
 
76
- def self.json_create(h)
77
- self.new()
69
+ def self.json_create(_h)
70
+ new()
78
71
  end
79
72
  end # Deep
80
73
  end # Three
@@ -106,24 +99,30 @@ class CompatJuice < Minitest::Test
106
99
 
107
100
  def test_fixnum
108
101
  dump_and_load(0, false)
109
- dump_and_load(12345, false)
110
- dump_and_load(-54321, false)
102
+ dump_and_load(12_345, false)
103
+ dump_and_load(-54_321, false)
111
104
  dump_and_load(1, false)
112
105
  end
113
106
 
107
+ def test_fixnum_array
108
+ data = (1..1000).to_a
109
+ json = Oj.dump(data, mode: :compat)
110
+ assert_equal("[#{data.join(',')}]", json)
111
+ end
112
+
114
113
  def test_float
115
114
  dump_and_load(0.0, false)
116
115
  dump_and_load(0.56, false)
117
116
  dump_and_load(3.0, false)
118
- dump_and_load(12345.6789, false)
117
+ dump_and_load(12_345.6789, false)
119
118
  dump_and_load(70.35, false)
120
- dump_and_load(-54321.012, false)
119
+ dump_and_load(-54_321.012, false)
121
120
  dump_and_load(1.7775, false)
122
121
  dump_and_load(2.5024, false)
123
122
  dump_and_load(2.48e16, false)
124
123
  dump_and_load(2.48e100 * 1.0e10, false)
125
124
  dump_and_load(-2.48e100 * 1.0e10, false)
126
- dump_and_load(1405460727.723866, false)
125
+ dump_and_load(1_405_460_727.723866, false)
127
126
  dump_and_load(0.5773, false)
128
127
  dump_and_load(0.6768, false)
129
128
  dump_and_load(0.685, false)
@@ -148,7 +147,7 @@ class CompatJuice < Minitest::Test
148
147
  def test_encode
149
148
  opts = Oj.default_options
150
149
  Oj.default_options = { :ascii_only => true }
151
- json = Oj.dump("ぴーたー")
150
+ json = Oj.dump('ぴーたー')
152
151
  assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
153
152
  Oj.default_options = opts
154
153
  end
@@ -170,7 +169,7 @@ class CompatJuice < Minitest::Test
170
169
  end
171
170
 
172
171
  def test_array_deep
173
- dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
172
+ dump_and_load([1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20]]]]]]]]]]]]]]]]]]]], false)
174
173
  end
175
174
 
176
175
  def test_symbol
@@ -179,8 +178,8 @@ class CompatJuice < Minitest::Test
179
178
  end
180
179
 
181
180
  def test_time_xml_schema
182
- t = Time.xmlschema("2012-01-05T23:58:07.123456000+09:00")
183
- #t = Time.local(2012, 1, 5, 23, 58, 7, 123456)
181
+ t = Time.xmlschema('2012-01-05T23:58:07.123456000+09:00')
182
+ # t = Time.local(2012, 1, 5, 23, 58, 7, 123456)
184
183
  json = Oj.dump(t, :mode => :compat)
185
184
  assert_equal(%{"2012-01-05 23:58:07 +0900"}, json)
186
185
  end
@@ -199,8 +198,9 @@ class CompatJuice < Minitest::Test
199
198
  def test_non_str_hash
200
199
  json = Oj.dump({ 1 => true, 0 => false }, :mode => :compat)
201
200
  h = Oj.load(json, :mode => :strict)
202
- assert_equal({ "1" => true, "0" => false }, h)
201
+ assert_equal({ '1' => true, '0' => false }, h)
203
202
  end
203
+
204
204
  def test_hash
205
205
  dump_and_load({}, false)
206
206
  dump_and_load({ 'true' => true, 'false' => false}, false)
@@ -239,12 +239,12 @@ class CompatJuice < Minitest::Test
239
239
  def test_invalid_escapes_handled
240
240
  json = '{"subtext":"\"404er\” \w \k \3 \a"}'
241
241
  obj = Oj.compat_load(json)
242
- assert_equal({"subtext" => "\"404er” w k 3 a"}, obj)
242
+ assert_equal({'subtext' => '"404er” w k 3 a'}, obj)
243
243
  end
244
244
 
245
245
  def test_hash_escaping
246
246
  json = Oj.to_json({'<>' => '<>'}, mode: :compat)
247
- assert_equal(json, '{"<>":"<>"}')
247
+ assert_equal('{"<>":"<>"}', json)
248
248
  end
249
249
 
250
250
  def test_bignum_object
@@ -271,7 +271,7 @@ class CompatJuice < Minitest::Test
271
271
  def test_bignum_compat
272
272
  json = Oj.dump(7 ** 55, :mode => :compat)
273
273
  b = Oj.load(json, :mode => :strict)
274
- assert_equal(30226801971775055948247051683954096612865741943, b)
274
+ assert_equal(30_226_801_971_775_055_948_247_051_683_954_096_612_865_741_943, b)
275
275
  end
276
276
 
277
277
  # BigDecimal
@@ -313,7 +313,7 @@ class CompatJuice < Minitest::Test
313
313
  if x.is_a?(String)
314
314
  assert_equal(orig.to_s, x)
315
315
  else # better be a Hash
316
- assert_equal({"year" => orig.year, "month" => orig.month, "day" => orig.day, "start" => orig.start}, x)
316
+ assert_equal({'year' => orig.year, 'month' => orig.month, 'day' => orig.day, 'start' => orig.start}, x)
317
317
  end
318
318
  end
319
319
 
@@ -340,13 +340,13 @@ class CompatJuice < Minitest::Test
340
340
  end
341
341
 
342
342
  def test_io_file
343
- filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
344
- File.open(filename, 'w') { |f| f.write(%{{
343
+ filename = File.join(__dir__, 'open_file_test.json')
344
+ File.write(filename, %{{
345
345
  "x":true,
346
346
  "y":58,
347
347
  "z": [1,2,3]
348
348
  }
349
- }) }
349
+ })
350
350
  f = File.new(filename)
351
351
  obj = Oj.compat_load(f)
352
352
  f.close()
@@ -410,7 +410,7 @@ class CompatJuice < Minitest::Test
410
410
 
411
411
  # A child to_json should not be called.
412
412
  def test_json_object_child
413
- obj = { "child" => Jeez.new(true, 58) }
413
+ obj = { 'child' => Jeez.new(true, 58) }
414
414
  assert_equal('{"child":{"json_class":"CompatJuice::Jeez","x":true,"y":58}}', Oj.dump(obj))
415
415
  end
416
416
 
@@ -431,10 +431,10 @@ class CompatJuice < Minitest::Test
431
431
  begin
432
432
  Oj.compat_load(json, :create_additions => true)
433
433
  rescue Exception => e
434
- assert_equal("ArgumentError", e.class().name)
434
+ assert_equal('ArgumentError', e.class().name)
435
435
  return
436
436
  end
437
- assert(false, "*** expected an exception")
437
+ assert(false, '*** expected an exception')
438
438
  end
439
439
 
440
440
  def test_json_object_create_cache
@@ -450,7 +450,7 @@ class CompatJuice < Minitest::Test
450
450
  expected = Jeez.new(true, 58)
451
451
  json = Oj.to_json(expected)
452
452
  json.gsub!('json_class', '_class_')
453
- obj = Oj.compat_load(json, :create_id => "_class_", :create_additions => true)
453
+ obj = Oj.compat_load(json, :create_id => '_class_', :create_additions => true)
454
454
  assert_equal(expected, obj)
455
455
  end
456
456
 
@@ -485,13 +485,47 @@ class CompatJuice < Minitest::Test
485
485
 
486
486
  def test_parse_to_s
487
487
  s = Stringy.new
488
- assert_equal([1,2], Oj.load(s, :mode => :compat))
488
+ assert_equal([1, 2], Oj.load(s, :mode => :compat))
489
+ end
490
+
491
+ def test_parse_large_string
492
+ error = assert_raises() { Oj.load(%|{"a":"aaaaaaaaaa\0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}|) }
493
+ assert_includes(error.message, 'NULL byte in string')
494
+
495
+ error = assert_raises() { Oj.load(%|{"a":"aaaaaaaaaaaaaaaaaaaa }|) }
496
+ assert_includes(error.message, 'quoted string not terminated')
497
+
498
+ json =<<~JSON
499
+ {
500
+ "a": "\\u3074\\u30fc\\u305f\\u30fc",
501
+ "b": "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"
502
+ }
503
+ JSON
504
+ assert_equal('ぴーたー', Oj.load(json)['a'])
505
+ end
506
+
507
+ def test_parse_large_escaped_string
508
+ invalid_json = %|{"a":"aaaa\\nbbbb\\rcccc\\tddd\\feee\\bf/\\\\\\u3074\\u30fc\\u305f\\u30fc }|
509
+ error = assert_raises() { Oj.load(invalid_json) }
510
+ assert_includes(error.message, 'quoted string not terminated')
511
+
512
+ json = '"aaaa\\nbbbb\\rcccc\\tddd\\feee\\bf/\\\\\\u3074\\u30fc\\u305f\\u30fc "'
513
+ assert_equal("aaaa\nbbbb\rcccc\tddd\feee\bf/\\ぴーたー ", Oj.load(json))
514
+ end
515
+
516
+ def test_invalid_to_s
517
+ obj = Object.new
518
+ def obj.to_s
519
+ nil
520
+ end
521
+
522
+ assert_raises(TypeError) { Oj.dump(obj, mode: :compat) }
489
523
  end
490
524
 
491
525
  def dump_and_load(obj, trace=false)
492
526
  json = Oj.dump(obj)
493
527
  puts json if trace
494
- loaded = Oj.compat_load(json, :create_additions => true);
528
+ loaded = Oj.compat_load(json, :create_additions => true)
495
529
  if obj.nil?
496
530
  assert_nil(loaded)
497
531
  else
@@ -503,7 +537,7 @@ class CompatJuice < Minitest::Test
503
537
  def dump_to_json_and_load(obj, trace=false)
504
538
  json = Oj.to_json(obj, :indent => ' ')
505
539
  puts json if trace
506
- loaded = Oj.compat_load(json, :create_additions => true);
540
+ loaded = Oj.compat_load(json, :create_additions => true)
507
541
  if obj.nil?
508
542
  assert_nil(loaded)
509
543
  else