string_pattern 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +4 -4
  3. data/README.md +20 -21
  4. data/lib/string_pattern.rb +111 -90
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7cce1e48cb65359785eb5d36f0794e04da7ec95e97b16b07a0c3e47d5ed8e347
4
- data.tar.gz: 0733b4a8abb8b182c229b6a2c5086b88c63656f942ce6debd0e19ae3a5c2156a
3
+ metadata.gz: 745a8f7a9278e7d26e8a33a1f8e90e55bcf0808ef4230499aba861f3a7b035ae
4
+ data.tar.gz: da00480f45da0b8446a98be85089e8d14f97430a9be2a85398a846cb00bfc79c
5
5
  SHA512:
6
- metadata.gz: d53ffbec78b439ec29ebbff2f6bd5b95511da43a9a3bf6691d2e63ebb01bd4a7c9aef2e0025f2a4d39366c378d380d580bae6bb473d010487507d21cc64d882c
7
- data.tar.gz: f448aefaf8fdf04b82cf0a37f6a174c7d0cc885e00eff726522ba18f48f59b70bffcb62834f7bcb72e177b517c27f6ccfd5720ed34f81b995c65261a1497ff03
6
+ metadata.gz: d86438c102dd0b413fd5dd2a04fa0f9cf1c47f4802ce835cd79689e328663ad3528eb0d31c9be4ab9cbc5a8b470dc9ba2bee1dbb4730c543c35be5b3a5c34be9
7
+ data.tar.gz: c86bc81b7513a4ae6c06993e185d88017c1aef1dd29b1fd2ce909e0e81f619dc09357b1177277ba092c3024110fdc5f45c3484f1e0384c382414d9ba4c1224b7
data/.yardopts CHANGED
@@ -1,5 +1,5 @@
1
- --readme README.md
2
- --title 'string_pattern - You can easily generate strings supplying a very simple pattern. Also you can validate if a text fulfill an specific pattern or even generate a string following a pattern and returning wrong length, value... for testing your applications.'
3
- --charset utf-8
4
- --markup markdown
1
+ --readme README.md
2
+ --title 'string_pattern - You can easily generate strings supplying a very simple pattern. Also you can validate if a text fulfill an specific pattern or even generate a string following a pattern and returning wrong length, value... for testing your applications.'
3
+ --charset utf-8
4
+ --markup markdown
5
5
  'lib/**/*.rb' - '*.md' - 'LICENSE'
data/README.md CHANGED
@@ -48,32 +48,31 @@ A pattern is a string where we supply these elements "a-b:c" where a is min_leng
48
48
  To generate a string following a pattern you can do it using directly the StringPattern class or the generate method in the class, be aware you can always use also the alias method: gen
49
49
 
50
50
  ```ruby
51
+ require 'string_pattern'
51
52
 
52
- require 'string_pattern'
53
-
54
- #StringPattern class
55
- p StringPattern.generate "10:N"
56
- #>3448910834
57
- p StringPattern.gen "5:X"
58
- #>JDDDK
53
+ #StringPattern class
54
+ p StringPattern.generate "10:N"
55
+ #>3448910834
56
+ p StringPattern.gen "5:X"
57
+ #>JDDDK
59
58
 
60
- #String class
61
- p "4:Nx".gen
62
- #>xaa3
59
+ #String class
60
+ p "4:Nx".gen
61
+ #>xaa3
63
62
 
64
- #Symbol class
65
- p :"10:T".generate
66
- #>AccBdjklñD
63
+ #Symbol class
64
+ p :"10:T".generate
65
+ #>AccBdjklñD
67
66
 
68
- #Array class
69
- p [:"3:N", "fixed", :"3:N"].gen
70
- #>334fixed920
71
- p "(,3:N,) ,3:N,-,2:N,-,2:N".split(',').generate
72
- #>(937) 980-65-05
67
+ #Array class
68
+ p [:"3:N", "fixed", :"3:N"].gen
69
+ #>334fixed920
70
+ p "(,3:N,) ,3:N,-,2:N,-,2:N".split(',').generate
71
+ #>(937) 980-65-05
73
72
 
74
- #Kernel
75
- p gen "3:N"
76
- #>443
73
+ #Kernel
74
+ p gen "3:N"
75
+ #>443
77
76
  ```
78
77
 
79
78
  #### Custom characters
@@ -18,10 +18,11 @@ require_relative 'string/pattern/add_to_ruby' if SP_ADD_TO_RUBY
18
18
  # If true it will check on the strings of the array positions if they have the pattern format and assume in that case that is a pattern.
19
19
  class StringPattern
20
20
  class << self
21
- attr_accessor :national_chars, :optimistic
21
+ attr_accessor :national_chars, :optimistic, :dont_repeat, :cache
22
22
  end
23
23
  @national_chars = (('a'..'z').to_a + ('A'..'Z').to_a).join
24
24
  @optimistic = true
25
+ @cache = Hash.new()
25
26
  NUMBER_SET = ('0'..'9').to_a
26
27
  SPECIAL_SET = [' ', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '=', '{', '}', '[', ']', "'", ';', ':', '?', '>', '<', '`', '|', '/', '"']
27
28
  ALPHA_SET_LOWER = ('a'..'z').to_a
@@ -36,6 +37,7 @@ class StringPattern
36
37
  # min_length, max_length, symbol_type, required_data, excluded_data, data_provided, string_set, all_characters_set
37
38
  ###############################################
38
39
  def StringPattern.analyze(pattern, silent:false)
40
+ return @cache[pattern.to_s] unless @cache[pattern.to_s].nil?
39
41
  min_length, max_length, symbol_type=pattern.to_s.scan(/(\d+)-(\d+):(.+)/)[0]
40
42
  if min_length.nil?
41
43
  min_length, symbol_type=pattern.to_s.scan(/^!?(\d+):(.+)/)[0]
@@ -45,6 +47,7 @@ class StringPattern
45
47
  return pattern.to_s
46
48
  end
47
49
  end
50
+
48
51
  symbol_type='!'+symbol_type if pattern.to_s[0]=='!'
49
52
  min_length=min_length.to_i
50
53
  max_length=max_length.to_i
@@ -57,7 +60,7 @@ class StringPattern
57
60
  a=symbol_type
58
61
  begin_provided=a.index('[')
59
62
  excluded_end_tag=false
60
- if begin_provided!=nil
63
+ unless begin_provided.nil?
61
64
  c=begin_provided+1
62
65
  until c==a.size or (a[c..c]==']' and a[c..c+1]!=']]')
63
66
  if a[c..c+1]==']]'
@@ -117,93 +120,97 @@ class StringPattern
117
120
 
118
121
  required=false
119
122
  required_symbol=''
120
- symbol_type.split(//).each {|stc|
121
- if stc=='/'
122
- if !required
123
- required=true
124
- else
125
- required=false
126
- end
127
- else
128
- if required
129
- required_symbol+=stc
130
- end
131
- end
132
- }
133
- national_set=@national_chars.split(//)
134
-
135
- if !symbol_type['x'].nil?
123
+ if symbol_type.include?("/")
124
+ symbol_type.chars.each {|stc|
125
+ if stc=='/'
126
+ if !required
127
+ required=true
128
+ else
129
+ required=false
130
+ end
131
+ else
132
+ if required
133
+ required_symbol+=stc
134
+ end
135
+ end
136
+ }
137
+ end
138
+
139
+ national_set=@national_chars.chars
140
+
141
+ if symbol_type.include?('L') then
142
+ alpha_set = ALPHA_SET_LOWER + ALPHA_SET_CAPITAL
143
+ elsif symbol_type.include?('x')
136
144
  alpha_set=ALPHA_SET_LOWER
137
- unless symbol_type['X'].nil?
145
+ if symbol_type.include?('X')
138
146
  alpha_set = alpha_set + ALPHA_SET_CAPITAL
139
147
  end
140
- else
141
- if !symbol_type['X'].nil?
142
- alpha_set=ALPHA_SET_CAPITAL
143
- elsif !symbol_type['L'].nil? then
144
- alpha_set = ALPHA_SET_LOWER + ALPHA_SET_CAPITAL
145
- else
146
- alpha_set = ALPHA_SET_LOWER + ALPHA_SET_CAPITAL
147
- end
148
+ elsif symbol_type.include?('X')
149
+ alpha_set=ALPHA_SET_CAPITAL
148
150
  end
149
- unless symbol_type['T'].nil?
151
+ if symbol_type.include?('T')
150
152
  alpha_set=alpha_set+national_set
151
153
  end
152
154
 
153
- unless required_symbol['x'].nil?
154
- required_data.push ALPHA_SET_LOWER
155
- end
156
- unless required_symbol['X'].nil?
157
- required_data.push ALPHA_SET_CAPITAL
158
- end
159
- unless required_symbol['L'].nil?
160
- required_data.push(ALPHA_SET_CAPITAL+ALPHA_SET_LOWER)
161
- end
162
- unless required_symbol['T'].nil?
163
- required_data.push national_set
164
- end
165
- required_symbol=required_symbol.downcase
155
+ unless required_symbol.nil?
156
+ if required_symbol.include?('x')
157
+ required_data.push ALPHA_SET_LOWER
158
+ end
159
+ if required_symbol.include?('X')
160
+ required_data.push ALPHA_SET_CAPITAL
161
+ end
162
+ if required_symbol.include?('L')
163
+ required_data.push(ALPHA_SET_CAPITAL+ALPHA_SET_LOWER)
164
+ end
165
+ if required_symbol.include?('T')
166
+ required_data.push national_set
167
+ end
168
+ required_symbol=required_symbol.downcase
169
+ end
166
170
  string_set=Array.new
167
171
  all_characters_set=ALPHA_SET_CAPITAL+ALPHA_SET_LOWER+NUMBER_SET+SPECIAL_SET+data_provided+national_set
168
172
 
169
- unless symbol_type['_'].nil?
170
- if symbol_type['$'].nil?
173
+ if symbol_type.include?('_')
174
+ unless symbol_type.include?('$')
171
175
  string_set.push(' ')
172
176
  end
173
- unless required_symbol['_'].nil?
177
+ if required_symbol.include?('_')
174
178
  required_data.push([' '])
175
179
  end
176
180
  end
177
181
 
178
182
  symbol_type = symbol_type.downcase
179
183
 
180
- if !symbol_type['x'].nil? or !symbol_type['l'].nil? or !symbol_type['t'].nil?
184
+ if symbol_type.include?('x') or symbol_type.include?('l') or symbol_type.include?('t')
181
185
  string_set = string_set + alpha_set
182
186
  end
183
- unless symbol_type['n'].nil?
187
+ if symbol_type.include?('n')
184
188
  string_set = string_set + NUMBER_SET
185
189
  end
186
- unless symbol_type['$'].nil?
190
+ if symbol_type.include?('$')
187
191
  string_set = string_set + SPECIAL_SET
188
192
  end
189
- unless symbol_type['*'].nil?
193
+ if symbol_type.include?('*')
190
194
  string_set = string_set+all_characters_set
191
195
  end
192
196
  if data_provided.size!=0
193
197
  string_set = string_set + data_provided
194
198
  end
195
- unless required_symbol['n'].nil?
196
- required_data.push NUMBER_SET
197
- end
198
- unless required_symbol['$'].nil?
199
- required_data.push SPECIAL_SET
200
- end
201
- if excluded_data.size>0
199
+ unless required_symbol.empty?
200
+ if required_symbol.include?('n')
201
+ required_data.push NUMBER_SET
202
+ end
203
+ if required_symbol.include?('$')
204
+ required_data.push SPECIAL_SET
205
+ end
206
+ end
207
+ unless excluded_data.empty?
202
208
  string_set=string_set-excluded_data.flatten
203
209
  end
204
210
  string_set.uniq!
205
- return Pattern.new(min_length, max_length, symbol_type, required_data, excluded_data, data_provided,
211
+ @cache[pattern.to_s]=Pattern.new(min_length, max_length, symbol_type, required_data, excluded_data, data_provided,
206
212
  string_set, all_characters_set)
213
+ return @cache[pattern.to_s]
207
214
  end
208
215
 
209
216
  ###############################################
@@ -273,7 +280,7 @@ class StringPattern
273
280
  if expected_errors.kind_of?(Symbol)
274
281
  expected_errors=[expected_errors]
275
282
  end
276
-
283
+
277
284
  if pattern.kind_of?(Array)
278
285
  pattern.each {|pat|
279
286
  if pat.kind_of?(Symbol)
@@ -295,7 +302,7 @@ class StringPattern
295
302
  }
296
303
  return string
297
304
  elsif pattern.kind_of?(String) or pattern.kind_of?(Symbol)
298
- patt=StringPattern.analyze(pattern)
305
+ patt=StringPattern.analyze(pattern)
299
306
  min_length=patt.min_length
300
307
  max_length=patt.max_length
301
308
  symbol_type=patt.symbol_type
@@ -305,23 +312,27 @@ class StringPattern
305
312
  string_set=patt.string_set
306
313
  all_characters_set=patt.all_characters_set
307
314
 
308
- required_chars=Array.new
309
- required_data.each {|rd|
310
- required_chars<<rd if rd.size==1
311
- }
312
- if (required_chars.flatten & excluded_data.flatten).size>0
313
- puts "pattern argument not valid on StringPattern.generate, a character cannot be required and excluded at the same time: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
314
- return ''
315
- end
316
-
317
- string_set_not_allowed=all_characters_set-string_set
315
+ required_chars=Array.new
316
+ unless required_data.size==0
317
+ required_data.each {|rd|
318
+ required_chars<<rd if rd.size==1
319
+ }
320
+ unless excluded_data.size==0
321
+ if (required_chars.flatten & excluded_data.flatten).size>0
322
+ puts "pattern argument not valid on StringPattern.generate, a character cannot be required and excluded at the same time: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
323
+ return ''
324
+ end
325
+ end
326
+ end
327
+ string_set_not_allowed=Array.new
318
328
 
319
329
  else
320
330
  puts "pattern argument not valid on StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
321
331
  return pattern.to_s
322
332
  end
323
333
 
324
- allow_empty=false
334
+
335
+ allow_empty=false
325
336
  deny_pattern=false
326
337
  if symbol_type[0..0]=='!'
327
338
  deny_pattern=true
@@ -336,6 +347,7 @@ class StringPattern
336
347
  elsif symbol_type[0..0]=='0' then
337
348
  allow_empty=true
338
349
  end
350
+
339
351
  if expected_errors.include?(:min_length) or expected_errors.include?(:length) or
340
352
  expected_errors.include?(:max_length)
341
353
  allow_empty=!allow_empty
@@ -352,8 +364,8 @@ class StringPattern
352
364
  expected_errors_left=expected_errors.dup
353
365
 
354
366
  symbol_type=symbol_type_orig
355
-
356
- unless deny_pattern
367
+
368
+ unless deny_pattern
357
369
  if required_data.size==0 and expected_errors_left.include?(:required_data)
358
370
  puts "required data not supplied on pattern so it won't be possible to generate a wrong string. StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
359
371
  return ''
@@ -364,9 +376,12 @@ class StringPattern
364
376
  return ''
365
377
  end
366
378
 
367
- if string_set_not_allowed.size==0 and expected_errors_left.include?(:string_set_not_allowed)
368
- puts "all characters are allowed so it won't be possible to generate a wrong string. StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
369
- return ''
379
+ if expected_errors_left.include?(:string_set_not_allowed)
380
+ string_set_not_allowed=all_characters_set-string_set
381
+ if string_set_not_allowed.size==0 then
382
+ puts "all characters are allowed so it won't be possible to generate a wrong string. StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
383
+ return ''
384
+ end
370
385
  end
371
386
  end
372
387
 
@@ -416,9 +431,12 @@ class StringPattern
416
431
  expected_errors_left.delete(:excluded_data)
417
432
  end
418
433
 
419
- if string_set_not_allowed.size==0 and expected_errors_left.include?(:string_set_not_allowed)
420
- expected_errors_left.delete(:string_set_not_allowed)
421
- end
434
+ if expected_errors_left.include?(:string_set_not_allowed)
435
+ string_set_not_allowed=all_characters_set-string_set
436
+ if string_set_not_allowed.size==0
437
+ expected_errors_left.delete(:string_set_not_allowed)
438
+ end
439
+ end
422
440
 
423
441
  if symbol_type=='!@' and expected_errors_left.size==0 and !expected_errors.include?(:length) and
424
442
  (expected_errors.include?(:required_data) or expected_errors.include?(:excluded_data))
@@ -427,7 +445,6 @@ class StringPattern
427
445
 
428
446
  end
429
447
 
430
-
431
448
  string = ''
432
449
  if symbol_type!='@' and symbol_type!='!@' and length!=0 and string_set.size!=0
433
450
  if string_set.size!=0
@@ -437,8 +454,8 @@ class StringPattern
437
454
  if required_data.size>0
438
455
  positions_to_set=(0..(string.size-1)).to_a
439
456
  required_data.each {|rd|
440
- if (string.split(//) & rd).size>0
441
- rd_to_set=(string.split(//) & rd).sample
457
+ if (string.chars & rd).size>0
458
+ rd_to_set=(string.chars & rd).sample
442
459
  else
443
460
  rd_to_set=rd.sample
444
461
  end
@@ -458,14 +475,15 @@ class StringPattern
458
475
  }
459
476
  end
460
477
  excluded_data.each {|ed|
461
- if (string.split(//) & ed).size>0
462
- (string.split(//) & ed).each {|s|
478
+ if (string.chars & ed).size>0
479
+ (string.chars & ed).each {|s|
463
480
  string.gsub!(s, string_set.sample)
464
481
  }
465
482
  end
466
483
  }
467
484
 
468
485
  if expected_errors_left.include?(:value)
486
+ string_set_not_allowed=all_characters_set-string_set if string_set_not_allowed.size==0
469
487
  if string_set_not_allowed.size==0
470
488
  puts "Not possible to generate a non valid string on StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
471
489
  return ''
@@ -493,11 +511,14 @@ class StringPattern
493
511
  expected_errors_left.delete(:excluded_data)
494
512
  end
495
513
 
496
- if expected_errors_left.include?(:string_set_not_allowed) and string_set_not_allowed.size>0
497
- (rand(string.size)+1).times {
498
- string[rand(string.size)]=string_set_not_allowed.sample
499
- }
500
- expected_errors_left.delete(:string_set_not_allowed)
514
+ if expected_errors_left.include?(:string_set_not_allowed)
515
+ string_set_not_allowed=all_characters_set-string_set if string_set_not_allowed.size==0
516
+ if string_set_not_allowed.size>0
517
+ (rand(string.size)+1).times {
518
+ string[rand(string.size)]=string_set_not_allowed.sample
519
+ }
520
+ expected_errors_left.delete(:string_set_not_allowed)
521
+ end
501
522
  end
502
523
 
503
524
  elsif (symbol_type=='@' or symbol_type=='!@') and length>0
@@ -797,7 +818,7 @@ class StringPattern
797
818
  if symbol_type!='@'
798
819
  if required_data.size>0
799
820
  required_data.each {|rd|
800
- if (text_to_validate.split(//) & rd).size==0
821
+ if (text_to_validate.chars & rd).size==0
801
822
  detected_errors.push(:value)
802
823
  detected_errors.push(:required_data)
803
824
  break
@@ -805,13 +826,13 @@ class StringPattern
805
826
  }
806
827
  end
807
828
  if excluded_data.size>0
808
- if (excluded_data & text_to_validate.split(//)).size>0
829
+ if (excluded_data & text_to_validate.chars).size>0
809
830
  detected_errors.push(:value)
810
831
  detected_errors.push(:excluded_data)
811
832
  end
812
833
  end
813
834
  string_set_not_allowed=all_characters_set-string_set
814
- text_to_validate.split(//).each {|st|
835
+ text_to_validate.chars.each {|st|
815
836
  if string_set_not_allowed.include?(st)
816
837
  detected_errors.push(:value)
817
838
  detected_errors.push(:string_set_not_allowed)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: string_pattern
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mario Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-22 00:00:00.000000000 Z
11
+ date: 2018-08-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: You can easily generate strings supplying a very simple pattern. Also
14
14
  you can validate if a text fulfill an specific pattern or even generate a string