From 575dbeeefcaafeb566afc07cdd8b55603b698d9f Mon Sep 17 00:00:00 2001 From: Xavier Noria Date: Thu, 21 Jul 2016 23:41:03 +0200 Subject: [PATCH] define Range#match? if Ruby < 2.4 See the rationale in the documentation included in this patch. We are going to gradually introduce this predicate in the code base. --- activesupport/CHANGELOG.md | 10 ++++++-- .../lib/active_support/core_ext/regexp.rb | 4 ++++ .../test/core_ext/regexp_ext_test.rb | 24 +++++++++++++++++++ .../source/active_support_core_extensions.md | 18 ++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index 8d47f99b22609..b24f9e6987c32 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,9 @@ +* Defines `Regexp.match?` for Ruby versions prior to 2.4. The predicate + has the same interface, but it does not have the performance boost. It's + purpose is to be able to write 2.4 compatible code. + + *Xavier Noria* + * Allow MessageEncryptor to take advantage of authenticated encryption modes. AEAD modes like `aes-256-gcm` provide both confidentiality and data @@ -55,7 +61,7 @@ *John Gesimondo* -* `travel/travel_to` travel time helpers, now raise on nested calls, +* `travel/travel_to` travel time helpers, now raise on nested calls, as this can lead to confusing time stubbing. Instead of: @@ -69,7 +75,7 @@ preferred way to achieve above is: - travel 2.days do + travel 2.days do # 2 days from today end diff --git a/activesupport/lib/active_support/core_ext/regexp.rb b/activesupport/lib/active_support/core_ext/regexp.rb index 784145f5fbd63..d9cff52050d55 100644 --- a/activesupport/lib/active_support/core_ext/regexp.rb +++ b/activesupport/lib/active_support/core_ext/regexp.rb @@ -2,4 +2,8 @@ class Regexp #:nodoc: def multiline? options & MULTILINE == MULTILINE end + + def match?(string, pos=0) + !! match(string, pos) + end unless //.respond_to?(:match?) end diff --git a/activesupport/test/core_ext/regexp_ext_test.rb b/activesupport/test/core_ext/regexp_ext_test.rb index c2398d31bd78b..d91e363085458 100644 --- a/activesupport/test/core_ext/regexp_ext_test.rb +++ b/activesupport/test/core_ext/regexp_ext_test.rb @@ -7,4 +7,28 @@ def test_multiline assert_equal false, //.multiline? assert_equal false, /(?m:)/.multiline? end + + # Based on https://github.com/ruby/ruby/blob/trunk/test/ruby/test_regexp.rb. + def test_match_p + /back(...)/ =~ 'backref' + # must match here, but not in a separate method, e.g., assert_send, + # to check if $~ is affected or not. + assert_equal false, //.match?(nil) + assert_equal true, //.match?("") + assert_equal true, /.../.match?(:abc) + assert_raise(TypeError) { /.../.match?(Object.new) } + assert_equal true, /b/.match?('abc') + assert_equal true, /b/.match?('abc', 1) + assert_equal true, /../.match?('abc', 1) + assert_equal true, /../.match?('abc', -2) + assert_equal false, /../.match?("abc", -4) + assert_equal false, /../.match?("abc", 4) + assert_equal true, /\z/.match?("") + assert_equal true, /\z/.match?("abc") + assert_equal true, /R.../.match?("Ruby") + assert_equal false, /R.../.match?("Ruby", 1) + assert_equal false, /P.../.match?("Ruby") + assert_equal 'backref', $& + assert_equal 'ref', $1 + end end diff --git a/guides/source/active_support_core_extensions.md b/guides/source/active_support_core_extensions.md index e0b6f2f8203d8..27478b21a0fec 100644 --- a/guides/source/active_support_core_extensions.md +++ b/guides/source/active_support_core_extensions.md @@ -2916,6 +2916,24 @@ end NOTE: Defined in `active_support/core_ext/regexp.rb`. +### `match?` + +Rails implements `Regexp#match?` for Ruby versions prior to 2.4: + +```ruby +/oo/.match?('foo') # => true +/oo/.match?('bar') # => false +/oo/.match?('foo', 1) # => true +``` + +The backport has the same interface and lack of side-effects in the caller like +not setting `$1` and friends, but it does not have the speed benefits. Its +purpose is to be able to write 2.4 compatible code. Rails itself uses this +predicate internally for example. + +Active Support defines `Regexp#match?` only if not present, so code running +under 2.4 or later does run the original one and gets the performance boost. + Extensions to `Range` ---------------------