Merge pull request #13060 from chancancode/change_log_for_json_refactor

CHANGELOG for JSON refactor + added back the `encode_big_decimal_as_string` option with warning
This commit is contained in:
Carlos Antonio da Silva 2013-12-02 17:47:29 -08:00
commit 6e905e21b1
3 changed files with 59 additions and 0 deletions

@ -26,6 +26,22 @@
*Godfrey Chan* *Godfrey Chan*
* Removed the old pure-Ruby JSON encoder and switched to a new encoder based on the built-in JSON
gem.
Support for encoding `BigDecimal` as a JSON number, as well as defining custom `encode_json`
methods to control the JSON output has been **removed from core**. The new encoder will always
encode BigDecimals as `String`s and ignore any custom `encode_json` methods.
The old encoder has been extracted into the `activesupport-json_encoder` gem. Installing that
gem will bring back the ability to encode `BigDecimal`s as numbers as well as `encode_json`
support.
Setting the related configuration `ActiveSupport.encode_big_decimal_as_string` without the
`activesupport-json_encoder` gem installed will raise an error.
*Godfrey Chan*
* Add `ActiveSupport::Testing::TimeHelpers#travel` and `#travel_to`. These methods change current * Add `ActiveSupport::Testing::TimeHelpers#travel` and `#travel_to`. These methods change current
time to the given time or time difference by stubbing `Time.now` and `Date.today` to return the time to the given time or time difference by stubbing `Time.now` and `Date.today` to return the
time or date after the difference calculation, or the time or date that got passed into the time or date after the difference calculation, or the time or date that got passed into the

@ -5,6 +5,7 @@ module ActiveSupport
class << self class << self
delegate :use_standard_json_time_format, :use_standard_json_time_format=, delegate :use_standard_json_time_format, :use_standard_json_time_format=,
:escape_html_entities_in_json, :escape_html_entities_in_json=, :escape_html_entities_in_json, :escape_html_entities_in_json=,
:encode_big_decimal_as_string, :encode_big_decimal_as_string=,
:json_encoder, :json_encoder=, :json_encoder, :json_encoder=,
:to => :'ActiveSupport::JSON::Encoding' :to => :'ActiveSupport::JSON::Encoding'
end end
@ -113,6 +114,32 @@ class << self
# in +Object#to_json+ and +ActiveSupport::JSON.encode+. # in +Object#to_json+ and +ActiveSupport::JSON.encode+.
attr_accessor :json_encoder attr_accessor :json_encoder
def encode_big_decimal_as_string=(as_string)
message = \
"The JSON encoder in Rails 4.1 no longer supports encoding BigDecimals as JSON numbers. Instead, " \
"the new encoder will always encode them as strings.\n\n" \
"You are seeing this error because you have 'active_support.encode_big_decimal_as_string' in " \
"your configuration file. If you have been setting this to true, you can safely remove it from " \
"your configuration. Otherwise, you should add the 'activesupport-json_encoder' gem to your " \
"Gemfile in order to restore this functionality."
raise NotImplementedError, message
end
def encode_big_decimal_as_string
message = \
"The JSON encoder in Rails 4.1 no longer supports encoding BigDecimals as JSON numbers. Instead, " \
"the new encoder will always encode them as strings.\n\n" \
"You are seeing this error because you are trying to check the value of the related configuration, " \
"'active_support.encode_big_decimal_as_string'. If your application depends on this option, you should " \
"add the 'activesupport-json_encoder' gem to your Gemfile. For now, this option will always be true. " \
"In the future, it will be removed from Rails, so you should stop checking its value."
ActiveSupport::Deprecation.warn message
true
end
# Deprecate CircularReferenceError # Deprecate CircularReferenceError
def const_missing(name) def const_missing(name)
if name == :CircularReferenceError if name == :CircularReferenceError

@ -172,6 +172,22 @@ def test_wide_utf8_roundtrip
assert_equal "𐒑", decoded_hash['string'] assert_equal "𐒑", decoded_hash['string']
end end
def test_reading_encode_big_decimal_as_string_option
assert_deprecated do
assert ActiveSupport.encode_big_decimal_as_string
end
end
def test_setting_deprecated_encode_big_decimal_as_string_option
assert_raise(NotImplementedError) do
ActiveSupport.encode_big_decimal_as_string = true
end
assert_raise(NotImplementedError) do
ActiveSupport.encode_big_decimal_as_string = false
end
end
def test_exception_raised_when_encoding_circular_reference_in_array def test_exception_raised_when_encoding_circular_reference_in_array
a = [1] a = [1]
a << a a << a