Skip to content

Commit

Permalink
Merge branch 'multi_json' of https://github.com/joshk/rails into josh…
Browse files Browse the repository at this point in the history
…k-multi_json
  • Loading branch information
josh committed Apr 19, 2011
2 parents 069e9b0 + b246218 commit 011afb7
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 233 deletions.
2 changes: 2 additions & 0 deletions activesupport/activesupport.gemspec
Expand Up @@ -16,4 +16,6 @@ Gem::Specification.new do |s|

s.files = Dir['CHANGELOG', 'README.rdoc', 'lib/**/*']
s.require_path = 'lib'

s.add_dependency('multi_json', '~> 1.0.0.rc3')
end
47 changes: 0 additions & 47 deletions activesupport/lib/active_support/json/backends/jsongem.rb

This file was deleted.

44 changes: 0 additions & 44 deletions activesupport/lib/active_support/json/backends/yajl.rb

This file was deleted.

113 changes: 0 additions & 113 deletions activesupport/lib/active_support/json/backends/yaml.rb

This file was deleted.

60 changes: 37 additions & 23 deletions activesupport/lib/active_support/json/decoding.rb
@@ -1,32 +1,31 @@
require 'active_support/core_ext/module/attribute_accessors'
require 'active_support/core_ext/module/delegation'
require 'multi_json'

module ActiveSupport
# Look for and parse json strings that look like ISO 8601 times.
mattr_accessor :parse_json_times

module JSON
# Listed in order of preference.
DECODERS = %w(Yajl Yaml)

class << self
attr_reader :parse_error
delegate :decode, :to => :backend
def decode(json, options ={})
data = MultiJson.decode(json, options)
if ActiveSupport.parse_json_times
convert_dates_from(data)
else
data
end
end

def backend
set_default_backend unless defined?(@backend)
@backend
def engine
MultiJson.engine
end
alias :backend :engine

def backend=(name)
if name.is_a?(Module)
@backend = name
else
require "active_support/json/backends/#{name.to_s.downcase}"
@backend = ActiveSupport::JSON::Backends::const_get(name)
end
@parse_error = @backend::ParseError
def engine=(name)
MultiJson.engine = name
end
alias :backend= :engine=

def with_backend(name)
old_backend, self.backend = backend, name
Expand All @@ -35,15 +34,30 @@ def with_backend(name)
self.backend = old_backend
end

def set_default_backend
DECODERS.find do |name|
def parse_error
MultiJson::DecodeError
end

private

def convert_dates_from(data)
case data
when nil
nil
when DATE_REGEX
begin
self.backend = name
true
rescue LoadError
# Try next decoder.
false
DateTime.parse(data)
rescue ArgumentError
data
end
when Array
data.map! { |d| convert_dates_from(d) }
when Hash
data.each do |key, value|
data[key] = convert_dates_from(value)
end
else
data
end
end
end
Expand Down
9 changes: 3 additions & 6 deletions activesupport/test/json/decoding_test.rb
Expand Up @@ -56,12 +56,9 @@ class TestJSONDecoding < ActiveSupport::TestCase
%q({"a":"Line1\u000aLine2"}) => {"a"=>"Line1\nLine2"}
}

# load the default JSON backend
ActiveSupport::JSON.backend = 'Yaml'

backends = %w(Yaml)
backends << "JSONGem" if defined?(::JSON)
backends << "Yajl" if defined?(::Yajl)
backends = [:ok_json]
backends << :json_gem if defined?(::JSON)
backends << :yajl if defined?(::Yajl)

backends.each do |backend|
TESTS.each do |json, expected|
Expand Down

0 comments on commit 011afb7

Please sign in to comment.