`String#strip_heredoc` preserves frozenness

```ruby
"foo".freeze.strip_heredoc.frozen?  # => true
```

Fixes the case where frozen string literals would inadvertently become
unfrozen:

```ruby

foo = <<-MSG.strip_heredoc
  la la la
MSG

foo.frozen?  # => false !??
```
This commit is contained in:
Jeremy Daer 2018-02-17 15:23:17 -08:00
parent 690ce38cfe
commit 8454aeeb2b
3 changed files with 23 additions and 1 deletions

View File

@ -1,5 +1,21 @@
## Rails 6.0.0.alpha (Unreleased) ##
* `String#strip_heredoc` preserves frozenness.
"foo".freeze.strip_heredoc.frozen? # => true
Fixes that frozen string literals would inadvertently become unfrozen:
# frozen_string_literal: true
foo = <<-MSG.strip_heredoc
la la la
MSG
foo.frozen? # => false !??
*Jeremy Daer*
* Rails 6 requires Ruby 2.4.1 or newer.
*Jeremy Daer*

View File

@ -20,6 +20,8 @@ class String
# Technically, it looks for the least indented non-empty line
# in the whole string, and removes that amount of leading whitespace.
def strip_heredoc
gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "".freeze)
gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "".freeze).tap do |stripped|
stripped.freeze if frozen?
end
end
end

View File

@ -24,6 +24,10 @@ class StringInflectionsTest < ActiveSupport::TestCase
assert_equal "", "".strip_heredoc
end
def test_strip_heredoc_on_a_frozen_string
assert "".freeze.strip_heredoc.frozen?
end
def test_strip_heredoc_on_a_string_with_no_lines
assert_equal "x", "x".strip_heredoc
assert_equal "x", " x".strip_heredoc