re2 2.4.3-x64-mingw32 → 2.6.0.rc1-x64-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +249 -192
 - data/Rakefile +1 -1
 - data/ext/re2/extconf.rb +6 -70
 - data/ext/re2/re2.cc +450 -263
 - data/ext/re2/recipes.rb +8 -0
 - data/lib/2.6/re2.so +0 -0
 - data/lib/2.7/re2.so +0 -0
 - data/lib/3.0/re2.so +0 -0
 - data/lib/re2/regexp.rb +70 -0
 - data/lib/re2/scanner.rb +9 -0
 - data/lib/re2/string.rb +10 -59
 - data/lib/re2/version.rb +10 -1
 - data/lib/re2.rb +7 -3
 - data/re2.gemspec +3 -2
 - data/spec/kernel_spec.rb +2 -2
 - data/spec/re2/match_data_spec.rb +64 -25
 - data/spec/re2/regexp_spec.rb +492 -113
 - data/spec/re2/scanner_spec.rb +3 -8
 - data/spec/re2/set_spec.rb +18 -18
 - data/spec/re2_spec.rb +4 -4
 - metadata +9 -8
 
    
        data/ext/re2/recipes.rb
    CHANGED
    
    | 
         @@ -1,3 +1,11 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # re2 (https://github.com/mudge/re2)
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Ruby bindings to RE2, a "fast, safe, thread-friendly alternative to
         
     | 
| 
      
 3 
     | 
    
         
            +
            # backtracking regular expression engines like those used in PCRE, Perl, and
         
     | 
| 
      
 4 
     | 
    
         
            +
            # Python".
         
     | 
| 
      
 5 
     | 
    
         
            +
            #
         
     | 
| 
      
 6 
     | 
    
         
            +
            # Copyright (c) 2010, Paul Mucur (https://mudge.name)
         
     | 
| 
      
 7 
     | 
    
         
            +
            # Released under the BSD Licence, please see LICENSE.txt
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       1 
9 
     | 
    
         
             
            PACKAGE_ROOT_DIR = File.expand_path('../..', __dir__)
         
     | 
| 
       2 
10 
     | 
    
         
             
            REQUIRED_MINI_PORTILE_VERSION = '~> 2.8.5' # keep this version in sync with the one in the gemspec
         
     | 
| 
       3 
11 
     | 
    
         | 
    
        data/lib/2.6/re2.so
    CHANGED
    
    | 
         Binary file 
     | 
    
        data/lib/2.7/re2.so
    CHANGED
    
    | 
         Binary file 
     | 
    
        data/lib/3.0/re2.so
    CHANGED
    
    | 
         Binary file 
     | 
    
        data/lib/re2/regexp.rb
    ADDED
    
    | 
         @@ -0,0 +1,70 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # re2 (https://github.com/mudge/re2)
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Ruby bindings to RE2, a "fast, safe, thread-friendly alternative to
         
     | 
| 
      
 3 
     | 
    
         
            +
            # backtracking regular expression engines like those used in PCRE, Perl, and
         
     | 
| 
      
 4 
     | 
    
         
            +
            # Python".
         
     | 
| 
      
 5 
     | 
    
         
            +
            #
         
     | 
| 
      
 6 
     | 
    
         
            +
            # Copyright (c) 2010, Paul Mucur (https://mudge.name)
         
     | 
| 
      
 7 
     | 
    
         
            +
            # Released under the BSD Licence, please see LICENSE.txt
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            module RE2
         
     | 
| 
      
 11 
     | 
    
         
            +
              class Regexp
         
     | 
| 
      
 12 
     | 
    
         
            +
                # Match the pattern against any substring of the given `text` and return a
         
     | 
| 
      
 13 
     | 
    
         
            +
                # {RE2::MatchData} instance with the specified number of submatches
         
     | 
| 
      
 14 
     | 
    
         
            +
                # (defaults to the total number of capturing groups) or a boolean (if no
         
     | 
| 
      
 15 
     | 
    
         
            +
                # submatches are required).
         
     | 
| 
      
 16 
     | 
    
         
            +
                #
         
     | 
| 
      
 17 
     | 
    
         
            +
                # The number of submatches has a significant impact on performance: requesting
         
     | 
| 
      
 18 
     | 
    
         
            +
                # one submatch is much faster than requesting more than one and requesting
         
     | 
| 
      
 19 
     | 
    
         
            +
                # zero submatches is faster still.
         
     | 
| 
      
 20 
     | 
    
         
            +
                #
         
     | 
| 
      
 21 
     | 
    
         
            +
                # @param [String] text the text to search
         
     | 
| 
      
 22 
     | 
    
         
            +
                # @param [Hash] options the options with which to perform the match
         
     | 
| 
      
 23 
     | 
    
         
            +
                # @option options [Integer] :submatches how many submatches to extract (0
         
     | 
| 
      
 24 
     | 
    
         
            +
                #   is fastest), defaults to the total number of capturing groups
         
     | 
| 
      
 25 
     | 
    
         
            +
                # @return [RE2::MatchData, nil] if extracting any submatches
         
     | 
| 
      
 26 
     | 
    
         
            +
                # @return [Boolean] if not extracting any submatches
         
     | 
| 
      
 27 
     | 
    
         
            +
                # @raise [ArgumentError] if given a negative number of submatches
         
     | 
| 
      
 28 
     | 
    
         
            +
                # @raise [NoMemoryError] if there was not enough memory to allocate the
         
     | 
| 
      
 29 
     | 
    
         
            +
                #   matches
         
     | 
| 
      
 30 
     | 
    
         
            +
                # @raise [TypeError] if given non-numeric submatches or non-hash options
         
     | 
| 
      
 31 
     | 
    
         
            +
                # @example
         
     | 
| 
      
 32 
     | 
    
         
            +
                #   r = RE2::Regexp.new('w(o)(o)')
         
     | 
| 
      
 33 
     | 
    
         
            +
                #   r.partial_match('woot')                #=> #<RE2::MatchData "woo" 1:"o" 2:"o">
         
     | 
| 
      
 34 
     | 
    
         
            +
                #   r.partial_match('nope')                #=> nil
         
     | 
| 
      
 35 
     | 
    
         
            +
                #   r.partial_match('woot', submatches: 1) #=> #<RE2::MatchData "woo" 1:"o">
         
     | 
| 
      
 36 
     | 
    
         
            +
                #   r.partial_match('woot', submatches: 0) #=> true
         
     | 
| 
      
 37 
     | 
    
         
            +
                def partial_match(text, options = {})
         
     | 
| 
      
 38 
     | 
    
         
            +
                  match(text, Hash(options).merge(anchor: :unanchored))
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                # Match the pattern against the given `text` exactly and return a
         
     | 
| 
      
 42 
     | 
    
         
            +
                # {RE2::MatchData} instance with the specified number of submatches
         
     | 
| 
      
 43 
     | 
    
         
            +
                # (defaults to the total number of capturing groups) or a boolean (if no
         
     | 
| 
      
 44 
     | 
    
         
            +
                # submatches are required).
         
     | 
| 
      
 45 
     | 
    
         
            +
                #
         
     | 
| 
      
 46 
     | 
    
         
            +
                # The number of submatches has a significant impact on performance: requesting
         
     | 
| 
      
 47 
     | 
    
         
            +
                # one submatch is much faster than requesting more than one and requesting
         
     | 
| 
      
 48 
     | 
    
         
            +
                # zero submatches is faster still.
         
     | 
| 
      
 49 
     | 
    
         
            +
                #
         
     | 
| 
      
 50 
     | 
    
         
            +
                # @param [String] text the text to search
         
     | 
| 
      
 51 
     | 
    
         
            +
                # @param [Hash] options the options with which to perform the match
         
     | 
| 
      
 52 
     | 
    
         
            +
                # @option options [Integer] :submatches how many submatches to extract (0
         
     | 
| 
      
 53 
     | 
    
         
            +
                #   is fastest), defaults to the total number of capturing groups
         
     | 
| 
      
 54 
     | 
    
         
            +
                # @return [RE2::MatchData, nil] if extracting any submatches
         
     | 
| 
      
 55 
     | 
    
         
            +
                # @return [Boolean] if not extracting any submatches
         
     | 
| 
      
 56 
     | 
    
         
            +
                # @raise [ArgumentError] if given a negative number of submatches
         
     | 
| 
      
 57 
     | 
    
         
            +
                # @raise [NoMemoryError] if there was not enough memory to allocate the
         
     | 
| 
      
 58 
     | 
    
         
            +
                #   matches
         
     | 
| 
      
 59 
     | 
    
         
            +
                # @raise [TypeError] if given non-numeric submatches or non-hash options
         
     | 
| 
      
 60 
     | 
    
         
            +
                # @example
         
     | 
| 
      
 61 
     | 
    
         
            +
                #   r = RE2::Regexp.new('w(o)(o)')
         
     | 
| 
      
 62 
     | 
    
         
            +
                #   r.full_match('woo')                #=> #<RE2::MatchData "woo" 1:"o" 2:"o">
         
     | 
| 
      
 63 
     | 
    
         
            +
                #   r.full_match('woot')               #=> nil
         
     | 
| 
      
 64 
     | 
    
         
            +
                #   r.full_match('woo', submatches: 1) #=> #<RE2::MatchData "woo" 1:"o">
         
     | 
| 
      
 65 
     | 
    
         
            +
                #   r.full_match('woo', submatches: 0) #=> true
         
     | 
| 
      
 66 
     | 
    
         
            +
                def full_match(text, options = {})
         
     | 
| 
      
 67 
     | 
    
         
            +
                  match(text, Hash(options).merge(anchor: :anchor_both))
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
              end
         
     | 
| 
      
 70 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/re2/scanner.rb
    CHANGED
    
    | 
         @@ -1,3 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # re2 (https://github.com/mudge/re2)
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Ruby bindings to RE2, a "fast, safe, thread-friendly alternative to
         
     | 
| 
      
 3 
     | 
    
         
            +
            # backtracking regular expression engines like those used in PCRE, Perl, and
         
     | 
| 
      
 4 
     | 
    
         
            +
            # Python".
         
     | 
| 
      
 5 
     | 
    
         
            +
            #
         
     | 
| 
      
 6 
     | 
    
         
            +
            # Copyright (c) 2010, Paul Mucur (https://mudge.name)
         
     | 
| 
      
 7 
     | 
    
         
            +
            # Released under the BSD Licence, please see LICENSE.txt
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       1 
10 
     | 
    
         
             
            module RE2
         
     | 
| 
       2 
11 
     | 
    
         
             
              class Scanner
         
     | 
| 
       3 
12 
     | 
    
         
             
                include Enumerable
         
     | 
    
        data/lib/re2/string.rb
    CHANGED
    
    | 
         @@ -1,81 +1,32 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # re2 ( 
     | 
| 
       2 
     | 
    
         
            -
            # Ruby bindings to  
     | 
| 
      
 1 
     | 
    
         
            +
            # re2 (https://github.com/mudge/re2)
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Ruby bindings to RE2, a "fast, safe, thread-friendly alternative to
         
     | 
| 
      
 3 
     | 
    
         
            +
            # backtracking regular expression engines like those used in PCRE, Perl, and
         
     | 
| 
      
 4 
     | 
    
         
            +
            # Python".
         
     | 
| 
       3 
5 
     | 
    
         
             
            #
         
     | 
| 
       4 
     | 
    
         
            -
            # Copyright (c) 2010 
     | 
| 
      
 6 
     | 
    
         
            +
            # Copyright (c) 2010, Paul Mucur (https://mudge.name)
         
     | 
| 
       5 
7 
     | 
    
         
             
            # Released under the BSD Licence, please see LICENSE.txt
         
     | 
| 
       6 
8 
     | 
    
         | 
| 
       7 
9 
     | 
    
         
             
            require "re2"
         
     | 
| 
       8 
10 
     | 
    
         | 
| 
       9 
11 
     | 
    
         
             
            module RE2
         
     | 
| 
      
 12 
     | 
    
         
            +
              # @deprecated Use methods on {RE2} and {RE2::Regexp} instead.
         
     | 
| 
       10 
13 
     | 
    
         
             
              module String
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                # Replaces the first occurrence +pattern+ with +rewrite+ and returns a new
         
     | 
| 
       13 
     | 
    
         
            -
                # string.
         
     | 
| 
       14 
     | 
    
         
            -
                #
         
     | 
| 
       15 
     | 
    
         
            -
                # @see RE2.Replace
         
     | 
| 
      
 14 
     | 
    
         
            +
                # @deprecated Use {RE2.Replace} instead.
         
     | 
| 
       16 
15 
     | 
    
         
             
                def re2_sub(*args)
         
     | 
| 
       17 
16 
     | 
    
         
             
                  RE2.Replace(self, *args)
         
     | 
| 
       18 
17 
     | 
    
         
             
                end
         
     | 
| 
       19 
18 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
                #  
     | 
| 
       21 
     | 
    
         
            -
                #
         
     | 
| 
       22 
     | 
    
         
            -
                # @see RE2.GlobalReplace
         
     | 
| 
      
 19 
     | 
    
         
            +
                # @deprecated Use {RE2.GlobalReplace} instead.
         
     | 
| 
       23 
20 
     | 
    
         
             
                def re2_gsub(*args)
         
     | 
| 
       24 
21 
     | 
    
         
             
                  RE2.GlobalReplace(self, *args)
         
     | 
| 
       25 
22 
     | 
    
         
             
                end
         
     | 
| 
       26 
23 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                #  
     | 
| 
       28 
     | 
    
         
            -
                # or a {RE2::MatchData} instance.
         
     | 
| 
       29 
     | 
    
         
            -
                #
         
     | 
| 
       30 
     | 
    
         
            -
                # @return [Boolean, RE2::MatchData]
         
     | 
| 
       31 
     | 
    
         
            -
                #
         
     | 
| 
       32 
     | 
    
         
            -
                # @overload match(pattern)
         
     | 
| 
       33 
     | 
    
         
            -
                #   Returns an {RE2::MatchData} containing the matching
         
     | 
| 
       34 
     | 
    
         
            -
                #   pattern and all subpatterns resulting from looking for
         
     | 
| 
       35 
     | 
    
         
            -
                #   +pattern+.
         
     | 
| 
       36 
     | 
    
         
            -
                #
         
     | 
| 
       37 
     | 
    
         
            -
                #   @param [String, RE2::Regexp] pattern the regular expression to match
         
     | 
| 
       38 
     | 
    
         
            -
                #   @return [RE2::MatchData] the matches
         
     | 
| 
       39 
     | 
    
         
            -
                #   @raise [NoMemoryError] if there was not enough memory to allocate the matches
         
     | 
| 
       40 
     | 
    
         
            -
                #   @example
         
     | 
| 
       41 
     | 
    
         
            -
                #     r = RE2::Regexp.new('w(o)(o)')
         
     | 
| 
       42 
     | 
    
         
            -
                #     "woo".re2_match(r)             #=> #<RE2::MatchData "woo" 1:"o" 2:"o">
         
     | 
| 
       43 
     | 
    
         
            -
                #
         
     | 
| 
       44 
     | 
    
         
            -
                # @overload match(pattern, 0)
         
     | 
| 
       45 
     | 
    
         
            -
                #   Returns either true or false indicating whether a
         
     | 
| 
       46 
     | 
    
         
            -
                #   successful match was made.
         
     | 
| 
       47 
     | 
    
         
            -
                #
         
     | 
| 
       48 
     | 
    
         
            -
                #   @param [String, RE2::Regexp] pattern the regular expression to match
         
     | 
| 
       49 
     | 
    
         
            -
                #   @return [Boolean] whether the match was successful
         
     | 
| 
       50 
     | 
    
         
            -
                #   @raise [NoMemoryError] if there was not enough memory to allocate the matches
         
     | 
| 
       51 
     | 
    
         
            -
                #   @example
         
     | 
| 
       52 
     | 
    
         
            -
                #     r = RE2::Regexp.new('w(o)(o)')
         
     | 
| 
       53 
     | 
    
         
            -
                #     "woo".re2_match(0) #=> true
         
     | 
| 
       54 
     | 
    
         
            -
                #     "bob".re2_match(0) #=> false
         
     | 
| 
       55 
     | 
    
         
            -
                #
         
     | 
| 
       56 
     | 
    
         
            -
                # @overload match(pattern, number_of_matches)
         
     | 
| 
       57 
     | 
    
         
            -
                #   See +match(pattern)+ but with a specific number of
         
     | 
| 
       58 
     | 
    
         
            -
                #   matches returned (padded with nils if necessary).
         
     | 
| 
       59 
     | 
    
         
            -
                #
         
     | 
| 
       60 
     | 
    
         
            -
                #   @param [String, RE2::Regexp] pattern the regular expression to match
         
     | 
| 
       61 
     | 
    
         
            -
                #   @param [Integer] number_of_matches the number of matches to return
         
     | 
| 
       62 
     | 
    
         
            -
                #   @return [RE2::MatchData] the matches
         
     | 
| 
       63 
     | 
    
         
            -
                #   @raise [NoMemoryError] if there was not enough memory to allocate the matches
         
     | 
| 
       64 
     | 
    
         
            -
                #   @example
         
     | 
| 
       65 
     | 
    
         
            -
                #     r = RE2::Regexp.new('w(o)(o)')
         
     | 
| 
       66 
     | 
    
         
            -
                #     "woo".re2_match(r, 1) #=> #<RE2::MatchData "woo" 1:"o">
         
     | 
| 
       67 
     | 
    
         
            -
                #     "woo".re2_match(r, 3) #=> #<RE2::MatchData "woo" 1:"o" 2:"o" 3:nil>
         
     | 
| 
      
 24 
     | 
    
         
            +
                # @deprecated Use {RE2::Regexp#match} instead.
         
     | 
| 
       68 
25 
     | 
    
         
             
                def re2_match(pattern, *args)
         
     | 
| 
       69 
26 
     | 
    
         
             
                  RE2::Regexp.new(pattern).match(self, *args)
         
     | 
| 
       70 
27 
     | 
    
         
             
                end
         
     | 
| 
       71 
28 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
                #  
     | 
| 
       73 
     | 
    
         
            -
                # The returned string, used as a regular expression, will exactly match the
         
     | 
| 
       74 
     | 
    
         
            -
                # original string.
         
     | 
| 
       75 
     | 
    
         
            -
                #
         
     | 
| 
       76 
     | 
    
         
            -
                # @return [String] the escaped string
         
     | 
| 
       77 
     | 
    
         
            -
                # @example
         
     | 
| 
       78 
     | 
    
         
            -
                #   "1.5-2.0?".escape    #=> "1\.5\-2\.0\?"
         
     | 
| 
      
 29 
     | 
    
         
            +
                # @deprecated Use {RE2.QuoteMeta} instead.
         
     | 
| 
       79 
30 
     | 
    
         
             
                def re2_escape
         
     | 
| 
       80 
31 
     | 
    
         
             
                  RE2.QuoteMeta(self)
         
     | 
| 
       81 
32 
     | 
    
         
             
                end
         
     | 
    
        data/lib/re2/version.rb
    CHANGED
    
    | 
         @@ -1,5 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            # re2 (https://github.com/mudge/re2)
         
     | 
| 
      
 4 
     | 
    
         
            +
            # Ruby bindings to RE2, a "fast, safe, thread-friendly alternative to
         
     | 
| 
      
 5 
     | 
    
         
            +
            # backtracking regular expression engines like those used in PCRE, Perl, and
         
     | 
| 
      
 6 
     | 
    
         
            +
            # Python".
         
     | 
| 
      
 7 
     | 
    
         
            +
            #
         
     | 
| 
      
 8 
     | 
    
         
            +
            # Copyright (c) 2010, Paul Mucur (https://mudge.name)
         
     | 
| 
      
 9 
     | 
    
         
            +
            # Released under the BSD Licence, please see LICENSE.txt
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
       3 
12 
     | 
    
         
             
            module RE2
         
     | 
| 
       4 
     | 
    
         
            -
              VERSION = "2. 
     | 
| 
      
 13 
     | 
    
         
            +
              VERSION = "2.6.0.rc1"
         
     | 
| 
       5 
14 
     | 
    
         
             
            end
         
     | 
    
        data/lib/re2.rb
    CHANGED
    
    | 
         @@ -1,8 +1,11 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # re2 ( 
     | 
| 
       2 
     | 
    
         
            -
            # Ruby bindings to  
     | 
| 
      
 1 
     | 
    
         
            +
            # re2 (https://github.com/mudge/re2)
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Ruby bindings to RE2, a "fast, safe, thread-friendly alternative to
         
     | 
| 
      
 3 
     | 
    
         
            +
            # backtracking regular expression engines like those used in PCRE, Perl, and
         
     | 
| 
      
 4 
     | 
    
         
            +
            # Python".
         
     | 
| 
       3 
5 
     | 
    
         
             
            #
         
     | 
| 
       4 
     | 
    
         
            -
            # Copyright (c) 2010 
     | 
| 
      
 6 
     | 
    
         
            +
            # Copyright (c) 2010, Paul Mucur (https://mudge.name)
         
     | 
| 
       5 
7 
     | 
    
         
             
            # Released under the BSD Licence, please see LICENSE.txt
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       6 
9 
     | 
    
         
             
            begin
         
     | 
| 
       7 
10 
     | 
    
         
             
              ::RUBY_VERSION =~ /(\d+\.\d+)/
         
     | 
| 
       8 
11 
     | 
    
         
             
              require_relative "#{Regexp.last_match(1)}/re2.so"
         
     | 
| 
         @@ -10,5 +13,6 @@ rescue LoadError 
     | 
|
| 
       10 
13 
     | 
    
         
             
              require 're2.so'
         
     | 
| 
       11 
14 
     | 
    
         
             
            end
         
     | 
| 
       12 
15 
     | 
    
         | 
| 
      
 16 
     | 
    
         
            +
            require "re2/regexp"
         
     | 
| 
       13 
17 
     | 
    
         
             
            require "re2/scanner"
         
     | 
| 
       14 
18 
     | 
    
         
             
            require "re2/version"
         
     | 
    
        data/re2.gemspec
    CHANGED
    
    | 
         @@ -17,6 +17,7 @@ Gem::Specification.new do |s| 
     | 
|
| 
       17 
17 
     | 
    
         
             
                "ext/re2/recipes.rb",
         
     | 
| 
       18 
18 
     | 
    
         
             
                "Gemfile",
         
     | 
| 
       19 
19 
     | 
    
         
             
                "lib/re2.rb",
         
     | 
| 
      
 20 
     | 
    
         
            +
                "lib/re2/regexp.rb",
         
     | 
| 
       20 
21 
     | 
    
         
             
                "lib/re2/scanner.rb",
         
     | 
| 
       21 
22 
     | 
    
         
             
                "lib/re2/string.rb",
         
     | 
| 
       22 
23 
     | 
    
         
             
                "lib/re2/version.rb",
         
     | 
| 
         @@ -37,8 +38,8 @@ Gem::Specification.new do |s| 
     | 
|
| 
       37 
38 
     | 
    
         
             
                "spec/re2/set_spec.rb",
         
     | 
| 
       38 
39 
     | 
    
         
             
                "spec/re2/scanner_spec.rb"
         
     | 
| 
       39 
40 
     | 
    
         
             
              ]
         
     | 
| 
       40 
     | 
    
         
            -
              s.add_development_dependency("rake-compiler", "~> 1.2. 
     | 
| 
       41 
     | 
    
         
            -
              s.add_development_dependency("rake-compiler-dock", "~> 1. 
     | 
| 
      
 41 
     | 
    
         
            +
              s.add_development_dependency("rake-compiler", "~> 1.2.5")
         
     | 
| 
      
 42 
     | 
    
         
            +
              s.add_development_dependency("rake-compiler-dock", "~> 1.4.0.rc2")
         
     | 
| 
       42 
43 
     | 
    
         
             
              s.add_development_dependency("rspec", "~> 3.2")
         
     | 
| 
       43 
44 
     | 
    
         
             
              s.add_runtime_dependency("mini_portile2", "~> 2.8.5") # keep version in sync with extconf.rb
         
     | 
| 
       44 
45 
     | 
    
         
             
            end
         
     | 
    
        data/spec/kernel_spec.rb
    CHANGED
    
    | 
         @@ -5,7 +5,7 @@ RSpec.describe Kernel do 
     | 
|
| 
       5 
5 
     | 
    
         
             
                end
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
                it "returns an RE2::Regexp instance given a pattern and options" do
         
     | 
| 
       8 
     | 
    
         
            -
                  re = RE2('w(o)(o)', : 
     | 
| 
      
 8 
     | 
    
         
            +
                  re = RE2('w(o)(o)', case_sensitive: false)
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
                  expect(re).not_to be_case_sensitive
         
     | 
| 
       11 
11 
     | 
    
         
             
                end
         
     | 
| 
         @@ -15,7 +15,7 @@ RSpec.describe Kernel do 
     | 
|
| 
       15 
15 
     | 
    
         
             
                end
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
17 
     | 
    
         
             
                it "allows invalid patterns to be created" do
         
     | 
| 
       18 
     | 
    
         
            -
                  re = RE2('???', : 
     | 
| 
      
 18 
     | 
    
         
            +
                  re = RE2('???', log_errors: false)
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                  expect(re).to be_a(RE2::Regexp)
         
     | 
| 
       21 
21 
     | 
    
         
             
                end
         
     | 
    
        data/spec/re2/match_data_spec.rb
    CHANGED
    
    | 
         @@ -12,11 +12,13 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       12 
12 
     | 
    
         
             
              describe "#to_a" do
         
     | 
| 
       13 
13 
     | 
    
         
             
                it "is populated with the match and capturing groups" do
         
     | 
| 
       14 
14 
     | 
    
         
             
                  a = RE2::Regexp.new('w(o)(o)').match('woo').to_a
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       15 
16 
     | 
    
         
             
                  expect(a).to eq(["woo", "o", "o"])
         
     | 
| 
       16 
17 
     | 
    
         
             
                end
         
     | 
| 
       17 
18 
     | 
    
         | 
| 
       18 
19 
     | 
    
         
             
                it "populates optional capturing groups with nil if they are missing" do
         
     | 
| 
       19 
20 
     | 
    
         
             
                  a = RE2::Regexp.new('(\d?)(a)(b)').match('ab').to_a
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
       20 
22 
     | 
    
         
             
                  expect(a).to eq(["ab", nil, "a", "b"])
         
     | 
| 
       21 
23 
     | 
    
         
             
                end
         
     | 
| 
       22 
24 
     | 
    
         | 
| 
         @@ -27,15 +29,16 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       27 
29 
     | 
    
         
             
                end
         
     | 
| 
       28 
30 
     | 
    
         | 
| 
       29 
31 
     | 
    
         
             
                it "returns ISO-8859-1 strings if the pattern is not UTF-8" do
         
     | 
| 
       30 
     | 
    
         
            -
                  a = RE2::Regexp.new('w(o)(o)', : 
     | 
| 
      
 32 
     | 
    
         
            +
                  a = RE2::Regexp.new('w(o)(o)', utf8: false).match('woo').to_a
         
     | 
| 
       31 
33 
     | 
    
         | 
| 
       32 
34 
     | 
    
         
             
                  expect(a.map(&:encoding)).to all eq(Encoding::ISO_8859_1)
         
     | 
| 
       33 
35 
     | 
    
         
             
                end
         
     | 
| 
       34 
36 
     | 
    
         
             
              end
         
     | 
| 
       35 
37 
     | 
    
         | 
| 
       36 
38 
     | 
    
         
             
              describe "#[]" do
         
     | 
| 
       37 
     | 
    
         
            -
                it "accesses capturing groups by numerical index" do
         
     | 
| 
      
 39 
     | 
    
         
            +
                it "accesses capturing groups by numerical index", :aggregate_failures do
         
     | 
| 
       38 
40 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)(\d{2})').match("123")
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
       39 
42 
     | 
    
         
             
                  expect(md[1]).to eq("1")
         
     | 
| 
       40 
43 
     | 
    
         
             
                  expect(md[2]).to eq("23")
         
     | 
| 
       41 
44 
     | 
    
         
             
                end
         
     | 
| 
         @@ -47,46 +50,53 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       47 
50 
     | 
    
         
             
                end
         
     | 
| 
       48 
51 
     | 
    
         | 
| 
       49 
52 
     | 
    
         
             
                it "returns a ISO-8859-1 string by numerical index if the pattern is not UTF-8" do
         
     | 
| 
       50 
     | 
    
         
            -
                  md = RE2::Regexp.new('(\d)(\d{2})', : 
     | 
| 
      
 53 
     | 
    
         
            +
                  md = RE2::Regexp.new('(\d)(\d{2})', utf8: false).match("123")
         
     | 
| 
       51 
54 
     | 
    
         | 
| 
       52 
55 
     | 
    
         
             
                  expect(md[1].encoding).to eq(Encoding::ISO_8859_1)
         
     | 
| 
       53 
56 
     | 
    
         
             
                end
         
     | 
| 
       54 
57 
     | 
    
         | 
| 
       55 
58 
     | 
    
         
             
                it "has the whole match as the 0th item" do
         
     | 
| 
       56 
59 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)(\d{2})').match("123")
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
       57 
61 
     | 
    
         
             
                  expect(md[0]).to eq("123")
         
     | 
| 
       58 
62 
     | 
    
         
             
                end
         
     | 
| 
       59 
63 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
                it "supports access by numerical ranges" do
         
     | 
| 
      
 64 
     | 
    
         
            +
                it "supports access by numerical ranges", :aggregate_failures do
         
     | 
| 
       61 
65 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+) (\d+) (\d+)').match("123 456 789")
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
       62 
67 
     | 
    
         
             
                  expect(md[1..3]).to eq(["123", "456", "789"])
         
     | 
| 
       63 
68 
     | 
    
         
             
                  expect(md[1...3]).to eq(["123", "456"])
         
     | 
| 
       64 
69 
     | 
    
         
             
                end
         
     | 
| 
       65 
70 
     | 
    
         | 
| 
       66 
     | 
    
         
            -
                it "supports slicing" do
         
     | 
| 
      
 71 
     | 
    
         
            +
                it "supports slicing", :aggregate_failures do
         
     | 
| 
       67 
72 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+) (\d+) (\d+)').match("123 456 789")
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
       68 
74 
     | 
    
         
             
                  expect(md[1, 3]).to eq(["123", "456", "789"])
         
     | 
| 
       69 
75 
     | 
    
         
             
                  expect(md[1, 2]).to eq(["123", "456"])
         
     | 
| 
       70 
76 
     | 
    
         
             
                end
         
     | 
| 
       71 
77 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
                it "returns nil if attempting to access non-existent capturing groups by index" do
         
     | 
| 
      
 78 
     | 
    
         
            +
                it "returns nil if attempting to access non-existent capturing groups by index", :aggregate_failures do
         
     | 
| 
       73 
79 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+)').match('bob 123')
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
       74 
81 
     | 
    
         
             
                  expect(md[2]).to be_nil
         
     | 
| 
       75 
82 
     | 
    
         
             
                  expect(md[3]).to be_nil
         
     | 
| 
       76 
83 
     | 
    
         
             
                end
         
     | 
| 
       77 
84 
     | 
    
         | 
| 
       78 
85 
     | 
    
         
             
                it "allows access by string names when there are named groups" do
         
     | 
| 
       79 
86 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<numbers>\d+)').match('bob 123')
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
       80 
88 
     | 
    
         
             
                  expect(md["numbers"]).to eq("123")
         
     | 
| 
       81 
89 
     | 
    
         
             
                end
         
     | 
| 
       82 
90 
     | 
    
         | 
| 
       83 
91 
     | 
    
         
             
                it "allows access by symbol names when there are named groups" do
         
     | 
| 
       84 
92 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<numbers>\d+)').match('bob 123')
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
       85 
94 
     | 
    
         
             
                  expect(md[:numbers]).to eq("123")
         
     | 
| 
       86 
95 
     | 
    
         
             
                end
         
     | 
| 
       87 
96 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
                it "allows access by names and indices with mixed groups" do
         
     | 
| 
      
 97 
     | 
    
         
            +
                it "allows access by names and indices with mixed groups", :aggregate_failures do
         
     | 
| 
       89 
98 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<name>\w+)(\s*)(?P<numbers>\d+)').match("bob 123")
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
       90 
100 
     | 
    
         
             
                  expect(md["name"]).to eq("bob")
         
     | 
| 
       91 
101 
     | 
    
         
             
                  expect(md[:name]).to eq("bob")
         
     | 
| 
       92 
102 
     | 
    
         
             
                  expect(md[2]).to eq(" ")
         
     | 
| 
         @@ -94,54 +104,60 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       94 
104 
     | 
    
         
             
                  expect(md[:numbers]).to eq("123")
         
     | 
| 
       95 
105 
     | 
    
         
             
                end
         
     | 
| 
       96 
106 
     | 
    
         | 
| 
       97 
     | 
    
         
            -
                it "returns nil if no such named group exists" do
         
     | 
| 
      
 107 
     | 
    
         
            +
                it "returns nil if no such named group exists", :aggregate_failures do
         
     | 
| 
       98 
108 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+)').match("bob 123")
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
       99 
110 
     | 
    
         
             
                  expect(md["missing"]).to be_nil
         
     | 
| 
       100 
111 
     | 
    
         
             
                  expect(md[:missing]).to be_nil
         
     | 
| 
       101 
112 
     | 
    
         
             
                end
         
     | 
| 
       102 
113 
     | 
    
         | 
| 
       103 
114 
     | 
    
         
             
                it "raises an error if given an inappropriate index" do
         
     | 
| 
       104 
115 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+)').match("bob 123")
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
       105 
117 
     | 
    
         
             
                  expect { md[nil] }.to raise_error(TypeError)
         
     | 
| 
       106 
118 
     | 
    
         
             
                end
         
     | 
| 
       107 
119 
     | 
    
         | 
| 
       108 
     | 
    
         
            -
                 
     | 
| 
       109 
     | 
    
         
            -
                   
     | 
| 
       110 
     | 
    
         
            -
                    md = RE2::Regexp.new('(?P<name>\S+)').match("bob")
         
     | 
| 
       111 
     | 
    
         
            -
                    expect(md[0].encoding.name).to eq("UTF-8")
         
     | 
| 
       112 
     | 
    
         
            -
                    expect(md["name"].encoding.name).to eq("UTF-8")
         
     | 
| 
       113 
     | 
    
         
            -
                    expect(md[:name].encoding.name).to eq("UTF-8")
         
     | 
| 
       114 
     | 
    
         
            -
                  end
         
     | 
| 
      
 120 
     | 
    
         
            +
                it "returns UTF-8 encoded strings by default", :aggregate_failures do
         
     | 
| 
      
 121 
     | 
    
         
            +
                  md = RE2::Regexp.new('(?P<name>\S+)').match("bob")
         
     | 
| 
       115 
122 
     | 
    
         | 
| 
       116 
     | 
    
         
            -
                   
     | 
| 
       117 
     | 
    
         
            -
             
     | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
      
 123 
     | 
    
         
            +
                  expect(md[0].encoding.name).to eq("UTF-8")
         
     | 
| 
      
 124 
     | 
    
         
            +
                  expect(md["name"].encoding.name).to eq("UTF-8")
         
     | 
| 
      
 125 
     | 
    
         
            +
                  expect(md[:name].encoding.name).to eq("UTF-8")
         
     | 
| 
      
 126 
     | 
    
         
            +
                end
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
      
 128 
     | 
    
         
            +
                it "returns Latin 1 strings encoding when utf-8 is false", :aggregate_failures do
         
     | 
| 
      
 129 
     | 
    
         
            +
                  md = RE2::Regexp.new('(?P<name>\S+)', utf8: false).match('bob')
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
                  expect(md[0].encoding.name).to eq("ISO-8859-1")
         
     | 
| 
      
 132 
     | 
    
         
            +
                  expect(md["name"].encoding.name).to eq("ISO-8859-1")
         
     | 
| 
      
 133 
     | 
    
         
            +
                  expect(md[:name].encoding.name).to eq("ISO-8859-1")
         
     | 
| 
       122 
134 
     | 
    
         
             
                end
         
     | 
| 
       123 
135 
     | 
    
         
             
              end
         
     | 
| 
       124 
136 
     | 
    
         | 
| 
       125 
137 
     | 
    
         
             
              describe "#string" do
         
     | 
| 
       126 
138 
     | 
    
         
             
                it "returns the original string to match against" do
         
     | 
| 
       127 
139 
     | 
    
         
             
                  re = RE2::Regexp.new('(\D+)').match("bob")
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
       128 
141 
     | 
    
         
             
                  expect(re.string).to eq("bob")
         
     | 
| 
       129 
142 
     | 
    
         
             
                end
         
     | 
| 
       130 
143 
     | 
    
         | 
| 
       131 
144 
     | 
    
         
             
                it "returns a copy, not the actual original" do
         
     | 
| 
       132 
145 
     | 
    
         
             
                  string = "bob"
         
     | 
| 
       133 
146 
     | 
    
         
             
                  re = RE2::Regexp.new('(\D+)').match(string)
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
       134 
148 
     | 
    
         
             
                  expect(re.string).to_not equal(string)
         
     | 
| 
       135 
149 
     | 
    
         
             
                end
         
     | 
| 
       136 
150 
     | 
    
         | 
| 
       137 
151 
     | 
    
         
             
                it "returns a frozen string" do
         
     | 
| 
       138 
152 
     | 
    
         
             
                  re = RE2::Regexp.new('(\D+)').match("bob")
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
       139 
154 
     | 
    
         
             
                  expect(re.string).to be_frozen
         
     | 
| 
       140 
155 
     | 
    
         
             
                end
         
     | 
| 
       141 
156 
     | 
    
         | 
| 
       142 
157 
     | 
    
         
             
                it "does not copy the string if it was already frozen" do
         
     | 
| 
       143 
158 
     | 
    
         
             
                  string = "bob".freeze
         
     | 
| 
       144 
159 
     | 
    
         
             
                  re = RE2::Regexp.new('(\D+)').match(string)
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
       145 
161 
     | 
    
         
             
                  expect(re.string).to equal(string)
         
     | 
| 
       146 
162 
     | 
    
         
             
                end
         
     | 
| 
       147 
163 
     | 
    
         
             
              end
         
     | 
| 
         @@ -149,6 +165,7 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       149 
165 
     | 
    
         
             
              describe "#size" do
         
     | 
| 
       150 
166 
     | 
    
         
             
                it "returns the number of capturing groups plus the matching string" do
         
     | 
| 
       151 
167 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+) (\d+)').match("1234 56")
         
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
       152 
169 
     | 
    
         
             
                  expect(md.size).to eq(3)
         
     | 
| 
       153 
170 
     | 
    
         
             
                end
         
     | 
| 
       154 
171 
     | 
    
         
             
              end
         
     | 
| 
         @@ -156,6 +173,7 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       156 
173 
     | 
    
         
             
              describe "#length" do
         
     | 
| 
       157 
174 
     | 
    
         
             
                it "returns the number of capturing groups plus the matching string" do
         
     | 
| 
       158 
175 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+) (\d+)').match("1234 56")
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
       159 
177 
     | 
    
         
             
                  expect(md.length).to eq(3)
         
     | 
| 
       160 
178 
     | 
    
         
             
                end
         
     | 
| 
       161 
179 
     | 
    
         
             
              end
         
     | 
| 
         @@ -164,6 +182,7 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       164 
182 
     | 
    
         
             
                it "returns the original RE2::Regexp used" do
         
     | 
| 
       165 
183 
     | 
    
         
             
                  re = RE2::Regexp.new('(\d+)')
         
     | 
| 
       166 
184 
     | 
    
         
             
                  md = re.match("123")
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
       167 
186 
     | 
    
         
             
                  expect(md.regexp).to equal(re)
         
     | 
| 
       168 
187 
     | 
    
         
             
                end
         
     | 
| 
       169 
188 
     | 
    
         
             
              end
         
     | 
| 
         @@ -171,11 +190,13 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       171 
190 
     | 
    
         
             
              describe "#inspect" do
         
     | 
| 
       172 
191 
     | 
    
         
             
                it "returns a text representation of the object and indices" do
         
     | 
| 
       173 
192 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+) (\d+)').match("1234 56")
         
     | 
| 
      
 193 
     | 
    
         
            +
             
         
     | 
| 
       174 
194 
     | 
    
         
             
                  expect(md.inspect).to eq('#<RE2::MatchData "1234 56" 1:"1234" 2:"56">')
         
     | 
| 
       175 
195 
     | 
    
         
             
                end
         
     | 
| 
       176 
196 
     | 
    
         | 
| 
       177 
197 
     | 
    
         
             
                it "represents missing matches as nil" do
         
     | 
| 
       178 
198 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+) (\d+)?').match("1234 ")
         
     | 
| 
      
 199 
     | 
    
         
            +
             
     | 
| 
       179 
200 
     | 
    
         
             
                  expect(md.inspect).to eq('#<RE2::MatchData "1234 " 1:"1234" 2:nil>')
         
     | 
| 
       180 
201 
     | 
    
         
             
                end
         
     | 
| 
       181 
202 
     | 
    
         
             
              end
         
     | 
| 
         @@ -183,14 +204,16 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       183 
204 
     | 
    
         
             
              describe "#to_s" do
         
     | 
| 
       184 
205 
     | 
    
         
             
                it "returns the matching part of the original string" do
         
     | 
| 
       185 
206 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d{2,5})').match("one two 23456")
         
     | 
| 
      
 207 
     | 
    
         
            +
             
     | 
| 
       186 
208 
     | 
    
         
             
                  expect(md.to_s).to eq("23456")
         
     | 
| 
       187 
209 
     | 
    
         
             
                end
         
     | 
| 
       188 
210 
     | 
    
         
             
              end
         
     | 
| 
       189 
211 
     | 
    
         | 
| 
       190 
212 
     | 
    
         
             
              describe "#to_ary" do
         
     | 
| 
       191 
     | 
    
         
            -
                it "allows the object to be expanded with an asterisk" do
         
     | 
| 
      
 213 
     | 
    
         
            +
                it "allows the object to be expanded with an asterisk", :aggregate_failures do
         
     | 
| 
       192 
214 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d+) (\d+)').match("1234 56")
         
     | 
| 
       193 
215 
     | 
    
         
             
                  m1, m2, m3 = *md
         
     | 
| 
      
 216 
     | 
    
         
            +
             
     | 
| 
       194 
217 
     | 
    
         
             
                  expect(m1).to eq("1234 56")
         
     | 
| 
       195 
218 
     | 
    
         
             
                  expect(m2).to eq("1234")
         
     | 
| 
       196 
219 
     | 
    
         
             
                  expect(m3).to eq("56")
         
     | 
| 
         @@ -200,41 +223,49 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       200 
223 
     | 
    
         
             
              describe "#begin" do
         
     | 
| 
       201 
224 
     | 
    
         
             
                it "returns the offset of the start of a match by index" do
         
     | 
| 
       202 
225 
     | 
    
         
             
                  md = RE2::Regexp.new('(wo{2})').match('a woohoo')
         
     | 
| 
      
 226 
     | 
    
         
            +
             
     | 
| 
       203 
227 
     | 
    
         
             
                  expect(md.string[md.begin(0)..-1]).to eq('woohoo')
         
     | 
| 
       204 
228 
     | 
    
         
             
                end
         
     | 
| 
       205 
229 
     | 
    
         | 
| 
       206 
230 
     | 
    
         
             
                it "returns the offset of the start of a match by string name" do
         
     | 
| 
       207 
231 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<foo>fo{2})').match('a foobar')
         
     | 
| 
      
 232 
     | 
    
         
            +
             
     | 
| 
       208 
233 
     | 
    
         
             
                  expect(md.string[md.begin('foo')..-1]).to eq('foobar')
         
     | 
| 
       209 
234 
     | 
    
         
             
                end
         
     | 
| 
       210 
235 
     | 
    
         | 
| 
       211 
236 
     | 
    
         
             
                it "returns the offset of the start of a match by symbol name" do
         
     | 
| 
       212 
237 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<foo>fo{2})').match('a foobar')
         
     | 
| 
      
 238 
     | 
    
         
            +
             
     | 
| 
       213 
239 
     | 
    
         
             
                  expect(md.string[md.begin(:foo)..-1]).to eq('foobar')
         
     | 
| 
       214 
240 
     | 
    
         
             
                end
         
     | 
| 
       215 
241 
     | 
    
         | 
| 
       216 
242 
     | 
    
         
             
                it "returns the offset despite multibyte characters" do
         
     | 
| 
       217 
243 
     | 
    
         
             
                  md = RE2::Regexp.new('(Ruby)').match('I ♥ Ruby')
         
     | 
| 
      
 244 
     | 
    
         
            +
             
     | 
| 
       218 
245 
     | 
    
         
             
                  expect(md.string[md.begin(0)..-1]).to eq('Ruby')
         
     | 
| 
       219 
246 
     | 
    
         
             
                end
         
     | 
| 
       220 
247 
     | 
    
         | 
| 
       221 
248 
     | 
    
         
             
                it "returns nil for non-existent numerical matches" do
         
     | 
| 
       222 
249 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)').match('123')
         
     | 
| 
      
 250 
     | 
    
         
            +
             
     | 
| 
       223 
251 
     | 
    
         
             
                  expect(md.begin(10)).to be_nil
         
     | 
| 
       224 
252 
     | 
    
         
             
                end
         
     | 
| 
       225 
253 
     | 
    
         | 
| 
       226 
254 
     | 
    
         
             
                it "returns nil for negative numerical matches" do
         
     | 
| 
       227 
255 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)').match('123')
         
     | 
| 
      
 256 
     | 
    
         
            +
             
     | 
| 
       228 
257 
     | 
    
         
             
                  expect(md.begin(-4)).to be_nil
         
     | 
| 
       229 
258 
     | 
    
         
             
                end
         
     | 
| 
       230 
259 
     | 
    
         | 
| 
       231 
260 
     | 
    
         
             
                it "returns nil for non-existent named matches" do
         
     | 
| 
       232 
261 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)').match('123')
         
     | 
| 
      
 262 
     | 
    
         
            +
             
     | 
| 
       233 
263 
     | 
    
         
             
                  expect(md.begin('foo')).to be_nil
         
     | 
| 
       234 
264 
     | 
    
         
             
                end
         
     | 
| 
       235 
265 
     | 
    
         | 
| 
       236 
266 
     | 
    
         
             
                it "returns nil for non-existent symbol named matches" do
         
     | 
| 
       237 
267 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)').match('123')
         
     | 
| 
      
 268 
     | 
    
         
            +
             
     | 
| 
       238 
269 
     | 
    
         
             
                  expect(md.begin(:foo)).to be_nil
         
     | 
| 
       239 
270 
     | 
    
         
             
                end
         
     | 
| 
       240 
271 
     | 
    
         
             
              end
         
     | 
| 
         @@ -242,41 +273,49 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       242 
273 
     | 
    
         
             
              describe "#end" do
         
     | 
| 
       243 
274 
     | 
    
         
             
                it "returns the offset of the character following the end of a match" do
         
     | 
| 
       244 
275 
     | 
    
         
             
                  md = RE2::Regexp.new('(wo{2})').match('a woohoo')
         
     | 
| 
      
 276 
     | 
    
         
            +
             
     | 
| 
       245 
277 
     | 
    
         
             
                  expect(md.string[0...md.end(0)]).to eq('a woo')
         
     | 
| 
       246 
278 
     | 
    
         
             
                end
         
     | 
| 
       247 
279 
     | 
    
         | 
| 
       248 
280 
     | 
    
         
             
                it "returns the offset of a match by string name" do
         
     | 
| 
       249 
281 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<foo>fo{2})').match('a foobar')
         
     | 
| 
      
 282 
     | 
    
         
            +
             
     | 
| 
       250 
283 
     | 
    
         
             
                  expect(md.string[0...md.end('foo')]).to eq('a foo')
         
     | 
| 
       251 
284 
     | 
    
         
             
                end
         
     | 
| 
       252 
285 
     | 
    
         | 
| 
       253 
286 
     | 
    
         
             
                it "returns the offset of a match by symbol name" do
         
     | 
| 
       254 
287 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<foo>fo{2})').match('a foobar')
         
     | 
| 
      
 288 
     | 
    
         
            +
             
     | 
| 
       255 
289 
     | 
    
         
             
                  expect(md.string[0...md.end(:foo)]).to eq('a foo')
         
     | 
| 
       256 
290 
     | 
    
         
             
                end
         
     | 
| 
       257 
291 
     | 
    
         | 
| 
       258 
292 
     | 
    
         
             
                it "returns the offset despite multibyte characters" do
         
     | 
| 
       259 
293 
     | 
    
         
             
                  md = RE2::Regexp.new('(Ruby)').match('I ♥ Ruby')
         
     | 
| 
      
 294 
     | 
    
         
            +
             
     | 
| 
       260 
295 
     | 
    
         
             
                  expect(md.string[0...md.end(0)]).to eq('I ♥ Ruby')
         
     | 
| 
       261 
296 
     | 
    
         
             
                end
         
     | 
| 
       262 
297 
     | 
    
         | 
| 
       263 
298 
     | 
    
         
             
                it "returns nil for non-existent numerical matches" do
         
     | 
| 
       264 
299 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)').match('123')
         
     | 
| 
      
 300 
     | 
    
         
            +
             
     | 
| 
       265 
301 
     | 
    
         
             
                  expect(md.end(10)).to be_nil
         
     | 
| 
       266 
302 
     | 
    
         
             
                end
         
     | 
| 
       267 
303 
     | 
    
         | 
| 
       268 
304 
     | 
    
         
             
                it "returns nil for negative numerical matches" do
         
     | 
| 
       269 
305 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)').match('123')
         
     | 
| 
      
 306 
     | 
    
         
            +
             
     | 
| 
       270 
307 
     | 
    
         
             
                  expect(md.end(-4)).to be_nil
         
     | 
| 
       271 
308 
     | 
    
         
             
                end
         
     | 
| 
       272 
309 
     | 
    
         | 
| 
       273 
310 
     | 
    
         
             
                it "returns nil for non-existent named matches" do
         
     | 
| 
       274 
311 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)').match('123')
         
     | 
| 
      
 312 
     | 
    
         
            +
             
     | 
| 
       275 
313 
     | 
    
         
             
                  expect(md.end('foo')).to be_nil
         
     | 
| 
       276 
314 
     | 
    
         
             
                end
         
     | 
| 
       277 
315 
     | 
    
         | 
| 
       278 
316 
     | 
    
         
             
                it "returns nil for non-existent symbol named matches" do
         
     | 
| 
       279 
317 
     | 
    
         
             
                  md = RE2::Regexp.new('(\d)').match('123')
         
     | 
| 
      
 318 
     | 
    
         
            +
             
     | 
| 
       280 
319 
     | 
    
         
             
                  expect(md.end(:foo)).to be_nil
         
     | 
| 
       281 
320 
     | 
    
         
             
                end
         
     | 
| 
       282 
321 
     | 
    
         
             
              end
         
     | 
| 
         @@ -299,19 +338,19 @@ RSpec.describe RE2::MatchData do 
     | 
|
| 
       299 
338 
     | 
    
         
             
                it "returns all named captures if given nil" do
         
     | 
| 
       300 
339 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<numbers>\d+) (?P<letters>[a-zA-Z]+)').match('123 abc')
         
     | 
| 
       301 
340 
     | 
    
         | 
| 
       302 
     | 
    
         
            -
                  expect(md.deconstruct_keys(nil)).to eq(: 
     | 
| 
      
 341 
     | 
    
         
            +
                  expect(md.deconstruct_keys(nil)).to eq(numbers: '123', letters: 'abc')
         
     | 
| 
       303 
342 
     | 
    
         
             
                end
         
     | 
| 
       304 
343 
     | 
    
         | 
| 
       305 
344 
     | 
    
         
             
                it "returns only named captures if given names" do
         
     | 
| 
       306 
345 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<numbers>\d+) (?P<letters>[a-zA-Z]+)').match('123 abc')
         
     | 
| 
       307 
346 
     | 
    
         | 
| 
       308 
     | 
    
         
            -
                  expect(md.deconstruct_keys([:numbers])).to eq(: 
     | 
| 
      
 347 
     | 
    
         
            +
                  expect(md.deconstruct_keys([:numbers])).to eq(numbers: '123')
         
     | 
| 
       309 
348 
     | 
    
         
             
                end
         
     | 
| 
       310 
349 
     | 
    
         | 
| 
       311 
350 
     | 
    
         
             
                it "returns named captures up until an invalid name is given" do
         
     | 
| 
       312 
351 
     | 
    
         
             
                  md = RE2::Regexp.new('(?P<numbers>\d+) (?P<letters>[a-zA-Z]+)').match('123 abc')
         
     | 
| 
       313 
352 
     | 
    
         | 
| 
       314 
     | 
    
         
            -
                  expect(md.deconstruct_keys([:numbers, :punctuation])).to eq(: 
     | 
| 
      
 353 
     | 
    
         
            +
                  expect(md.deconstruct_keys([:numbers, :punctuation])).to eq(numbers: '123')
         
     | 
| 
       315 
354 
     | 
    
         
             
                end
         
     | 
| 
       316 
355 
     | 
    
         | 
| 
       317 
356 
     | 
    
         
             
                it "returns an empty hash if given more capture names than exist" do
         
     |