oj 3.7.12 → 3.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Oj
3
3
  # Current version of the module.
4
- VERSION = '3.7.12'
4
+ VERSION = '3.8.0'
5
5
  end
@@ -14,7 +14,7 @@ modes are:
14
14
  - `:object`
15
15
  - `:custom`
16
16
 
17
- Since modes detemine what the JSON output will look like and alternatively
17
+ Since modes determine what the JSON output will look like and alternatively
18
18
  what Oj expects when the `Oj.load()` method is called, mixing the output and
19
19
  input mode formats will most likely not behave as intended. If the object mode
20
20
  is used for producing JSON then use object mode for reading. The same is true
@@ -117,6 +117,7 @@ information.
117
117
  | :object_nl | String | | | x | x | | x | |
118
118
  | :omit_nil | Boolean | x | x | x | x | x | x | |
119
119
  | :quirks_mode | Boolean | | | 6 | | | x | |
120
+ | :safe | String | | | x | | | | |
120
121
  | :second_precision | Fixnum | | | | | x | x | |
121
122
  | :space | String | | | x | x | | x | |
122
123
  | :space_before | String | | | x | x | | x | |
@@ -124,6 +125,7 @@ information.
124
125
  | :trace | Boolean | x | x | x | x | x | x | x |
125
126
  | :time_format | Symbol | | | | | x | x | |
126
127
  | :use_as_json | Boolean | | | | | | x | |
128
+ | :use_raw_json | Boolean | | | x | x | x | x | |
127
129
  | :use_to_hash | Boolean | | | | | | x | |
128
130
  | :use_to_json | Boolean | | | | | | x | |
129
131
  --------------------------------------------------------------------------------------------------------
@@ -151,4 +153,3 @@ information.
151
153
  6. The quirks mode option is no longer supported in the most recent json
152
154
  gem. It is supported by Oj for backward compatibility with older json gem
153
155
  versions.
154
-
@@ -149,7 +149,7 @@ integer gives better performance.
149
149
 
150
150
  ### :integer_range [Range]
151
151
 
152
- Dump integers outside range as strings.
152
+ Dump integers outside range as strings.
153
153
  Note: range bounds must be Fixnum.
154
154
 
155
155
  ### :match_string
@@ -211,6 +211,12 @@ Allow single JSON values instead of documents, default is true (allow). This
211
211
  can also be used in :compat mode to be backward compatible with older versions
212
212
  of the json gem.
213
213
 
214
+ ### :safe
215
+
216
+ The JSON gem includes the complete JSON in parse errors with no limit
217
+ on size. To break from the JSON gem behavior for this case set `:safe`
218
+ to true.
219
+
214
220
  ### :second_precision [Fixnum]
215
221
 
216
222
  The number of digits after the decimal when dumping the seconds of time.
@@ -254,6 +260,18 @@ The :time_format when dumping.
254
260
  Call `as_json()` methods on dump, default is false. The option is ignored in
255
261
  the :compat and :rails mode.
256
262
 
263
+
264
+ ### :use_raw_json [Boolean]
265
+
266
+ Call `raw_json()` methods on dump, default is false. The option is
267
+ accepted in the :compat and :rails mode even though it is not
268
+ supported by other JSON gems. It provides a means to optimize dump or
269
+ generate performance. The `raw_json(depth, indent)` method should be
270
+ called only by Oj. It is not intended for any other use. This is mean
271
+ to replace the abused `to_json` methods. Calling `Oj.dump` inside the
272
+ `raw_json` with the object itself when `:use_raw_json` is true will
273
+ result in an infinite loop.
274
+
257
275
  ### :use_to_hash [Boolean]
258
276
 
259
277
  Call `to_hash()` methods on dump, default is false. The option is ignored in
@@ -263,4 +281,3 @@ the :compat and :rails mode.
263
281
 
264
282
  Call `to_json()` methods on dump, default is false. The option is ignored in
265
283
  the :compat and :rails mode.
266
-
@@ -7,7 +7,7 @@ Symbols. The same is true for auto defining classes in all versions of ruby;
7
7
  memory will also be exhausted if too many classes are automatically
8
8
  defined. Auto defining is a useful feature during development and from trusted
9
9
  sources but it allows too many classes to be created in the object load mode and
10
- auto defined is used with an untrusted source. The `Oj.strict_load()` method
10
+ auto defined is used with an untrusted source. The `Oj.safe_load()` method
11
11
  sets and uses the most strict and safest options. It should be used by
12
12
  developers who find it difficult to understand the options available in Oj.
13
13
 
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
6
+ %w(lib ext).each do |dir|
7
+ $: << File.join($oj_dir, dir)
8
+ end
9
+
10
+ require 'oj'
11
+
12
+ #Oj.load_file(ARGV[0], mode: :strict) { |obj|
13
+ # puts Oj.dump(obj, indent: 2)
14
+ #}
15
+
16
+ data = open('invalid_unicode.data').read
17
+
18
+ puts data
19
+
20
+ puts Oj.dump(data)
21
+
22
+ Oj.mimic_JSON
23
+ puts Oj.dump(data, escape_mode: :json)
24
+
25
+ puts Oj.default_options
@@ -1,33 +1,167 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: UTF-8
2
3
 
3
- $: << '.'
4
- $: << '../lib'
5
- $: << '../ext'
4
+ $: << File.dirname(__FILE__)
5
+ $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
6
+ %w(lib ext).each do |dir|
7
+ $: << File.join($oj_dir, dir)
8
+ end
6
9
 
10
+ #require 'json'
7
11
  require 'oj'
8
12
 
9
- f = File.open("foo.json", "w")
10
- 100_000.times do
11
- obj = { created_at: DateTime.new(2001,2,3,4,5,6) }
12
- Oj.to_stream(f, obj)
13
- f.puts
14
- f.flush
15
- end
16
- f.close
13
+ Oj.mimic_JSON
17
14
 
18
- def run_test_thread
19
- threads = Array.new(3) do
20
- Thread.new do
21
- counter = 0
22
- File.open("foo.json", "r") { |f| Oj.enum_for(:load, f).lazy.each { counter += 1 } }
23
- #File.open("odd_file.jsonl", "r") { |f| Oj.enum_for(:load, f).lazy.each { counter += 1 } }
24
- puts counter
25
- end
26
- end
27
- threads.each(&:join)
28
- end
15
+ obj = {
16
+ ab: {
17
+ cbbb: {
18
+ tilbeb: [
19
+ {
20
+ coob: {
21
+ uijwts: [
22
+ {
23
+ prrrrr: {
24
+ yakj: "pvebbx",
25
+ lbhqy: {
26
+ uhyw: {
27
+ uijwts: [
28
+ {
29
+ jangi: {
30
+ ubentg7haineued8atnr8w: {
31
+ abc: "uejdncbncnamnasdasdasdasd",
32
+ cde: "skfjskdfjskdfjsdkfjsdkfjs"
33
+ }
34
+ }
35
+ }
36
+ ]
37
+ }
38
+ }
39
+ }
40
+ },
41
+ {
42
+ kdncg: {
43
+ lvbnt8b9ounv: {
44
+ qk: 9
45
+ }
46
+ }
47
+ }
48
+ ],
49
+ jenfjbhe: {}
50
+ }
51
+ }
52
+ ]
53
+ }
54
+ },
55
+ ijbh: {
56
+ jsnbrpbnunt: {
57
+ b88dibalbvp: {
58
+ mnbvd: "9uhbqlpiev"
59
+ }
60
+ },
61
+ ncnwkl: {
62
+ ksdfsf: {
63
+ mjln: "mnklkn"
64
+ },
65
+ kbrh: {
66
+ sdfn83nnalbmgnansdd: {
67
+ uijwts: {
68
+ ibha: {
69
+ uijwts: [
70
+ {
71
+ lnrbf: {
72
+ nbvtmqbhap9ebeb7btnnaw: {
73
+ ksb: "sdfksdfjsdfsb39242dnasddd",
74
+ mnm: "1293dsfnsdmfnsdfsd,fmnsd,"
75
+ }
76
+ }
77
+ }
78
+ ]
79
+ }
80
+ },
81
+ kbrh: {
82
+ bo8libts: {
83
+ nag40n: {
84
+ kyen: "sdfasnc92nsn"
85
+ },
86
+ kbrh: {
87
+ nbwyu26snfcbajsdkj8: {
88
+ uijwts: {
89
+ mdfnkjsdd: {}
90
+ },
91
+ kbrh: {
92
+ kneahce: {
93
+ uijwts: {
94
+ kwnb: {
95
+ uijwts: [
96
+ {
97
+ fhfd: {
98
+ sfasdnfmasndfamsdnfajsmdf: false
99
+ }
100
+ }
101
+ ],
102
+ asdfsdff: [
103
+ {
104
+ cwdf: {
105
+ sddlkfajsdkfjabskdfjalsdkfjansdkfjf: ""
106
+ }
107
+ },
108
+ {
109
+ bsdj: {
110
+ sdfsjdlfkasy8kljsfsdf83jlkjfals: true
111
+ }
112
+ }
113
+ ]
114
+ }
115
+ },
116
+ kbrh: {
117
+ sdfsdfsddfk: {
118
+ uijwts: {
119
+ sdfsd: {
120
+ sdfsadf89mnlrrrqurqwvdnff: {
121
+ "kj": 8
122
+ }
123
+ }
124
+ },
125
+ kbrh: {
126
+ dkdjd: {
127
+ dfeteu: {
128
+ sdfd: "sdfasdfjlkjslrsdbb"
129
+ },
130
+ kbrh: {
131
+ sdfskjdfldk: {
132
+ buqpen: {
133
+ kjlkj: {
134
+ sdflskdjfalsdkrjalwkjfsrlfjasdf: {
135
+ sd: 0
136
+ }
137
+ }
138
+ },
139
+ kbrh: {
140
+ sdfksljdlfksdfl: {
141
+ sdfsdkfjssd: {
142
+ ksdjf: "sdflsdkfjasdkaufs;ldkfjsdlf",
143
+ sdfsdfsl: [5]
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
29
164
 
30
- 100.times do |i|
31
- puts i
32
- run_test_thread
33
- end
165
+ #Oj.dump(obj)
166
+ JSON.pretty_generate(obj)
167
+ #JSON.generate(obj)
@@ -32,6 +32,9 @@ class CustomJuice < Minitest::Test
32
32
  def to_json(*args)
33
33
  %|{"xx":#{@x},"yy":#{y}}|
34
34
  end
35
+ def raw_json(depth, indent)
36
+ %|{"xxx":#{@x},"yyy":#{y}}|
37
+ end
35
38
  def as_json(*args)
36
39
  {'a' => @x, :b => @y }
37
40
  end
@@ -40,6 +43,40 @@ class CustomJuice < Minitest::Test
40
43
  end
41
44
  end
42
45
 
46
+ class AsJson
47
+ attr_accessor :x, :y
48
+
49
+ def initialize(x, y)
50
+ @x = x
51
+ @y = y
52
+ end
53
+ def ==(o)
54
+ self.class == o.class && @x == o.x && @y = o.y
55
+ end
56
+ def as_json(*args)
57
+ {'a' => @x, :b => @y }
58
+ end
59
+ end
60
+
61
+ class AsRails
62
+ attr_accessor :x, :y
63
+
64
+ def initialize(x, y)
65
+ @x = x
66
+ @y = y
67
+ end
68
+ def ==(o)
69
+ self.class == o.class && @x == o.x && @y = o.y
70
+ end
71
+ def as_json(*args)
72
+ a = @x
73
+ a = a.as_json if a.respond_to?('as_json')
74
+ b = @y
75
+ b = b.as_json if b.respond_to?('as_json')
76
+ {'a' => a, :b => b }
77
+ end
78
+ end
79
+
43
80
  def setup
44
81
  @default_options = Oj.default_options
45
82
  Oj.default_options = { :mode => :custom }
@@ -92,7 +129,7 @@ class CustomJuice < Minitest::Test
92
129
  end
93
130
  assert(false, "*** expected an exception")
94
131
  end
95
-
132
+
96
133
  def test_infinity_dump
97
134
  assert_equal('null', Oj.dump(1/0.0, :nan => :null))
98
135
  assert_equal('3.0e14159265358979323846', Oj.dump(1/0.0, :nan => :huge))
@@ -187,7 +224,7 @@ class CustomJuice < Minitest::Test
187
224
  '19' => {
188
225
  '20' => {}}}}}}}}}}}}}}}}}}}}}, false)
189
226
  end
190
-
227
+
191
228
  def test_hash_escaped_key
192
229
  json = %{{"a\nb":true,"c\td":false}}
193
230
  obj = Oj.load(json)
@@ -232,6 +269,66 @@ class CustomJuice < Minitest::Test
232
269
  assert_equal(%|{"b":true,"n":58}|, json)
233
270
  end
234
271
 
272
+ def test_object_raw_json
273
+ obj = Jeez.new(true, 58)
274
+ json = Oj.dump(obj, :use_to_json => true, :use_as_json => false, :use_raw_json => true, :use_to_hash => false)
275
+ assert_equal(%|{"xxx":true,"yyy":58}|, json)
276
+ end
277
+
278
+ def test_raw_json_stringwriter
279
+ obj = Oj::StringWriter.new(:indent => 0)
280
+ obj.push_array()
281
+ obj.pop()
282
+ json = Oj.dump(obj, :use_raw_json => true)
283
+ assert_equal(%|[]|, json)
284
+ end
285
+
286
+ def test_as_raw_json_stringwriter
287
+ obj = Oj::StringWriter.new(:indent => 0)
288
+ obj.push_array()
289
+ obj.push_value(3)
290
+ obj.pop()
291
+ j = AsJson.new(1, obj)
292
+
293
+ json = Oj.dump(j, use_raw_json: true, use_as_json: true, indent: 2)
294
+ assert_equal(%|{
295
+ "a":1,
296
+ "b":[3]
297
+ }
298
+ |, json)
299
+
300
+ json = Oj.dump(j, use_raw_json: false, use_as_json: true, indent: 2)
301
+ assert_equal(%|{
302
+ "a":1,
303
+ "b":{}
304
+ }
305
+ |, json)
306
+ end
307
+
308
+ def test_rails_as_raw_json_stringwriter
309
+ obj = Oj::StringWriter.new(:indent => 0)
310
+ obj.push_array()
311
+ obj.push_value(3)
312
+ obj.pop()
313
+ j = AsRails.new(1, obj)
314
+ json = Oj.dump(j, mode: :rails, use_raw_json: true, indent: 2)
315
+ assert_equal(%|{
316
+ "a":1,
317
+ "b":{}
318
+ }
319
+ |, json)
320
+
321
+ Oj::Rails.optimize
322
+ json = Oj.dump(j, mode: :rails, use_raw_json: true, indent: 2)
323
+ Oj::Rails.deoptimize
324
+ assert_equal(%|{
325
+ "a":1,
326
+ "b":[3]
327
+ }
328
+ |, json)
329
+
330
+ end
331
+
235
332
  def test_symbol
236
333
  json = Oj.dump(:abc)
237
334
  assert_equal('"abc"', json)
@@ -134,6 +134,7 @@ class Juice < Minitest::Test
134
134
  :use_to_json=>false,
135
135
  :use_to_hash=>false,
136
136
  :use_as_json=>false,
137
+ :use_raw_json=>false,
137
138
  :nilnil=>true,
138
139
  :empty_string=>true,
139
140
  :allow_gc=>false,
@@ -158,6 +159,7 @@ class Juice < Minitest::Test
158
159
  :array_class=>Array,
159
160
  :ignore=>nil,
160
161
  :trace=>true,
162
+ :safe=>true,
161
163
  }
162
164
  Oj.default_options = alt
163
165
  #keys = alt.keys