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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7467fda4e27fd5886a4fd0c455ad5ebe4cb8db161c6c06bf99bb5912f907c9a
4
- data.tar.gz: 98c6ca7fe45449a814575e13fc98cd343dc2fafd7e0e4962261a459212924add
3
+ metadata.gz: aa1cee078c860f7e156663ec53e028f497b80ad1ab75dd4ddd63bb6dcc863eac
4
+ data.tar.gz: 2fe31a71bbe3fedc1c5e5fc21fef2cbe8f9109266c7fb57bee7fce477655a396
5
5
  SHA512:
6
- metadata.gz: 51192fa1910ff86346c8da105030a9c33810e3c1974b38dc22676a77eb7a5eefab597155132ad174dcd8fee12da2fc746fe703e86418a68c7f97ec2d666b9d3b
7
- data.tar.gz: 37490e66c2c56d24a5af2b1dc7c8ad2631f188df0582f391946b02c8e97a13830641a46deb1e61c365276018678c77729f6350bfaac1a550d5d86ef44a0a2418
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
- Regexer::Utils::StringHelper.update_string_pattern(@final_pattern, sanitized_pattern, pattern_object.raw_pattern)
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
- from_to_hash_handler = ::Regexer::Utils::Handlers::AnyCharacterInInputValueHandlers::FromToHashHandler.new
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
- char_range_model = "Regexer::Models::CharacterRangePattern"
12
- valid_hash_model = "Hash with from & to keys"
13
- valid_basic_types = "String or Integer or Float"
14
- message = "Value should only be of type #{valid_basic_types} or #{char_range_model} or #{valid_hash_model}"
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) || string?(value) || character_range?(value) || from_to_hash?(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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Regexer
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
5
5
  end
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.1.0
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: 2022-10-09 00:00:00.000000000 Z
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