diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-01-04 23:22:21 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-04 23:22:21 +0900 |
commit | c7b832730158da5372aeeff512508b2eab4e6fcc (patch) | |
tree | e27364f1710f94418cbfcc1fc579cd9609c35208 /activesupport | |
parent | cb86b95b609c8aa52411322f5a8e0f128696e068 (diff) | |
parent | 7b44ffa21efe3b9608254701ffdf44f743b1a324 (diff) | |
download | rails-c7b832730158da5372aeeff512508b2eab4e6fcc.tar.gz rails-c7b832730158da5372aeeff512508b2eab4e6fcc.tar.bz2 rails-c7b832730158da5372aeeff512508b2eab4e6fcc.zip |
Merge pull request #31049 from gwincr11/cg-blank
Add support for multiple encodings in String.blank?
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/lib/active_support/core_ext/object/blank.rb | 11 | ||||
-rw-r--r-- | activesupport/test/core_ext/object/blank_test.rb | 4 |
2 files changed, 12 insertions, 3 deletions
diff --git a/activesupport/lib/active_support/core_ext/object/blank.rb b/activesupport/lib/active_support/core_ext/object/blank.rb index e42ad852dd..2ca431ab10 100644 --- a/activesupport/lib/active_support/core_ext/object/blank.rb +++ b/activesupport/lib/active_support/core_ext/object/blank.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "active_support/core_ext/regexp" +require "concurrent/map" class Object # An object is blank if it's false, empty, or a whitespace string. @@ -102,6 +103,9 @@ end class String BLANK_RE = /\A[[:space:]]*\z/ + ENCODED_BLANKS = Concurrent::Map.new do |h, enc| + h[enc] = Regexp.new(BLANK_RE.source.encode(enc), BLANK_RE.options | Regexp::FIXEDENCODING) + end # A string is blank if it's empty or contains whitespaces only: # @@ -119,7 +123,12 @@ class String # The regexp that matches blank strings is expensive. For the case of empty # strings we can speed up this method (~3.5x) with an empty? call. The # penalty for the rest of strings is marginal. - empty? || BLANK_RE.match?(self) + empty? || + begin + BLANK_RE.match?(self) + rescue Encoding::CompatibilityError + ENCODED_BLANKS[self.encoding].match?(self) + end end end diff --git a/activesupport/test/core_ext/object/blank_test.rb b/activesupport/test/core_ext/object/blank_test.rb index 749e59ec00..35a3e5922e 100644 --- a/activesupport/test/core_ext/object/blank_test.rb +++ b/activesupport/test/core_ext/object/blank_test.rb @@ -16,8 +16,8 @@ class BlankTest < ActiveSupport::TestCase end end - BLANK = [ EmptyTrue.new, nil, false, "", " ", " \n\t \r ", " ", "\u00a0", [], {} ] - NOT = [ EmptyFalse.new, Object.new, true, 0, 1, "a", [nil], { nil => 0 }, Time.now ] + BLANK = [ EmptyTrue.new, nil, false, "", " ", " \n\t \r ", " ", "\u00a0", [], {}, " ".encode("UTF-16LE")] + NOT = [ EmptyFalse.new, Object.new, true, 0, 1, "a", [nil], { nil => 0 }, Time.now , "my value".encode("UTF-16LE")] def test_blank BLANK.each { |v| assert_equal true, v.blank?, "#{v.inspect} should be blank" } |