oj 2.18.5 → 3.16.11

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 (166) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1452 -0
  3. data/README.md +53 -221
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +54 -72
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +61 -63
  9. data/ext/oj/cache8.h +12 -39
  10. data/ext/oj/circarray.c +38 -67
  11. data/ext/oj/circarray.h +16 -42
  12. data/ext/oj/code.c +214 -0
  13. data/ext/oj/code.h +40 -0
  14. data/ext/oj/compat.c +194 -110
  15. data/ext/oj/custom.c +1074 -0
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +1276 -2494
  18. data/ext/oj/dump.h +110 -0
  19. data/ext/oj/dump_compat.c +897 -0
  20. data/ext/oj/dump_leaf.c +162 -0
  21. data/ext/oj/dump_object.c +710 -0
  22. data/ext/oj/dump_strict.c +399 -0
  23. data/ext/oj/encode.h +7 -42
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +28 -53
  26. data/ext/oj/err.h +49 -46
  27. data/ext/oj/extconf.rb +33 -32
  28. data/ext/oj/fast.c +1082 -1098
  29. data/ext/oj/intern.c +313 -0
  30. data/ext/oj/intern.h +22 -0
  31. data/ext/oj/mem.c +318 -0
  32. data/ext/oj/mem.h +53 -0
  33. data/ext/oj/mimic_json.c +919 -0
  34. data/ext/oj/object.c +545 -625
  35. data/ext/oj/odd.c +158 -168
  36. data/ext/oj/odd.h +32 -58
  37. data/ext/oj/oj.c +1727 -2080
  38. data/ext/oj/oj.h +334 -259
  39. data/ext/oj/parse.c +974 -753
  40. data/ext/oj/parse.h +97 -90
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +103 -0
  43. data/ext/oj/rails.c +1478 -0
  44. data/ext/oj/rails.h +18 -0
  45. data/ext/oj/reader.c +136 -163
  46. data/ext/oj/reader.h +76 -112
  47. data/ext/oj/resolve.c +45 -94
  48. data/ext/oj/resolve.h +7 -34
  49. data/ext/oj/rxclass.c +144 -0
  50. data/ext/oj/rxclass.h +26 -0
  51. data/ext/oj/saj.c +445 -511
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +82 -143
  55. data/ext/oj/simd.h +10 -0
  56. data/ext/oj/sparse.c +749 -644
  57. data/ext/oj/stream_writer.c +329 -0
  58. data/ext/oj/strict.c +114 -112
  59. data/ext/oj/string_writer.c +517 -0
  60. data/ext/oj/trace.c +72 -0
  61. data/ext/oj/trace.h +55 -0
  62. data/ext/oj/usual.c +1218 -0
  63. data/ext/oj/usual.h +69 -0
  64. data/ext/oj/util.c +136 -0
  65. data/ext/oj/util.h +20 -0
  66. data/ext/oj/val_stack.c +75 -72
  67. data/ext/oj/val_stack.h +94 -127
  68. data/ext/oj/validate.c +46 -0
  69. data/ext/oj/wab.c +586 -0
  70. data/lib/oj/active_support_helper.rb +1 -3
  71. data/lib/oj/bag.rb +8 -1
  72. data/lib/oj/easy_hash.rb +21 -13
  73. data/lib/oj/error.rb +10 -12
  74. data/lib/oj/json.rb +188 -0
  75. data/lib/oj/mimic.rb +165 -26
  76. data/lib/oj/saj.rb +20 -6
  77. data/lib/oj/schandler.rb +5 -4
  78. data/lib/oj/state.rb +135 -0
  79. data/lib/oj/version.rb +2 -3
  80. data/lib/oj.rb +3 -31
  81. data/pages/Advanced.md +22 -0
  82. data/pages/Compatibility.md +25 -0
  83. data/pages/Custom.md +23 -0
  84. data/pages/Encoding.md +65 -0
  85. data/pages/InstallOptions.md +20 -0
  86. data/pages/JsonGem.md +94 -0
  87. data/pages/Modes.md +161 -0
  88. data/pages/Options.md +337 -0
  89. data/pages/Parser.md +309 -0
  90. data/pages/Rails.md +167 -0
  91. data/pages/Security.md +20 -0
  92. data/pages/WAB.md +13 -0
  93. metadata +126 -163
  94. data/ext/oj/hash.c +0 -163
  95. data/ext/oj/hash.h +0 -46
  96. data/ext/oj/hash_test.c +0 -512
  97. data/test/_test_active.rb +0 -76
  98. data/test/_test_active_mimic.rb +0 -96
  99. data/test/_test_mimic_rails.rb +0 -126
  100. data/test/activesupport_datetime_test.rb +0 -23
  101. data/test/bug.rb +0 -51
  102. data/test/bug2.rb +0 -10
  103. data/test/bug3.rb +0 -46
  104. data/test/bug_fast.rb +0 -32
  105. data/test/bug_load.rb +0 -24
  106. data/test/crash.rb +0 -111
  107. data/test/curl/curl_oj.rb +0 -46
  108. data/test/curl/get_oj.rb +0 -24
  109. data/test/curl/just_curl.rb +0 -31
  110. data/test/curl/just_oj.rb +0 -51
  111. data/test/example.rb +0 -11
  112. data/test/files.rb +0 -29
  113. data/test/foo.rb +0 -24
  114. data/test/helper.rb +0 -27
  115. data/test/io.rb +0 -48
  116. data/test/isolated/shared.rb +0 -310
  117. data/test/isolated/test_mimic_after.rb +0 -13
  118. data/test/isolated/test_mimic_alone.rb +0 -12
  119. data/test/isolated/test_mimic_as_json.rb +0 -45
  120. data/test/isolated/test_mimic_before.rb +0 -13
  121. data/test/isolated/test_mimic_define.rb +0 -28
  122. data/test/isolated/test_mimic_rails_after.rb +0 -22
  123. data/test/isolated/test_mimic_rails_before.rb +0 -21
  124. data/test/isolated/test_mimic_rails_datetime.rb +0 -27
  125. data/test/isolated/test_mimic_redefine.rb +0 -15
  126. data/test/mod.rb +0 -16
  127. data/test/perf.rb +0 -107
  128. data/test/perf_compat.rb +0 -128
  129. data/test/perf_fast.rb +0 -164
  130. data/test/perf_file.rb +0 -64
  131. data/test/perf_object.rb +0 -138
  132. data/test/perf_saj.rb +0 -109
  133. data/test/perf_scp.rb +0 -151
  134. data/test/perf_simple.rb +0 -287
  135. data/test/perf_strict.rb +0 -128
  136. data/test/rails.rb +0 -50
  137. data/test/russian.rb +0 -18
  138. data/test/sample/change.rb +0 -14
  139. data/test/sample/dir.rb +0 -19
  140. data/test/sample/doc.rb +0 -36
  141. data/test/sample/file.rb +0 -48
  142. data/test/sample/group.rb +0 -16
  143. data/test/sample/hasprops.rb +0 -16
  144. data/test/sample/layer.rb +0 -12
  145. data/test/sample/line.rb +0 -20
  146. data/test/sample/oval.rb +0 -10
  147. data/test/sample/rect.rb +0 -10
  148. data/test/sample/shape.rb +0 -35
  149. data/test/sample/text.rb +0 -20
  150. data/test/sample.rb +0 -55
  151. data/test/sample_json.rb +0 -37
  152. data/test/struct.rb +0 -29
  153. data/test/test_compat.rb +0 -398
  154. data/test/test_debian.rb +0 -53
  155. data/test/test_fast.rb +0 -458
  156. data/test/test_file.rb +0 -245
  157. data/test/test_gc.rb +0 -49
  158. data/test/test_hash.rb +0 -29
  159. data/test/test_object.rb +0 -745
  160. data/test/test_saj.rb +0 -186
  161. data/test/test_scp.rb +0 -396
  162. data/test/test_serializer.rb +0 -59
  163. data/test/test_strict.rb +0 -254
  164. data/test/test_various.rb +0 -1383
  165. data/test/test_writer.rb +0 -308
  166. data/test/write_timebars.rb +0 -31
data/test/perf_scp.rb DELETED
@@ -1,151 +0,0 @@
1
- #!/usr/bin/env ruby -wW1
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 'yajl'
10
- require 'perf'
11
- require 'json'
12
- require 'json/ext'
13
- require 'oj'
14
-
15
- $verbose = false
16
- $indent = 0
17
- $iter = 50000
18
- $with_bignum = false
19
- $size = 0
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("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
28
- files = opts.parse(ARGV)
29
-
30
- $obj = {
31
- 'a' => 'Alpha', # string
32
- 'b' => true, # boolean
33
- 'c' => 12345, # number
34
- 'd' => [ true, [false, [-123456789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
35
- 'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
36
- 'f' => nil, # nil
37
- 'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
38
- 'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
39
- }
40
- $obj['g'] = 12345678901234567890123456789 if $with_bignum
41
-
42
- if 0 < $size
43
- o = $obj
44
- $obj = []
45
- (4 * $size).times do
46
- $obj << o
47
- end
48
- end
49
-
50
- Oj.default_options = { :indent => $indent, :mode => :compat }
51
-
52
- $json = Oj.dump($obj)
53
- $failed = {} # key is same as String used in tests later
54
-
55
- class AllSaj < Oj::Saj
56
- def initialize()
57
- end
58
-
59
- def hash_start(key)
60
- end
61
-
62
- def hash_end(key)
63
- end
64
-
65
- def array_start(key)
66
- end
67
-
68
- def array_end(key)
69
- end
70
-
71
- def add_value(value, key)
72
- end
73
- end # AllSaj
74
-
75
- class NoSaj < Oj::Saj
76
- def initialize()
77
- end
78
- end # NoSaj
79
-
80
- class NoHandler < Oj::ScHandler
81
- def initialize()
82
- end
83
- end # NoHandler
84
-
85
- class AllHandler < Oj::ScHandler
86
- def initialize()
87
- end
88
-
89
- def hash_start()
90
- return nil
91
- end
92
-
93
- def hash_end()
94
- end
95
-
96
- def array_start()
97
- return nil
98
- end
99
-
100
- def array_end()
101
- end
102
-
103
- def add_value(value)
104
- end
105
-
106
- def hash_set(h, key, value)
107
- end
108
-
109
- def array_append(a, value)
110
- end
111
-
112
- end # AllHandler
113
-
114
- saj_handler = AllSaj.new()
115
- no_saj = NoSaj.new()
116
-
117
- sc_handler = AllHandler.new()
118
- no_handler = NoHandler.new()
119
-
120
- 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
127
- end
128
-
129
- # 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 }
132
-
133
- if $verbose
134
- puts "json:\n#{$json}\n"
135
- end
136
-
137
- puts '-' * 80
138
- puts "Parse Performance"
139
- perf = Perf.new()
140
- perf.add('Oj::Saj', 'all') { Oj.saj_parse(saj_handler, $json) }
141
- perf.add('Oj::Saj', 'none') { Oj.saj_parse(no_saj, $json) }
142
- perf.add('Oj::Scp', 'all') { Oj.sc_parse(sc_handler, $json) }
143
- perf.add('Oj::Scp', 'none') { Oj.sc_parse(no_handler, $json) }
144
- perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
145
- perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new($json).parse } unless $failed.has_key?('JSON::Ext')
146
- perf.run($iter)
147
-
148
- unless $failed.empty?
149
- puts "The following packages were not included for the reason listed"
150
- $failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
151
- end
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,128 +0,0 @@
1
- #!/usr/bin/env ruby -wW1
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("-n", "without numbers") { $with_nums = false }
26
- opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
27
- files = opts.parse(ARGV)
28
-
29
- if $with_nums
30
- $obj = {
31
- 'a' => 'Alpha', # string
32
- 'b' => true, # boolean
33
- 'c' => 12345, # number
34
- 'd' => [ true, [false, [-123456789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
35
- 'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
36
- 'f' => nil, # nil
37
- 'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
38
- 'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
39
- }
40
- $obj['g'] = 12345678901234567890123456789 if $with_bignum
41
- else
42
- $obj = {
43
- 'a' => 'Alpha',
44
- 'b' => true,
45
- 'c' => '12345',
46
- 'd' => [ true, [false, ['12345', nil], '3.967', ['something', false], nil]],
47
- 'e' => { 'zero' => '0', 'one' => '1', 'two' => '2' },
48
- 'f' => nil,
49
- 'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
50
- 'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
51
- }
52
- end
53
-
54
- Oj.default_options = { :indent => $indent, :mode => :strict }
55
-
56
- if 0 < $size
57
- o = $obj
58
- $obj = []
59
- (4 * $size).times do
60
- $obj << o
61
- end
62
- end
63
-
64
- $json = Oj.dump($obj)
65
- $obj_json = Oj.dump($obj, :mode => :object)
66
- #puts "*** size: #{$obj_json.size}"
67
- #puts "*** #{$obj_json}"
68
- $failed = {} # key is same as String used in tests later
69
-
70
- def capture_error(tag, orig, load_key, dump_key, &blk)
71
- begin
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}"
76
- end
77
- end
78
-
79
- # Verify that all packages dump and load correctly and return the same Object as the original.
80
- capture_error('Oj:strict', $obj, 'load', 'dump') { |o| Oj.strict_load(Oj.dump(o, :mode => :strict)) }
81
- capture_error('Yajl', $obj, 'encode', 'parse') { |o| require 'yajl'; Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
82
- capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
83
- require 'json'
84
- require 'json/ext'
85
- JSON.generator = JSON::Ext::Generator
86
- JSON.parser = JSON::Ext::Parser
87
- JSON.parse(JSON.generate(o))
88
- }
89
- capture_error('JSON::Pure', $obj, 'generate', 'parse') { |o|
90
- require 'json/pure'
91
- JSON.generator = JSON::Pure::Generator
92
- JSON.parser = JSON::Pure::Parser
93
- JSON.parse(JSON.generate(o))
94
- }
95
-
96
- if $verbose
97
- puts "json:\n#{$json}\n"
98
- puts "object json:\n#{$obj_json}\n"
99
- puts "Oj loaded object:\n#{Oj.strict_load($json)}\n"
100
- puts "Yajl loaded object:\n#{Yajl::Parser.parse($json)}\n"
101
- puts "JSON loaded object:\n#{JSON::Ext::Parser.new($json).parse}\n"
102
- end
103
-
104
- puts '-' * 80
105
- puts "Strict Parse Performance"
106
- perf = Perf.new()
107
- unless $failed.has_key?('JSON::Ext')
108
- perf.add('JSON::Ext', 'parse') { JSON.parse($json) }
109
- perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
110
- end
111
- unless $failed.has_key?('JSON::Pure')
112
- perf.add('JSON::Pure', 'parse') { JSON.parse($json) }
113
- perf.before('JSON::Pure') { JSON.parser = JSON::Pure::Parser }
114
- end
115
- unless $failed.has_key?('Oj:strict')
116
- perf.add('Oj:strict', 'strict_load') { Oj.strict_load($json) }
117
- end
118
- perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
119
- perf.run($iter)
120
-
121
- puts
122
- puts '-' * 80
123
- puts
124
-
125
- unless $failed.empty?
126
- puts "The following packages were not included for the reason listed"
127
- $failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
128
- end
data/test/rails.rb DELETED
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $VERBOSE = true
5
-
6
- here = File.expand_path(File.dirname(__FILE__))
7
- $: << File.dirname(__FILE__)
8
- $: << File.join(File.dirname(here), 'ext')
9
- $: << File.join(File.dirname(here), 'lib')
10
-
11
- require "active_record"
12
- require "minitest/autorun"
13
- require "logger"
14
- require 'sidekiq/testing'
15
- require "rspec/mocks/minitest_integration"
16
- require 'oj'
17
-
18
- Oj.mimic_JSON
19
-
20
- Sidekiq::Testing.inline!
21
-
22
- # Ensure backward compatibility with Minitest 4
23
- Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test)
24
-
25
- # This connection will do for database-independent bug reports.
26
- ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
27
- ActiveRecord::Base.logger = Logger.new(STDOUT)
28
-
29
- ActiveRecord::Schema.define do
30
- create_table :posts, force: true do |t|
31
- end
32
- end
33
-
34
- class Post < ActiveRecord::Base
35
- end
36
-
37
- class MyWorker
38
- include Sidekiq::Worker
39
-
40
- def perform(post)
41
- end
42
- end
43
-
44
- class BugTest < Minitest::Test
45
- def test_as_json
46
- Post.arel_table
47
- dbl = instance_double("Post", id: 1)
48
- MyWorker.perform_async dbl
49
- end
50
- end
data/test/russian.rb DELETED
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << File.dirname(__FILE__)
5
-
6
- %w(lib ext test).each do |dir|
7
- $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
8
- end
9
-
10
- require 'oj'
11
-
12
- s = %|{"response":[{"id":7250,"from_id":1382722,"owner_id":1382722,"date":1415964230,"post_type":"post","text":"Сдается комната в 2-х комнатной квартире с декабря месяца в Люберцах. (р-он Красная Горка)\nСдается желательно семейной паре (можно рассмотреть и другие варианты). \nв комнате одна большая . Стол, Шкаф, комод.\nДля проживания все есть. в Соседней комнате проживают два парня (из Чувашии)\nДо города можно доехать на маршрутке (20 мин.) на против дома остановка, на электричке (до электрички 15-20 мин. пешком) или на автобусе\nЦена 15 тыс. за комнату + коммунальные услуги\nЗвоните 8\/903\/012-34-25 венера","comments":{"count":0},"likes":{"count":1},"reposts":{"count":0}}]}|
13
-
14
- r = Oj.load(s)
15
-
16
- text = r["response"][0]["text"]
17
- puts "#{text}"
18
- puts "#{text.encoding}"
@@ -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