diff options
| author | Carlos Antonio da Silva <carlosantoniodasilva@gmail.com> | 2013-12-02 17:47:29 -0800 | 
|---|---|---|
| committer | Carlos Antonio da Silva <carlosantoniodasilva@gmail.com> | 2013-12-02 17:47:29 -0800 | 
| commit | 6e905e21b1b3a8114d1499775061b65556c9964e (patch) | |
| tree | 5a650266d1d58b5184f21cc32028b4b18c32e73a | |
| parent | 735abe93a5590f3d6f215a645e633d9fcd8ff3b6 (diff) | |
| parent | fadc02b7322c97f10d34fc04c147f3585eda1272 (diff) | |
| download | rails-6e905e21b1b3a8114d1499775061b65556c9964e.tar.gz rails-6e905e21b1b3a8114d1499775061b65556c9964e.tar.bz2 rails-6e905e21b1b3a8114d1499775061b65556c9964e.zip | |
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
| -rw-r--r-- | activesupport/CHANGELOG.md | 16 | ||||
| -rw-r--r-- | activesupport/lib/active_support/json/encoding.rb | 27 | ||||
| -rw-r--r-- | activesupport/test/json/encoding_test.rb | 16 | 
3 files changed, 59 insertions, 0 deletions
| diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index eec290ea79..18050969d0 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -26,6 +26,22 @@      *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      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 diff --git a/activesupport/lib/active_support/json/encoding.rb b/activesupport/lib/active_support/json/encoding.rb index eb25ef7a4c..060dcb6995 100644 --- a/activesupport/lib/active_support/json/encoding.rb +++ b/activesupport/lib/active_support/json/encoding.rb @@ -5,6 +5,7 @@ module ActiveSupport    class << self      delegate :use_standard_json_time_format, :use_standard_json_time_format=,        :escape_html_entities_in_json, :escape_html_entities_in_json=, +      :encode_big_decimal_as_string, :encode_big_decimal_as_string=,        :json_encoder, :json_encoder=,        :to => :'ActiveSupport::JSON::Encoding'    end @@ -113,6 +114,32 @@ module ActiveSupport          # in +Object#to_json+ and +ActiveSupport::JSON.encode+.          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          def const_missing(name)            if name == :CircularReferenceError diff --git a/activesupport/test/json/encoding_test.rb b/activesupport/test/json/encoding_test.rb index 79e639b508..78cf4819f9 100644 --- a/activesupport/test/json/encoding_test.rb +++ b/activesupport/test/json/encoding_test.rb @@ -172,6 +172,22 @@ class TestJSONEncoding < ActiveSupport::TestCase      assert_equal "𐒑", decoded_hash['string']    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      a = [1]      a << a | 
