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:
commit
6e905e21b1
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user