multi_json 1.5.0 → 1.15.0
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +275 -0
- data/CONTRIBUTING.md +46 -0
- data/LICENSE.md +1 -1
- data/README.md +70 -37
- data/lib/multi_json/adapter.rb +49 -0
- data/lib/multi_json/adapter_error.rb +15 -0
- data/lib/multi_json/adapters/gson.rb +20 -0
- data/lib/multi_json/adapters/jr_jackson.rb +25 -0
- data/lib/multi_json/adapters/json_common.rb +13 -15
- data/lib/multi_json/adapters/json_gem.rb +2 -3
- data/lib/multi_json/adapters/json_pure.rb +2 -3
- data/lib/multi_json/adapters/nsjsonserialization.rb +9 -8
- data/lib/multi_json/adapters/oj.rb +50 -13
- data/lib/multi_json/adapters/ok_json.rb +8 -33
- data/lib/multi_json/adapters/yajl.rb +5 -4
- data/lib/multi_json/convertible_hash_keys.rb +43 -0
- data/lib/multi_json/options.rb +39 -0
- data/lib/multi_json/options_cache.rb +29 -0
- data/lib/multi_json/parse_error.rb +17 -0
- data/lib/multi_json/vendor/okjson.rb +97 -93
- data/lib/multi_json/version.rb +15 -1
- data/lib/multi_json.rb +141 -110
- metadata +44 -81
- data/.document +0 -5
- data/.rspec +0 -3
- data/.travis.yml +0 -10
- data/Gemfile +0 -7
- data/Rakefile +0 -20
- data/multi_json.gemspec +0 -23
- data/spec/adapter_shared_example.rb +0 -127
- data/spec/helper.rb +0 -39
- data/spec/multi_json_spec.rb +0 -100
data/lib/multi_json.rb
CHANGED
@@ -1,130 +1,161 @@
|
|
1
|
+
require 'multi_json/options'
|
2
|
+
require 'multi_json/version'
|
3
|
+
require 'multi_json/adapter_error'
|
4
|
+
require 'multi_json/parse_error'
|
5
|
+
require 'multi_json/options_cache'
|
6
|
+
|
1
7
|
module MultiJson
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
+
include Options
|
9
|
+
extend self
|
10
|
+
|
11
|
+
def default_options=(value)
|
12
|
+
Kernel.warn "MultiJson.default_options setter is deprecated\n" \
|
13
|
+
'Use MultiJson.load_options and MultiJson.dump_options instead'
|
14
|
+
|
15
|
+
self.load_options = self.dump_options = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_options
|
19
|
+
Kernel.warn "MultiJson.default_options is deprecated\n" \
|
20
|
+
'Use MultiJson.load_options or MultiJson.dump_options instead'
|
21
|
+
|
22
|
+
load_options
|
23
|
+
end
|
24
|
+
|
25
|
+
%w(cached_options reset_cached_options!).each do |method_name|
|
26
|
+
define_method method_name do |*|
|
27
|
+
Kernel.warn "MultiJson.#{method_name} method is deprecated and no longer used."
|
8
28
|
end
|
9
29
|
end
|
10
30
|
|
11
|
-
|
31
|
+
ALIASES = {'jrjackson' => 'jr_jackson'}
|
12
32
|
|
13
33
|
REQUIREMENT_MAP = [
|
14
|
-
[
|
15
|
-
[
|
16
|
-
[
|
17
|
-
[
|
34
|
+
[:oj, 'oj'],
|
35
|
+
[:yajl, 'yajl'],
|
36
|
+
[:jr_jackson, 'jrjackson'],
|
37
|
+
[:json_gem, 'json/ext'],
|
38
|
+
[:gson, 'gson'],
|
39
|
+
[:json_pure, 'json/pure'],
|
18
40
|
]
|
19
41
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
REQUIREMENT_MAP.each do |(library, adapter)|
|
32
|
-
begin
|
33
|
-
require library
|
34
|
-
return adapter
|
35
|
-
rescue LoadError
|
36
|
-
next
|
37
|
-
end
|
38
|
-
end
|
42
|
+
# The default adapter based on what you currently
|
43
|
+
# have loaded and installed. First checks to see
|
44
|
+
# if any adapters are already loaded, then checks
|
45
|
+
# to see which are installed if none are loaded.
|
46
|
+
def default_adapter
|
47
|
+
return :oj if defined?(::Oj)
|
48
|
+
return :yajl if defined?(::Yajl)
|
49
|
+
return :jr_jackson if defined?(::JrJackson)
|
50
|
+
return :json_gem if defined?(::JSON::Ext::Parser)
|
51
|
+
return :gson if defined?(::Gson)
|
39
52
|
|
40
|
-
|
41
|
-
:ok_json
|
42
|
-
end
|
43
|
-
# :nodoc:
|
44
|
-
alias :default_engine :default_adapter
|
45
|
-
|
46
|
-
# Get the current adapter class.
|
47
|
-
def adapter
|
48
|
-
return @adapter if @adapter
|
49
|
-
self.use self.default_adapter
|
50
|
-
@adapter
|
51
|
-
end
|
52
|
-
# :nodoc:
|
53
|
-
alias :engine :adapter
|
54
|
-
|
55
|
-
# Set the JSON parser utilizing a symbol, string, or class.
|
56
|
-
# Supported by default are:
|
57
|
-
#
|
58
|
-
# * <tt>:oj</tt>
|
59
|
-
# * <tt>:json_gem</tt>
|
60
|
-
# * <tt>:json_pure</tt>
|
61
|
-
# * <tt>:ok_json</tt>
|
62
|
-
# * <tt>:yajl</tt>
|
63
|
-
# * <tt>:nsjsonserialization</tt> (MacRuby only)
|
64
|
-
def use(new_adapter)
|
65
|
-
@adapter = load_adapter(new_adapter)
|
66
|
-
end
|
67
|
-
alias :adapter= :use
|
68
|
-
# :nodoc:
|
69
|
-
alias :engine= :use
|
70
|
-
|
71
|
-
def load_adapter(new_adapter)
|
72
|
-
case new_adapter
|
73
|
-
when String, Symbol
|
74
|
-
require "multi_json/adapters/#{new_adapter}"
|
75
|
-
MultiJson::Adapters.const_get(:"#{new_adapter.to_s.split('_').map{|s| s.capitalize}.join('')}")
|
76
|
-
when NilClass, FalseClass
|
77
|
-
default_adapter = self.default_adapter
|
78
|
-
require "multi_json/adapters/#{default_adapter}"
|
79
|
-
MultiJson::Adapters.const_get(:"#{default_adapter.to_s.split('_').map{|s| s.capitalize}.join('')}")
|
80
|
-
when Class
|
81
|
-
new_adapter
|
82
|
-
else
|
83
|
-
raise "Did not recognize your adapter specification. Please specify either a symbol or a class."
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
# Decode a JSON string into Ruby.
|
88
|
-
#
|
89
|
-
# <b>Options</b>
|
90
|
-
#
|
91
|
-
# <tt>:symbolize_keys</tt> :: If true, will use symbols instead of strings for the keys.
|
92
|
-
# <tt>:adapter</tt> :: If set, the selected engine will be used just for the call.
|
93
|
-
def load(string, options={})
|
94
|
-
adapter = current_adapter(options)
|
53
|
+
REQUIREMENT_MAP.each do |adapter, library|
|
95
54
|
begin
|
96
|
-
|
97
|
-
|
98
|
-
|
55
|
+
require library
|
56
|
+
return adapter
|
57
|
+
rescue ::LoadError
|
58
|
+
next
|
99
59
|
end
|
100
60
|
end
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
61
|
+
|
62
|
+
Kernel.warn '[WARNING] MultiJson is using the default adapter (ok_json). ' \
|
63
|
+
'We recommend loading a different JSON library to improve performance.'
|
64
|
+
|
65
|
+
:ok_json
|
66
|
+
end
|
67
|
+
alias_method :default_engine, :default_adapter
|
68
|
+
|
69
|
+
# Get the current adapter class.
|
70
|
+
def adapter
|
71
|
+
return @adapter if defined?(@adapter) && @adapter
|
72
|
+
|
73
|
+
use nil # load default adapter
|
74
|
+
|
75
|
+
@adapter
|
76
|
+
end
|
77
|
+
alias_method :engine, :adapter
|
78
|
+
|
79
|
+
# Set the JSON parser utilizing a symbol, string, or class.
|
80
|
+
# Supported by default are:
|
81
|
+
#
|
82
|
+
# * <tt>:oj</tt>
|
83
|
+
# * <tt>:json_gem</tt>
|
84
|
+
# * <tt>:json_pure</tt>
|
85
|
+
# * <tt>:ok_json</tt>
|
86
|
+
# * <tt>:yajl</tt>
|
87
|
+
# * <tt>:nsjsonserialization</tt> (MacRuby only)
|
88
|
+
# * <tt>:gson</tt> (JRuby only)
|
89
|
+
# * <tt>:jr_jackson</tt> (JRuby only)
|
90
|
+
def use(new_adapter)
|
91
|
+
@adapter = load_adapter(new_adapter)
|
92
|
+
ensure
|
93
|
+
OptionsCache.reset
|
94
|
+
end
|
95
|
+
alias_method :adapter=, :use
|
96
|
+
alias_method :engine=, :use
|
97
|
+
|
98
|
+
def load_adapter(new_adapter)
|
99
|
+
case new_adapter
|
100
|
+
when String, Symbol
|
101
|
+
load_adapter_from_string_name new_adapter.to_s
|
102
|
+
when NilClass, FalseClass
|
103
|
+
load_adapter default_adapter
|
104
|
+
when Class, Module
|
105
|
+
new_adapter
|
106
|
+
else
|
107
|
+
fail ::LoadError, new_adapter
|
110
108
|
end
|
109
|
+
rescue ::LoadError => exception
|
110
|
+
raise AdapterError.build(exception)
|
111
|
+
end
|
111
112
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
113
|
+
# Decode a JSON string into Ruby.
|
114
|
+
#
|
115
|
+
# <b>Options</b>
|
116
|
+
#
|
117
|
+
# <tt>:symbolize_keys</tt> :: If true, will use symbols instead of strings for the keys.
|
118
|
+
# <tt>:adapter</tt> :: If set, the selected adapter will be used for this call.
|
119
|
+
def load(string, options = {})
|
120
|
+
adapter = current_adapter(options)
|
121
|
+
begin
|
122
|
+
adapter.load(string, options)
|
123
|
+
rescue adapter::ParseError => exception
|
124
|
+
raise ParseError.build(exception, string)
|
116
125
|
end
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
126
|
+
end
|
127
|
+
alias_method :decode, :load
|
128
|
+
|
129
|
+
def current_adapter(options = {})
|
130
|
+
if (new_adapter = options[:adapter])
|
131
|
+
load_adapter(new_adapter)
|
132
|
+
else
|
133
|
+
adapter
|
125
134
|
end
|
126
|
-
|
135
|
+
end
|
127
136
|
|
137
|
+
# Encodes a Ruby object as JSON.
|
138
|
+
def dump(object, options = {})
|
139
|
+
current_adapter(options).dump(object, options)
|
128
140
|
end
|
141
|
+
alias_method :encode, :dump
|
129
142
|
|
143
|
+
# Executes passed block using specified adapter.
|
144
|
+
def with_adapter(new_adapter)
|
145
|
+
old_adapter = adapter
|
146
|
+
self.adapter = new_adapter
|
147
|
+
yield
|
148
|
+
ensure
|
149
|
+
self.adapter = old_adapter
|
150
|
+
end
|
151
|
+
alias_method :with_engine, :with_adapter
|
152
|
+
|
153
|
+
private
|
154
|
+
|
155
|
+
def load_adapter_from_string_name(name)
|
156
|
+
name = ALIASES.fetch(name, name)
|
157
|
+
require "multi_json/adapters/#{name.downcase}"
|
158
|
+
klass_name = name.to_s.split('_').map(&:capitalize) * ''
|
159
|
+
MultiJson::Adapters.const_get(klass_name)
|
160
|
+
end
|
130
161
|
end
|
metadata
CHANGED
@@ -1,105 +1,67 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multi_json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 1.5.0
|
4
|
+
version: 1.15.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Michael Bleigh
|
9
8
|
- Josh Kalderimis
|
10
9
|
- Erik Michaels-Ober
|
10
|
+
- Pavel Pravosud
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2020-07-10 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
version_requirements: !ruby/object:Gem::Requirement
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0.9'
|
22
|
-
none: false
|
23
17
|
name: rake
|
24
|
-
type: :development
|
25
|
-
prerelease: false
|
26
18
|
requirement: !ruby/object:Gem::Requirement
|
27
19
|
requirements:
|
28
|
-
- -
|
20
|
+
- - "~>"
|
29
21
|
- !ruby/object:Gem::Version
|
30
|
-
version: '
|
31
|
-
none: false
|
32
|
-
- !ruby/object:Gem::Dependency
|
33
|
-
version_requirements: !ruby/object:Gem::Requirement
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '3.9'
|
38
|
-
none: false
|
39
|
-
name: rdoc
|
22
|
+
version: '10.5'
|
40
23
|
type: :development
|
41
24
|
prerelease: false
|
42
|
-
requirement: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - ! '>='
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '3.9'
|
47
|
-
none: false
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
25
|
version_requirements: !ruby/object:Gem::Requirement
|
50
26
|
requirements:
|
51
|
-
- -
|
27
|
+
- - "~>"
|
52
28
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
54
|
-
|
29
|
+
version: '10.5'
|
30
|
+
- !ruby/object:Gem::Dependency
|
55
31
|
name: rspec
|
56
|
-
type: :development
|
57
|
-
prerelease: false
|
58
32
|
requirement: !ruby/object:Gem::Requirement
|
59
33
|
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '2.6'
|
63
|
-
none: false
|
64
|
-
- !ruby/object:Gem::Dependency
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - ! '>='
|
34
|
+
- - "~>"
|
68
35
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
70
|
-
none: false
|
71
|
-
name: simplecov
|
36
|
+
version: '3.9'
|
72
37
|
type: :development
|
73
38
|
prerelease: false
|
74
|
-
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
75
40
|
requirements:
|
76
|
-
- -
|
41
|
+
- - "~>"
|
77
42
|
- !ruby/object:Gem::Version
|
78
|
-
version: '
|
79
|
-
|
80
|
-
|
81
|
-
|
43
|
+
version: '3.9'
|
44
|
+
description: A common interface to multiple JSON libraries, including Oj, Yajl, the
|
45
|
+
JSON gem (with C-extensions), the pure-Ruby JSON gem, NSJSONSerialization, gson.rb,
|
46
|
+
JrJackson, and OkJson.
|
82
47
|
email:
|
83
48
|
- michael@intridea.com
|
84
49
|
- josh.kalderimis@gmail.com
|
85
50
|
- sferik@gmail.com
|
51
|
+
- pavel@pravosud.com
|
86
52
|
executables: []
|
87
53
|
extensions: []
|
88
|
-
extra_rdoc_files:
|
89
|
-
- LICENSE.md
|
90
|
-
- README.md
|
54
|
+
extra_rdoc_files: []
|
91
55
|
files:
|
56
|
+
- CHANGELOG.md
|
57
|
+
- CONTRIBUTING.md
|
92
58
|
- LICENSE.md
|
93
59
|
- README.md
|
94
|
-
-
|
95
|
-
- multi_json.
|
96
|
-
-
|
97
|
-
- .
|
98
|
-
- .
|
99
|
-
- .travis.yml
|
100
|
-
- spec/adapter_shared_example.rb
|
101
|
-
- spec/helper.rb
|
102
|
-
- spec/multi_json_spec.rb
|
60
|
+
- lib/multi_json.rb
|
61
|
+
- lib/multi_json/adapter.rb
|
62
|
+
- lib/multi_json/adapter_error.rb
|
63
|
+
- lib/multi_json/adapters/gson.rb
|
64
|
+
- lib/multi_json/adapters/jr_jackson.rb
|
103
65
|
- lib/multi_json/adapters/json_common.rb
|
104
66
|
- lib/multi_json/adapters/json_gem.rb
|
105
67
|
- lib/multi_json/adapters/json_pure.rb
|
@@ -107,37 +69,38 @@ files:
|
|
107
69
|
- lib/multi_json/adapters/oj.rb
|
108
70
|
- lib/multi_json/adapters/ok_json.rb
|
109
71
|
- lib/multi_json/adapters/yajl.rb
|
72
|
+
- lib/multi_json/convertible_hash_keys.rb
|
73
|
+
- lib/multi_json/options.rb
|
74
|
+
- lib/multi_json/options_cache.rb
|
75
|
+
- lib/multi_json/parse_error.rb
|
110
76
|
- lib/multi_json/vendor/okjson.rb
|
111
77
|
- lib/multi_json/version.rb
|
112
|
-
|
113
|
-
homepage: http://github.com/intridea/multi_json
|
78
|
+
homepage: https://github.com/intridea/multi_json
|
114
79
|
licenses:
|
115
80
|
- MIT
|
81
|
+
metadata:
|
82
|
+
bug_tracker_uri: https://github.com/intridea/multi_json/issues
|
83
|
+
changelog_uri: https://github.com/intridea/multi_json/blob/v1.15.0/CHANGELOG.md
|
84
|
+
documentation_uri: https://www.rubydoc.info/gems/multi_json/1.15.0
|
85
|
+
source_code_uri: https://github.com/intridea/multi_json/tree/v1.15.0
|
86
|
+
wiki_uri: https://github.com/intridea/multi_json/wiki
|
116
87
|
post_install_message:
|
117
|
-
rdoc_options:
|
118
|
-
- --charset=UTF-8
|
88
|
+
rdoc_options: []
|
119
89
|
require_paths:
|
120
90
|
- lib
|
121
91
|
required_ruby_version: !ruby/object:Gem::Requirement
|
122
92
|
requirements:
|
123
|
-
- -
|
93
|
+
- - ">="
|
124
94
|
- !ruby/object:Gem::Version
|
125
95
|
version: '0'
|
126
|
-
none: false
|
127
96
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
97
|
requirements:
|
129
|
-
- -
|
98
|
+
- - ">="
|
130
99
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.3.
|
132
|
-
none: false
|
100
|
+
version: 1.3.5
|
133
101
|
requirements: []
|
134
|
-
|
135
|
-
rubygems_version: 1.8.23
|
102
|
+
rubygems_version: 3.0.3
|
136
103
|
signing_key:
|
137
|
-
specification_version:
|
138
|
-
summary: A
|
139
|
-
test_files:
|
140
|
-
- spec/adapter_shared_example.rb
|
141
|
-
- spec/helper.rb
|
142
|
-
- spec/multi_json_spec.rb
|
143
|
-
has_rdoc:
|
104
|
+
specification_version: 4
|
105
|
+
summary: A common interface to multiple JSON libraries.
|
106
|
+
test_files: []
|
data/.document
DELETED
data/.rspec
DELETED
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'bundler'
|
2
|
-
Bundler::GemHelper.install_tasks
|
3
|
-
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
desc "Run all examples"
|
6
|
-
RSpec::Core::RakeTask.new(:spec)
|
7
|
-
|
8
|
-
task :default => :spec
|
9
|
-
task :test => :spec
|
10
|
-
|
11
|
-
namespace :doc do
|
12
|
-
require 'rdoc/task'
|
13
|
-
require File.expand_path('../lib/multi_json/version', __FILE__)
|
14
|
-
RDoc::Task.new do |rdoc|
|
15
|
-
rdoc.rdoc_dir = 'rdoc'
|
16
|
-
rdoc.title = "multi_json #{MultiJson::VERSION}"
|
17
|
-
rdoc.main = 'README.md'
|
18
|
-
rdoc.rdoc_files.include('README.md', 'LICENSE.md', 'lib/**/*.rb')
|
19
|
-
end
|
20
|
-
end
|
data/multi_json.gemspec
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require File.expand_path("../lib/multi_json/version", __FILE__)
|
3
|
-
|
4
|
-
Gem::Specification.new do |gem|
|
5
|
-
gem.add_development_dependency 'rake', '>= 0.9'
|
6
|
-
gem.add_development_dependency 'rdoc', '>= 3.9'
|
7
|
-
gem.add_development_dependency 'rspec', '>= 2.6'
|
8
|
-
gem.add_development_dependency 'simplecov', '>= 0.4'
|
9
|
-
gem.authors = ["Michael Bleigh", "Josh Kalderimis", "Erik Michaels-Ober"]
|
10
|
-
gem.description = %q{A gem to provide easy switching between different JSON backends, including Oj, Yajl, the JSON gem (with C-extensions), the pure-Ruby JSON gem, and OkJson.}
|
11
|
-
gem.email = ['michael@intridea.com', 'josh.kalderimis@gmail.com', 'sferik@gmail.com']
|
12
|
-
gem.extra_rdoc_files = ['LICENSE.md', 'README.md']
|
13
|
-
gem.files = Dir['LICENSE.md', 'README.md', 'Rakefile', 'multi_json.gemspec', 'Gemfile', '.document', '.rspec', '.travis.yml' ,'spec/**/*', 'lib/**/*']
|
14
|
-
gem.homepage = 'http://github.com/intridea/multi_json'
|
15
|
-
gem.licenses = ['MIT']
|
16
|
-
gem.name = 'multi_json'
|
17
|
-
gem.rdoc_options = ["--charset=UTF-8"]
|
18
|
-
gem.require_paths = ['lib']
|
19
|
-
gem.required_rubygems_version = Gem::Requirement.new(">= 1.3.6")
|
20
|
-
gem.summary = %q{A gem to provide swappable JSON backends.}
|
21
|
-
gem.test_files = Dir['spec/**/*']
|
22
|
-
gem.version = MultiJson::VERSION
|
23
|
-
end
|
@@ -1,127 +0,0 @@
|
|
1
|
-
shared_examples_for "an adapter" do |adapter|
|
2
|
-
|
3
|
-
before do
|
4
|
-
begin
|
5
|
-
MultiJson.use adapter
|
6
|
-
rescue LoadError
|
7
|
-
pending "Adapter #{adapter} couldn't be loaded (not installed?)"
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
describe '.dump' do
|
12
|
-
it 'writes decodable JSON' do
|
13
|
-
[
|
14
|
-
{'abc' => 'def'},
|
15
|
-
[1, 2, 3, "4"],
|
16
|
-
].each do |example|
|
17
|
-
expect(MultiJson.load(MultiJson.dump(example))).to eq example
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'dumps symbol and fixnum keys as strings' do
|
22
|
-
[
|
23
|
-
[
|
24
|
-
{:foo => {:bar => 'baz'}},
|
25
|
-
{'foo' => {'bar' => 'baz'}},
|
26
|
-
],
|
27
|
-
[
|
28
|
-
[{:foo => {:bar => 'baz'}}],
|
29
|
-
[{'foo' => {'bar' => 'baz'}}],
|
30
|
-
],
|
31
|
-
[
|
32
|
-
{:foo => [{:bar => 'baz'}]},
|
33
|
-
{'foo' => [{'bar' => 'baz'}]},
|
34
|
-
],
|
35
|
-
[
|
36
|
-
{1 => {2 => {3 => 'bar'}}},
|
37
|
-
{'1' => {'2' => {'3' => 'bar'}}}
|
38
|
-
]
|
39
|
-
].each do |example, expected|
|
40
|
-
dumped_json = MultiJson.dump(example)
|
41
|
-
expect(MultiJson.load(dumped_json)).to eq expected
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'dumps rootless JSON' do
|
46
|
-
expect(MultiJson.dump("random rootless string")).to eq "\"random rootless string\""
|
47
|
-
expect(MultiJson.dump(123)).to eq "123"
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'passes options to the adapter' do
|
51
|
-
MultiJson.adapter.should_receive(:dump).with('foo', {:bar => :baz})
|
52
|
-
MultiJson.dump('foo', :bar => :baz)
|
53
|
-
end
|
54
|
-
|
55
|
-
if adapter == 'json_gem' || adapter == 'json_pure'
|
56
|
-
describe 'with :pretty option set to true' do
|
57
|
-
it 'passes default pretty options' do
|
58
|
-
object = 'foo'
|
59
|
-
object.should_receive(:to_json).with(JSON::PRETTY_STATE_PROTOTYPE.to_h)
|
60
|
-
MultiJson.dump(object,:pretty => true)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'dumps custom objects which implement as_json' do
|
66
|
-
expect(MultiJson.dump(TimeWithZone.new)).to eq "\"2005-02-01T15:15:10Z\""
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'allow to dump JSON values' do
|
70
|
-
expect(MultiJson.dump(42)).to eq '42'
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
describe '.load' do
|
76
|
-
it 'properly loads valid JSON' do
|
77
|
-
expect(MultiJson.load('{"abc":"def"}')).to eq({'abc' => 'def'})
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'raises MultiJson::DecodeError on invalid JSON' do
|
81
|
-
expect{MultiJson.load('{"abc"}')}.to raise_error(MultiJson::DecodeError)
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'raises MultiJson::DecodeError with data on invalid JSON' do
|
85
|
-
data = '{invalid}'
|
86
|
-
begin
|
87
|
-
MultiJson.load(data)
|
88
|
-
rescue MultiJson::DecodeError => de
|
89
|
-
expect(de.data).to eq data
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'stringifys symbol keys when encoding' do
|
94
|
-
dumped_json = MultiJson.dump(:a => 1, :b => {:c => 2})
|
95
|
-
expect(MultiJson.load(dumped_json)).to eq({"a" => 1, "b" => {"c" => 2}})
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'properly loads valid JSON in StringIOs' do
|
99
|
-
json = StringIO.new('{"abc":"def"}')
|
100
|
-
expect(MultiJson.load(json)).to eq({'abc' => 'def'})
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'allows for symbolization of keys' do
|
104
|
-
[
|
105
|
-
[
|
106
|
-
'{"abc":{"def":"hgi"}}',
|
107
|
-
{:abc => {:def => 'hgi'}},
|
108
|
-
],
|
109
|
-
[
|
110
|
-
'[{"abc":{"def":"hgi"}}]',
|
111
|
-
[{:abc => {:def => 'hgi'}}],
|
112
|
-
],
|
113
|
-
[
|
114
|
-
'{"abc":[{"def":"hgi"}]}',
|
115
|
-
{:abc => [{:def => 'hgi'}]},
|
116
|
-
],
|
117
|
-
].each do |example, expected|
|
118
|
-
expect(MultiJson.load(example, :symbolize_keys => true)).to eq expected
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'allow to load JSON values' do
|
123
|
-
expect(MultiJson.load('42')).to eq 42
|
124
|
-
end
|
125
|
-
|
126
|
-
end
|
127
|
-
end
|