oj 3.13.23 → 3.16.10

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 (178) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +86 -0
  3. data/README.md +2 -2
  4. data/ext/oj/buf.h +7 -6
  5. data/ext/oj/cache.c +29 -26
  6. data/ext/oj/cache.h +3 -2
  7. data/ext/oj/cache8.c +10 -9
  8. data/ext/oj/circarray.c +7 -5
  9. data/ext/oj/circarray.h +2 -2
  10. data/ext/oj/code.c +5 -12
  11. data/ext/oj/code.h +2 -2
  12. data/ext/oj/compat.c +20 -60
  13. data/ext/oj/custom.c +26 -59
  14. data/ext/oj/debug.c +3 -9
  15. data/ext/oj/dump.c +103 -53
  16. data/ext/oj/dump.h +1 -4
  17. data/ext/oj/dump_compat.c +557 -592
  18. data/ext/oj/dump_leaf.c +3 -5
  19. data/ext/oj/dump_object.c +42 -48
  20. data/ext/oj/dump_strict.c +10 -22
  21. data/ext/oj/encoder.c +1 -1
  22. data/ext/oj/err.c +2 -13
  23. data/ext/oj/err.h +9 -12
  24. data/ext/oj/extconf.rb +16 -7
  25. data/ext/oj/fast.c +63 -98
  26. data/ext/oj/intern.c +62 -47
  27. data/ext/oj/intern.h +3 -7
  28. data/ext/oj/mem.c +318 -0
  29. data/ext/oj/mem.h +53 -0
  30. data/ext/oj/mimic_json.c +54 -38
  31. data/ext/oj/object.c +33 -43
  32. data/ext/oj/odd.c +8 -6
  33. data/ext/oj/odd.h +4 -4
  34. data/ext/oj/oj.c +245 -216
  35. data/ext/oj/oj.h +83 -81
  36. data/ext/oj/parse.c +109 -153
  37. data/ext/oj/parse.h +21 -24
  38. data/ext/oj/parser.c +80 -67
  39. data/ext/oj/parser.h +9 -8
  40. data/ext/oj/rails.c +71 -94
  41. data/ext/oj/reader.c +9 -14
  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 +13 -15
  47. data/ext/oj/saj2.c +37 -49
  48. data/ext/oj/saj2.h +1 -1
  49. data/ext/oj/scp.c +6 -20
  50. data/ext/oj/sparse.c +22 -70
  51. data/ext/oj/stream_writer.c +46 -48
  52. data/ext/oj/strict.c +22 -56
  53. data/ext/oj/string_writer.c +64 -40
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +125 -114
  56. data/ext/oj/usual.h +7 -6
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +13 -2
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/wab.c +25 -57
  61. data/lib/oj/active_support_helper.rb +1 -3
  62. data/lib/oj/bag.rb +7 -1
  63. data/lib/oj/easy_hash.rb +4 -5
  64. data/lib/oj/error.rb +0 -1
  65. data/lib/oj/json.rb +162 -150
  66. data/lib/oj/mimic.rb +7 -7
  67. data/lib/oj/schandler.rb +5 -4
  68. data/lib/oj/state.rb +8 -5
  69. data/lib/oj/version.rb +1 -2
  70. data/lib/oj.rb +2 -0
  71. data/pages/InstallOptions.md +20 -0
  72. data/pages/Options.md +4 -0
  73. metadata +46 -121
  74. data/test/_test_active.rb +0 -76
  75. data/test/_test_active_mimic.rb +0 -96
  76. data/test/_test_mimic_rails.rb +0 -126
  77. data/test/activerecord/result_test.rb +0 -32
  78. data/test/activesupport4/decoding_test.rb +0 -108
  79. data/test/activesupport4/encoding_test.rb +0 -531
  80. data/test/activesupport4/test_helper.rb +0 -41
  81. data/test/activesupport5/abstract_unit.rb +0 -45
  82. data/test/activesupport5/decoding_test.rb +0 -133
  83. data/test/activesupport5/encoding_test.rb +0 -500
  84. data/test/activesupport5/encoding_test_cases.rb +0 -98
  85. data/test/activesupport5/test_helper.rb +0 -72
  86. data/test/activesupport5/time_zone_test_helpers.rb +0 -39
  87. data/test/activesupport6/abstract_unit.rb +0 -44
  88. data/test/activesupport6/decoding_test.rb +0 -133
  89. data/test/activesupport6/encoding_test.rb +0 -507
  90. data/test/activesupport6/encoding_test_cases.rb +0 -98
  91. data/test/activesupport6/test_common.rb +0 -17
  92. data/test/activesupport6/test_helper.rb +0 -163
  93. data/test/activesupport6/time_zone_test_helpers.rb +0 -39
  94. data/test/activesupport7/abstract_unit.rb +0 -49
  95. data/test/activesupport7/decoding_test.rb +0 -125
  96. data/test/activesupport7/encoding_test.rb +0 -486
  97. data/test/activesupport7/encoding_test_cases.rb +0 -104
  98. data/test/activesupport7/time_zone_test_helpers.rb +0 -47
  99. data/test/bar.rb +0 -11
  100. data/test/baz.rb +0 -16
  101. data/test/bug.rb +0 -16
  102. data/test/files.rb +0 -29
  103. data/test/foo.rb +0 -77
  104. data/test/helper.rb +0 -42
  105. data/test/isolated/shared.rb +0 -308
  106. data/test/isolated/test_mimic_after.rb +0 -13
  107. data/test/isolated/test_mimic_alone.rb +0 -12
  108. data/test/isolated/test_mimic_as_json.rb +0 -45
  109. data/test/isolated/test_mimic_before.rb +0 -13
  110. data/test/isolated/test_mimic_define.rb +0 -28
  111. data/test/isolated/test_mimic_rails_after.rb +0 -22
  112. data/test/isolated/test_mimic_rails_before.rb +0 -21
  113. data/test/isolated/test_mimic_redefine.rb +0 -15
  114. data/test/json_gem/json_addition_test.rb +0 -216
  115. data/test/json_gem/json_common_interface_test.rb +0 -153
  116. data/test/json_gem/json_encoding_test.rb +0 -107
  117. data/test/json_gem/json_ext_parser_test.rb +0 -20
  118. data/test/json_gem/json_fixtures_test.rb +0 -35
  119. data/test/json_gem/json_generator_test.rb +0 -396
  120. data/test/json_gem/json_generic_object_test.rb +0 -90
  121. data/test/json_gem/json_parser_test.rb +0 -477
  122. data/test/json_gem/json_string_matching_test.rb +0 -42
  123. data/test/json_gem/test_helper.rb +0 -30
  124. data/test/mem.rb +0 -33
  125. data/test/perf.rb +0 -107
  126. data/test/perf_compat.rb +0 -130
  127. data/test/perf_dump.rb +0 -50
  128. data/test/perf_fast.rb +0 -164
  129. data/test/perf_file.rb +0 -64
  130. data/test/perf_object.rb +0 -138
  131. data/test/perf_once.rb +0 -58
  132. data/test/perf_parser.rb +0 -189
  133. data/test/perf_saj.rb +0 -109
  134. data/test/perf_scp.rb +0 -152
  135. data/test/perf_simple.rb +0 -287
  136. data/test/perf_strict.rb +0 -139
  137. data/test/perf_wab.rb +0 -131
  138. data/test/prec.rb +0 -23
  139. data/test/sample/change.rb +0 -14
  140. data/test/sample/dir.rb +0 -19
  141. data/test/sample/doc.rb +0 -36
  142. data/test/sample/file.rb +0 -48
  143. data/test/sample/group.rb +0 -16
  144. data/test/sample/hasprops.rb +0 -16
  145. data/test/sample/layer.rb +0 -12
  146. data/test/sample/line.rb +0 -20
  147. data/test/sample/oval.rb +0 -10
  148. data/test/sample/rect.rb +0 -10
  149. data/test/sample/shape.rb +0 -35
  150. data/test/sample/text.rb +0 -20
  151. data/test/sample.rb +0 -54
  152. data/test/sample_json.rb +0 -37
  153. data/test/test_compat.rb +0 -540
  154. data/test/test_custom.rb +0 -544
  155. data/test/test_debian.rb +0 -53
  156. data/test/test_fast.rb +0 -530
  157. data/test/test_file.rb +0 -255
  158. data/test/test_gc.rb +0 -60
  159. data/test/test_generate.rb +0 -21
  160. data/test/test_hash.rb +0 -39
  161. data/test/test_integer_range.rb +0 -72
  162. data/test/test_null.rb +0 -376
  163. data/test/test_object.rb +0 -1025
  164. data/test/test_parser.rb +0 -11
  165. data/test/test_parser_debug.rb +0 -27
  166. data/test/test_parser_saj.rb +0 -335
  167. data/test/test_parser_usual.rb +0 -217
  168. data/test/test_rails.rb +0 -35
  169. data/test/test_saj.rb +0 -186
  170. data/test/test_scp.rb +0 -431
  171. data/test/test_strict.rb +0 -435
  172. data/test/test_various.rb +0 -752
  173. data/test/test_wab.rb +0 -309
  174. data/test/test_writer.rb +0 -380
  175. data/test/tests.rb +0 -33
  176. data/test/tests_mimic.rb +0 -23
  177. data/test/tests_mimic_addition.rb +0 -16
  178. data/test/zoo.rb +0 -13
data/test/perf_simple.rb DELETED
@@ -1,287 +0,0 @@
1
- #!/usr/bin/env ruby -wW1
2
- # encoding: UTF-8
3
-
4
- $: << File.join(File.dirname(__FILE__), "../lib")
5
- $: << File.join(File.dirname(__FILE__), "../ext")
6
-
7
- require 'optparse'
8
- require 'yajl'
9
- require 'json'
10
- require 'json/pure'
11
- require 'json/ext'
12
- require 'msgpack'
13
- require 'oj'
14
- require 'ox'
15
-
16
- class Jazz
17
- def initialize()
18
- @boolean = true
19
- @number = 58
20
- @string = "A string"
21
- @array = [true, false, nil]
22
- @hash = { 'one' => 1, 'two' => 2 }
23
- end
24
- def to_json()
25
- %{
26
- { "boolean":#{@boolean},
27
- "number":#{@number},
28
- "string":#{@string},
29
- "array":#{@array},
30
- "hash":#{@hash},
31
- }
32
- }
33
- end
34
- def to_hash()
35
- { 'boolean' => @boolean,
36
- 'number' => @number,
37
- 'string' => @string,
38
- 'array' => @array,
39
- 'hash' => @hash,
40
- }
41
- end
42
- def to_msgpack(out='')
43
- to_hash().to_msgpack(out)
44
- end
45
- end
46
-
47
- $indent = 2
48
- $iter = 10000
49
- $with_object = true
50
- $with_bignum = true
51
- $with_nums = true
52
-
53
- 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)
61
-
62
- if $with_nums
63
- obj = {
64
- 'a' => 'Alpha',
65
- 'b' => true,
66
- 'c' => 12345,
67
- 'd' => [ true, [false, [12345, nil], 3.967, ['something', false], nil]],
68
- 'e' => { 'one' => 1, 'two' => 2 },
69
- 'f' => nil,
70
- }
71
- obj['g'] = Jazz.new() if $with_object
72
- obj['h'] = 12345678901234567890123456789 if $with_bignum
73
- else
74
- obj = {
75
- 'a' => 'Alpha',
76
- 'b' => true,
77
- 'c' => '12345',
78
- 'd' => [ true, [false, ['12345', nil], '3.967', ['something', false], nil]],
79
- 'e' => { 'one' => '1', 'two' => '2' },
80
- 'f' => nil,
81
- }
82
- end
83
-
84
- Oj.default_options = { :indent => $indent, :mode => :object }
85
-
86
- s = Oj.dump(obj)
87
-
88
- xml = Ox.dump(obj, :indent => $indent)
89
-
90
- puts
91
-
92
- # Put Oj in strict mode so it only create JSON native types instead of the
93
- # original Ruby Objects. None of the other packages other than Ox support
94
- # Object recreation so no need for Oj to do it in the performance tests.
95
- Oj.default_options = { :mode => :strict }
96
- parse_results = { :oj => 0.0, :yajl => 0.0, :msgpack => 0.0, :pure => 0.0, :ext => 0.0, :ox => 0.0 }
97
-
98
- start = Time.now
99
- $iter.times do
100
- Oj.load(s)
101
- end
102
- dt = Time.now - start
103
- base_dt = dt
104
- 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]
106
-
107
- start = Time.now
108
- $iter.times do
109
- Yajl::Parser.parse(s)
110
- end
111
- dt = Time.now - start
112
- if base_dt < dt
113
- base_dt = dt
114
- base_name = 'Yajl'
115
- end
116
- 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]
118
-
119
- begin
120
- JSON.parser = JSON::Ext::Parser
121
- start = Time.now
122
- $iter.times do
123
- JSON.parse(s)
124
- end
125
- dt = Time.now - start
126
- if base_dt < dt
127
- base_dt = dt
128
- base_name = 'JSON::Ext'
129
- end
130
- 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]
132
- rescue Exception => e
133
- puts "JSON::Ext failed: #{e.class}: #{e.message}"
134
- end
135
-
136
- begin
137
- JSON.parser = JSON::Pure::Parser
138
- start = Time.now
139
- $iter.times do
140
- JSON.parse(s)
141
- end
142
- dt = Time.now - start
143
- if base_dt < dt
144
- base_dt = dt
145
- base_name = 'JSON::Pure'
146
- end
147
- 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]
149
- rescue Exception => e
150
- puts "JSON::Pure failed: #{e.class}: #{e.message}"
151
- end
152
-
153
- begin
154
- mp = MessagePack.pack(obj)
155
- start = Time.now
156
- $iter.times do
157
- MessagePack.unpack(mp)
158
- end
159
- dt = Time.now - start
160
- if base_dt < dt
161
- base_dt = dt
162
- base_name = 'MessagePack'
163
- end
164
- 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]
166
- rescue Exception => e
167
- puts "MessagePack failed: #{e.class}: #{e.message}"
168
- end
169
-
170
- start = Time.now
171
- $iter.times do
172
- Ox.load(xml)
173
- end
174
- dt = Time.now - start
175
- 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]
177
-
178
- puts "Parser results:"
179
- 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
182
- puts "#{name} failed to generate JSON"
183
- next
184
- end
185
- puts "%-7s %6.3f %5.1f %4.1f" % [name, dt, $iter/dt/1000.0, base_dt/dt]
186
- end
187
-
188
- puts
189
-
190
- # Back to object mode for best performance when dumping.
191
- 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
-
194
- start = Time.now
195
- $iter.times do
196
- Oj.dump(obj)
197
- end
198
- dt = Time.now - start
199
- base_dt = dt
200
- base_name = 'Oj'
201
- 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]
203
-
204
- start = Time.now
205
- $iter.times do
206
- Yajl::Encoder.encode(obj)
207
- end
208
- dt = Time.now - start
209
- if base_dt < dt
210
- base_dt = dt
211
- base_name = 'Yajl'
212
- end
213
- 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]
215
-
216
- begin
217
- JSON.parser = JSON::Ext::Parser
218
- start = Time.now
219
- $iter.times do
220
- JSON.generate(obj)
221
- end
222
- dt = Time.now - start
223
- if base_dt < dt
224
- base_dt = dt
225
- base_name = 'JSON::Ext'
226
- end
227
- 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]
229
- rescue Exception => e
230
- parse_results[:ext] = 0.0
231
- puts "JSON::Ext failed: #{e.class}: #{e.message}"
232
- end
233
-
234
- begin
235
- JSON.parser = JSON::Pure::Parser
236
- start = Time.now
237
- $iter.times do
238
- JSON.generate(obj)
239
- end
240
- dt = Time.now - start
241
- if base_dt < dt
242
- base_dt = dt
243
- base_name = 'JSON::Pure'
244
- end
245
- 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]
247
- rescue Exception => e
248
- parse_results[:pure] = 0.0
249
- puts "JSON::Pure failed: #{e.class}: #{e.message}"
250
- end
251
-
252
- begin
253
- start = Time.now
254
- $iter.times do
255
- MessagePack.pack(obj)
256
- end
257
- dt = Time.now - start
258
- if base_dt < dt
259
- base_dt = dt
260
- base_name = 'MessagePack'
261
- end
262
- parse_results[:msgpack] = dt
263
- puts "%d Msgpack()s in %0.3f seconds or %0.1f unpacks/msec" % [$iter, dt, $iter/dt/1000.0]
264
- rescue Exception => e
265
- parse_results[:msgpack] = 0.0
266
- puts "MessagePack failed: #{e.class}: #{e.message}"
267
- end
268
-
269
- start = Time.now
270
- $iter.times do
271
- Ox.dump(obj)
272
- end
273
- dt = Time.now - start
274
- 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]
276
-
277
- puts "Parser results:"
278
- 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
- puts "#{name} failed to generate JSON"
282
- next
283
- end
284
- puts "%-7s %6.3f %5.1f %4.1f" % [name, dt, $iter/dt/1000.0, base_dt/dt]
285
- end
286
-
287
- puts
data/test/perf_strict.rb DELETED
@@ -1,139 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << '.'
5
- $: << File.join(File.dirname(__FILE__), "../lib")
6
- $: << File.join(File.dirname(__FILE__), "../ext")
7
-
8
- require 'optparse'
9
- require 'perf'
10
- require 'oj'
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
20
-
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 = {
35
- 'a' => 'Alpha', # string
36
- 'b' => true, # boolean
37
- 'c' => 12345, # number
38
- 'd' => [ true, [false, [-123456789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
39
- 'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
40
- 'f' => nil, # nil
41
- 'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
42
- 'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
43
- }
44
- $obj['g'] = 12345678901234567890123456789 if $with_bignum
45
- else
46
- $obj = {
47
- 'a' => 'Alpha',
48
- 'b' => true,
49
- 'c' => '12345',
50
- 'd' => [ true, [false, ['12345', nil], '3.967', ['something', false], nil]],
51
- 'e' => { 'zero' => '0', 'one' => '1', 'two' => '2' },
52
- 'f' => nil,
53
- 'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
54
- 'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
55
- }
56
- end
57
-
58
- Oj.default_options = { :indent => $indent, :mode => :strict, cache_keys: $cache_keys, cache_str: 5 }
59
-
60
- if 0 < $size
61
- o = $obj
62
- $obj = []
63
- (4 * $size).times do
64
- $obj << o
65
- end
66
- end
67
-
68
- $json = Oj.dump($obj)
69
- $failed = {} # key is same as String used in tests later
70
-
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
78
- end
79
-
80
- # 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|
82
- Oj.strict_load(Oj.dump(o))
83
- }
84
- capture_error('Yajl', $obj, 'encode', 'parse') { |o|
85
- require 'yajl'
86
- Yajl::Parser.parse(Yajl::Encoder.encode(o))
87
- }
88
- capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
89
- require 'json'
90
- require 'json/ext'
91
- JSON.generator = JSON::Ext::Generator
92
- JSON.parser = JSON::Ext::Parser
93
- JSON.parse(JSON.generate(o))
94
- }
95
-
96
- Oj.default_options = { symbol_keys: $symbolize }
97
-
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"
103
- end
104
-
105
- puts '-' * 80
106
- puts "Strict Parse Performance"
107
- perf = Perf.new()
108
- unless $failed.has_key?('JSON::Ext')
109
- perf.add('JSON::Ext', 'parse') { JSON.parse($json, symbolize_names: $symbolize) }
110
- perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
111
- 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) }
115
- end
116
- perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
117
- perf.run($iter)
118
-
119
- puts '-' * 80
120
- puts "Strict Dump Performance"
121
- perf = Perf.new()
122
- unless $failed.has_key?('JSON::Ext')
123
- perf.add('JSON::Ext', 'dump') { JSON.generate($obj) }
124
- perf.before('JSON::Ext') { JSON.generator = JSON::Ext::Generator }
125
- end
126
- unless $failed.has_key?('Oj:strict')
127
- perf.add('Oj:strict', 'dump') { Oj.dump($obj) }
128
- end
129
- perf.add('Yajl', 'encode') { Yajl::Encoder.encode($obj) } unless $failed.has_key?('Yajl')
130
- perf.run($iter)
131
-
132
- puts
133
- puts '-' * 80
134
- puts
135
-
136
- unless $failed.empty?
137
- puts "The following packages were not included for the reason listed"
138
- $failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
139
- end
data/test/perf_wab.rb DELETED
@@ -1,131 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << '.'
5
- $: << File.join(File.dirname(__FILE__), "../lib")
6
- $: << File.join(File.dirname(__FILE__), "../ext")
7
-
8
- require 'optparse'
9
- require 'perf'
10
- require 'oj'
11
-
12
- $verbose = false
13
- $indent = 0
14
- $iter = 20000
15
- $with_bignum = false
16
- $with_nums = true
17
- $size = 0
18
-
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)
27
-
28
- $obj = {
29
- a: 'Alpha', # string
30
- b: true, # boolean
31
- c: 12345, # number
32
- d: [ true, [false, [-123456789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
33
- e: { zero: nil, one: 1, two: 2, three: [3], four: [0, 1, 2, 3, 4] }, # hash
34
- f: nil, # nil
35
- h: { a: { b: { c: { d: {e: { f: { g: nil }}}}}}}, # deep hash, not that deep
36
- i: [[[[[[[nil]]]]]]] # deep array, again, not that deep
37
- }
38
- $obj[:g] = 12345678901234567890123456789 if $with_bignum
39
-
40
- Oj.default_options = { :indent => $indent, :mode => :wab }
41
-
42
- if 0 < $size
43
- o = $obj
44
- $obj = []
45
- (4 * $size).times do
46
- $obj << o
47
- end
48
- end
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
55
-
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
63
- end
64
-
65
- # 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|
69
- require 'json'
70
- require 'json/ext'
71
- JSON.generator = JSON::Ext::Generator
72
- JSON.parser = JSON::Ext::Parser
73
- JSON.parse(JSON.generate(o))
74
- }
75
- capture_error('JSON::Pure', $obj, 'generate', 'parse') { |o|
76
- require 'json/pure'
77
- JSON.generator = JSON::Pure::Generator
78
- JSON.parser = JSON::Pure::Parser
79
- JSON.parse(JSON.generate(o))
80
- }
81
-
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"
88
- end
89
-
90
- puts '-' * 80
91
- puts "Wab Parse Performance"
92
- perf = Perf.new()
93
- unless $failed.has_key?('JSON::Ext')
94
- perf.add('JSON::Ext', 'parse') { JSON.parse($json) }
95
- perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
96
- end
97
- unless $failed.has_key?('JSON::Pure')
98
- perf.add('JSON::Pure', 'parse') { JSON.parse($json) }
99
- perf.before('JSON::Pure') { JSON.parser = JSON::Pure::Parser }
100
- end
101
- unless $failed.has_key?('Oj:wab')
102
- perf.add('Oj:wab', 'wab_load') { Oj.wab_load($json) }
103
- end
104
- perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
105
- perf.run($iter)
106
-
107
- puts '-' * 80
108
- puts "Wab Dump Performance"
109
- perf = Perf.new()
110
- unless $failed.has_key?('JSON::Ext')
111
- perf.add('JSON::Ext', 'dump') { JSON.generate($obj) }
112
- perf.before('JSON::Ext') { JSON.generator = JSON::Ext::Generator }
113
- end
114
- unless $failed.has_key?('JSON::Pure')
115
- perf.add('JSON::Pure', 'generate') { JSON.generate($obj) }
116
- perf.before('JSON::Pure') { JSON.generator = JSON::Pure::Generator }
117
- end
118
- unless $failed.has_key?('Oj:wab')
119
- perf.add('Oj:wab', 'dump') { Oj.dump($obj, :mode => :wab) }
120
- end
121
- perf.add('Yajl', 'encode') { Yajl::Encoder.encode($obj) } unless $failed.has_key?('Yajl')
122
- perf.run($iter)
123
-
124
- puts
125
- puts '-' * 80
126
- puts
127
-
128
- unless $failed.empty?
129
- puts "The following packages were not included for the reason listed"
130
- $failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
131
- end
data/test/prec.rb DELETED
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'oj'
4
-
5
- extras = {"locationLng" => -97.14690769100295}
6
-
7
- Oj.default_options = {float_precision: 17}
8
-
9
- encoded = Oj.dump(extras)
10
- puts encoded
11
- puts Oj.load(encoded)
12
-
13
- require "active_record"
14
-
15
- Oj::Rails.set_encoder()
16
- Oj::Rails.set_decoder()
17
-
18
- Oj.default_options = {float_precision: 17}
19
- # Using Oj rails encoder, gets the correct value: {"locationLng":-97.14690769100295}
20
- encoded = ActiveSupport::JSON.encode(extras)
21
- puts encoded
22
- puts ActiveSupport::JSON.decode(encoded)
23
- puts Oj.load(encoded)
@@ -1,14 +0,0 @@
1
-
2
- module Sample
3
- class Change
4
- attr_accessor :time
5
- attr_accessor :user
6
- attr_accessor :comment
7
-
8
- def initialize(comment=nil, time=nil, user=nil)
9
- @user = user || ENV['USER']
10
- @time = time || Time.now
11
- @comment = comment
12
- end
13
- end # Change
14
- end # Sample
data/test/sample/dir.rb DELETED
@@ -1,19 +0,0 @@
1
-
2
- require 'etc'
3
-
4
- module Sample
5
-
6
- class Dir < File
7
- attr_accessor :files
8
-
9
- def initialize(filename)
10
- super
11
- @files = []
12
- end
13
-
14
- def <<(f)
15
- @files << f
16
- end
17
-
18
- end # Dir
19
- end # Sample
data/test/sample/doc.rb DELETED
@@ -1,36 +0,0 @@
1
-
2
- require 'sample/hasprops'
3
- require 'sample/group'
4
- require 'sample/layer'
5
- require 'sample/line'
6
- require 'sample/shape'
7
- require 'sample/oval'
8
- require 'sample/rect'
9
- require 'sample/text'
10
- require 'sample/change'
11
-
12
- module Sample
13
- class Doc
14
- include HasProps
15
-
16
- attr_accessor :title
17
- attr_accessor :create_time
18
- attr_accessor :user
19
- # Hash of layers in the document indexed by layer name.
20
- attr_reader :layers
21
- attr_reader :change_history
22
-
23
- def initialize(title)
24
- @title = title
25
- @user = ENV['USER']
26
- @create_time = Time.now
27
- @layers = { }
28
- @change_history = []
29
- end
30
-
31
- def add_change(comment, time=nil, user=nil)
32
- @change_history << Change.new(comment, time, user)
33
- end
34
-
35
- end # Doc
36
- end # Sample
data/test/sample/file.rb DELETED
@@ -1,48 +0,0 @@
1
-
2
- require 'etc'
3
-
4
- module Sample
5
-
6
- class File
7
- attr_accessor :name, :ctime, :mtime, :size, :owner, :group, :permissions
8
-
9
- def initialize(filename)
10
- @name = ::File.basename(filename)
11
- stat = ::File.stat(filename)
12
- @ctime = stat.ctime
13
- @mtime = stat.mtime
14
- @size = stat.size
15
- @owner = Etc.getpwuid(stat.uid).name
16
- @group = Etc.getgrgid(stat.gid).name
17
- if false
18
- @permissions = {
19
- 'user' => {
20
- 'read' => (0 != (stat.mode & 0x0100)),
21
- 'write' => (0 != (stat.mode & 0x0080)),
22
- 'execute' => (0 != (stat.mode & 0x0040))},
23
- 'group' => {
24
- 'read' => (0 != (stat.mode & 0x0020)),
25
- 'write' => (0 != (stat.mode & 0x0010)),
26
- 'execute' => (0 != (stat.mode & 0x0008))},
27
- 'other' => {
28
- 'read' => (0 != (stat.mode & 0x0004)),
29
- 'write' => (0 != (stat.mode & 0x0002)),
30
- 'execute' => (0 != (stat.mode & 0x0001))}
31
- }
32
- else
33
- @permissions = {
34
- 'user' => [(0 != (stat.mode & 0x0100)) ? 'r' : '-',
35
- (0 != (stat.mode & 0x0080)) ? 'w' : '-',
36
- (0 != (stat.mode & 0x0040)) ? 'x' : '-'].join(''),
37
- 'group' => [(0 != (stat.mode & 0x0020)) ? 'r' : '-',
38
- (0 != (stat.mode & 0x0010)) ? 'w' : '-',
39
- (0 != (stat.mode & 0x0008)) ? 'x' : '-'].join(''),
40
- 'other' => [(0 != (stat.mode & 0x0004)) ? 'r' : '-',
41
- (0 != (stat.mode & 0x0002)) ? 'w' : '-',
42
- (0 != (stat.mode & 0x0001)) ? 'x' : '-'].join('')
43
- }
44
- end
45
- end
46
-
47
- end # File
48
- end # Sample