re2 2.4.3 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/Gemfile +2 -0
- data/README.md +281 -192
- data/Rakefile +1 -1
- data/dependencies.yml +4 -4
- data/ext/re2/extconf.rb +250 -358
- data/ext/re2/re2.cc +505 -284
- data/ext/re2/recipes.rb +31 -20
- data/lib/re2/regexp.rb +72 -0
- data/lib/re2/scanner.rb +11 -0
- data/lib/re2/string.rb +12 -59
- data/lib/re2/version.rb +10 -1
- data/lib/re2.rb +9 -3
- data/ports/archives/20240116.1.tar.gz +0 -0
- data/ports/archives/re2-2024-04-01.tar.gz +0 -0
- data/re2.gemspec +5 -2
- data/spec/kernel_spec.rb +10 -2
- data/spec/re2/match_data_spec.rb +98 -28
- data/spec/re2/regexp_spec.rb +546 -113
- data/spec/re2/scanner_spec.rb +26 -9
- data/spec/re2/set_spec.rb +28 -18
- data/spec/re2/string_spec.rb +2 -0
- data/spec/re2_spec.rb +34 -4
- data/spec/spec_helper.rb +2 -0
- metadata +10 -9
- data/ports/archives/20230802.1.tar.gz +0 -0
- data/ports/archives/re2-2023-11-01.tar.gz +0 -0
data/spec/re2/scanner_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
RSpec.describe RE2::Scanner do
|
4
4
|
describe "#regexp" do
|
@@ -34,6 +34,16 @@ RSpec.describe RE2::Scanner do
|
|
34
34
|
expect(scanner.scan).to be_nil
|
35
35
|
end
|
36
36
|
|
37
|
+
it "supports scanning inputs with null bytes", :aggregate_failures do
|
38
|
+
r = RE2::Regexp.new("(\\w\0\\w)")
|
39
|
+
scanner = r.scan("a\0b c\0d e\0f")
|
40
|
+
|
41
|
+
expect(scanner.scan).to eq(["a\0b"])
|
42
|
+
expect(scanner.scan).to eq(["c\0d"])
|
43
|
+
expect(scanner.scan).to eq(["e\0f"])
|
44
|
+
expect(scanner.scan).to be_nil
|
45
|
+
end
|
46
|
+
|
37
47
|
it "returns UTF-8 matches if the pattern is UTF-8" do
|
38
48
|
r = RE2::Regexp.new('(\w+)')
|
39
49
|
scanner = r.scan("It")
|
@@ -43,7 +53,7 @@ RSpec.describe RE2::Scanner do
|
|
43
53
|
end
|
44
54
|
|
45
55
|
it "returns ISO-8859-1 matches if the pattern is not UTF-8" do
|
46
|
-
r = RE2::Regexp.new('(\w+)', :
|
56
|
+
r = RE2::Regexp.new('(\w+)', utf8: false)
|
47
57
|
scanner = r.scan("It")
|
48
58
|
matches = scanner.scan
|
49
59
|
|
@@ -75,7 +85,7 @@ RSpec.describe RE2::Scanner do
|
|
75
85
|
end
|
76
86
|
|
77
87
|
it "returns nil if the regexp is invalid" do
|
78
|
-
r = RE2::Regexp.new('???', :
|
88
|
+
r = RE2::Regexp.new('???', log_errors: false)
|
79
89
|
scanner = r.scan("Foo bar")
|
80
90
|
|
81
91
|
expect(scanner.scan).to be_nil
|
@@ -173,12 +183,7 @@ RSpec.describe RE2::Scanner do
|
|
173
183
|
r = RE2::Regexp.new('(\d)')
|
174
184
|
scanner = r.scan("There are 1 some 2 numbers 3")
|
175
185
|
|
176
|
-
|
177
|
-
if defined?(Enumerator)
|
178
|
-
expect(scanner.each).to be_a(Enumerator)
|
179
|
-
elsif defined?(Enumerable::Enumerator)
|
180
|
-
expect(scanner.each).to be_a(Enumerable::Enumerator)
|
181
|
-
end
|
186
|
+
expect(scanner.each).to be_a(Enumerator)
|
182
187
|
end
|
183
188
|
end
|
184
189
|
|
@@ -195,6 +200,18 @@ RSpec.describe RE2::Scanner do
|
|
195
200
|
expect(scanner.to_enum.first).to eq(["1"])
|
196
201
|
end
|
197
202
|
|
203
|
+
it "supports inputs with null bytes", :aggregate_failures do
|
204
|
+
r = RE2::Regexp.new("(\\w\0\\w)")
|
205
|
+
scanner = r.scan("a\0b c\0d")
|
206
|
+
|
207
|
+
expect(scanner.to_enum.first).to eq(["a\0b"])
|
208
|
+
expect(scanner.to_enum.first).to eq(["c\0d"])
|
209
|
+
|
210
|
+
scanner.rewind
|
211
|
+
|
212
|
+
expect(scanner.to_enum.first).to eq(["a\0b"])
|
213
|
+
end
|
214
|
+
|
198
215
|
it "resets the eof? check", :aggregate_failures do
|
199
216
|
r = RE2::Regexp.new('(\d)')
|
200
217
|
scanner = r.scan("1")
|
data/spec/re2/set_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
RSpec.describe RE2::Set do
|
2
4
|
describe "#initialize" do
|
3
5
|
it "returns an instance given no args" do
|
@@ -25,7 +27,7 @@ RSpec.describe RE2::Set do
|
|
25
27
|
end
|
26
28
|
|
27
29
|
it "returns an instance given an anchor and options" do
|
28
|
-
set = RE2::Set.new(:unanchored, :
|
30
|
+
set = RE2::Set.new(:unanchored, case_sensitive: false)
|
29
31
|
|
30
32
|
expect(set).to be_a(RE2::Set)
|
31
33
|
end
|
@@ -42,7 +44,7 @@ RSpec.describe RE2::Set do
|
|
42
44
|
end
|
43
45
|
|
44
46
|
it "raises an error if given an invalid anchor and options" do
|
45
|
-
expect { RE2::Set.new(:not_a_valid_anchor, :
|
47
|
+
expect { RE2::Set.new(:not_a_valid_anchor, case_sensitive: false) }.to raise_error(
|
46
48
|
ArgumentError,
|
47
49
|
"anchor should be one of: :unanchored, :anchor_start, :anchor_both"
|
48
50
|
)
|
@@ -59,19 +61,19 @@ RSpec.describe RE2::Set do
|
|
59
61
|
end
|
60
62
|
|
61
63
|
it "rejects invalid patterns when added" do
|
62
|
-
set = RE2::Set.new(:unanchored, :
|
64
|
+
set = RE2::Set.new(:unanchored, log_errors: false)
|
63
65
|
|
64
66
|
expect { set.add("???") }.to raise_error(ArgumentError, /str rejected by RE2::Set->Add\(\)/)
|
65
67
|
end
|
66
68
|
|
67
69
|
it "truncates error messages to 100 characters" do
|
68
|
-
set = RE2::Set.new(:unanchored, :
|
70
|
+
set = RE2::Set.new(:unanchored, log_errors: false)
|
69
71
|
|
70
72
|
expect { set.add("(?P<#{'o' * 200}") }.to raise_error(ArgumentError, "str rejected by RE2::Set->Add(): invalid named capture group: (?P<oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo")
|
71
73
|
end
|
72
74
|
|
73
75
|
it "raises an error if called after #compile" do
|
74
|
-
set = RE2::Set.new(:unanchored, :
|
76
|
+
set = RE2::Set.new(:unanchored, log_errors: false)
|
75
77
|
set.add("abc")
|
76
78
|
set.compile
|
77
79
|
|
@@ -81,7 +83,7 @@ RSpec.describe RE2::Set do
|
|
81
83
|
end
|
82
84
|
|
83
85
|
it "raises an error if given a pattern that can't be coerced to a String" do
|
84
|
-
set = RE2::Set.new(:unanchored, :
|
86
|
+
set = RE2::Set.new(:unanchored, log_errors: false)
|
85
87
|
|
86
88
|
expect { set.add(0) }.to raise_error(TypeError)
|
87
89
|
end
|
@@ -112,7 +114,7 @@ RSpec.describe RE2::Set do
|
|
112
114
|
set.add("ghi")
|
113
115
|
set.compile
|
114
116
|
|
115
|
-
expect(set.match("abcdefghi", :
|
117
|
+
expect(set.match("abcdefghi", exception: false)).to eq([0, 1, 2])
|
116
118
|
end
|
117
119
|
|
118
120
|
it "returns an empty array if there is no match" do
|
@@ -120,7 +122,15 @@ RSpec.describe RE2::Set do
|
|
120
122
|
set.add("abc")
|
121
123
|
set.compile
|
122
124
|
|
123
|
-
expect(set.match("def", :
|
125
|
+
expect(set.match("def", exception: false)).to be_empty
|
126
|
+
end
|
127
|
+
|
128
|
+
it "supports matching null bytes", :aggregate_failures do
|
129
|
+
set = RE2::Set.new
|
130
|
+
set.add("a\0b")
|
131
|
+
set.compile
|
132
|
+
|
133
|
+
expect(set.match("a\0b", exception: false)).to eq([0])
|
124
134
|
end
|
125
135
|
|
126
136
|
it "returns an empty array if there is no match when :exception is true" do
|
@@ -136,7 +146,7 @@ RSpec.describe RE2::Set do
|
|
136
146
|
it "raises an error if called before #compile by default" do
|
137
147
|
skip "Underlying RE2::Set::Match does not output error information" unless RE2::Set.match_raises_errors?
|
138
148
|
|
139
|
-
set = RE2::Set.new(:unanchored, :
|
149
|
+
set = RE2::Set.new(:unanchored, log_errors: false)
|
140
150
|
|
141
151
|
silence_stderr do
|
142
152
|
expect { set.match("") }.to raise_error(RE2::Set::MatchError)
|
@@ -146,28 +156,28 @@ RSpec.describe RE2::Set do
|
|
146
156
|
it "raises an error if called before #compile when :exception is true" do
|
147
157
|
skip "Underlying RE2::Set::Match does not output error information" unless RE2::Set.match_raises_errors?
|
148
158
|
|
149
|
-
set = RE2::Set.new(:unanchored, :
|
159
|
+
set = RE2::Set.new(:unanchored, log_errors: false)
|
150
160
|
|
151
161
|
silence_stderr do
|
152
|
-
expect { set.match("", :
|
162
|
+
expect { set.match("", exception: true) }.to raise_error(RE2::Set::MatchError)
|
153
163
|
end
|
154
164
|
end
|
155
165
|
|
156
166
|
it "returns an empty array if called before #compile when :exception is false" do
|
157
|
-
set = RE2::Set.new(:unanchored, :
|
167
|
+
set = RE2::Set.new(:unanchored, log_errors: false)
|
158
168
|
|
159
169
|
silence_stderr do
|
160
|
-
expect(set.match("", :
|
170
|
+
expect(set.match("", exception: false)).to be_empty
|
161
171
|
end
|
162
172
|
end
|
163
173
|
|
164
|
-
it "raises an error if :exception is true and
|
174
|
+
it "raises an error if :exception is true and RE2 does not support it" do
|
165
175
|
skip "Underlying RE2::Set::Match outputs error information" if RE2::Set.match_raises_errors?
|
166
176
|
|
167
|
-
set = RE2::Set.new(:unanchored, :
|
177
|
+
set = RE2::Set.new(:unanchored, log_errors: false)
|
168
178
|
|
169
179
|
silence_stderr do
|
170
|
-
expect { set.match("", :
|
180
|
+
expect { set.match("", exception: true) }.to raise_error(RE2::Set::UnsupportedError)
|
171
181
|
end
|
172
182
|
end
|
173
183
|
|
@@ -182,7 +192,7 @@ RSpec.describe RE2::Set do
|
|
182
192
|
set.add("abc")
|
183
193
|
set.compile
|
184
194
|
|
185
|
-
expect { set.match(0, :
|
195
|
+
expect { set.match(0, exception: false) }.to raise_error(TypeError)
|
186
196
|
end
|
187
197
|
|
188
198
|
it "accepts input if it can be coerced to a String" do
|
@@ -190,7 +200,7 @@ RSpec.describe RE2::Set do
|
|
190
200
|
set.add("abc")
|
191
201
|
set.compile
|
192
202
|
|
193
|
-
expect(set.match(StringLike.new("abcdef"), :
|
203
|
+
expect(set.match(StringLike.new("abcdef"), exception: false)).to contain_exactly(0)
|
194
204
|
end
|
195
205
|
end
|
196
206
|
|
data/spec/re2/string_spec.rb
CHANGED
data/spec/re2_spec.rb
CHANGED
@@ -1,9 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
RSpec.describe RE2 do
|
2
4
|
describe ".Replace" do
|
3
5
|
it "only replaces the first occurrence of the pattern" do
|
4
6
|
expect(RE2.Replace("woo", "o", "a")).to eq("wao")
|
5
7
|
end
|
6
8
|
|
9
|
+
it "supports inputs with null bytes" do
|
10
|
+
expect(RE2.Replace("w\0oo", "o", "a")).to eq("w\0ao")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "supports patterns with null bytes" do
|
14
|
+
expect(RE2.Replace("w\0oo", "\0", "o")).to eq("wooo")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "supports replacements with null bytes" do
|
18
|
+
expect(RE2.Replace("woo", "o", "\0")).to eq("w\0o")
|
19
|
+
end
|
20
|
+
|
7
21
|
it "performs replacement based on regular expressions" do
|
8
22
|
expect(RE2.Replace("woo", "o+", "e")).to eq("we")
|
9
23
|
end
|
@@ -27,7 +41,7 @@ RSpec.describe RE2 do
|
|
27
41
|
end
|
28
42
|
|
29
43
|
it "respects any passed RE2::Regexp's flags" do
|
30
|
-
re = RE2::Regexp.new('gOOD MORNING', :
|
44
|
+
re = RE2::Regexp.new('gOOD MORNING', case_sensitive: false)
|
31
45
|
|
32
46
|
expect(RE2.Replace("Good morning", re, "hi")).to eq("hi")
|
33
47
|
end
|
@@ -53,7 +67,7 @@ RSpec.describe RE2 do
|
|
53
67
|
|
54
68
|
it "returns ISO-8859-1 strings if the pattern is not UTF-8" do
|
55
69
|
original = "Foo"
|
56
|
-
replacement = RE2.Replace(original, RE2("oo", :
|
70
|
+
replacement = RE2.Replace(original, RE2("oo", utf8: false), "ah")
|
57
71
|
|
58
72
|
expect(replacement.encoding).to eq(Encoding::ISO_8859_1)
|
59
73
|
end
|
@@ -82,6 +96,18 @@ RSpec.describe RE2 do
|
|
82
96
|
expect(RE2.GlobalReplace("woo", "o", "a")).to eq("waa")
|
83
97
|
end
|
84
98
|
|
99
|
+
it "supports inputs with null bytes" do
|
100
|
+
expect(RE2.GlobalReplace("w\0oo", "o", "a")).to eq("w\0aa")
|
101
|
+
end
|
102
|
+
|
103
|
+
it "supports patterns with null bytes" do
|
104
|
+
expect(RE2.GlobalReplace("w\0\0oo", "\0", "a")).to eq("waaoo")
|
105
|
+
end
|
106
|
+
|
107
|
+
it "supports replacements with null bytes" do
|
108
|
+
expect(RE2.GlobalReplace("woo", "o", "\0")).to eq("w\0\0")
|
109
|
+
end
|
110
|
+
|
85
111
|
it "performs replacement based on regular expressions" do
|
86
112
|
expect(RE2.GlobalReplace("woohoo", "o+", "e")).to eq("wehe")
|
87
113
|
end
|
@@ -105,7 +131,7 @@ RSpec.describe RE2 do
|
|
105
131
|
end
|
106
132
|
|
107
133
|
it "respects any passed RE2::Regexp's flags" do
|
108
|
-
re = RE2::Regexp.new('gOOD MORNING', :
|
134
|
+
re = RE2::Regexp.new('gOOD MORNING', case_sensitive: false)
|
109
135
|
|
110
136
|
expect(RE2.GlobalReplace("Good morning Good morning", re, "hi")).to eq("hi hi")
|
111
137
|
end
|
@@ -131,7 +157,7 @@ RSpec.describe RE2 do
|
|
131
157
|
|
132
158
|
it "returns ISO-8859-1 strings if the pattern is not UTF-8" do
|
133
159
|
original = "Foo"
|
134
|
-
replacement = RE2.GlobalReplace(original, RE2("oo", :
|
160
|
+
replacement = RE2.GlobalReplace(original, RE2("oo", utf8: false), "ah")
|
135
161
|
|
136
162
|
expect(replacement.encoding).to eq(Encoding::ISO_8859_1)
|
137
163
|
end
|
@@ -167,5 +193,9 @@ RSpec.describe RE2 do
|
|
167
193
|
it "supports passing something that can be coerced to a String as input" do
|
168
194
|
expect(RE2.QuoteMeta(StringLike.new("1.5"))).to eq('1\.5')
|
169
195
|
end
|
196
|
+
|
197
|
+
it "supports strings containing null bytes" do
|
198
|
+
expect(RE2.QuoteMeta("abc\0def")).to eq('abc\x00def')
|
199
|
+
end
|
170
200
|
end
|
171
201
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: re2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Mucur
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-04-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake-compiler
|
@@ -17,28 +17,28 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 1.2.
|
20
|
+
version: 1.2.5
|
21
21
|
type: :development
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 1.2.
|
27
|
+
version: 1.2.5
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rake-compiler-dock
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 1.
|
34
|
+
version: 1.4.0
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 1.
|
41
|
+
version: 1.4.0
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rspec
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,11 +86,12 @@ files:
|
|
86
86
|
- ext/re2/re2.cc
|
87
87
|
- ext/re2/recipes.rb
|
88
88
|
- lib/re2.rb
|
89
|
+
- lib/re2/regexp.rb
|
89
90
|
- lib/re2/scanner.rb
|
90
91
|
- lib/re2/string.rb
|
91
92
|
- lib/re2/version.rb
|
92
|
-
- ports/archives/
|
93
|
-
- ports/archives/re2-
|
93
|
+
- ports/archives/20240116.1.tar.gz
|
94
|
+
- ports/archives/re2-2024-04-01.tar.gz
|
94
95
|
- re2.gemspec
|
95
96
|
- spec/kernel_spec.rb
|
96
97
|
- spec/re2/match_data_spec.rb
|
@@ -119,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
120
|
- !ruby/object:Gem::Version
|
120
121
|
version: '0'
|
121
122
|
requirements: []
|
122
|
-
rubygems_version: 3.4.
|
123
|
+
rubygems_version: 3.4.19
|
123
124
|
signing_key:
|
124
125
|
specification_version: 4
|
125
126
|
summary: Ruby bindings to RE2.
|
Binary file
|
Binary file
|