mirror of https://github.com/rails/rails
`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:
parent
690ce38cfe
commit
8454aeeb2b
|
@ -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*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue