multi_json 1.10.1 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ea3e5f54b3fbdc2ee1e49fa66dcf731b63a57b58
4
- data.tar.gz: 65e6e1fa41c9246473cf552675418118d8469e3a
3
+ metadata.gz: c98a15d47cdde07463c5cd6ee853d0eb6e17d27b
4
+ data.tar.gz: fe66e81cb3aaf716037b48e438c602cb405cb0d0
5
5
  SHA512:
6
- metadata.gz: 7f445fca0136fc8daef294d0494691d0e2c9d79fa0d9477c225bbbe5c90f91cfaaa4a55ea633863a38467d6a4e71313c26e4203084cc54bfa71a3539e20eddb2
7
- data.tar.gz: a61ffb653f2985d5d19b933ef1e503c8b9ad8b3ea70fb82ec05ad05552a9052b92564e8bb0f45311665ee7723986990ce649c135d7c5d6d1c6aa5994251f7499
6
+ metadata.gz: 853be4c2d237e50d0fc9156fe1f8cc4fadf19c55480aff5b02b7daca5cc7b08f923468291244f9706a40968d38fadaf44557af23a40aa0c232a84246dfffe220
7
+ data.tar.gz: b1851d3dc40055a6c8572dbc1eb0752e3dd7b97fb8519de0027b41413a9c1b6d68650df53927c86dfec9039a074505758421822d5a9f7b1866c82fac198c3cc2
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,7 +1,12 @@
1
+ 1.11.0
2
+ ------
3
+
4
+ * [Make all adapters read IO object before load](https://github.com/intridea/multi_json/commit/167f559e18d4efee05e1f160a2661d16dbb215d4)
5
+
1
6
  1.10.1
2
7
  ------
3
8
  * [Explicitly require stringio for Gson adapter](https://github.com/intridea/multi_json/commit/623ec8142d4a212fa0db763bb71295789a119929)
4
- * [Do not read StrignIO object before passing it to JrJackson](https://github.com/intridea/multi_json/commit/a6dc935df08e7b3d5d701fbb9298384c96df0fde)
9
+ * [Do not read StringIO object before passing it to JrJackson](https://github.com/intridea/multi_json/commit/a6dc935df08e7b3d5d701fbb9298384c96df0fde)
5
10
 
6
11
  1.10.0
7
12
  ------
@@ -17,6 +17,7 @@ module MultiJson
17
17
 
18
18
  def load(string, options={})
19
19
  raise self::ParseError if blank?(string)
20
+ string = string.read if string.respond_to?(:read)
20
21
  instance.load(string, load_options(options).merge(MultiJson.load_options(options)).merge!(options))
21
22
  end
22
23
 
@@ -9,7 +9,6 @@ module MultiJson
9
9
  ParseError = ::Gson::DecodeError
10
10
 
11
11
  def load(string, options={})
12
- string = string.read if StringIO === string
13
12
  ::Gson::Decoder.new(options).decode(string)
14
13
  end
15
14
 
@@ -6,8 +6,6 @@ module MultiJson
6
6
  defaults :load, :create_additions => false, :quirks_mode => true
7
7
 
8
8
  def load(string, options={})
9
- string = string.read if string.respond_to?(:read)
10
-
11
9
  if string.respond_to?(:force_encoding)
12
10
  string = string.dup.force_encoding(::Encoding::ASCII_8BIT)
13
11
  end
@@ -7,7 +7,6 @@ module MultiJson
7
7
  ParseError = ::MultiJson::OkJson::Error
8
8
 
9
9
  def load(string, options={})
10
- string = string.read if string.respond_to?(:read)
11
10
  data = string.dataUsingEncoding(NSUTF8StringEncoding)
12
11
  object = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves, error: nil)
13
12
  if object
@@ -9,7 +9,6 @@ module MultiJson
9
9
  ParseError = ::MultiJson::OkJson::Error
10
10
 
11
11
  def load(string, options={})
12
- string = string.read if string.respond_to?(:read)
13
12
  result = ::MultiJson::OkJson.decode("[#{string}]").first
14
13
  options[:symbolize_keys] ? symbolize_keys(result) : result
15
14
  rescue ArgumentError # invalid byte sequence in UTF-8
@@ -1,8 +1,8 @@
1
1
  module MultiJson
2
2
  class Version
3
3
  MAJOR = 1 unless defined? MultiJson::Version::MAJOR
4
- MINOR = 10 unless defined? MultiJson::Version::MINOR
5
- PATCH = 1 unless defined? MultiJson::Version::PATCH
4
+ MINOR = 11 unless defined? MultiJson::Version::MINOR
5
+ PATCH = 0 unless defined? MultiJson::Version::PATCH
6
6
  PRE = nil unless defined? MultiJson::Version::PRE
7
7
 
8
8
  class << self
data/multi_json.gemspec CHANGED
@@ -1,22 +1,20 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'multi_json/version'
2
+ require File.expand_path("../lib/multi_json/version.rb", __FILE__)
5
3
 
6
4
  Gem::Specification.new do |spec|
7
- spec.add_development_dependency 'bundler', '~> 1.0'
8
5
  spec.authors = ["Michael Bleigh", "Josh Kalderimis", "Erik Michaels-Ober", "Pavel Pravosud"]
9
- spec.cert_chain = %w(certs/rwz.pem)
10
- spec.description = %q{A common interface to multiple JSON libraries, including Oj, Yajl, the JSON gem (with C-extensions), the pure-Ruby JSON gem, NSJSONSerialization, gson.rb, JrJackson, and OkJson.}
11
- spec.email = ['michael@intridea.com', 'josh.kalderimis@gmail.com', 'sferik@gmail.com']
12
- spec.files = Dir['.yardopts', 'CHANGELOG.md', 'CONTRIBUTING.md', 'LICENSE.md', 'README.md', 'Rakefile', 'multi_json.gemspec', 'Gemfile', '.document', '.rspec', '.travis.yml' ,'spec/**/*', 'lib/**/*']
13
- spec.homepage = 'http://github.com/intridea/multi_json'
14
- spec.licenses = ['MIT']
15
- spec.name = 'multi_json'
16
- spec.require_paths = ['lib']
17
- spec.required_rubygems_version = '>= 1.3.5'
6
+ spec.cert_chain = %w[certs/rwz.pem]
7
+ spec.summary = "A common interface to multiple JSON libraries."
8
+ spec.description = "A common interface to multiple JSON libraries, including Oj, Yajl, the JSON gem (with C-extensions), the pure-Ruby JSON gem, NSJSONSerialization, gson.rb, JrJackson, and OkJson."
9
+ spec.email = %w[michael@intridea.com josh.kalderimis@gmail.com sferik@gmail.com pavel@pravosud.com]
10
+ spec.files = Dir["CHANGELOG.md", "CONTRIBUTING.md", "LICENSE.md", "README.md", "multi_json.gemspec", "lib/**/*"]
11
+ spec.homepage = "http://github.com/intridea/multi_json"
12
+ spec.license = "MIT"
13
+ spec.name = "multi_json"
14
+ spec.require_path = "lib"
18
15
  spec.signing_key = File.expand_path("~/.gem/private_key.pem") if $0 =~ /gem\z/
19
- spec.summary = %q{A common interface to multiple JSON libraries.}
20
- spec.test_files = Dir['spec/**/*']
21
16
  spec.version = MultiJson::Version
17
+
18
+ spec.required_rubygems_version = ">= 1.3.5"
19
+ spec.add_development_dependency "bundler", "~> 1.0"
22
20
  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.10.1
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bleigh
@@ -15,25 +15,25 @@ cert_chain:
15
15
  -----BEGIN CERTIFICATE-----
16
16
  MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQ4wDAYDVQQDDAVwYXZl
17
17
  bDEYMBYGCgmSJomT8ixkARkWCHByYXZvc3VkMRMwEQYKCZImiZPyLGQBGRYDY29t
18
- MB4XDTEzMDgxMTE1NDYzNVoXDTE0MDgxMTE1NDYzNVowPzEOMAwGA1UEAwwFcGF2
18
+ MB4XDTE1MDMwNDA0MTAzNVoXDTE2MDMwMzA0MTAzNVowPzEOMAwGA1UEAwwFcGF2
19
19
  ZWwxGDAWBgoJkiaJk/IsZAEZFghwcmF2b3N1ZDETMBEGCgmSJomT8ixkARkWA2Nv
20
- bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8/eRkT0QewaGvJ4nnV
21
- PejBZ50kVhQIQAdc+fdp4JyQX4Nn1FdxMe2q7BGYtSmdCLNnqO//m/HRzAyjIN5O
22
- tYRcODPI4gCSJR2wlS72+PJvZv8m0FHnzO5BeQ2w5UcGifyaR/A/xOx1oFnNcDMB
23
- N6yIOV7IcQrz1OaGwdr7r+1D4Y0ZM0bCJVq882UNsqlnLC3tHGMNsPEj+dgrysWp
24
- c7XRxH+LZHfPVYy2JQ+DmAFZE8yjuRe/BgsAe59j7Zxtxu62BrLk2yWp44YZF0Gx
25
- nwJh83W7cSmNDGKy72tIsuUAqSUunp3rJ2zkgkY3G9lFQHqIzxQJxdq8Ir0GFlUo
26
- W6cCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFDti
27
- +zDBnPhm+3PsLqXqlFWuxiCsMB0GA1UdEQQWMBSBEnBhdmVsQHByYXZvc3VkLmNv
20
+ bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgJODgg1dH3weeyKtQF
21
+ mhC3C8gleHSTZYAt1pMBZQ6QmRD7/kLIfLTJB/zgFUVoNoHVZ8qyFmx89reqk5Z4
22
+ x/rIVskzpB76MushyaEJhw5UrxEZvoCK0b+nSUR8NT0YcznkjSbALBBagny5NWHn
23
+ 98LbVtIQYXdJTgC8xvV1u2Bix1JI/Qv1wuDKCw14XF2AFmT4nPt40FEUk4zWwbGI
24
+ rdKjssA43TGDjzKmzdOpJ4aOble+Zq6N7jBacMdlsqQAvQ0bbGLokp8W7Ci/UNWC
25
+ Q8DwDrjlbURMu729T70yuswrQHyxmh7SISMmjp44+C5ElwVbfcCQQxiwsdAcE3zD
26
+ ST0CAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFJ7X
27
+ Ly29ycziHHerLL3NCavLRSv5MB0GA1UdEQQWMBSBEnBhdmVsQHByYXZvc3VkLmNv
28
28
  bTAdBgNVHRIEFjAUgRJwYXZlbEBwcmF2b3N1ZC5jb20wDQYJKoZIhvcNAQEFBQAD
29
- ggEBAC/fDN75QBrn+A5ERo9qlMd1DcAC3UNvjnWpHvRTva2I1PxIg2zEJphOimDo
30
- hEvmruC3urPpMwEuAsRfyL6+5SRBnAfLP4Yu7SFYuMRtnZvIYVUgUmxoteISbm7g
31
- FPXe8v3M5aYJ1e/VM11G+2ZwXsAx/rH4kaAhFBMQadrnamluFHX+tdTVCbEwZW/5
32
- NrgsYshJ0qFLYhfktlApOAisrXZskGYAeUQSWVu5nzqQlQ3+wXNsPtATuZNtvUaB
33
- 7BTxdlSpJZDcAK29Ni3NRCRu6Air4wfDln0Ilzeuut6cJ4/j2/RlvsccVSRaEfOa
34
- wM7GTK5SEdU3qelyBdc4+RRs6uU=
29
+ ggEBAJM/D4S0IHFerw9xcEKR2sehNn9deQKsS7auR3wAtxEitrPzKZb+8Uy3KVqP
30
+ Jt/z5WABxO2Bjd7IM+s445lZF6kDsGsYYydlEkf9yzOYrtVmISTJYrsApU8BZQfL
31
+ bWJg8zt1qjAKmmwULsCiYOfIGhUIhKVdVKrlkdXFFCB5v8R124FZXjo43WXZ2OCp
32
+ 4W7nHEaaaZLxrPnZCAiaryoFUL06d78sxq9F4MYfSD4CLdwJjNb5TOrwVAXK9uE9
33
+ 88AJhXqiqrY/cm2sh/xcGvGkhy9YOMyMZZrCAq4ruaXAB+tAkMrJ1paJDJRgErvJ
34
+ 8Vss1khfU5E/Xig1ytdFyNPPkCA=
35
35
  -----END CERTIFICATE-----
36
- date: 2014-05-20 00:00:00.000000000 Z
36
+ date: 2015-03-04 00:00:00.000000000 Z
37
37
  dependencies:
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: bundler
@@ -56,20 +56,15 @@ email:
56
56
  - michael@intridea.com
57
57
  - josh.kalderimis@gmail.com
58
58
  - sferik@gmail.com
59
+ - pavel@pravosud.com
59
60
  executables: []
60
61
  extensions: []
61
62
  extra_rdoc_files: []
62
63
  files:
63
- - ".document"
64
- - ".rspec"
65
- - ".travis.yml"
66
- - ".yardopts"
67
64
  - CHANGELOG.md
68
65
  - CONTRIBUTING.md
69
- - Gemfile
70
66
  - LICENSE.md
71
67
  - README.md
72
- - Rakefile
73
68
  - lib/multi_json.rb
74
69
  - lib/multi_json/adapter.rb
75
70
  - lib/multi_json/adapter_error.rb
@@ -88,19 +83,6 @@ files:
88
83
  - lib/multi_json/vendor/okjson.rb
89
84
  - lib/multi_json/version.rb
90
85
  - multi_json.gemspec
91
- - spec/gson_adapter_spec.rb
92
- - spec/jr_jackson_adapter_spec.rb
93
- - spec/json_gem_adapter_spec.rb
94
- - spec/json_pure_adapter_spec.rb
95
- - spec/multi_json_spec.rb
96
- - spec/nsjsonserialization_adapter_spec.rb
97
- - spec/oj_adapter_spec.rb
98
- - spec/ok_json_adapter_spec.rb
99
- - spec/shared/adapter.rb
100
- - spec/shared/json_common_adapter.rb
101
- - spec/shared/options.rb
102
- - spec/spec_helper.rb
103
- - spec/yajl_adapter_spec.rb
104
86
  homepage: http://github.com/intridea/multi_json
105
87
  licenses:
106
88
  - MIT
@@ -121,22 +103,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
103
  version: 1.3.5
122
104
  requirements: []
123
105
  rubyforge_project:
124
- rubygems_version: 2.2.2
106
+ rubygems_version: 2.4.6
125
107
  signing_key:
126
108
  specification_version: 4
127
109
  summary: A common interface to multiple JSON libraries.
128
- test_files:
129
- - spec/gson_adapter_spec.rb
130
- - spec/jr_jackson_adapter_spec.rb
131
- - spec/json_gem_adapter_spec.rb
132
- - spec/json_pure_adapter_spec.rb
133
- - spec/multi_json_spec.rb
134
- - spec/nsjsonserialization_adapter_spec.rb
135
- - spec/oj_adapter_spec.rb
136
- - spec/ok_json_adapter_spec.rb
137
- - spec/shared/adapter.rb
138
- - spec/shared/json_common_adapter.rb
139
- - spec/shared/options.rb
140
- - spec/spec_helper.rb
141
- - spec/yajl_adapter_spec.rb
110
+ test_files: []
142
111
  has_rdoc:
metadata.gz.sig CHANGED
Binary file
data/.document DELETED
@@ -1,5 +0,0 @@
1
- LICENSE.md
2
- README.md
3
- bin/*
4
- features/**/*.feature
5
- lib/**/*.rb
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --order random
data/.travis.yml DELETED
@@ -1,19 +0,0 @@
1
- bundler_args: --without development
2
- language: ruby
3
- rvm:
4
- - 1.8.7-p374
5
- - 1.9.2
6
- - 1.9.3
7
- - 2.0.0
8
- - 2.1.1
9
- - jruby-18mode
10
- - jruby-19mode
11
- - jruby-head
12
- - rbx-2
13
- - ruby-head
14
- matrix:
15
- allow_failures:
16
- - rvm: rbx-2
17
- - rvm: jruby-head
18
- - rvm: ruby-head
19
- fast_finish: true
data/.yardopts DELETED
@@ -1,6 +0,0 @@
1
- --markup markdown
2
- -
3
- CHANGELOG.md
4
- CONTRIBUTING.md
5
- LICENSE.md
6
- README.md
data/Gemfile DELETED
@@ -1,29 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'rake', '>= 0.9'
4
- gem 'yard', '>= 0.8'
5
-
6
- gem 'json', '~> 1.4', :require => nil
7
- gem 'json_pure', '~> 1.4', :require => nil
8
-
9
- group :development do
10
- gem 'kramdown', '>= 0.14'
11
- gem 'pry'
12
- gem 'pry-debugger', :platforms => :mri
13
- end
14
-
15
- group :test do
16
- gem 'rspec', '>= 2.14'
17
- end
18
-
19
- platforms :jruby do
20
- gem 'gson', '>= 0.6', :require => nil
21
- gem 'jrjackson', '~> 0.2.2', :require => nil
22
- end
23
-
24
- platforms :mingw, :mswin, :ruby do
25
- gem 'oj', '~> 2.9', :require => nil
26
- gem 'yajl-ruby', '~> 1.0', :require => nil
27
- end
28
-
29
- gemspec
data/Rakefile DELETED
@@ -1,25 +0,0 @@
1
- require 'bundler'
2
- Bundler::GemHelper.install_tasks
3
-
4
- require 'rspec/core/rake_task'
5
- RSpec::Core::RakeTask.new(:base_spec) do |task|
6
- task.pattern = 'spec/multi_json_spec.rb'
7
- end
8
-
9
- namespace :adapters do
10
- Dir['spec/*_adapter_spec.rb'].each do |adapter_spec|
11
- adapter_name = adapter_spec[/(\w+)_adapter_spec/, 1]
12
- desc "Run #{adapter_name} adapter specs"
13
- RSpec::Core::RakeTask.new(adapter_name) do |task|
14
- task.pattern = adapter_spec
15
- end
16
- end
17
- end
18
-
19
- task :spec => %w[base_spec adapters:oj adapters:yajl adapters:json_gem adapters:json_pure adapters:ok_json adapters:gson adapters:jr_jackson adapters:nsjsonserialization]
20
-
21
- task :default => :spec
22
- task :test => :spec
23
-
24
- require 'yard'
25
- YARD::Rake::YardocTask.new
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- exit true unless jruby?
4
-
5
- require 'shared/adapter'
6
- require 'multi_json/adapters/gson'
7
-
8
- describe MultiJson::Adapters::Gson do
9
- it_behaves_like 'an adapter', described_class
10
- end
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- exit true unless jruby?
4
-
5
- require 'shared/adapter'
6
- require 'multi_json/adapters/jr_jackson'
7
-
8
- describe MultiJson::Adapters::JrJackson do
9
- it_behaves_like 'an adapter', described_class
10
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
- require 'shared/adapter'
3
- require 'shared/json_common_adapter'
4
- require 'multi_json/adapters/json_gem'
5
-
6
- describe MultiJson::Adapters::JsonGem do
7
- it_behaves_like 'an adapter', described_class
8
- it_behaves_like 'JSON-like adapter', described_class
9
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
- require 'shared/adapter'
3
- require 'shared/json_common_adapter'
4
- require 'multi_json/adapters/json_pure'
5
-
6
- describe MultiJson::Adapters::JsonPure do
7
- it_behaves_like 'an adapter', described_class
8
- it_behaves_like 'JSON-like adapter', described_class
9
- end
@@ -1,200 +0,0 @@
1
- require 'spec_helper'
2
- require 'shared/options'
3
-
4
- describe MultiJson do
5
- before(:all) do
6
- # make sure all available libs are required
7
- MultiJson::REQUIREMENT_MAP.each do |library, adapter|
8
- begin
9
- require library
10
- rescue ::LoadError
11
- next
12
- end
13
- end
14
- end
15
-
16
- context 'when no other json implementations are available' do
17
- around do |example|
18
- simulate_no_adapters{ example.call }
19
- end
20
-
21
- it 'defaults to ok_json if no other json implementions are available' do
22
- silence_warnings do
23
- expect(MultiJson.default_adapter).to eq(:ok_json)
24
- end
25
- end
26
-
27
- it 'prints a warning' do
28
- expect(Kernel).to receive(:warn).with(/warning/i)
29
- MultiJson.default_adapter
30
- end
31
- end
32
-
33
- context 'caching' do
34
- before{ MultiJson.use adapter }
35
- let(:adapter){ MultiJson::Adapters::JsonGem }
36
- let(:json_string){ '{"abc":"def"}' }
37
-
38
- it 'busts caches on global options change' do
39
- MultiJson.load_options = { :symbolize_keys => true }
40
- expect(MultiJson.load(json_string)).to eq(:abc => 'def')
41
- MultiJson.load_options = nil
42
- expect(MultiJson.load(json_string)).to eq('abc' => 'def')
43
- end
44
-
45
- it 'busts caches on per-adapter options change' do
46
- adapter.load_options = { :symbolize_keys => true }
47
- expect(MultiJson.load(json_string)).to eq(:abc => 'def')
48
- adapter.load_options = nil
49
- expect(MultiJson.load(json_string)).to eq('abc' => 'def')
50
- end
51
- end
52
-
53
- it 'defaults to the best available gem' do
54
- # Clear cache variable already set by previous tests
55
- MultiJson.send(:remove_instance_variable, :@adapter) if MultiJson.instance_variable_defined?(:@adapter)
56
-
57
- if jruby?
58
- expect(MultiJson.adapter.to_s).to eq('MultiJson::Adapters::JrJackson')
59
- else
60
- expect(MultiJson.adapter.to_s).to eq('MultiJson::Adapters::Oj')
61
- end
62
- end
63
-
64
- it 'looks for adapter even if @adapter variable is nil' do
65
- MultiJson.send(:instance_variable_set, :@adapter, nil)
66
- expect(MultiJson).to receive(:default_adapter).and_return(:ok_json)
67
- expect(MultiJson.adapter).to eq(MultiJson::Adapters::OkJson)
68
- end
69
-
70
- it 'is settable via a symbol' do
71
- MultiJson.use :json_gem
72
- expect(MultiJson.adapter).to eq(MultiJson::Adapters::JsonGem)
73
- end
74
-
75
- it 'is settable via a case-insensitive string' do
76
- MultiJson.use 'Json_Gem'
77
- expect(MultiJson.adapter).to eq(MultiJson::Adapters::JsonGem)
78
- end
79
-
80
- it 'is settable via a class' do
81
- adapter = Class.new
82
- MultiJson.use adapter
83
- expect(MultiJson.adapter).to eq(adapter)
84
- end
85
-
86
- it 'is settable via a module' do
87
- adapter = Module.new
88
- MultiJson.use adapter
89
- expect(MultiJson.adapter).to eq(adapter)
90
- end
91
-
92
- it 'throws AdapterError on bad input' do
93
- expect{ MultiJson.use 'bad adapter' }.to raise_error(MultiJson::AdapterError, /bad adapter/)
94
- end
95
-
96
- it 'gives access to original error when raising AdapterError' do
97
- exception = get_exception(MultiJson::AdapterError){ MultiJson.use 'foobar' }
98
- expect(exception.cause).to be_instance_of(::LoadError)
99
- expect(exception.message).to include("-- multi_json/adapters/foobar")
100
- expect(exception.message).to include("Did not recognize your adapter specification")
101
- end
102
-
103
- context 'using one-shot parser' do
104
- before do
105
- expect(MultiJson::Adapters::JsonPure).to receive(:dump).once.and_return('dump_something')
106
- expect(MultiJson::Adapters::JsonPure).to receive(:load).once.and_return('load_something')
107
- end
108
-
109
- it 'should use the defined parser just for the call' do
110
- MultiJson.use :json_gem
111
- expect(MultiJson.dump('', :adapter => :json_pure)).to eq('dump_something')
112
- expect(MultiJson.load('', :adapter => :json_pure)).to eq('load_something')
113
- expect(MultiJson.adapter).to eq(MultiJson::Adapters::JsonGem)
114
- end
115
- end
116
-
117
- it 'can set adapter for a block' do
118
- MultiJson.use :ok_json
119
- MultiJson.with_adapter(:json_pure) do
120
- MultiJson.with_engine(:json_gem) do
121
- expect(MultiJson.adapter).to eq(MultiJson::Adapters::JsonGem)
122
- end
123
- expect(MultiJson.adapter).to eq(MultiJson::Adapters::JsonPure)
124
- end
125
- expect(MultiJson.adapter).to eq(MultiJson::Adapters::OkJson)
126
- end
127
-
128
- it 'JSON gem does not create symbols on parse' do
129
- MultiJson.with_engine(:json_gem) do
130
- MultiJson.load('{"json_class":"ZOMG"}') rescue nil
131
-
132
- expect{
133
- MultiJson.load('{"json_class":"OMG"}') rescue nil
134
- }.to_not change{Symbol.all_symbols.count}
135
- end
136
- end
137
-
138
- unless jruby?
139
- it 'Oj does not create symbols on parse' do
140
- MultiJson.with_engine(:oj) do
141
- MultiJson.load('{"json_class":"ZOMG"}') rescue nil
142
-
143
- expect{
144
- MultiJson.load('{"json_class":"OMG"}') rescue nil
145
- }.to_not change{Symbol.all_symbols.count}
146
- end
147
- end
148
-
149
- context 'with Oj.default_settings' do
150
- around do |example|
151
- options = Oj.default_options
152
- Oj.default_options = { :symbol_keys => true }
153
- MultiJson.with_engine(:oj){ example.call }
154
- Oj.default_options = options
155
- end
156
-
157
- it 'ignores global settings' do
158
- MultiJson.with_engine(:oj) do
159
- example = '{"a": 1, "b": 2}'
160
- expected = { 'a' => 1, 'b' => 2 }
161
- expect(MultiJson.load(example)).to eq(expected)
162
- end
163
- end
164
- end
165
- end
166
-
167
- describe 'default options' do
168
- after(:all){ MultiJson.load_options = MultiJson.dump_options = nil }
169
-
170
- it 'is deprecated' do
171
- expect(Kernel).to receive(:warn).with(/deprecated/i)
172
- silence_warnings{ MultiJson.default_options = {:foo => 'bar'} }
173
- end
174
-
175
- it 'sets both load and dump options' do
176
- expect(MultiJson).to receive(:dump_options=).with(:foo => 'bar')
177
- expect(MultiJson).to receive(:load_options=).with(:foo => 'bar')
178
- silence_warnings{ MultiJson.default_options = {:foo => 'bar'} }
179
- end
180
- end
181
-
182
- it_behaves_like 'has options', MultiJson
183
-
184
- describe 'aliases' do
185
- if jruby?
186
- describe 'jrjackson' do
187
- after{ expect(MultiJson.adapter).to eq(MultiJson::Adapters::JrJackson) }
188
-
189
- it 'allows jrjackson alias as symbol' do
190
- expect{ MultiJson.use :jrjackson }.not_to raise_error
191
- end
192
-
193
- it 'allows jrjackson alias as string' do
194
- expect{ MultiJson.use 'jrjackson' }.not_to raise_error
195
- end
196
-
197
- end
198
- end
199
- end
200
- end
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- exit true unless macruby?
4
-
5
- require 'shared/adapter'
6
- require 'multi_json/adapters/nsjsonserialization'
7
-
8
- describe MultiJson::Adapters::Nsjsonserialization do
9
- it_behaves_like 'an adapter', described_class
10
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
-
3
- exit true if jruby?
4
-
5
- require 'shared/adapter'
6
- require 'multi_json/adapters/oj'
7
-
8
- describe MultiJson::Adapters::Oj do
9
- it_behaves_like 'an adapter', described_class
10
-
11
- describe '.dump' do
12
- describe '#dump_options' do
13
- around{ |example| with_default_options(&example) }
14
-
15
- it 'ensures indent is a Fixnum' do
16
- expect{ MultiJson.dump(42, :indent => '')}.not_to raise_error
17
- end
18
- end
19
- end
20
- end
@@ -1,7 +0,0 @@
1
- require 'spec_helper'
2
- require 'shared/adapter'
3
- require 'multi_json/adapters/ok_json'
4
-
5
- describe MultiJson::Adapters::OkJson do
6
- it_behaves_like 'an adapter', described_class
7
- end
@@ -1,236 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'shared/options'
4
-
5
- shared_examples_for 'an adapter' do |adapter|
6
-
7
- before{ MultiJson.use adapter }
8
-
9
- it_behaves_like 'has options', adapter
10
-
11
- it 'does not modify argument hashes' do
12
- options = { :symbolize_keys => true, :pretty => false, :adapter => :ok_json }
13
- expect{MultiJson.load('{}', options)}.to_not change{options}
14
- expect{MultiJson.dump([42], options)}.to_not change{options}
15
- end
16
-
17
- describe '.dump' do
18
- describe '#dump_options' do
19
- before{ MultiJson.dump_options = MultiJson.adapter.dump_options = {} }
20
-
21
- after do
22
- expect(MultiJson.adapter.instance).to receive(:dump).with(1, :foo => 'bar', :fizz => 'buzz')
23
- MultiJson.dump(1, :fizz => 'buzz')
24
- MultiJson.dump_options = MultiJson.adapter.dump_options = nil
25
- end
26
-
27
- it 'respects global dump options' do
28
- MultiJson.dump_options = {:foo => 'bar'}
29
- end
30
-
31
- it 'respects per-adapter dump options' do
32
- MultiJson.adapter.dump_options = {:foo => 'bar'}
33
- end
34
-
35
- it 'adapter-specific are overridden by global options' do
36
- MultiJson.adapter.dump_options = {:foo => 'foo'}
37
- MultiJson.dump_options = {:foo => 'bar'}
38
- end
39
- end
40
-
41
- it 'writes decodable JSON' do
42
- [
43
- {'abc' => 'def'},
44
- [1, 2, 3, '4', true, false, nil]
45
- ].each do |example|
46
- expect(MultiJson.load(MultiJson.dump(example))).to eq(example)
47
- end
48
- end
49
-
50
- unless 'json_pure' == adapter || 'json_gem' == adapter
51
- it 'dumps time in correct format' do
52
- time = Time.at(1355218745).utc
53
-
54
- dumped_json = MultiJson.dump(time)
55
- expected = if RUBY_VERSION > '1.9'
56
- '2012-12-11 09:39:05 UTC'
57
- else
58
- 'Tue Dec 11 09:39:05 UTC 2012'
59
- end
60
- expect(MultiJson.load(dumped_json)).to eq(expected)
61
- end
62
- end
63
-
64
- it 'dumps symbol and fixnum keys as strings' do
65
- [
66
- [
67
- {:foo => {:bar => 'baz'}},
68
- {'foo' => {'bar' => 'baz'}},
69
- ],
70
- [
71
- [{:foo => {:bar => 'baz'}}],
72
- [{'foo' => {'bar' => 'baz'}}],
73
- ],
74
- [
75
- {:foo => [{:bar => 'baz'}]},
76
- {'foo' => [{'bar' => 'baz'}]},
77
- ],
78
- [
79
- {1 => {2 => {3 => 'bar'}}},
80
- {'1' => {'2' => {'3' => 'bar'}}}
81
- ]
82
- ].each do |example, expected|
83
- dumped_json = MultiJson.dump(example)
84
- expect(MultiJson.load(dumped_json)).to eq(expected)
85
- end
86
- end
87
-
88
- it 'dumps rootless JSON' do
89
- expect(MultiJson.dump('random rootless string')).to eq('"random rootless string"')
90
- expect(MultiJson.dump(123)).to eq('123')
91
- end
92
-
93
- it 'passes options to the adapter' do
94
- expect(MultiJson.adapter).to receive(:dump).with('foo', {:bar => :baz})
95
- MultiJson.dump('foo', :bar => :baz)
96
- end
97
-
98
- it 'dumps custom objects that implement to_json' do
99
- pending 'not supported' if adapter.name == 'MultiJson::Adapters::Gson'
100
- klass = Class.new do
101
- def to_json(*)
102
- '"foobar"'
103
- end
104
- end
105
- expect(MultiJson.dump(klass.new)).to eq('"foobar"')
106
- end
107
-
108
- it 'allows to dump JSON values' do
109
- expect(MultiJson.dump(42)).to eq('42')
110
- end
111
-
112
- it 'allows to dump JSON with UTF-8 characters' do
113
- expect(MultiJson.dump('color' => 'żółć')).to eq('{"color":"żółć"}')
114
- end
115
- end
116
-
117
- describe '.load' do
118
- describe '#load_options' do
119
- before{ MultiJson.load_options = MultiJson.adapter.load_options = {} }
120
-
121
- after do
122
- expect(MultiJson.adapter.instance).to receive(:load).with('1', :foo => 'bar', :fizz => 'buzz')
123
- MultiJson.load('1', :fizz => 'buzz')
124
- MultiJson.load_options = MultiJson.adapter.load_options = nil
125
- end
126
-
127
- it 'respects global load options' do
128
- MultiJson.load_options = {:foo => 'bar'}
129
- end
130
-
131
- it 'respects per-adapter load options' do
132
- MultiJson.adapter.load_options = {:foo => 'bar'}
133
- end
134
-
135
- it 'adapter-specific are overridden by global options' do
136
- MultiJson.adapter.load_options = {:foo => 'foo'}
137
- MultiJson.load_options = {:foo => 'bar'}
138
- end
139
- end
140
-
141
- it 'does not modify input' do
142
- input = %Q{\n\n {"foo":"bar"} \n\n\t}
143
- expect{
144
- MultiJson.load(input)
145
- }.to_not change{ input }
146
- end
147
-
148
- # Ruby 1.8 doesn't support String encodings
149
- if RUBY_VERSION > '1.9'
150
- it 'does not modify input encoding' do
151
-
152
- input = '[123]'
153
- input.force_encoding('iso-8859-1')
154
-
155
- expect{
156
- MultiJson.load(input)
157
- }.to_not change{ input.encoding }
158
- end
159
- end
160
-
161
- it 'properly loads valid JSON' do
162
- expect(MultiJson.load('{"abc":"def"}')).to eq('abc' => 'def')
163
- end
164
-
165
- it 'raises MultiJson::ParseError on blank input or invalid input' do
166
- [nil, '{"abc"}', ' ', "\t\t\t", "\n", "\x82\xAC\xEF"].each do |input|
167
- if input == "\x82\xAC\xEF"
168
- pending 'GSON bug: https://github.com/avsej/gson.rb/issues/3' if adapter.name =~ /Gson/
169
- pending 'JrJackson bug: https://github.com/guyboertje/jrjackson/issues/21' if adapter.name =~ /JrJackson/
170
- end
171
-
172
- expect{MultiJson.load(input)}.to raise_error(MultiJson::ParseError)
173
- end
174
- end
175
-
176
- it 'raises MultiJson::ParseError with data on invalid JSON' do
177
- data = '{invalid}'
178
- exception = get_exception(MultiJson::ParseError){ MultiJson.load data }
179
- expect(exception.data).to eq(data)
180
- expect(exception.cause).to be_kind_of(MultiJson.adapter::ParseError)
181
- end
182
-
183
- it 'catches MultiJson::DecodeError for legacy support' do
184
- data = '{invalid}'
185
- exception = get_exception(MultiJson::DecodeError){ MultiJson.load data }
186
- expect(exception.data).to eq(data)
187
- expect(exception.cause).to be_kind_of(MultiJson.adapter::ParseError)
188
- end
189
-
190
- it 'catches MultiJson::LoadError for legacy support' do
191
- data = '{invalid}'
192
- exception = get_exception(MultiJson::LoadError){ MultiJson.load data }
193
- expect(exception.data).to eq(data)
194
- expect(exception.cause).to be_kind_of(MultiJson.adapter::ParseError)
195
- end
196
-
197
-
198
- it 'stringifys symbol keys when encoding' do
199
- dumped_json = MultiJson.dump(:a => 1, :b => {:c => 2})
200
- loaded_json = MultiJson.load(dumped_json)
201
- expect(loaded_json).to eq('a' => 1, 'b' => {'c' => 2})
202
- end
203
-
204
- it 'properly loads valid JSON in StringIOs' do
205
- json = StringIO.new('{"abc":"def"}')
206
- expect(MultiJson.load(json)).to eq('abc' => 'def')
207
- end
208
-
209
- it 'allows for symbolization of keys' do
210
- [
211
- [
212
- '{"abc":{"def":"hgi"}}',
213
- {:abc => {:def => 'hgi'}},
214
- ],
215
- [
216
- '[{"abc":{"def":"hgi"}}]',
217
- [{:abc => {:def => 'hgi'}}],
218
- ],
219
- [
220
- '{"abc":[{"def":"hgi"}]}',
221
- {:abc => [{:def => 'hgi'}]},
222
- ]
223
- ].each do |example, expected|
224
- expect(MultiJson.load(example, :symbolize_keys => true)).to eq(expected)
225
- end
226
- end
227
-
228
- it 'allows to load JSON values' do
229
- expect(MultiJson.load('42')).to eq(42)
230
- end
231
-
232
- it 'allows to load JSON with UTF-8 characters' do
233
- expect(MultiJson.load('{"color":"żółć"}')).to eq('color' => 'żółć')
234
- end
235
- end
236
- end
@@ -1,30 +0,0 @@
1
- shared_examples_for 'JSON-like adapter' do |adapter|
2
- before{ MultiJson.use adapter }
3
-
4
- describe '.dump' do
5
- before{ MultiJson.dump_options = MultiJson.adapter.dump_options = nil }
6
-
7
- describe 'with :pretty option set to true' do
8
- it 'passes default pretty options' do
9
- object = 'foo'
10
- expect(object).to receive(:to_json).with(JSON::PRETTY_STATE_PROTOTYPE.to_h)
11
- MultiJson.dump(object, :pretty => true)
12
- end
13
- end
14
-
15
- describe 'with :indent option' do
16
- it 'passes it on dump' do
17
- object = 'foo'
18
- expect(object).to receive(:to_json).with(:indent => "\t")
19
- MultiJson.dump(object, :indent => "\t")
20
- end
21
- end
22
- end
23
-
24
- describe '.load' do
25
- it 'passes :quirks_mode option' do
26
- expect(::JSON).to receive(:parse).with('[123]', {:quirks_mode => false, :create_additions => false})
27
- MultiJson.load('[123]', :quirks_mode => false)
28
- end
29
- end
30
- end
@@ -1,119 +0,0 @@
1
- shared_examples_for 'has options' do |object|
2
-
3
- if object.respond_to?(:call)
4
- subject{ object.call }
5
- else
6
- subject{ object }
7
- end
8
-
9
- describe "dump options" do
10
-
11
- before do
12
- subject.dump_options = nil
13
- end
14
-
15
- after do
16
- subject.dump_options = nil
17
- end
18
-
19
- it 'returns default options if not set' do
20
- expect(subject.dump_options).to eq(subject.default_dump_options)
21
- end
22
-
23
- it 'allows hashes' do
24
- subject.dump_options = {:foo => 'bar'}
25
- expect(subject.dump_options).to eq(:foo => 'bar')
26
- end
27
-
28
- it 'allows objects that implement #to_hash' do
29
- value = Class.new do
30
- def to_hash
31
- {:foo => 'bar'}
32
- end
33
- end.new
34
-
35
- subject.dump_options = value
36
- expect(subject.dump_options).to eq(:foo => 'bar')
37
- end
38
-
39
- it 'evaluates lambda returning options (with args)' do
40
- subject.dump_options = lambda{ |a1, a2| { a1 => a2 }}
41
- expect(subject.dump_options('1', '2')).to eq('1' => '2')
42
- end
43
-
44
- it 'evaluates lambda returning options (with no args)' do
45
- subject.dump_options = lambda{{:foo => 'bar'}}
46
- expect(subject.dump_options).to eq(:foo => 'bar')
47
- end
48
-
49
- it 'returns empty hash in all other cases' do
50
- subject.dump_options = true
51
- expect(subject.dump_options).to eq(subject.default_dump_options)
52
-
53
- subject.dump_options = false
54
- expect(subject.dump_options).to eq(subject.default_dump_options)
55
-
56
- subject.dump_options = 10
57
- expect(subject.dump_options).to eq(subject.default_dump_options)
58
-
59
- subject.dump_options = nil
60
- expect(subject.dump_options).to eq(subject.default_dump_options)
61
- end
62
- end
63
-
64
- describe "load options" do
65
-
66
- before do
67
- subject.load_options = nil
68
- end
69
-
70
- after do
71
- subject.load_options = nil
72
- end
73
-
74
- it 'returns default options if not set' do
75
- expect(subject.load_options).to eq(subject.default_load_options)
76
- end
77
-
78
- it 'allows hashes' do
79
- subject.load_options = {:foo => 'bar'}
80
- expect(subject.load_options).to eq(:foo => 'bar')
81
- end
82
-
83
- it 'allows objects that implement #to_hash' do
84
- value = Class.new do
85
- def to_hash
86
- {:foo => 'bar'}
87
- end
88
- end.new
89
-
90
- subject.load_options = value
91
- expect(subject.load_options).to eq(:foo => 'bar')
92
- end
93
-
94
- it 'evaluates lambda returning options (with args)' do
95
- subject.load_options = lambda{ |a1, a2| { a1 => a2 }}
96
- expect(subject.load_options('1', '2')).to eq('1' => '2')
97
- end
98
-
99
- it 'evaluates lambda returning options (with no args)' do
100
- subject.load_options = lambda{{:foo => 'bar'}}
101
- expect(subject.load_options).to eq(:foo => 'bar')
102
- end
103
-
104
- it 'returns empty hash in all other cases' do
105
- subject.load_options = true
106
- expect(subject.load_options).to eq(subject.default_load_options)
107
-
108
- subject.load_options = false
109
- expect(subject.load_options).to eq(subject.default_load_options)
110
-
111
- subject.load_options = 10
112
- expect(subject.load_options).to eq(subject.default_load_options)
113
-
114
- subject.load_options = nil
115
- expect(subject.load_options).to eq(subject.default_load_options)
116
- end
117
- end
118
-
119
- end
data/spec/spec_helper.rb DELETED
@@ -1,77 +0,0 @@
1
- require 'multi_json'
2
- require 'rspec'
3
-
4
- RSpec.configure do |config|
5
- config.expect_with :rspec do |c|
6
- c.syntax = :expect
7
- end
8
- end
9
-
10
- def silence_warnings
11
- old_verbose, $VERBOSE = $VERBOSE, nil
12
- yield
13
- ensure
14
- $VERBOSE = old_verbose
15
- end
16
-
17
- def macruby?
18
- defined?(RUBY_ENGINE) && RUBY_ENGINE == 'macruby'
19
- end
20
-
21
- def jruby?
22
- defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
23
- end
24
-
25
- def undefine_constants(*consts)
26
- values = {}
27
- consts.each do |const|
28
- if Object.const_defined?(const)
29
- values[const] = Object.const_get(const)
30
- Object.send :remove_const, const
31
- end
32
- end
33
-
34
- yield
35
-
36
- ensure
37
- values.each do |const, value|
38
- Object.const_set const, value
39
- end
40
- end
41
-
42
- def break_requirements
43
- requirements = MultiJson::REQUIREMENT_MAP
44
- MultiJson::REQUIREMENT_MAP.each_with_index do |(library, adapter), index|
45
- MultiJson::REQUIREMENT_MAP[index] = ["foo/#{library}", adapter]
46
- end
47
-
48
- yield
49
- ensure
50
- requirements.each_with_index do |(library, adapter), index|
51
- MultiJson::REQUIREMENT_MAP[index] = [library, adapter]
52
- end
53
- end
54
-
55
- def simulate_no_adapters
56
- break_requirements do
57
- undefine_constants :JSON, :Oj, :Yajl, :Gson, :JrJackson do
58
- yield
59
- end
60
- end
61
- end
62
-
63
- def get_exception(exception_class = StandardError)
64
- begin
65
- yield
66
- rescue exception_class => exception
67
- exception
68
- end
69
- end
70
-
71
- def with_default_options
72
- adapter = MultiJson.adapter
73
- adapter.load_options = adapter.dump_options = MultiJson.load_options = MultiJson.dump_options = nil
74
- yield
75
- ensure
76
- adapter.load_options = adapter.dump_options = MultiJson.load_options = MultiJson.dump_options = nil
77
- end
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- exit true if jruby?
4
-
5
- require 'shared/adapter'
6
- require 'multi_json/adapters/yajl'
7
-
8
- describe MultiJson::Adapters::Yajl do
9
- it_behaves_like 'an adapter', described_class
10
- end