diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index d1b3b31646451044a7ffc6dcc1880b4bc7ac0d68..ccdf2c30409da63fe2676c8c80e6b7d470d452fb 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,22 @@ +* `truncate` would return the original string if it was too short to be truncated + and a frozen string if it were long enough to be truncated. Now truncate will + consistently return an unfrozen string regardless. This behavior is consistent + with `gsub` and `strip`. + Before: + + 'foobar'.truncate(5).frozen? + => true + 'foobar'.truncate(6).frozen? + => false + + After: + + 'foobar'.truncate(5).frozen? + => false + 'foobar'.truncate(6).frozen? + => false + + *Jordan Thomas* Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activesupport/CHANGELOG.md) for previous changes. diff --git a/activesupport/lib/active_support/core_ext/string/filters.rb b/activesupport/lib/active_support/core_ext/string/filters.rb index df0e79afa8ed488e1fefe9bf2d561a6a4f7149ef..7f28bd52f244a2b9292b3b727488d9967b151fbd 100644 --- a/activesupport/lib/active_support/core_ext/string/filters.rb +++ b/activesupport/lib/active_support/core_ext/string/filters.rb @@ -75,7 +75,7 @@ def truncate(truncate_at, options = {}) length_with_room_for_omission end - "#{self[0, stop]}#{omission}" + +"#{self[0, stop]}#{omission}" end # Truncates +text+ to at most bytesize bytes in length without diff --git a/activesupport/test/core_ext/string_ext_test.rb b/activesupport/test/core_ext/string_ext_test.rb index 4ffa33aa612d51b418f3947baa178628edd0b729..c5a000b67ab02c8cf79f4af25ba0943bfa9108f8 100644 --- a/activesupport/test/core_ext/string_ext_test.rb +++ b/activesupport/test/core_ext/string_ext_test.rb @@ -291,6 +291,11 @@ def test_truncate_with_omission_and_regexp_separator assert_equal "Hello Big[...]", "Hello Big World!".truncate(15, omission: "[...]", separator: /\s/) end + def test_truncate_returns_frozen_string + assert_not "Hello World!".truncate(12).frozen? + assert_not "Hello World!!".truncate(12).frozen? + end + def test_truncate_bytes assert_equal "👍👍👍👍", "👍👍👍👍".truncate_bytes(16) assert_equal "👍👍👍👍", "👍👍👍👍".truncate_bytes(16, omission: nil)