Fix Ruby 3.4 frozen string literal warnings with StringIO#140
Merged
jeremy merged 1 commit intorails:mainfrom Jan 23, 2026
Merged
Fix Ruby 3.4 frozen string literal warnings with StringIO#140jeremy merged 1 commit intorails:mainfrom
jeremy merged 1 commit intorails:mainfrom
Conversation
40b6a4c to
38b0819
Compare
PR rails#123 fixed frozen string warnings on line 127 (buffer creation) but missed the warnings triggered by calling binmode/set_encoding on StringIO objects. These methods modify StringIO's internal string encoding, which triggers Ruby 3.4 deprecation warnings when running with verbose warnings (-W2), which Rails test suites use by default. Solution: Make StringIO readonly before encoding modifications by calling close_write. This prevents the internal string modification that triggers the warning, while still allowing binmode/set_encoding to execute normally. Only affects StringIO objects (which have closed_write? method) - File objects are unaffected. This workaround should only be needed until Ruby 3.5, which will include an upstream fix: https://redmine.ruby-lang.org/issues/21280
38b0819 to
25b6571
Compare
This was referenced Dec 18, 2025
matiasgarciaisaia
left a comment
There was a problem hiding this comment.
Fixes the issue for me 👍
I don't think I have the most-thorough test suite, but the patch stops the warnings, and the tests keep passing.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #139
Problem
PR #123 fixed frozen string warnings on line 127, but missed warnings triggered by calling
binmodeandset_encodingon StringIO objects. Rails applications running tests with verbose warnings (-W2) see this warning repeatedly:Solution
Make StringIO readonly before encoding modifications to prevent the warning:
How it works:
closed_write?method that File objects don'tclose_writemakes the StringIO readonly, preventing internal string modificationsbinmode/set_encodingare subsequently calledclosed_write?, so they're unaffectedWhy this approach:
respond_to?pattern consistently with existing codebinmodeandset_encodingas originally intendedrescueneeded)Testing
Added a test that captures stderr and verifies no frozen string warnings when processing StringIO objects. All 384 existing tests pass. The test provides a runnable example that demonstrates the fix works correctly.
Future
This workaround should only be needed until Ruby 3.5, which will include an upstream fix that prevents false-positive warnings on StringIO encoding operations: https://redmine.ruby-lang.org/issues/21280