regexer 1.1.0 → 1.2.0
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/lib/regexer/models/pattern.rb +19 -2
- data/lib/regexer/pattern_builder.rb +120 -22
- data/lib/regexer/utils/any_character_in_value_transformer.rb +5 -1
- data/lib/regexer/utils/handlers/any_character_in_input_value_handlers/regex_shorthand_pattern_handler.rb +25 -0
- data/lib/regexer/utils/string_helper.rb +5 -0
- data/lib/regexer/validators/any_character_in_validator.rb +15 -5
- data/lib/regexer/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa1cee078c860f7e156663ec53e028f497b80ad1ab75dd4ddd63bb6dcc863eac
|
4
|
+
data.tar.gz: 2fe31a71bbe3fedc1c5e5fc21fef2cbe8f9109266c7fb57bee7fce477655a396
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ba8841c57b7f87ad5c6a9bfdae871ab31262f2c158f48625fada5a12405762f419f533f9e7ed745a0a7f0692d2165267857698da970f4ded1cd01526a8c734a
|
7
|
+
data.tar.gz: 58610f6cb9a40103a0c59f695b1717de7b3704d57f34798f1a7dd0615c56c85c29c29d6a55f46f7a1350e12a330d6f7a8c40c3c15bf4deb49be40c429990bfa3
|
@@ -1,15 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "regexer/exceptions/invalid_value_error"
|
4
|
+
|
3
5
|
module Regexer
|
4
6
|
module Models
|
5
7
|
# The main model for the patterns being build by pattern builder
|
6
8
|
class Pattern
|
7
9
|
attr_reader :raw_pattern
|
8
10
|
|
9
|
-
def initialize(pattern, regex_escaped: true, single_entity: true)
|
10
|
-
@raw_pattern = pattern
|
11
|
+
def initialize(pattern, regex_escaped: true, single_entity: true, regex_shorthand_character: false)
|
12
|
+
@raw_pattern = String.new(pattern)
|
11
13
|
@regex_escaped = regex_escaped
|
12
14
|
@single_entity = single_entity
|
15
|
+
@regex_shorthand_character = regex_shorthand_character
|
16
|
+
end
|
17
|
+
|
18
|
+
def +(other)
|
19
|
+
unless other.is_a?(Regexer::Models::Pattern)
|
20
|
+
raise TypeError,
|
21
|
+
"Unable to add #{other.class} to Regexer::Models::Pattern"
|
22
|
+
end
|
23
|
+
|
24
|
+
Regexer::Models::Pattern.new(@raw_pattern + other.raw_pattern, regex_escaped: @regex_escaped,
|
25
|
+
single_entity: @single_entity)
|
13
26
|
end
|
14
27
|
|
15
28
|
def regex_escaped?
|
@@ -23,6 +36,10 @@ module Regexer
|
|
23
36
|
def regex
|
24
37
|
/#{raw_pattern}/
|
25
38
|
end
|
39
|
+
|
40
|
+
def regex_shorthand_character?
|
41
|
+
@regex_shorthand_character
|
42
|
+
end
|
26
43
|
end
|
27
44
|
end
|
28
45
|
end
|
@@ -23,6 +23,10 @@ module Regexer
|
|
23
23
|
Regexer::Models::Pattern.new(@final_pattern, single_entity: false)
|
24
24
|
end
|
25
25
|
|
26
|
+
def append_pattern(&block)
|
27
|
+
instance_exec(&block)
|
28
|
+
end
|
29
|
+
|
26
30
|
private
|
27
31
|
|
28
32
|
# STRUCTS
|
@@ -99,30 +103,12 @@ module Regexer
|
|
99
103
|
pattern_object
|
100
104
|
end
|
101
105
|
|
102
|
-
def has_word_character
|
103
|
-
pattern_object = Regexer::Models::Pattern.new("\\w")
|
104
|
-
@final_pattern += pattern_object.raw_pattern
|
105
|
-
pattern_object
|
106
|
-
end
|
107
|
-
|
108
106
|
def _or_
|
109
107
|
pattern_object = Regexer::Models::Pattern.new("\|")
|
110
108
|
@final_pattern += pattern_object.raw_pattern
|
111
109
|
pattern_object
|
112
110
|
end
|
113
111
|
|
114
|
-
def has_whitespace_character
|
115
|
-
pattern_object = Regexer::Models::Pattern.new("\\s")
|
116
|
-
@final_pattern += pattern_object.raw_pattern
|
117
|
-
pattern_object
|
118
|
-
end
|
119
|
-
|
120
|
-
def has_digit_character
|
121
|
-
pattern_object = Regexer::Models::Pattern.new("\\d")
|
122
|
-
@final_pattern += pattern_object.raw_pattern
|
123
|
-
pattern_object
|
124
|
-
end
|
125
|
-
|
126
112
|
def has_alphanumeric_character
|
127
113
|
pattern_object = Regexer::Models::Pattern.new("[A-Za-z0-9]")
|
128
114
|
@final_pattern += pattern_object.raw_pattern
|
@@ -160,16 +146,24 @@ module Regexer
|
|
160
146
|
value = Regexer::PatternBuilder.new(&block).result
|
161
147
|
sanitized_pattern = Regexer::Utils::PatternSanitizer.sanitize(value)
|
162
148
|
pattern_object = Regexer::Models::Pattern.new("(#{sanitized_pattern})")
|
163
|
-
|
149
|
+
@final_pattern += pattern_object.raw_pattern
|
164
150
|
pattern_object
|
165
151
|
end
|
166
152
|
|
167
153
|
def has_any_character_in(*values)
|
154
|
+
all_pattern_model_values = ""
|
168
155
|
combined_pattern = values.reduce("") do |pattern, value|
|
169
156
|
Regexer::Validators::AnyCharacterInValidator.value_valid?(value)
|
157
|
+
|
158
|
+
all_pattern_model_values << value.raw_pattern if value.instance_of?(::Regexer::Models::Pattern)
|
159
|
+
|
170
160
|
pattern + Regexer::Utils::AnyCharacterInValueTransformer.transform(value)
|
171
161
|
end
|
172
162
|
|
163
|
+
unless all_pattern_model_values.empty?
|
164
|
+
::Regexer::Utils::StringHelper.remove_pattern_in_the_end_of_string(@final_pattern, all_pattern_model_values)
|
165
|
+
end
|
166
|
+
|
173
167
|
pattern_object = Regexer::Models::Pattern.new("[#{combined_pattern}]")
|
174
168
|
@final_pattern += pattern_object.raw_pattern
|
175
169
|
pattern_object
|
@@ -180,6 +174,95 @@ module Regexer
|
|
180
174
|
|
181
175
|
pattern_object = Regexer::Models::Pattern.new(String.new(pattern).insert(1, "^"), single_entity: true)
|
182
176
|
Regexer::Utils::StringHelper.update_string_pattern(@final_pattern, pattern, pattern_object.raw_pattern)
|
177
|
+
pattern_object
|
178
|
+
end
|
179
|
+
|
180
|
+
# Shorthand characters
|
181
|
+
def has_whitespace_character
|
182
|
+
pattern_object = Regexer::Models::Pattern.new("\\s", regex_shorthand_character: true)
|
183
|
+
@final_pattern += pattern_object.raw_pattern
|
184
|
+
pattern_object
|
185
|
+
end
|
186
|
+
|
187
|
+
def has_non_whitespace_character
|
188
|
+
pattern_object = Regexer::Models::Pattern.new("\\S", regex_shorthand_character: true)
|
189
|
+
@final_pattern += pattern_object.raw_pattern
|
190
|
+
pattern_object
|
191
|
+
end
|
192
|
+
|
193
|
+
def has_digit_character
|
194
|
+
pattern_object = Regexer::Models::Pattern.new("\\d", regex_shorthand_character: true)
|
195
|
+
@final_pattern += pattern_object.raw_pattern
|
196
|
+
pattern_object
|
197
|
+
end
|
198
|
+
|
199
|
+
def has_word_character
|
200
|
+
pattern_object = Regexer::Models::Pattern.new("\\w", regex_shorthand_character: true)
|
201
|
+
@final_pattern += pattern_object.raw_pattern
|
202
|
+
pattern_object
|
203
|
+
end
|
204
|
+
|
205
|
+
def has_non_digit_character
|
206
|
+
pattern_object = Regexer::Models::Pattern.new("\\D", regex_shorthand_character: true)
|
207
|
+
@final_pattern += pattern_object.raw_pattern
|
208
|
+
pattern_object
|
209
|
+
end
|
210
|
+
|
211
|
+
def has_newline_character
|
212
|
+
pattern_object = Regexer::Models::Pattern.new("\\n", regex_shorthand_character: true)
|
213
|
+
@final_pattern += pattern_object.raw_pattern
|
214
|
+
pattern_object
|
215
|
+
end
|
216
|
+
|
217
|
+
def has_tab_character
|
218
|
+
pattern_object = Regexer::Models::Pattern.new("\\t", regex_shorthand_character: true)
|
219
|
+
@final_pattern += pattern_object.raw_pattern
|
220
|
+
pattern_object
|
221
|
+
end
|
222
|
+
|
223
|
+
def has_vertical_tab_character
|
224
|
+
pattern_object = Regexer::Models::Pattern.new("\\v", regex_shorthand_character: true)
|
225
|
+
@final_pattern += pattern_object.raw_pattern
|
226
|
+
pattern_object
|
227
|
+
end
|
228
|
+
|
229
|
+
def has_carriage_return_character
|
230
|
+
pattern_object = Regexer::Models::Pattern.new("\\r", regex_shorthand_character: true)
|
231
|
+
@final_pattern += pattern_object.raw_pattern
|
232
|
+
pattern_object
|
233
|
+
end
|
234
|
+
|
235
|
+
def has_form_feed_character
|
236
|
+
pattern_object = Regexer::Models::Pattern.new("\\f", regex_shorthand_character: true)
|
237
|
+
@final_pattern += pattern_object.raw_pattern
|
238
|
+
pattern_object
|
239
|
+
end
|
240
|
+
|
241
|
+
def has_non_word_character
|
242
|
+
pattern_object = Regexer::Models::Pattern.new("\\W", regex_shorthand_character: true)
|
243
|
+
@final_pattern += pattern_object.raw_pattern
|
244
|
+
pattern_object
|
245
|
+
end
|
246
|
+
|
247
|
+
def contains_a_word_ending_with(value)
|
248
|
+
pattern = contains(value)&.raw_pattern
|
249
|
+
pattern_object = Regexer::Models::Pattern.new("#{pattern}\\b", single_entity: false)
|
250
|
+
Regexer::Utils::StringHelper.update_string_pattern(@final_pattern, pattern, pattern_object.raw_pattern)
|
251
|
+
pattern_object
|
252
|
+
end
|
253
|
+
|
254
|
+
def contains_a_word_starting_with(value)
|
255
|
+
pattern = contains(value)&.raw_pattern
|
256
|
+
pattern_object = Regexer::Models::Pattern.new("\\b#{pattern}", single_entity: false)
|
257
|
+
Regexer::Utils::StringHelper.update_string_pattern(@final_pattern, pattern, pattern_object.raw_pattern)
|
258
|
+
pattern_object
|
259
|
+
end
|
260
|
+
|
261
|
+
def contains_the_word(value)
|
262
|
+
pattern = contains(value)&.raw_pattern
|
263
|
+
pattern_object = Regexer::Models::Pattern.new("\\b#{pattern}\\b", single_entity: false)
|
264
|
+
Regexer::Utils::StringHelper.update_string_pattern(@final_pattern, pattern, pattern_object.raw_pattern)
|
265
|
+
pattern_object
|
183
266
|
end
|
184
267
|
|
185
268
|
# VALUE BUILDER METHOD THAT IS COMPATIBILE WITH THE PATTERN BUILDER
|
@@ -188,9 +271,6 @@ module Regexer
|
|
188
271
|
Regexer::Models::CharacterRangePattern.new(from, to)
|
189
272
|
end
|
190
273
|
|
191
|
-
alias word_character has_word_character
|
192
|
-
alias whitespace_character has_whitespace_character
|
193
|
-
alias digit_character has_digit_character
|
194
274
|
alias alphanumeric_character has_alphanumeric_character
|
195
275
|
alias any_character_except_new_line has_any_character_except_new_line
|
196
276
|
alias letter has_letter
|
@@ -202,5 +282,23 @@ module Regexer
|
|
202
282
|
alias group has_group
|
203
283
|
alias any_character_in has_any_character_in
|
204
284
|
alias any_character_not_in has_any_character_not_in
|
285
|
+
|
286
|
+
# Shorthand character alias methods
|
287
|
+
alias word_character has_word_character
|
288
|
+
alias non_word_character has_non_word_character
|
289
|
+
alias whitespace_character has_whitespace_character
|
290
|
+
alias non_whitespace_character has_non_whitespace_character
|
291
|
+
alias digit_character has_digit_character
|
292
|
+
alias non_digit_character has_non_digit_character
|
293
|
+
alias newline_character has_newline_character
|
294
|
+
alias tab_character has_tab_character
|
295
|
+
alias vertical_tab_character has_vertical_tab_character
|
296
|
+
alias carriage_return_character has_carriage_return_character
|
297
|
+
alias form_feed_character has_form_feed_character
|
298
|
+
alias the_word contains_the_word
|
299
|
+
alias contains_a_word_with contains_the_word
|
300
|
+
alias a_word_with contains_the_word
|
301
|
+
alias a_word_starting_with contains_a_word_starting_with
|
302
|
+
alias a_word_ending_with contains_a_word_ending_with
|
205
303
|
end
|
206
304
|
end
|
@@ -4,6 +4,7 @@ require "regexer/utils/handlers/any_character_in_input_value_handlers/base"
|
|
4
4
|
require "regexer/utils/handlers/any_character_in_input_value_handlers/basic_types_handler"
|
5
5
|
require "regexer/utils/handlers/any_character_in_input_value_handlers/character_range_pattern_handler"
|
6
6
|
require "regexer/utils/handlers/any_character_in_input_value_handlers/from_to_hash_handler"
|
7
|
+
require "regexer/utils/handlers/any_character_in_input_value_handlers/regex_shorthand_pattern_handler"
|
7
8
|
|
8
9
|
module Regexer
|
9
10
|
module Utils
|
@@ -13,12 +14,15 @@ module Regexer
|
|
13
14
|
class AnyCharacterInValueTransformer
|
14
15
|
def self.transform(value)
|
15
16
|
basic_types_handler = ::Regexer::Utils::Handlers::AnyCharacterInInputValueHandlers::BasicTypesHandler.new
|
17
|
+
from_to_hash_handler = ::Regexer::Utils::Handlers::AnyCharacterInInputValueHandlers::FromToHashHandler.new
|
16
18
|
char_range_pattern_handler =
|
17
19
|
::Regexer::Utils::Handlers::AnyCharacterInInputValueHandlers::CharacterRangePatternHandler.new
|
18
|
-
|
20
|
+
regex_shorthand_pattern_handler =
|
21
|
+
::Regexer::Utils::Handlers::AnyCharacterInInputValueHandlers::RegexShorthandPatternHandler.new
|
19
22
|
|
20
23
|
basic_types_handler.next_handler(char_range_pattern_handler)
|
21
24
|
.next_handler(from_to_hash_handler)
|
25
|
+
.next_handler(regex_shorthand_pattern_handler)
|
22
26
|
|
23
27
|
basic_types_handler.handle(value) || ""
|
24
28
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "regexer/utils/handlers/any_character_in_input_value_handlers/base"
|
4
|
+
require "regexer/models/pattern"
|
5
|
+
|
6
|
+
module Regexer
|
7
|
+
module Utils
|
8
|
+
module Handlers
|
9
|
+
module AnyCharacterInInputValueHandlers
|
10
|
+
# A handler class to check if input value is a Regexer::Models::Pattern object
|
11
|
+
# tagged as regex shorthand character
|
12
|
+
# this returns the raw_pattern of that object
|
13
|
+
class RegexShorthandPatternHandler < Base
|
14
|
+
def handle(value)
|
15
|
+
if value.instance_of?(Regexer::Models::Pattern) && value.regex_shorthand_character?
|
16
|
+
value.raw_pattern
|
17
|
+
else
|
18
|
+
give_to_next_handler(value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -10,6 +10,11 @@ module Regexer
|
|
10
10
|
pattern_to_update << new_pattern
|
11
11
|
end
|
12
12
|
end
|
13
|
+
|
14
|
+
def self.remove_pattern_in_the_end_of_string(pattern_to_update, pattern_to_remove)
|
15
|
+
pattern_to_update
|
16
|
+
.sub!(/(#{Regexp.escape(pattern_to_remove)})$/) { "" } if pattern_to_update.end_with?(pattern_to_remove)
|
17
|
+
end
|
13
18
|
end
|
14
19
|
end
|
15
20
|
end
|
@@ -2,16 +2,18 @@
|
|
2
2
|
|
3
3
|
require "regexer/exceptions/invalid_value_error"
|
4
4
|
require "regexer/models/character_range_pattern"
|
5
|
+
require "regexer/models/pattern"
|
5
6
|
|
6
7
|
module Regexer
|
7
8
|
module Validators
|
8
9
|
# A Validator Class for validating values being passed to has_any_character_in Regexer::Pattern method
|
9
10
|
class AnyCharacterInValidator
|
10
11
|
def self.value_valid?(value)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
char_range = "Regexer::Models::CharacterRangePattern"
|
13
|
+
regex_shorthand_pattern = "Regexer::Models::Pattern as regex shorthand character"
|
14
|
+
hash_model = "Hash with from & to keys"
|
15
|
+
basic_types = "String, Integer, Float"
|
16
|
+
message = "Value should be one of type #{basic_types}, #{char_range}, #{hash_model}, #{regex_shorthand_pattern}"
|
15
17
|
raise Regexer::Exceptions::InvalidValueError, message unless valid?(value)
|
16
18
|
end
|
17
19
|
|
@@ -34,8 +36,16 @@ module Regexer
|
|
34
36
|
value.instance_of?(Regexer::Models::CharacterRangePattern)
|
35
37
|
end
|
36
38
|
|
39
|
+
def regex_shorthand_character_pattern?(value)
|
40
|
+
value.instance_of?(Regexer::Models::Pattern) && value.regex_shorthand_character?
|
41
|
+
end
|
42
|
+
|
37
43
|
def valid?(value)
|
38
|
-
number?(value) ||
|
44
|
+
number?(value) ||
|
45
|
+
string?(value) ||
|
46
|
+
character_range?(value) ||
|
47
|
+
from_to_hash?(value) ||
|
48
|
+
regex_shorthand_character_pattern?(value)
|
39
49
|
end
|
40
50
|
end
|
41
51
|
end
|
data/lib/regexer/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: regexer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genesis Ivan Ilagan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- lib/regexer/utils/handlers/any_character_in_input_value_handlers/basic_types_handler.rb
|
87
87
|
- lib/regexer/utils/handlers/any_character_in_input_value_handlers/character_range_pattern_handler.rb
|
88
88
|
- lib/regexer/utils/handlers/any_character_in_input_value_handlers/from_to_hash_handler.rb
|
89
|
+
- lib/regexer/utils/handlers/any_character_in_input_value_handlers/regex_shorthand_pattern_handler.rb
|
89
90
|
- lib/regexer/utils/handlers/base_handler.rb
|
90
91
|
- lib/regexer/utils/handlers/quantifier_options_handlers/base.rb
|
91
92
|
- lib/regexer/utils/handlers/quantifier_options_handlers/exactly_option_handler.rb
|