Skip to content

Commit

Permalink
Merge pull request #449 from okeeblow/freeze_concatenated_strings
Browse files Browse the repository at this point in the history
Explicitly freeze concatenated-`String` constants to unbreak on non-main `Ractor`s.
  • Loading branch information
sporkmonger authored Jul 30, 2022
2 parents 068f673 + 41f12dd commit 7ecf751
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 9 deletions.
24 changes: 15 additions & 9 deletions lib/addressable/uri.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,26 @@ class InvalidURIError < StandardError
##
# Container for the character classes specified in
# <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>.
#
# Note: Concatenated and interpolated `String`s are not affected by the
# `frozen_string_literal` directive and must be frozen explicitly.
#
# Interpolated `String`s *were* frozen this way before Ruby 3.0:
# https://bugs.ruby-lang.org/issues/17104
module CharacterClasses
ALPHA = "a-zA-Z"
DIGIT = "0-9"
GEN_DELIMS = "\\:\\/\\?\\#\\[\\]\\@"
SUB_DELIMS = "\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\="
RESERVED = GEN_DELIMS + SUB_DELIMS
UNRESERVED = ALPHA + DIGIT + "\\-\\.\\_\\~"
PCHAR = UNRESERVED + SUB_DELIMS + "\\:\\@"
SCHEME = ALPHA + DIGIT + "\\-\\+\\."
HOST = UNRESERVED + SUB_DELIMS + "\\[\\:\\]"
AUTHORITY = PCHAR + "\\[\\]"
PATH = PCHAR + "\\/"
QUERY = PCHAR + "\\/\\?"
FRAGMENT = PCHAR + "\\/\\?"
RESERVED = (GEN_DELIMS + SUB_DELIMS).freeze
UNRESERVED = (ALPHA + DIGIT + "\\-\\.\\_\\~").freeze
PCHAR = (UNRESERVED + SUB_DELIMS + "\\:\\@").freeze
SCHEME = (ALPHA + DIGIT + "\\-\\+\\.").freeze
HOST = (UNRESERVED + SUB_DELIMS + "\\[\\:\\]").freeze
AUTHORITY = (PCHAR + "\\[\\:\\]").freeze
PATH = (PCHAR + "\\/").freeze
QUERY = (PCHAR + "\\/\\?").freeze
FRAGMENT = (PCHAR + "\\/\\?").freeze
end

module NormalizeCharacterClasses
Expand Down
10 changes: 10 additions & 0 deletions spec/addressable/uri_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6667,3 +6667,13 @@ def to_str
expect(@uri.class).to eq(@uri.join('path').class)
end
end

describe Addressable::URI, "when initialized in a non-main `Ractor`" do
it "should have the same value as if used in the main `Ractor`" do
pending("Ruby 3.0+ for `Ractor` support") unless defined?(Ractor)
main = Addressable::URI.parse("http://example.com")
expect(
Ractor.new { Addressable::URI.parse("http://example.com") }.take
).to eq(main)
end
end

0 comments on commit 7ecf751

Please sign in to comment.