re2 2.24.0-aarch64-linux-gnu → 2.25.0-aarch64-linux-gnu

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.
data/lib/re2/string.rb CHANGED
@@ -13,14 +13,14 @@ require "re2"
13
13
  module RE2
14
14
  # @deprecated Use methods on {RE2} and {RE2::Regexp} instead.
15
15
  module String
16
- # @deprecated Use {RE2.Replace} instead.
16
+ # @deprecated Use {RE2.replace} instead.
17
17
  def re2_sub(*args)
18
- RE2.Replace(self, *args)
18
+ RE2.replace(self, *args)
19
19
  end
20
20
 
21
- # @deprecated Use {RE2.GlobalReplace} instead.
21
+ # @deprecated Use {RE2.global_replace} instead.
22
22
  def re2_gsub(*args)
23
- RE2.GlobalReplace(self, *args)
23
+ RE2.global_replace(self, *args)
24
24
  end
25
25
 
26
26
  # @deprecated Use {RE2::Regexp#match} instead.
@@ -28,9 +28,9 @@ module RE2
28
28
  RE2::Regexp.new(pattern).match(self, *args)
29
29
  end
30
30
 
31
- # @deprecated Use {RE2.QuoteMeta} instead.
31
+ # @deprecated Use {RE2.escape} instead.
32
32
  def re2_escape
33
- RE2.QuoteMeta(self)
33
+ RE2.escape(self)
34
34
  end
35
35
 
36
36
  alias_method :re2_quote, :re2_escape
data/lib/re2/version.rb CHANGED
@@ -10,5 +10,5 @@
10
10
 
11
11
 
12
12
  module RE2
13
- VERSION = "2.24.0"
13
+ VERSION = "2.25.0"
14
14
  end
@@ -461,6 +461,234 @@ RSpec.describe RE2::MatchData do
461
461
  end
462
462
  end
463
463
 
464
+ describe "#pre_match" do
465
+ it "returns the portion of the string before the match" do
466
+ md = RE2::Regexp.new('(\d+)').match("bob 123 456")
467
+
468
+ expect(md.pre_match).to eq("bob ")
469
+ end
470
+
471
+ it "returns an empty string when the match starts at the beginning" do
472
+ md = RE2::Regexp.new('(\w+)').match("bob 123")
473
+
474
+ expect(md.pre_match).to eq("")
475
+ end
476
+
477
+ it "supports multibyte characters" do
478
+ md = RE2::Regexp.new('(\d+)').match("I ♥ 123")
479
+
480
+ expect(md.pre_match).to eq("I ♥ ")
481
+ end
482
+
483
+ it "returns UTF-8 strings by default" do
484
+ md = RE2::Regexp.new('(\d+)').match("abc 123")
485
+
486
+ expect(md.pre_match.encoding).to eq(Encoding::UTF_8)
487
+ end
488
+
489
+ it "returns ISO-8859-1 strings if the pattern is not UTF-8" do
490
+ md = RE2::Regexp.new('(\d+)', utf8: false).match("abc 123")
491
+
492
+ expect(md.pre_match.encoding).to eq(Encoding::ISO_8859_1)
493
+ end
494
+
495
+ it "raises an error when called on an uninitialized object" do
496
+ expect { described_class.allocate.pre_match }.to raise_error(TypeError, /uninitialized RE2::MatchData/)
497
+ end
498
+ end
499
+
500
+ describe "#post_match" do
501
+ it "returns the portion of the string after the match" do
502
+ md = RE2::Regexp.new('(\d+)').match("bob 123 456")
503
+
504
+ expect(md.post_match).to eq(" 456")
505
+ end
506
+
507
+ it "returns an empty string when the match ends at the end" do
508
+ md = RE2::Regexp.new('(\d+)$').match("bob 123")
509
+
510
+ expect(md.post_match).to eq("")
511
+ end
512
+
513
+ it "supports multibyte characters" do
514
+ md = RE2::Regexp.new('(\d+)').match("123 ♥ world")
515
+
516
+ expect(md.post_match).to eq(" ♥ world")
517
+ end
518
+
519
+ it "returns UTF-8 strings by default" do
520
+ md = RE2::Regexp.new('(\d+)').match("abc 123 def")
521
+
522
+ expect(md.post_match.encoding).to eq(Encoding::UTF_8)
523
+ end
524
+
525
+ it "returns ISO-8859-1 strings if the pattern is not UTF-8" do
526
+ md = RE2::Regexp.new('(\d+)', utf8: false).match("abc 123 def")
527
+
528
+ expect(md.post_match.encoding).to eq(Encoding::ISO_8859_1)
529
+ end
530
+
531
+ it "raises an error when called on an uninitialized object" do
532
+ expect { described_class.allocate.post_match }.to raise_error(TypeError, /uninitialized RE2::MatchData/)
533
+ end
534
+ end
535
+
536
+ describe "#offset" do
537
+ it "returns the offset of a match by index" do
538
+ md = RE2::Regexp.new('ob (\d+)').match("bob 123")
539
+
540
+ expect(md.offset(0)).to eq([1, 7])
541
+ end
542
+
543
+ it "returns the offset of a submatch by index" do
544
+ md = RE2::Regexp.new('ob (\d+)').match("bob 123")
545
+
546
+ expect(md.offset(1)).to eq([4, 7])
547
+ end
548
+
549
+ it "returns the offset of a match by string name" do
550
+ md = RE2::Regexp.new('(?P<number>\d+)').match("bob 123")
551
+
552
+ expect(md.offset("number")).to eq([4, 7])
553
+ end
554
+
555
+ it "returns the offset of a match by symbol name" do
556
+ md = RE2::Regexp.new('(?P<number>\d+)').match("bob 123")
557
+
558
+ expect(md.offset(:number)).to eq([4, 7])
559
+ end
560
+
561
+ it "returns character offsets despite multibyte characters" do
562
+ md = RE2::Regexp.new('(Ruby)').match("I ♥ Ruby")
563
+
564
+ expect(md.offset(0)).to eq([4, 8])
565
+ end
566
+
567
+ it "returns nil for non-existent numerical matches" do
568
+ md = RE2::Regexp.new('(\d)').match("123")
569
+
570
+ expect(md.offset(10)).to be_nil
571
+ end
572
+
573
+ it "returns nil for non-existent named matches" do
574
+ md = RE2::Regexp.new('(\d)').match("123")
575
+
576
+ expect(md.offset("foo")).to be_nil
577
+ end
578
+
579
+ it "raises a type error if given an invalid name or number" do
580
+ md = RE2::Regexp.new('(\d)').match("123")
581
+
582
+ expect { md.offset(nil) }.to raise_error(TypeError)
583
+ end
584
+
585
+ it "raises an error when called on an uninitialized object" do
586
+ expect { described_class.allocate.offset(0) }.to raise_error(TypeError, /uninitialized RE2::MatchData/)
587
+ end
588
+ end
589
+
590
+ describe "#match_length" do
591
+ it "returns the length of the overall match" do
592
+ md = RE2::Regexp.new('ob (\d+)').match("bob 123")
593
+
594
+ expect(md.match_length(0)).to eq(6)
595
+ end
596
+
597
+ it "returns the length of a submatch by index" do
598
+ md = RE2::Regexp.new('ob (\d+)').match("bob 123")
599
+
600
+ expect(md.match_length(1)).to eq(3)
601
+ end
602
+
603
+ it "returns the length of a match by string name" do
604
+ md = RE2::Regexp.new('(?P<number>\d+)').match("bob 123")
605
+
606
+ expect(md.match_length("number")).to eq(3)
607
+ end
608
+
609
+ it "returns the length of a match by symbol name" do
610
+ md = RE2::Regexp.new('(?P<number>\d+)').match("bob 123")
611
+
612
+ expect(md.match_length(:number)).to eq(3)
613
+ end
614
+
615
+ it "returns character length despite multibyte characters" do
616
+ md = RE2::Regexp.new('(♥ Ruby)').match("I ♥ Ruby!")
617
+
618
+ expect(md.match_length(0)).to eq(6)
619
+ end
620
+
621
+ it "returns nil for non-existent numerical matches" do
622
+ md = RE2::Regexp.new('(\d)').match("123")
623
+
624
+ expect(md.match_length(10)).to be_nil
625
+ end
626
+
627
+ it "returns nil for non-existent named matches" do
628
+ md = RE2::Regexp.new('(\d)').match("123")
629
+
630
+ expect(md.match_length("foo")).to be_nil
631
+ end
632
+
633
+ it "raises a type error if given an invalid name or number" do
634
+ md = RE2::Regexp.new('(\d)').match("123")
635
+
636
+ expect { md.match_length(nil) }.to raise_error(TypeError)
637
+ end
638
+
639
+ it "raises an error when called on an uninitialized object" do
640
+ expect { described_class.allocate.match_length(0) }.to raise_error(TypeError, /uninitialized RE2::MatchData/)
641
+ end
642
+ end
643
+
644
+ describe "#values_at" do
645
+ it "returns match values at the given indices" do
646
+ md = RE2::Regexp.new('(\d+) (\d+) (\d+)').match("123 456 789")
647
+
648
+ expect(md.values_at(1, 3)).to eq(["123", "789"])
649
+ end
650
+
651
+ it "returns match values by named groups" do
652
+ md = RE2::Regexp.new('(?P<a>\d+) (?P<b>\d+)').match("123 456")
653
+
654
+ expect(md.values_at(:a, :b)).to eq(["123", "456"])
655
+ end
656
+
657
+ it "supports a mix of indices and names" do
658
+ md = RE2::Regexp.new('(?P<a>\d+) (\d+)').match("123 456")
659
+
660
+ expect(md.values_at(2, :a)).to eq(["456", "123"])
661
+ end
662
+
663
+ it "returns nil for non-existent indices" do
664
+ md = RE2::Regexp.new('(\d+)').match("123")
665
+
666
+ expect(md.values_at(1, 5)).to eq(["123", nil])
667
+ end
668
+
669
+ it "returns nil for non-existent names" do
670
+ md = RE2::Regexp.new('(?P<a>\d+)').match("123")
671
+
672
+ expect(md.values_at(:a, :z)).to eq(["123", nil])
673
+ end
674
+
675
+ it "returns the full match when given index 0" do
676
+ md = RE2::Regexp.new('(\d+) (\d+)').match("123 456")
677
+
678
+ expect(md.values_at(0, 1)).to eq(["123 456", "123"])
679
+ end
680
+
681
+ it "returns an empty array if given no arguments" do
682
+ md = RE2::Regexp.new('(\d+) (\d+)').match("123 456")
683
+
684
+ expect(md.values_at).to be_empty
685
+ end
686
+
687
+ it "raises an error when called on an uninitialized object" do
688
+ expect { described_class.allocate.values_at(1) }.to raise_error(TypeError, /uninitialized RE2::MatchData/)
689
+ end
690
+ end
691
+
464
692
  describe "#deconstruct" do
465
693
  it "returns all capturing groups" do
466
694
  md = RE2::Regexp.new('w(o)(o)').match('woo')
@@ -479,6 +707,90 @@ RSpec.describe RE2::MatchData do
479
707
  end
480
708
  end
481
709
 
710
+ describe "#captures" do
711
+ it "returns all capturing groups" do
712
+ md = RE2::Regexp.new('w(o)(o)').match('woo')
713
+
714
+ expect(md.captures).to eq(['o', 'o'])
715
+ end
716
+
717
+ it "includes optional capturing groups as nil" do
718
+ md = RE2::Regexp.new('w(.)(.)(.)?').match('woo')
719
+
720
+ expect(md.captures).to eq(['o', 'o', nil])
721
+ end
722
+
723
+ it "raises an error when called on an uninitialized object" do
724
+ expect { described_class.allocate.captures }.to raise_error(TypeError, /uninitialized RE2::MatchData/)
725
+ end
726
+ end
727
+
728
+ describe "#named_captures" do
729
+ it "returns a hash of capturing group names to matched strings" do
730
+ md = RE2::Regexp.new('(?P<numbers>\d+) (?P<letters>[a-zA-Z]+)').match('123 abc')
731
+
732
+ expect(md.named_captures).to eq("numbers" => "123", "letters" => "abc")
733
+ end
734
+
735
+ it "returns an empty hash if there are no named capturing groups" do
736
+ md = RE2::Regexp.new('(\d+)').match('123')
737
+
738
+ expect(md.named_captures).to be_empty
739
+ end
740
+
741
+ it "returns unmatched optional groups as nil" do
742
+ md = RE2::Regexp.new('(?P<a>\d+) (?P<b>\w+)?').match('123 ')
743
+
744
+ expect(md.named_captures).to eq("a" => "123", "b" => nil)
745
+ end
746
+
747
+ it "returns symbol keys when symbolize_names: true" do
748
+ md = RE2::Regexp.new('(?P<numbers>\d+) (?P<letters>[a-zA-Z]+)').match('123 abc')
749
+
750
+ expect(md.named_captures(symbolize_names: true)).to eq(numbers: "123", letters: "abc")
751
+ end
752
+
753
+ it "returns string keys when symbolize_names: false" do
754
+ md = RE2::Regexp.new('(?P<numbers>\d+) (?P<letters>[a-zA-Z]+)').match('123 abc')
755
+
756
+ expect(md.named_captures(symbolize_names: false)).to eq("numbers" => "123", "letters" => "abc")
757
+ end
758
+
759
+ it "raises an error when called on an uninitialized object" do
760
+ expect { described_class.allocate.named_captures }.to raise_error(TypeError, /uninitialized RE2::MatchData/)
761
+ end
762
+ end
763
+
764
+ describe "#names" do
765
+ it "returns an array of names of named capturing groups" do
766
+ md = RE2::Regexp.new('(?P<numbers>\d+) (?P<letters>[a-zA-Z]+)').match('123 abc')
767
+
768
+ expect(md.names).to eq(["letters", "numbers"])
769
+ end
770
+
771
+ it "returns an empty array if there are no named capturing groups" do
772
+ md = RE2::Regexp.new('(\d+)').match('123')
773
+
774
+ expect(md.names).to be_empty
775
+ end
776
+
777
+ it "returns UTF-8 strings if the pattern is UTF-8" do
778
+ md = RE2::Regexp.new('(?P<numbers>\d+)').match('123')
779
+
780
+ expect(md.names.first.encoding).to eq(Encoding::UTF_8)
781
+ end
782
+
783
+ it "returns ISO-8859-1 strings if the pattern is not UTF-8" do
784
+ md = RE2::Regexp.new('(?P<numbers>\d+)', utf8: false).match('123')
785
+
786
+ expect(md.names.first.encoding).to eq(Encoding::ISO_8859_1)
787
+ end
788
+
789
+ it "raises an error when called on an uninitialized object" do
790
+ expect { described_class.allocate.names }.to raise_error(TypeError, /uninitialized RE2::MatchData/)
791
+ end
792
+ end
793
+
482
794
  describe "#deconstruct_keys" do
483
795
  it "returns all named captures if given nil" do
484
796
  md = RE2::Regexp.new('(?P<numbers>\d+) (?P<letters>[a-zA-Z]+)').match('123 abc')
@@ -723,7 +723,6 @@ RSpec.describe RE2::Regexp do
723
723
 
724
724
  it "raises an exception if given too large a number of submatches instead of options" do
725
725
  re = RE2::Regexp.new('(\w+) (\w+) (\w+)')
726
- md = re.match("one two three", 2)
727
726
 
728
727
  expect { re.match("one two three", INT_MAX) }.to raise_error(RangeError, "number of matches should be < #{INT_MAX}")
729
728
  end
@@ -963,6 +962,64 @@ RSpec.describe RE2::Regexp do
963
962
  end
964
963
  end
965
964
 
965
+ describe "#names" do
966
+ it "returns an array of names of named capturing groups" do
967
+ expect(RE2::Regexp.new('(?P<bob>a)(?P<rob>b)').names).to eq(["bob", "rob"])
968
+ end
969
+
970
+ it "returns an empty array if there are no named capturing groups" do
971
+ expect(RE2::Regexp.new('(a)(b)').names).to be_empty
972
+ end
973
+
974
+ it "returns an empty array for a pattern with no capturing groups" do
975
+ expect(RE2::Regexp.new('ab').names).to be_empty
976
+ end
977
+
978
+ it "returns an empty array for an invalid regexp" do
979
+ expect(RE2::Regexp.new('???', log_errors: false).names).to be_empty
980
+ end
981
+
982
+ it "returns UTF-8 strings if the pattern is UTF-8" do
983
+ names = RE2::Regexp.new('(?P<bob>a)').names
984
+
985
+ expect(names.first.encoding).to eq(Encoding::UTF_8)
986
+ end
987
+
988
+ it "returns ISO-8859-1 strings if the pattern is not UTF-8" do
989
+ names = RE2::Regexp.new('(?P<bob>a)', utf8: false).names
990
+
991
+ expect(names.first.encoding).to eq(Encoding::ISO_8859_1)
992
+ end
993
+
994
+ it "raises an error when called on an uninitialized object" do
995
+ expect { described_class.allocate.names }.to raise_error(TypeError, /uninitialized RE2::Regexp/)
996
+ end
997
+ end
998
+
999
+ describe "#named_captures" do
1000
+ it "returns a hash of names to indices" do
1001
+ expect(RE2::Regexp.new('(?P<bob>a)').named_captures).to eq("bob" => 1)
1002
+ end
1003
+
1004
+ it "maps names to indices with several groups" do
1005
+ groups = RE2::Regexp.new('(?P<bob>a)(o)(?P<rob>e)').named_captures
1006
+
1007
+ expect(groups).to eq("bob" => 1, "rob" => 3)
1008
+ end
1009
+
1010
+ it "returns an empty hash for a pattern with no named groups" do
1011
+ expect(RE2::Regexp.new('(a)(b)').named_captures).to be_empty
1012
+ end
1013
+
1014
+ it "returns an empty hash for an invalid regexp" do
1015
+ expect(RE2::Regexp.new('???', log_errors: false).named_captures).to be_empty
1016
+ end
1017
+
1018
+ it "raises an error when called on an uninitialized object" do
1019
+ expect { described_class.allocate.named_captures }.to raise_error(TypeError, /uninitialized RE2::Regexp/)
1020
+ end
1021
+ end
1022
+
966
1023
  describe "#scan" do
967
1024
  it "returns a scanner" do
968
1025
  r = RE2::Regexp.new('(\w+)')