re2 2.4.3 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
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+)', :utf8 => false)
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('???', :log_errors => false)
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
- # Prior to Ruby 1.9, Enumerator was within Enumerable.
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, :case_sensitive => false)
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, :case_sensitive => false) }.to raise_error(
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, :log_errors => false)
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, :log_errors => false)
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, :log_errors => false)
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, :log_errors => false)
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", :exception => false)).to eq([0, 1, 2])
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", :exception => false)).to be_empty
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, :log_errors => false)
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, :log_errors => false)
159
+ set = RE2::Set.new(:unanchored, log_errors: false)
150
160
 
151
161
  silence_stderr do
152
- expect { set.match("", :exception => true) }.to raise_error(RE2::Set::MatchError)
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, :log_errors => false)
167
+ set = RE2::Set.new(:unanchored, log_errors: false)
158
168
 
159
169
  silence_stderr do
160
- expect(set.match("", :exception => false)).to be_empty
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 re2 does not support it" do
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, :log_errors => false)
177
+ set = RE2::Set.new(:unanchored, log_errors: false)
168
178
 
169
179
  silence_stderr do
170
- expect { set.match("", :exception => true) }.to raise_error(RE2::Set::UnsupportedError)
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, :exception => false) }.to raise_error(TypeError)
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"), :exception => false)).to contain_exactly(0)
203
+ expect(set.match(StringLike.new("abcdef"), exception: false)).to contain_exactly(0)
194
204
  end
195
205
  end
196
206
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "re2/string"
2
4
 
3
5
  class String
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', :case_sensitive => false)
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", :utf8 => false), "ah")
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', :case_sensitive => false)
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", :utf8 => false), "ah")
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "re2"
2
4
 
3
5
  # To test passing objects that can be coerced to a String.
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.3
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: 2023-11-22 00:00:00.000000000 Z
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.1
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.1
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.3.0
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.3.0
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/20230802.1.tar.gz
93
- - ports/archives/re2-2023-11-01.tar.gz
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.10
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