multi_json 1.5.1 → 1.6.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.
data.tar.gz.sig ADDED
Binary file
data/.travis.yml CHANGED
@@ -1,3 +1,4 @@
1
+ bundler_args: --without development
1
2
  language: ruby
2
3
  rvm:
3
4
  - rbx-18mode
@@ -7,4 +8,4 @@ rvm:
7
8
  - 1.8.7
8
9
  - 1.9.2
9
10
  - 1.9.3
10
- - ruby-head
11
+ - 2.0.0
data/.yardopts ADDED
@@ -0,0 +1,6 @@
1
+ --markup markdown
2
+ -
3
+ CHANGELOG.md
4
+ CONTRIBUTING.md
5
+ LICENSE.md
6
+ README.md
data/CHANGELOG.md ADDED
@@ -0,0 +1,116 @@
1
+ 1.6.0
2
+ -----
3
+ * [Add gson.rb support](https://github.com/intridea/multi_json/pull/71)
4
+ * [Add MultiJson.default_options](https://github.com/intridea/multi_json/pull/70)
5
+ * [Add MultiJson.with_adapter](https://github.com/intridea/multi_json/pull/67)
6
+ * [Stringify all possible keys for ok_json](https://github.com/intridea/multi_json/pull/66)
7
+ * [Alias `MultiJson::DecodeError` to `MultiJson::LoadError`](https://github.com/intridea/multi_json/pull/79)
8
+
9
+ 1.5.1
10
+ -----
11
+ * [Do not allow Oj or JSON to create symbols by searching for classes](https://github.com/intridea/multi_json/commit/193e28cf4dc61b6e7b7b7d80f06f74c76df65c41)
12
+
13
+ 1.5.0
14
+ -----
15
+ * [Add `MultiJson.with_adapter` method](https://github.com/intridea/multi_json/commit/d14c5d28cae96557a0421298621b9499e1f28104)
16
+ * [Stringify all possible keys for `ok_json`](https://github.com/intridea/multi_json/commit/73998074058e1e58c557ffa7b9541d486d6041fa)
17
+
18
+ 1.4.0
19
+ -----
20
+ * [Allow `load`/`dump` of JSON fragments](https://github.com/intridea/multi_json/commit/707aae7d48d39c85b38febbd2c210ba87f6e4a36)
21
+
22
+ 1.3.7
23
+ -----
24
+ * [Fix rescue clause for MagLev](https://github.com/intridea/multi_json/commit/39abdf50199828c50e85b2ce8f8ba31fcbbc9332)
25
+ * [Remove unnecessary check for string version of options key](https://github.com/intridea/multi_json/commit/660101b70e962b3c007d0b90d45944fa47d13ec4)
26
+ * [Explicitly set default adapter when adapter is set to `nil` or `false`](https://github.com/intridea/multi_json/commit/a9e587d5a63eafb4baee9fb211265e4dd96a26bc)
27
+ * [Fix Oj `ParseError` mapping for Oj 1.4.0](https://github.com/intridea/multi_json/commit/7d9045338cc9029401c16f3c409d54ce97f275e2)
28
+
29
+ 1.3.6
30
+ -----
31
+ * [Allow adapter-specific options to be passed through to Oj](https://github.com/intridea/multi_json/commit/d0e5feeebcba0bc69400dd203a295f5c30971223)
32
+
33
+ 1.3.5
34
+ -----
35
+ * [Add pretty support to Oj adapter](https://github.com/intridea/multi_json/commit/0c8f75f03020c53bcf4c6be258faf433d24b2c2b)
36
+
37
+ 1.3.4
38
+ -----
39
+ * [Use `class << self` instead of `module_function` to create aliases](https://github.com/intridea/multi_json/commit/ba1451c4c48baa297e049889be241a424cb05980)
40
+
41
+ 1.3.3
42
+ -----
43
+ * [Remove deprecation warnings](https://github.com/intridea/multi_json/commit/36b524e71544eb0186826a891bcc03b2820a008f)
44
+
45
+ 1.3.2
46
+ -----
47
+ * [Add ability to use adapter per call](https://github.com/intridea/multi_json/commit/106bbec469d5d0a832bfa31fffcb8c0f0cdc9bd3)
48
+ * [Add and deprecate `default_engine` method](https://github.com/intridea/multi_json/commit/fc3df0c7a3e2ab9ce0c2c7e7617a4da97dd13f6e)
49
+
50
+ 1.3.1
51
+ -----
52
+ * [Only warn once for each instance a deprecated method is called](https://github.com/intridea/multi_json/commit/e21d6eb7da74b3f283995c1d27d5880e75f0ae84)
53
+
54
+ 1.3.0
55
+ -----
56
+ * [Implement `load`/`dump`; deprecate `decode`/`encode`](https://github.com/intridea/multi_json/commit/e90fd6cb1b0293eb0c73c2f4eb0f7a1764370216)
57
+ * [Rename engines to adapters](https://github.com/intridea/multi_json/commit/ae7fd144a7949a9c221dcaa446196ec23db908df)
58
+
59
+ 1.2.0
60
+ -----
61
+ * [Add support for Oj](https://github.com/intridea/multi_json/commit/acd06b233edabe6c44f226873db7b49dab560c60)
62
+
63
+ 1.1.0
64
+ -----
65
+ * [`NSJSONSerialization` support for MacRuby](https://github.com/intridea/multi_json/commit/f862e2fc966cac8867fe7da3997fc76e8a6cf5d4)
66
+
67
+ 1.0.4
68
+ -----
69
+ * [Set data context to `DecodeError` exception](https://github.com/intridea/multi_json/commit/19ddafd44029c6681f66fae2a0f6eabfd0f85176)
70
+ * [Allow `ok_json` to fallback to `to_json`](https://github.com/intridea/multi_json/commit/c157240b1193b283d06d1bd4d4b5b06bcf3761f8)
71
+ * [Add warning when using `ok_json`](https://github.com/intridea/multi_json/commit/dd4b68810c84f826fb98f9713bfb29ab96888d57)
72
+ * [Options can be passed to an engine on encode](https://github.com/intridea/multi_json/commit/e0a7ff5d5ff621ffccc61617ed8aeec5816e81f7)
73
+
74
+ 1.0.3
75
+ -----
76
+ * [`Array` support for `stringify_keys`](https://github.com/intridea/multi_json/commit/644d1c5c7c7f6a27663b11668527b346094e38b9)
77
+ * [`Array` support for `symbolize_keys`](https://github.com/intridea/multi_json/commit/c885377d47a2aa39cb0d971fea78db2d2fa479a7)
78
+
79
+ 1.0.2
80
+ -----
81
+ * [Allow encoding of rootless JSON when `ok_json` is used](https://github.com/intridea/multi_json/commit/d1cde7de97cb0f6152aef8daf14037521cdce8c6)
82
+
83
+ 1.0.1
84
+ -----
85
+ * [Correct an issue with `ok_json` not being returned as the default engine](https://github.com/intridea/multi_json/commit/d33c141619c54cccd770199694da8fd1bd8f449d)
86
+
87
+ 1.0.0
88
+ -----
89
+ * [Remove `ActiveSupport::JSON` support](https://github.com/intridea/multi_json/commit/c2f4140141d785a24b3f56e58811b0e561b37f6a)
90
+ * [Fix `@engine` ivar warning](https://github.com/intridea/multi_json/commit/3b978a8995721a8dffedc3b75a7f49e5494ec553)
91
+ * [Only `rescue` from parsing errors during decoding, not any `StandardError`](https://github.com/intridea/multi_json/commit/391d00b5e85294d42d41347605d8d46b4a7f66cc)
92
+ * [Rename `okjson` engine and vendored lib to `ok_json`](https://github.com/intridea/multi_json/commit/5bd1afc977a8208ddb0443e1d57cb79665c019f1)
93
+ * [Add `StringIO` support to `json` gem and `ok_json`](https://github.com/intridea/multi_json/commit/1706b11568db7f50af451fce5f4d679aeb3bbe8f)
94
+
95
+ 0.0.5
96
+ -----
97
+ * [Trap all JSON decoding errors; raise `MultiJson::DecodeError`](https://github.com/intridea/multi_json/commit/dea9a1aef6dd1212aa1e5a37ab1669f9b045b732)
98
+
99
+ 0.0.4
100
+ -----
101
+ * [Fix default_engine check for `json` gem](https://github.com/intridea/multi_json/commit/caced0c4e8c795922a109ebc00c3c4fa8635bed8)
102
+ * [Make requirement mapper an `Array` to preserve order in Ruby versions < 1.9](https://github.com/intridea/multi_json/commit/526f5f29a42131574a088ad9bbb43d7f48439b2c)
103
+
104
+ 0.0.3
105
+ -----
106
+ * [Improved defaulting and documentation](https://github.com/sferik/twitter/commit/3a0e41b9e4b0909201045fa47704b78c9d949b73)
107
+
108
+ 0.0.2
109
+ -----
110
+
111
+ * [Rename to `multi_json`](https://github.com/sferik/twitter/commit/461ab89ce071c8c9fabfc183581e0ec523788b62)
112
+
113
+ 0.0.1
114
+ -----
115
+
116
+ * [Initial commit](https://github.com/sferik/twitter/commit/518c21ab299c500527491e6c049ab2229e22a805)
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,46 @@
1
+ ## Contributing
2
+ In the spirit of [free software][free-sw], **everyone** is encouraged to help
3
+ improve this project.
4
+
5
+ [free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
6
+
7
+ Here are some ways *you* can contribute:
8
+
9
+ * by using alpha, beta, and prerelease versions
10
+ * by reporting bugs
11
+ * by suggesting new features
12
+ * by writing or editing documentation
13
+ * by writing specifications
14
+ * by writing code (**no patch is too small**: fix typos, add comments, clean up
15
+ inconsistent whitespace)
16
+ * by refactoring code
17
+ * by closing [issues][]
18
+ * by reviewing patches
19
+
20
+ [issues]: https://github.com/intridea/multi_json/issues
21
+
22
+ ## Submitting an Issue
23
+ We use the [GitHub issue tracker][issues] to track bugs and features. Before
24
+ submitting a bug report or feature request, check to make sure it hasn't
25
+ already been submitted. When submitting a bug report, please include a [Gist][]
26
+ that includes a stack trace and any details that may be necessary to reproduce
27
+ the bug, including your gem version, Ruby version, and operating system.
28
+ Ideally, a bug report should include a pull request with failing specs.
29
+
30
+ [gist]: https://gist.github.com/
31
+
32
+ ## Submitting a Pull Request
33
+ 1. [Fork the repository.][fork]
34
+ 2. [Create a topic branch.][branch]
35
+ 3. Add specs for your unimplemented feature or bug fix.
36
+ 4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
37
+ 5. Implement your feature or bug fix.
38
+ 6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
39
+ 7. Run `open coverage/index.html`. If your changes are not completely covered
40
+ by your tests, return to step 3.
41
+ 8. Add, commit, and push your changes.
42
+ 9. [Submit a pull request.][pr]
43
+
44
+ [fork]: http://help.github.com/fork-a-repo/
45
+ [branch]: http://learn.github.com/p/branching.html
46
+ [pr]: http://help.github.com/send-pull-requests/
data/Gemfile CHANGED
@@ -1,7 +1,31 @@
1
- source 'https://rubygems.org'
1
+ source :rubygems
2
2
 
3
- gem 'json', '~> 1.4', :require => nil
4
- gem 'oj', '~> 1.0', :require => nil, :platforms => [:ruby, :mswin, :mingw]
5
- gem 'yajl-ruby', '~> 1.0', :require => nil, :platforms => [:ruby, :mswin, :mingw]
3
+ gem 'rake', '>= 0.9'
4
+ gem 'yard', '>= 0.8'
5
+
6
+ platforms :ruby_18 do
7
+ gem 'json', '~> 1.4', :require => nil
8
+ end
9
+
10
+ gem 'json_pure', '~> 1.4', :require => nil
11
+
12
+ platforms :ruby, :mswin, :mingw do
13
+ gem 'oj', '~> 2.0', :require => nil
14
+ gem 'yajl-ruby', '~> 1.0', :require => nil
15
+ end
16
+ platforms :jruby do
17
+ gem 'gson', '>= 0.6', :require => nil
18
+ end
19
+
20
+ group :development do
21
+ gem 'kramdown', '>= 0.14'
22
+ gem 'pry'
23
+ gem 'pry-debugger', :platforms => :mri_19
24
+ end
25
+
26
+ group :test do
27
+ gem 'rspec', '>= 2.11'
28
+ gem 'simplecov', :require => false
29
+ end
6
30
 
7
31
  gemspec
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 Michael Bleigh, Josh Kalderimis, Erik Michaels-Ober, and Intridea, Inc.
1
+ Copyright (c) 2010-2013 Michael Bleigh, Josh Kalderimis, Erik Michaels-Ober, Pavel Pravosud
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,19 +1,33 @@
1
- # MultiJSON [![Build Status](https://secure.travis-ci.org/intridea/multi_json.png?branch=master)][travis] [![Dependency Status](https://gemnasium.com/intridea/multi_json.png?travis)][gemnasium]
1
+ # MultiJSON
2
+ [![Gem Version](https://badge.fury.io/rb/multi_json.png)][gem]
3
+ [![Build Status](https://secure.travis-ci.org/intridea/multi_json.png?branch=master)][travis]
4
+ [![Dependency Status](https://gemnasium.com/intridea/multi_json.png?travis)][gemnasium]
5
+ [![Code Climate](https://codeclimate.com/github/intridea/multi_json.png)][codeclimate]
2
6
 
7
+ [gem]: https://rubygems.org/gems/multi_json
3
8
  [travis]: http://travis-ci.org/intridea/multi_json
4
9
  [gemnasium]: https://gemnasium.com/intridea/multi_json
10
+ [codeclimate]: https://codeclimate.com/github/intridea/multi_json
5
11
 
6
12
  Lots of Ruby libraries parse JSON and everyone has their favorite JSON coder.
7
13
  Instead of choosing a single JSON coder and forcing users of your library to be
8
14
  stuck with it, you can use MultiJSON instead, which will simply choose the
9
15
  fastest available JSON coder. Here's how to use it:
10
16
 
11
- require 'multi_json'
17
+ ```ruby
18
+ require 'multi_json'
12
19
 
13
- MultiJson.load('{"abc":"def"}') #=> {"abc" => "def"}
14
- MultiJson.load('{"abc":"def"}', :symbolize_keys => true) #=> {:abc => "def"}
15
- MultiJson.dump({:abc => 'def'}) # convert Ruby back to JSON
16
- MultiJson.dump({:abc => 'def'}, :pretty => true) # encoded in a pretty form (if supported by the coder)
20
+ MultiJson.load('{"abc":"def"}') #=> {"abc" => "def"}
21
+ MultiJson.load('{"abc":"def"}', :symbolize_keys => true) #=> {:abc => "def"}
22
+ MultiJson.dump({:abc => 'def'}) # convert Ruby back to JSON
23
+ MultiJson.dump({:abc => 'def'}, :pretty => true) # encoded in a pretty form (if supported by the coder)
24
+ ```
25
+
26
+ When loading invalid JSON, multiJSON will throw a `MultiJson::LoadError`. `MultiJson::DecodeError` is an alias for backwards compatibility.
27
+
28
+ ```ruby
29
+ MultiJson.load('invalid json') #=> MultiJson::LoadError
30
+ ```
17
31
 
18
32
  The `use` method, which sets the MultiJson adapter, takes either a symbol or a
19
33
  class (to allow for custom JSON parsers) that responds to both `.load` and `.dump`
@@ -43,6 +57,7 @@ implementations:
43
57
  * Ruby 1.8.7
44
58
  * Ruby 1.9.2
45
59
  * Ruby 1.9.3
60
+ * Ruby 2.0.0
46
61
  * [JRuby][]
47
62
  * [Rubinius][]
48
63
  * [MacRuby][] (not tested on Travis CI)
@@ -51,8 +66,7 @@ implementations:
51
66
  [rubinius]: http://rubini.us/
52
67
  [macruby]: http://www.macruby.org/
53
68
 
54
- If something doesn't work on one of these interpreters, it should be considered
55
- a bug.
69
+ If something doesn't work on one of these interpreters, it's a bug.
56
70
 
57
71
  This library may inadvertently work (or seem to work) on other Ruby
58
72
  implementations, however support will only be provided for the versions listed
@@ -61,9 +75,9 @@ above.
61
75
  If you would like this library to support another Ruby version, you may
62
76
  volunteer to be a maintainer. Being a maintainer entails making sure all tests
63
77
  run and pass on that implementation. When something breaks on your
64
- implementation, you will be personally responsible for providing patches in a
65
- timely fashion. If critical issues for a particular implementation exist at the
66
- time of a major release, support for that Ruby version may be dropped.
78
+ implementation, you will be responsible for providing patches in a timely
79
+ fashion. If critical issues for a particular implementation exist at the time
80
+ of a major release, support for that Ruby version may be dropped.
67
81
 
68
82
  ## Versioning
69
83
 
@@ -76,13 +90,15 @@ introduced with new major versions. As a result of this policy, you can (and
76
90
  should) specify a dependency on this gem using the [Pessimistic Version
77
91
  Constraint][pvc] with two digits of precision. For example:
78
92
 
79
- spec.add_dependency 'multi_json', '~> 1.0'
93
+ ```ruby
94
+ spec.add_dependency 'multi_json', '~> 1.0'
95
+ ```
80
96
 
81
97
  [semver]: http://semver.org/
82
98
  [pvc]: http://docs.rubygems.org/read/chapter/16#page74
83
99
 
84
100
  ## Copyright
85
- Copyright (c) 2010 Michael Bleigh, Josh Kalderimis, Erik Michaels-Ober, and Intridea, Inc.
86
- See [LICENSE][] for details.
101
+ Copyright (c) 2010-2013 Michael Bleigh, Josh Kalderimis, Erik Michaels-Ober,
102
+ and Pavel Pravosud. See [LICENSE][] for details.
87
103
 
88
- [license]: https://github.com/intridea/multi_json/blob/master/LICENSE.md
104
+ [license]: LICENSE.md
data/Rakefile CHANGED
@@ -8,13 +8,5 @@ RSpec::Core::RakeTask.new(:spec)
8
8
  task :default => :spec
9
9
  task :test => :spec
10
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
11
+ require 'yard'
12
+ YARD::Rake::YardocTask.new
data/lib/multi_json.rb CHANGED
@@ -1,130 +1,137 @@
1
1
  module MultiJson
2
- class DecodeError < StandardError
2
+ extend self
3
+
4
+ class LoadError < StandardError
3
5
  attr_reader :data
4
- def initialize(message="", backtrace=[], data="")
6
+ def initialize(message='', backtrace=[], data='')
5
7
  super(message)
6
8
  self.set_backtrace(backtrace)
7
9
  @data = data
8
10
  end
9
11
  end
12
+ DecodeError = LoadError # Legacy support
13
+
10
14
 
11
- @adapter = nil
15
+ @default_options = {}
16
+ attr_accessor :default_options
12
17
 
13
18
  REQUIREMENT_MAP = [
14
- ["oj", :oj],
15
- ["yajl", :yajl],
16
- ["json", :json_gem],
17
- ["json/pure", :json_pure]
19
+ ['oj', :oj],
20
+ ['yajl', :yajl],
21
+ ['json', :json_gem],
22
+ ['gson', :gson],
23
+ ['json/pure', :json_pure]
18
24
  ]
19
25
 
20
- class << self
21
-
22
- # The default adapter based on what you currently
23
- # have loaded and installed. First checks to see
24
- # if any adapters are already loaded, then checks
25
- # to see which are installed if none are loaded.
26
- def default_adapter
27
- return :oj if defined?(::Oj)
28
- return :yajl if defined?(::Yajl)
29
- return :json_gem if defined?(::JSON)
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
26
+ # The default adapter based on what you currently
27
+ # have loaded and installed. First checks to see
28
+ # if any adapters are already loaded, then checks
29
+ # to see which are installed if none are loaded.
30
+ def default_adapter
31
+ return :oj if defined?(::Oj)
32
+ return :yajl if defined?(::Yajl)
33
+ return :json_gem if defined?(::JSON)
34
+ return :gson if defined?(::Gson)
39
35
 
40
- Kernel.warn "[WARNING] MultiJson is using the default adapter (ok_json). We recommend loading a different JSON library to improve performance."
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)
36
+ REQUIREMENT_MAP.each do |(library, adapter)|
95
37
  begin
96
- adapter.load(string, options)
97
- rescue adapter::ParseError => exception
98
- raise DecodeError.new(exception.message, exception.backtrace, string)
38
+ require library
39
+ return adapter
40
+ rescue ::LoadError
41
+ next
99
42
  end
100
43
  end
101
- # :nodoc:
102
- alias :decode :load
103
-
104
- def current_adapter(options)
105
- if new_adapter = (options || {}).delete(:adapter)
106
- load_adapter(new_adapter)
107
- else
108
- adapter
109
- end
44
+
45
+ Kernel.warn '[WARNING] MultiJson is using the default adapter (ok_json). We recommend loading a different JSON library to improve performance.'
46
+ :ok_json
47
+ end
48
+ # :nodoc:
49
+ alias :default_engine :default_adapter
50
+
51
+ # Get the current adapter class.
52
+ def adapter
53
+ return @adapter if defined?(@adapter) && @adapter
54
+
55
+ self.use nil # load default adapter
56
+
57
+ @adapter
58
+ end
59
+ # :nodoc:
60
+ alias :engine :adapter
61
+
62
+ # Set the JSON parser utilizing a symbol, string, or class.
63
+ # Supported by default are:
64
+ #
65
+ # * <tt>:oj</tt>
66
+ # * <tt>:json_gem</tt>
67
+ # * <tt>:json_pure</tt>
68
+ # * <tt>:ok_json</tt>
69
+ # * <tt>:yajl</tt>
70
+ # * <tt>:nsjsonserialization</tt> (MacRuby only)
71
+ # * <tt>:gson</tt> (JRuby only)
72
+ def use(new_adapter)
73
+ @adapter = load_adapter(new_adapter)
74
+ end
75
+ alias :adapter= :use
76
+ # :nodoc:
77
+ alias :engine= :use
78
+
79
+ def load_adapter(new_adapter)
80
+ case new_adapter
81
+ when String, Symbol
82
+ require "multi_json/adapters/#{new_adapter}"
83
+ MultiJson::Adapters.const_get(:"#{new_adapter.to_s.split('_').map{|s| s.capitalize}.join('')}")
84
+ when NilClass, FalseClass
85
+ load_adapter default_adapter
86
+ when Class, Module
87
+ new_adapter
88
+ else
89
+ raise "Did not recognize your adapter specification. Please specify either a symbol or a class."
110
90
  end
91
+ end
111
92
 
112
- # Encodes a Ruby object as JSON.
113
- def dump(object, options={})
114
- adapter = current_adapter(options)
115
- adapter.dump(object, options)
93
+ # Decode a JSON string into Ruby.
94
+ #
95
+ # <b>Options</b>
96
+ #
97
+ # <tt>:symbolize_keys</tt> :: If true, will use symbols instead of strings for the keys.
98
+ # <tt>:adapter</tt> :: If set, the selected engine will be used just for the call.
99
+ def load(string, options={})
100
+ adapter = current_adapter(options)
101
+ begin
102
+ adapter.load(string, options)
103
+ rescue adapter::ParseError => exception
104
+ raise LoadError.new(exception.message, exception.backtrace, string)
116
105
  end
117
- # :nodoc:
118
- alias :encode :dump
119
-
120
- def with_adapter(new_adapter)
121
- old_adapter, self.adapter = adapter, new_adapter
122
- yield
123
- ensure
124
- self.adapter = old_adapter
106
+ end
107
+ # :nodoc:
108
+ alias :decode :load
109
+
110
+ def current_adapter(options)
111
+ if new_adapter = (options || {}).delete(:adapter)
112
+ load_adapter(new_adapter)
113
+ else
114
+ adapter
125
115
  end
126
- alias :with_engine :with_adapter
116
+ end
117
+
118
+ # Encodes a Ruby object as JSON.
119
+ def dump(object, options={})
120
+ options = default_options.merge(options)
121
+ adapter = current_adapter(options)
122
+ adapter.dump(object, options)
123
+ end
124
+ # :nodoc:
125
+ alias :encode :dump
127
126
 
127
+ # Executes passed block using specified adapter.
128
+ def with_adapter(new_adapter)
129
+ old_adapter, self.adapter = adapter, new_adapter
130
+ yield
131
+ ensure
132
+ self.adapter = old_adapter
128
133
  end
134
+ # :nodoc:
135
+ alias :with_engine :with_adapter
129
136
 
130
137
  end