multi_json 1.7.1 → 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,4 +1,11 @@
1
+ 1.7.2
2
+ -----
3
+ * [Renamed Jrjackson adapter to JrJackson](https://github.com/intridea/multi_json/commit/b36dc915fc0e6548cbad06b5db6f520e040c9c8b)
4
+ * [Implemented jrjackson -> jr_jackson alias for back-compatability](https://github.com/intridea/multi_json/commit/aa50ab8b7bb646b8b75d5d65dfeadae8248a4f10)
5
+ * [Update vendored OkJson module](https://github.com/intridea/multi_json/commit/30a3f474e17dd86a697c3fab04f468d1a4fd69d7)
6
+
1
7
  1.7.1
8
+ -----
2
9
  * [Fix capitalization of JrJackson class](https://github.com/intridea/multi_json/commit/5373a5e38c647f02427a0477cb8e0e0dafad1b8d)
3
10
 
4
11
  1.7.0
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source 'https://rubygems.org'
3
3
  gem 'rake', '>= 0.9'
4
4
  gem 'yard', '>= 0.8'
5
5
 
6
- platforms :ruby_18 do
6
+ platforms :mri do
7
7
  gem 'json', '~> 1.4', :require => nil
8
8
  end
9
9
 
@@ -13,6 +13,7 @@ platforms :ruby, :mswin, :mingw do
13
13
  gem 'oj', '~> 2.0', :require => nil
14
14
  gem 'yajl-ruby', '~> 1.0', :require => nil
15
15
  end
16
+
16
17
  platforms :jruby do
17
18
  gem 'gson', '>= 0.6', :require => nil
18
19
  gem 'jrjackson', :require => nil
data/lib/multi_json.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'multi_json/options'
2
+ require 'multi_json/version'
2
3
 
3
4
  module MultiJson
4
5
  include Options
@@ -26,13 +27,17 @@ module MultiJson
26
27
  self.load_options = self.dump_options = value
27
28
  end
28
29
 
30
+ ALIASES = {
31
+ 'jrjackson' => :jr_jackson
32
+ }
33
+
29
34
  REQUIREMENT_MAP = [
30
- ['oj', :oj],
31
- ['yajl', :yajl],
32
- ['json', :json_gem],
33
- ['gson', :gson],
34
- ['jrjackson', :jrjackson],
35
- ['json/pure', :json_pure]
35
+ ['oj', :oj],
36
+ ['yajl', :yajl],
37
+ ['json', :json_gem],
38
+ ['gson', :gson],
39
+ ['jrjackson_r', :jr_jackson],
40
+ ['json/pure', :json_pure]
36
41
  ]
37
42
 
38
43
  # The default adapter based on what you currently
@@ -88,8 +93,10 @@ module MultiJson
88
93
  def load_adapter(new_adapter)
89
94
  case new_adapter
90
95
  when String, Symbol
96
+ new_adapter = ALIASES.fetch(new_adapter.to_s, new_adapter)
91
97
  require "multi_json/adapters/#{new_adapter}"
92
- MultiJson::Adapters.const_get(:"#{new_adapter.to_s.split('_').map{|s| s.capitalize}.join('')}")
98
+ klass_name = new_adapter.to_s.split('_').map(&:capitalize) * ''
99
+ MultiJson::Adapters.const_get(klass_name)
93
100
  when NilClass, FalseClass
94
101
  load_adapter default_adapter
95
102
  when Class, Module
@@ -5,7 +5,7 @@ module MultiJson
5
5
  module Adapters
6
6
  # Use the Oj library to dump/load.
7
7
  class Oj < Adapter
8
- defaults :load, :mode => :strict
8
+ defaults :load, :mode => :strict, :symbolize_keys => false
9
9
  defaults :dump, :mode => :compat, :time_format => :ruby
10
10
 
11
11
  ParseError = if defined?(::Oj::ParseError)
@@ -15,7 +15,7 @@ module MultiJson
15
15
  end
16
16
 
17
17
  def load(string, options={})
18
- options[:symbol_keys] = true if options.delete(:symbolize_keys)
18
+ options[:symbol_keys] = options.delete(:symbolize_keys)
19
19
  ::Oj.load(string, options)
20
20
  end
21
21
 
@@ -29,6 +29,7 @@ require 'stringio'
29
29
  # http://golang.org/src/pkg/utf8/utf8.go
30
30
  module MultiJson
31
31
  module OkJson
32
+ Upstream = '42'
32
33
  extend self
33
34
 
34
35
 
@@ -50,12 +51,52 @@ module MultiJson
50
51
  end
51
52
 
52
53
 
54
+ # Encodes x into a json text. It may contain only
55
+ # Array, Hash, String, Numeric, true, false, nil.
56
+ # (Note, this list excludes Symbol.)
57
+ # X itself must be an Array or a Hash.
58
+ # No other value can be encoded, and an error will
59
+ # be raised if x contains any other value, such as
60
+ # Nan, Infinity, Symbol, and Proc, or if a Hash key
61
+ # is not a String.
62
+ # Strings contained in x must be valid UTF-8.
63
+ def encode(x)
64
+ case x
65
+ when Hash then objenc(x)
66
+ when Array then arrenc(x)
67
+ else valenc(x)
68
+ end
69
+ end
70
+
71
+
72
+ def valenc(x)
73
+ case x
74
+ when Hash then objenc(x)
75
+ when Array then arrenc(x)
76
+ when String then strenc(x)
77
+ when Numeric then numenc(x)
78
+ when true then "true"
79
+ when false then "false"
80
+ when nil then "null"
81
+ else
82
+ if x.respond_to?(:to_json)
83
+ x.to_json
84
+ else
85
+ raise Error, "cannot encode #{x.class}: #{x.inspect}"
86
+ end
87
+ end
88
+ end
89
+
90
+
91
+ private
92
+
93
+
53
94
  # Parses a "json text" in the sense of RFC 4627.
54
95
  # Returns the parsed value and any trailing tokens.
55
96
  # Note: this is almost the same as valparse,
56
97
  # except that it does not accept atomic values.
57
98
  def textparse(ts)
58
- if ts.length < 0
99
+ if ts.length <= 0
59
100
  raise Error, 'empty'
60
101
  end
61
102
 
@@ -72,7 +113,7 @@ module MultiJson
72
113
  # Parses a "value" in the sense of RFC 4627.
73
114
  # Returns the parsed value and any trailing tokens.
74
115
  def valparse(ts)
75
- if ts.length < 0
116
+ if ts.length <= 0
76
117
  raise Error, 'empty'
77
118
  end
78
119
 
@@ -201,21 +242,19 @@ module MultiJson
201
242
  # it is the lexeme.
202
243
  def tok(s)
203
244
  case s[0]
204
- when ?{ then ['{', s[0,1], s[0,1]]
205
- when ?} then ['}', s[0,1], s[0,1]]
206
- when ?: then [':', s[0,1], s[0,1]]
207
- when ?, then [',', s[0,1], s[0,1]]
208
- when ?[ then ['[', s[0,1], s[0,1]]
209
- when ?] then [']', s[0,1], s[0,1]]
210
- when ?n then nulltok(s)
211
- when ?t then truetok(s)
212
- when ?f then falsetok(s)
213
- when ?" then strtok(s)
214
- when Spc then [:space, s[0,1], s[0,1]]
215
- when ?\t then [:space, s[0,1], s[0,1]]
216
- when ?\n then [:space, s[0,1], s[0,1]]
217
- when ?\r then [:space, s[0,1], s[0,1]]
218
- else numtok(s)
245
+ when ?{ then ['{', s[0,1], s[0,1]]
246
+ when ?} then ['}', s[0,1], s[0,1]]
247
+ when ?: then [':', s[0,1], s[0,1]]
248
+ when ?, then [',', s[0,1], s[0,1]]
249
+ when ?[ then ['[', s[0,1], s[0,1]]
250
+ when ?] then [']', s[0,1], s[0,1]]
251
+ when ?n then nulltok(s)
252
+ when ?t then truetok(s)
253
+ when ?f then falsetok(s)
254
+ when ?" then strtok(s)
255
+ when Spc, ?\t, ?\n, ?\r then [:space, s[0,1], s[0,1]]
256
+ else
257
+ numtok(s)
219
258
  end
220
259
  end
221
260
 
@@ -228,12 +267,12 @@ module MultiJson
228
267
  def numtok(s)
229
268
  m = /-?([1-9][0-9]+|[0-9])([.][0-9]+)?([eE][+-]?[0-9]+)?/.match(s)
230
269
  if m && m.begin(0) == 0
231
- if m[3] && !m[2]
232
- [:val, m[0], Integer(m[1])*(10**Integer(m[3][1..-1]))]
270
+ if !m[2] && !m[3]
271
+ [:val, m[0], Integer(m[0])]
233
272
  elsif m[2]
234
273
  [:val, m[0], Float(m[0])]
235
274
  else
236
- [:val, m[0], Integer(m[0])]
275
+ [:val, m[0], Integer(m[1])*(10**Integer(m[3][1..-1]))]
237
276
  end
238
277
  else
239
278
  []
@@ -265,17 +304,14 @@ module MultiJson
265
304
  def unquote(q)
266
305
  q = q[1...-1]
267
306
  a = q.dup # allocate a big enough string
268
- rubydoesenc = false
269
307
  # In ruby >= 1.9, a[w] is a codepoint, not a byte.
270
- if a.class.method_defined?(:force_encoding)
308
+ if rubydoesenc?
271
309
  a.force_encoding('UTF-8')
272
- rubydoesenc = true
273
310
  end
274
311
  r, w = 0, 0
275
312
  while r < q.length
276
313
  c = q[r]
277
- case true
278
- when c == ?\\
314
+ if c == ?\\
279
315
  r += 1
280
316
  if r >= q.length
281
317
  raise Error, "string literal ends with a \"\\\": \"#{q}\""
@@ -308,7 +344,7 @@ module MultiJson
308
344
  end
309
345
  end
310
346
  end
311
- if rubydoesenc
347
+ if rubydoesenc?
312
348
  a[w] = '' << uchar
313
349
  w += 1
314
350
  else
@@ -317,7 +353,7 @@ module MultiJson
317
353
  else
318
354
  raise Error, "invalid escape char #{q[r]} in \"#{q}\""
319
355
  end
320
- when c == ?", c < Spc
356
+ elsif c == ?" || c < Spc
321
357
  raise Error, "invalid character in string literal \"#{q}\""
322
358
  else
323
359
  # Copy anything else byte-for-byte.
@@ -338,15 +374,14 @@ module MultiJson
338
374
  # bytes in string a at position i.
339
375
  # Returns the number of bytes written.
340
376
  def ucharenc(a, i, u)
341
- case true
342
- when u <= Uchar1max
377
+ if u <= Uchar1max
343
378
  a[i] = (u & 0xff).chr
344
379
  1
345
- when u <= Uchar2max
380
+ elsif u <= Uchar2max
346
381
  a[i+0] = (Utag2 | ((u>>6)&0xff)).chr
347
382
  a[i+1] = (Utagx | (u&Umaskx)).chr
348
383
  2
349
- when u <= Uchar3max
384
+ elsif u <= Uchar3max
350
385
  a[i+0] = (Utag3 | ((u>>12)&0xff)).chr
351
386
  a[i+1] = (Utagx | ((u>>6)&Umaskx)).chr
352
387
  a[i+2] = (Utagx | (u&Umaskx)).chr
@@ -383,54 +418,15 @@ module MultiJson
383
418
 
384
419
 
385
420
  def nibble(c)
386
- case true
387
- when ?0 <= c && c <= ?9 then c.ord - ?0.ord
388
- when ?a <= c && c <= ?z then c.ord - ?a.ord + 10
389
- when ?A <= c && c <= ?Z then c.ord - ?A.ord + 10
421
+ if ?0 <= c && c <= ?9 then c.ord - ?0.ord
422
+ elsif ?a <= c && c <= ?z then c.ord - ?a.ord + 10
423
+ elsif ?A <= c && c <= ?Z then c.ord - ?A.ord + 10
390
424
  else
391
425
  raise Error, "invalid hex code #{c}"
392
426
  end
393
427
  end
394
428
 
395
429
 
396
- # Encodes x into a json text. It may contain only
397
- # Array, Hash, String, Numeric, true, false, nil.
398
- # (Note, this list excludes Symbol.)
399
- # X itself must be an Array or a Hash.
400
- # No other value can be encoded, and an error will
401
- # be raised if x contains any other value, such as
402
- # Nan, Infinity, Symbol, and Proc, or if a Hash key
403
- # is not a String.
404
- # Strings contained in x must be valid UTF-8.
405
- def encode(x)
406
- case x
407
- when Hash then objenc(x)
408
- when Array then arrenc(x)
409
- else
410
- raise Error, 'root value must be an Array or a Hash'
411
- end
412
- end
413
-
414
-
415
- def valenc(x)
416
- case x
417
- when Hash then objenc(x)
418
- when Array then arrenc(x)
419
- when String then strenc(x)
420
- when Numeric then numenc(x)
421
- when true then "true"
422
- when false then "false"
423
- when nil then "null"
424
- else
425
- if x.respond_to?(:to_json)
426
- x.to_json
427
- else
428
- raise Error, "cannot encode #{x.class}: #{x.inspect}"
429
- end
430
- end
431
- end
432
-
433
-
434
430
  def objenc(x)
435
431
  '{' + x.map{|k,v| keyenc(k) + ':' + valenc(v)}.join(',') + '}'
436
432
  end
@@ -455,9 +451,6 @@ module MultiJson
455
451
  t.putc(?")
456
452
  r = 0
457
453
 
458
- # In ruby >= 1.9, s[r] is a codepoint, not a byte.
459
- rubydoesenc = s.class.method_defined?(:encoding)
460
-
461
454
  while r < s.length
462
455
  case s[r]
463
456
  when ?" then t.print('\\"')
@@ -469,15 +462,15 @@ module MultiJson
469
462
  when ?\t then t.print('\\t')
470
463
  else
471
464
  c = s[r]
472
- case true
473
- when rubydoesenc
465
+ # In ruby >= 1.9, s[r] is a codepoint, not a byte.
466
+ if rubydoesenc?
474
467
  begin
475
468
  c.ord # will raise an error if c is invalid UTF-8
476
469
  t.write(c)
477
470
  rescue
478
471
  t.write(Ustrerr)
479
472
  end
480
- when Spc <= c && c <= ?~
473
+ elsif Spc <= c && c <= ?~
481
474
  t.putc(c)
482
475
  else
483
476
  n = ucharcopy(t, s, r) # ensure valid UTF-8 output
@@ -569,6 +562,11 @@ module MultiJson
569
562
  end
570
563
 
571
564
 
565
+ def rubydoesenc?
566
+ ::String.method_defined?(:force_encoding)
567
+ end
568
+
569
+
572
570
  class Utf8Error < ::StandardError
573
571
  end
574
572
 
@@ -577,15 +575,15 @@ module MultiJson
577
575
  end
578
576
 
579
577
 
580
- Utagx = 0x80 # 1000 0000
581
- Utag2 = 0xc0 # 1100 0000
582
- Utag3 = 0xe0 # 1110 0000
583
- Utag4 = 0xf0 # 1111 0000
584
- Utag5 = 0xF8 # 1111 1000
585
- Umaskx = 0x3f # 0011 1111
586
- Umask2 = 0x1f # 0001 1111
587
- Umask3 = 0x0f # 0000 1111
588
- Umask4 = 0x07 # 0000 0111
578
+ Utagx = 0b1000_0000
579
+ Utag2 = 0b1100_0000
580
+ Utag3 = 0b1110_0000
581
+ Utag4 = 0b1111_0000
582
+ Utag5 = 0b1111_1000
583
+ Umaskx = 0b0011_1111
584
+ Umask2 = 0b0001_1111
585
+ Umask3 = 0b0000_1111
586
+ Umask4 = 0b0000_0111
589
587
  Uchar1max = (1<<7) - 1
590
588
  Uchar2max = (1<<11) - 1
591
589
  Uchar3max = (1<<16) - 1
@@ -1,3 +1,3 @@
1
1
  module MultiJson
2
- VERSION = '1.7.1' unless defined?(MultiJson::VERSION)
2
+ VERSION = '1.7.2' unless defined?(MultiJson::VERSION)
3
3
  end
@@ -106,7 +106,7 @@ shared_examples_for 'an adapter' do |adapter|
106
106
 
107
107
  # This behavior is currently not supported by gson.rb
108
108
  # See discussion at https://github.com/intridea/multi_json/pull/71
109
- unless %w(gson jrjackson).include?(adapter)
109
+ unless %w(gson jr_jackson).include?(adapter)
110
110
  it 'dumps custom objects that implement to_json' do
111
111
  klass = Class.new do
112
112
  def to_json(*)
@@ -129,6 +129,24 @@ describe 'MultiJson' do
129
129
  }.to_not change{Symbol.all_symbols.count}
130
130
  end
131
131
  end
132
+
133
+ context 'with Oj.default_settings' do
134
+
135
+ around do |example|
136
+ options = Oj.default_options
137
+ Oj.default_options = { :symbol_keys => true }
138
+ MultiJson.with_engine(:oj){ example.call }
139
+ Oj.default_options = options
140
+ end
141
+
142
+ it 'ignores global settings' do
143
+ MultiJson.with_engine(:oj) do
144
+ example = '{"a": 1, "b": 2}'
145
+ expected = { 'a' => 1, 'b' => 2 }
146
+ expect(MultiJson.load(example)).to eq expected
147
+ end
148
+ end
149
+ end
132
150
  end
133
151
 
134
152
  describe 'default options' do
@@ -148,8 +166,8 @@ describe 'MultiJson' do
148
166
 
149
167
  it_behaves_like 'has options', MultiJson
150
168
 
151
- %w(gson jrjackson json_gem json_pure nsjsonserialization oj ok_json yajl).each do |adapter|
152
- next if !jruby? && %w(gson jrjackson).include?(adapter)
169
+ %w(gson jr_jackson json_gem json_pure nsjsonserialization oj ok_json yajl).each do |adapter|
170
+ next if !jruby? && %w(gson jr_jackson).include?(adapter)
153
171
  next if !macruby? && adapter == 'nsjsonserialization'
154
172
  next if jruby? && %w(oj yajl).include?(adapter)
155
173
 
@@ -163,4 +181,21 @@ describe 'MultiJson' do
163
181
  it_behaves_like 'JSON-like adapter', adapter
164
182
  end
165
183
  end
166
- end
184
+
185
+ describe 'aliases' do
186
+ if jruby?
187
+ describe 'jrjackson' do
188
+ after{ expect(MultiJson.adapter).to eq(MultiJson::Adapters::JrJackson) }
189
+
190
+ it 'allows jrjackson alias as symbol' do
191
+ expect{ MultiJson.use :jrjackson }.not_to raise_error
192
+ end
193
+
194
+ it 'allows jrjackson alias as string' do
195
+ expect{ MultiJson.use 'jrjackson' }.not_to raise_error
196
+ end
197
+
198
+ end
199
+ end
200
+ end
201
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.1
4
+ version: 1.7.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -39,7 +39,7 @@ cert_chain:
39
39
  U0xxV3ZRUnNCbHlwSGZoczZKSnVMbHlaUEdoVTNSL3YKU2YzbFZLcEJDV2dS
40
40
  cEdUdnk0NVhWcEIrNTl5MzNQSm1FdVExUFRFT1l2UXlhbzlVS01BQWFBTi83
41
41
  cVdRdGpsMApobHc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
42
- date: 2013-03-18 00:00:00.000000000 Z
42
+ date: 2013-03-22 00:00:00.000000000 Z
43
43
  dependencies:
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: bundler
@@ -85,7 +85,7 @@ files:
85
85
  - spec/multi_json_spec.rb
86
86
  - lib/multi_json/adapter.rb
87
87
  - lib/multi_json/adapters/gson.rb
88
- - lib/multi_json/adapters/jrjackson.rb
88
+ - lib/multi_json/adapters/jr_jackson.rb
89
89
  - lib/multi_json/adapters/json_common.rb
90
90
  - lib/multi_json/adapters/json_gem.rb
91
91
  - lib/multi_json/adapters/json_pure.rb
metadata.gz.sig CHANGED
Binary file