regexer 1.0.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: 92070599c885225a8466e24f2bf46d3b5aea40c2ec205e8da99af425bf00d4e3
4
- data.tar.gz: 42ce090a8b56be47aa2ca63caf8ec4c85868ff7229c7fec327b02086413b2327
3
+ metadata.gz: aa1cee078c860f7e156663ec53e028f497b80ad1ab75dd4ddd63bb6dcc863eac
4
+ data.tar.gz: 2fe31a71bbe3fedc1c5e5fc21fef2cbe8f9109266c7fb57bee7fce477655a396
5
5
  SHA512:
6
- metadata.gz: 8040c4d4a11602ccdf7ad2059f0474d57890af8613ba678c911dd6f2699cff6a74b18b64fbe56ef3a8b86656f849b1520ff06c4fdc4f7b8a7686dd408d008c4a
7
- data.tar.gz: 142da4ce9ad77977a7379e514be5206647b08eb727f0422fa31af97827a29d552ddd0ed687f6a79cdababf0be6f4e00481bbd336dbde4c8c79f0ad507a935653
6
+ metadata.gz: 5ba8841c57b7f87ad5c6a9bfdae871ab31262f2c158f48625fada5a12405762f419f533f9e7ed745a0a7f0692d2165267857698da970f4ded1cd01526a8c734a
7
+ data.tar.gz: 58610f6cb9a40103a0c59f695b1717de7b3704d57f34798f1a7dd0615c56c85c29c29d6a55f46f7a1350e12a330d6f7a8c40c3c15bf4deb49be40c429990bfa3
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Regexer
4
+ module Models
5
+ # The main model for character range patterns
6
+ class CharacterRangePattern
7
+ attr_reader :from, :to
8
+
9
+ def initialize(from, to)
10
+ @from = Regexp.escape(from)
11
+ @to = Regexp.escape(to)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -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
@@ -3,10 +3,12 @@ require "regexer/validators/contains_value_validator"
3
3
  require "regexer/validators/any_character_in_validator"
4
4
  require "regexer/exceptions/no_block_given_error"
5
5
  require "regexer/models/pattern"
6
+ require "regexer/models/character_range_pattern"
6
7
  require "regexer/utils/single_entity_checker"
7
8
  require "regexer/utils/quantifier_value_generator"
8
9
  require "regexer/utils/pattern_sanitizer"
9
10
  require "regexer/utils/string_helper"
11
+ require "regexer/utils/any_character_in_value_transformer"
10
12
  require "pry"
11
13
 
12
14
  module Regexer
@@ -21,6 +23,10 @@ module Regexer
21
23
  Regexer::Models::Pattern.new(@final_pattern, single_entity: false)
22
24
  end
23
25
 
26
+ def append_pattern(&block)
27
+ instance_exec(&block)
28
+ end
29
+
24
30
  private
25
31
 
26
32
  # STRUCTS
@@ -97,30 +103,12 @@ module Regexer
97
103
  pattern_object
98
104
  end
99
105
 
100
- def has_word_character
101
- pattern_object = Regexer::Models::Pattern.new("\\w")
102
- @final_pattern += pattern_object.raw_pattern
103
- pattern_object
104
- end
105
-
106
106
  def _or_
107
107
  pattern_object = Regexer::Models::Pattern.new("\|")
108
108
  @final_pattern += pattern_object.raw_pattern
109
109
  pattern_object
110
110
  end
111
111
 
112
- def has_whitespace_character
113
- pattern_object = Regexer::Models::Pattern.new("\\s")
114
- @final_pattern += pattern_object.raw_pattern
115
- pattern_object
116
- end
117
-
118
- def has_digit_character
119
- pattern_object = Regexer::Models::Pattern.new("\\d")
120
- @final_pattern += pattern_object.raw_pattern
121
- pattern_object
122
- end
123
-
124
112
  def has_alphanumeric_character
125
113
  pattern_object = Regexer::Models::Pattern.new("[A-Za-z0-9]")
126
114
  @final_pattern += pattern_object.raw_pattern
@@ -158,19 +146,22 @@ module Regexer
158
146
  value = Regexer::PatternBuilder.new(&block).result
159
147
  sanitized_pattern = Regexer::Utils::PatternSanitizer.sanitize(value)
160
148
  pattern_object = Regexer::Models::Pattern.new("(#{sanitized_pattern})")
161
- Regexer::Utils::StringHelper.update_string_pattern(@final_pattern, sanitized_pattern, pattern_object.raw_pattern)
149
+ @final_pattern += pattern_object.raw_pattern
162
150
  pattern_object
163
151
  end
164
152
 
165
153
  def has_any_character_in(*values)
154
+ all_pattern_model_values = ""
166
155
  combined_pattern = values.reduce("") do |pattern, value|
167
156
  Regexer::Validators::AnyCharacterInValidator.value_valid?(value)
168
- if value.instance_of?(Hash)
169
- Regexer::Validators::FromToValidator.valid_values?("ascii_character", value[:from], value[:to])
170
- pattern + "#{value[:from]}-#{value[:to]}"
171
- else
172
- pattern + Regexer::Utils::PatternSanitizer.sanitize(value)
173
- end
157
+
158
+ all_pattern_model_values << value.raw_pattern if value.instance_of?(::Regexer::Models::Pattern)
159
+
160
+ pattern + Regexer::Utils::AnyCharacterInValueTransformer.transform(value)
161
+ end
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)
174
165
  end
175
166
 
176
167
  pattern_object = Regexer::Models::Pattern.new("[#{combined_pattern}]")
@@ -178,15 +169,108 @@ module Regexer
178
169
  pattern_object
179
170
  end
180
171
 
172
+ def has_any_character_not_in(*values)
173
+ pattern = has_any_character_in(*values)&.raw_pattern
174
+
175
+ pattern_object = Regexer::Models::Pattern.new(String.new(pattern).insert(1, "^"), single_entity: true)
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
266
+ end
267
+
181
268
  # VALUE BUILDER METHOD THAT IS COMPATIBILE WITH THE PATTERN BUILDER
182
269
  def character_range(from:, to:)
183
270
  Regexer::Validators::FromToValidator.valid_values?("ascii_character", from, to)
184
- { from: Regexp.escape(from), to: Regexp.escape(to) }
271
+ Regexer::Models::CharacterRangePattern.new(from, to)
185
272
  end
186
273
 
187
- alias word_character has_word_character
188
- alias whitespace_character has_whitespace_character
189
- alias digit_character has_digit_character
190
274
  alias alphanumeric_character has_alphanumeric_character
191
275
  alias any_character_except_new_line has_any_character_except_new_line
192
276
  alias letter has_letter
@@ -197,5 +281,24 @@ module Regexer
197
281
  alias none_or_one_instance_of has_none_or_one_instance_of
198
282
  alias group has_group
199
283
  alias any_character_in has_any_character_in
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
200
303
  end
201
304
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "regexer/utils/handlers/any_character_in_input_value_handlers/base"
4
+ require "regexer/utils/handlers/any_character_in_input_value_handlers/basic_types_handler"
5
+ require "regexer/utils/handlers/any_character_in_input_value_handlers/character_range_pattern_handler"
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"
8
+
9
+ module Regexer
10
+ module Utils
11
+ # A Utility Class that transforms a given value based on
12
+ # its types so that it is compatible with the
13
+ # has_any_character_in or has_any_character_not_in methods
14
+ class AnyCharacterInValueTransformer
15
+ def self.transform(value)
16
+ basic_types_handler = ::Regexer::Utils::Handlers::AnyCharacterInInputValueHandlers::BasicTypesHandler.new
17
+ from_to_hash_handler = ::Regexer::Utils::Handlers::AnyCharacterInInputValueHandlers::FromToHashHandler.new
18
+ char_range_pattern_handler =
19
+ ::Regexer::Utils::Handlers::AnyCharacterInInputValueHandlers::CharacterRangePatternHandler.new
20
+ regex_shorthand_pattern_handler =
21
+ ::Regexer::Utils::Handlers::AnyCharacterInInputValueHandlers::RegexShorthandPatternHandler.new
22
+
23
+ basic_types_handler.next_handler(char_range_pattern_handler)
24
+ .next_handler(from_to_hash_handler)
25
+ .next_handler(regex_shorthand_pattern_handler)
26
+
27
+ basic_types_handler.handle(value) || ""
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "regexer/utils/handlers/base_handler"
4
+
5
+ module Regexer
6
+ module Utils
7
+ module Handlers
8
+ module AnyCharacterInInputValueHandlers
9
+ # The base class for the handling of input values of
10
+ # has_any_character_in method
11
+ class Base < ::Regexer::Utils::Handlers::BaseHandler
12
+ def next_handler(handler)
13
+ @next_handler = handler
14
+
15
+ handler
16
+ end
17
+
18
+ def give_to_next_handler(value)
19
+ @next_handler&.handle(value) if @next_handler
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "regexer/utils/handlers/any_character_in_input_value_handlers/base"
4
+ require "regexer/utils/pattern_sanitizer"
5
+
6
+ module Regexer
7
+ module Utils
8
+ module Handlers
9
+ module AnyCharacterInInputValueHandlers
10
+ # A handler class to check if input value is one of the valid
11
+ # basic data types e.g. String, Integer, Float
12
+ # If its one of the basic types, just return a sanitized
13
+ # value for regex
14
+ class BasicTypesHandler < Base
15
+ def handle(value)
16
+ if value.instance_of?(String) || value.instance_of?(Integer) || value.instance_of?(Float)
17
+ Regexer::Utils::PatternSanitizer.sanitize(value)
18
+ else
19
+ give_to_next_handler(value)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "regexer/utils/handlers/any_character_in_input_value_handlers/base"
4
+ require "regexer/models/character_range_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 CharacterRangePattern object
11
+ # if true, should return a string based on values in that object
12
+ class CharacterRangePatternHandler < Base
13
+ def handle(value)
14
+ if value.instance_of?(Regexer::Models::CharacterRangePattern)
15
+ "#{value.from}-#{value.to}"
16
+ else
17
+ give_to_next_handler(value)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "regexer/utils/handlers/any_character_in_input_value_handlers/base"
4
+ require "regexer/models/character_range_pattern"
5
+ require "regexer/validators/from_to_validator"
6
+
7
+ module Regexer
8
+ module Utils
9
+ module Handlers
10
+ module AnyCharacterInInputValueHandlers
11
+ # A handler class to check if input value is a Hash with from & to keys only
12
+ # if true, should return a regex escaped string based on values in that Hash
13
+ class FromToHashHandler < Base
14
+ def handle(value)
15
+ if value.instance_of?(Hash) && value.keys == %i[from to]
16
+ Regexer::Validators::FromToValidator.valid_values?("ascii_character", value[:from], value[:to])
17
+ "#{Regexp.escape(value[:from])}-#{Regexp.escape(value[:to])}"
18
+ else
19
+ give_to_next_handler(value)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ 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
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "regexer/exceptions/invalid_value_error"
4
+ require "regexer/models/character_range_pattern"
4
5
  require "regexer/models/pattern"
5
6
 
6
7
  module Regexer
@@ -8,8 +9,12 @@ module Regexer
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
- error_message = "Value should only be of type String or Integer or Hash with from & to keys"
12
- raise Regexer::Exceptions::InvalidValueError, error_message unless valid?(value)
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}"
17
+ raise Regexer::Exceptions::InvalidValueError, message unless valid?(value)
13
18
  end
14
19
 
15
20
  class << self
@@ -27,8 +32,20 @@ module Regexer
27
32
  value.instance_of?(Hash) && value.keys == %i[from to]
28
33
  end
29
34
 
35
+ def character_range?(value)
36
+ value.instance_of?(Regexer::Models::CharacterRangePattern)
37
+ end
38
+
39
+ def regex_shorthand_character_pattern?(value)
40
+ value.instance_of?(Regexer::Models::Pattern) && value.regex_shorthand_character?
41
+ end
42
+
30
43
  def valid?(value)
31
- number?(value) || string?(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)
32
49
  end
33
50
  end
34
51
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Regexer
4
- VERSION = "1.0.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.0.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-08-08 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
@@ -78,8 +78,15 @@ files:
78
78
  - lib/regexer.rb
79
79
  - lib/regexer/exceptions/invalid_value_error.rb
80
80
  - lib/regexer/exceptions/no_block_given_error.rb
81
+ - lib/regexer/models/character_range_pattern.rb
81
82
  - lib/regexer/models/pattern.rb
82
83
  - lib/regexer/pattern_builder.rb
84
+ - lib/regexer/utils/any_character_in_value_transformer.rb
85
+ - lib/regexer/utils/handlers/any_character_in_input_value_handlers/base.rb
86
+ - lib/regexer/utils/handlers/any_character_in_input_value_handlers/basic_types_handler.rb
87
+ - lib/regexer/utils/handlers/any_character_in_input_value_handlers/character_range_pattern_handler.rb
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
83
90
  - lib/regexer/utils/handlers/base_handler.rb
84
91
  - lib/regexer/utils/handlers/quantifier_options_handlers/base.rb
85
92
  - lib/regexer/utils/handlers/quantifier_options_handlers/exactly_option_handler.rb