string_pattern 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -0
  3. data/lib/string_pattern.rb +366 -340
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 745a8f7a9278e7d26e8a33a1f8e90e55bcf0808ef4230499aba861f3a7b035ae
4
- data.tar.gz: da00480f45da0b8446a98be85089e8d14f97430a9be2a85398a846cb00bfc79c
3
+ metadata.gz: dac5331eb5b7b3a9aadc5f207306069595b542eee8027ae7f73864f00efea9d4
4
+ data.tar.gz: 20160f3cead72e7a75e6bdbe4da25374e7fb93751cf15bcc78f564f9d37c107c
5
5
  SHA512:
6
- metadata.gz: d86438c102dd0b413fd5dd2a04fa0f9cf1c47f4802ce835cd79689e328663ad3528eb0d31c9be4ab9cbc5a8b470dc9ba2bee1dbb4730c543c35be5b3a5c34be9
7
- data.tar.gz: c86bc81b7513a4ae6c06993e185d88017c1aef1dd29b1fd2ce909e0e81f619dc09357b1177277ba092c3024110fdc5f45c3484f1e0384c382414d9ba4c1224b7
6
+ metadata.gz: 936d83dc4c33e3ca09f209b6c6cd03d7d8b05ad530e7ea83e027ab1c0c29cbae579fbafeec8886d0968ee8c754e587310e80608a06d6e9df6ba705b3b15791d0
7
+ data.tar.gz: 11690843c4c23514d4754991da06ea0d762794633b01aa0df82ad1acef1e6c94fe45f2c18aa9c0dbfc1a585aafe5077e0533ac541ffe685db0591ec3f17e0734
data/README.md CHANGED
@@ -75,6 +75,16 @@ p gen "3:N"
75
75
  #>443
76
76
  ```
77
77
 
78
+ If you want to generate for example 1000 strings and be sure all those strings are different you can use:
79
+
80
+ ```ruby
81
+ StringPattern.dont_repeat = true #default: false
82
+ 1000.times {
83
+ puts :"6-20:L/N/".gen
84
+ }
85
+ StringPattern.cache_values = Hash.new() #to clean the generated values from memory
86
+ ```
87
+
78
88
  #### Custom characters
79
89
 
80
90
  Also it's possible to provided the characters we want. To do that we'll use the symbol_type [characters]
@@ -16,13 +16,17 @@ require_relative 'string/pattern/add_to_ruby' if SP_ADD_TO_RUBY
16
16
  # Set of characters that will be used when using T pattern
17
17
  # optimistic: (TrueFalse, default: true)
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
+ # dont_repeat: (TrueFalse, default: false)
20
+ # If you want to generate for example 1000 strings and be sure all those strings are different you can set it to true
19
21
  class StringPattern
20
22
  class << self
21
- attr_accessor :national_chars, :optimistic, :dont_repeat, :cache
23
+ attr_accessor :national_chars, :optimistic, :dont_repeat, :cache, :cache_values
22
24
  end
23
25
  @national_chars = (('a'..'z').to_a + ('A'..'Z').to_a).join
24
26
  @optimistic = true
25
27
  @cache = Hash.new()
28
+ @cache_values = Hash.new()
29
+ @dont_repeat = false
26
30
  NUMBER_SET = ('0'..'9').to_a
27
31
  SPECIAL_SET = [' ', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '=', '{', '}', '[', ']', "'", ';', ':', '?', '>', '<', '`', '|', '/', '"']
28
32
  ALPHA_SET_LOWER = ('a'..'z').to_a
@@ -273,383 +277,405 @@ class StringPattern
273
277
  # the generated string
274
278
  ###############################################
275
279
  def StringPattern.generate(pattern, expected_errors: [], **synonyms)
276
- string=''
280
+ tries = 0
281
+ begin
282
+ good_result = true
283
+ tries+=1
284
+ string=''
277
285
 
278
- expected_errors=synonyms[:errors] if synonyms.keys.include?(:errors)
286
+ expected_errors=synonyms[:errors] if synonyms.keys.include?(:errors)
279
287
 
280
- if expected_errors.kind_of?(Symbol)
281
- expected_errors=[expected_errors]
282
- end
283
-
284
- if pattern.kind_of?(Array)
285
- pattern.each {|pat|
286
- if pat.kind_of?(Symbol)
287
- if pat.to_s.scan(/^!?\d+-?\d*:.+/).size>0
288
- string<<StringPattern.generate(pat.to_s, expected_errors: expected_errors)
289
- else
290
- string<<pat.to_s
291
- end
292
- elsif pat.kind_of?(String) then
293
- if @optimistic and pat.to_s.scan(/^!?\d+-?\d*:.+/).size>0
294
- string<<StringPattern.generate(pat.to_s, expected_errors: expected_errors)
295
- else
296
- string<<pat
297
- end
298
- else
299
- puts "StringPattern.generate: it seems you supplied wrong array of patterns: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
300
- return ''
301
- end
302
- }
303
- return string
304
- elsif pattern.kind_of?(String) or pattern.kind_of?(Symbol)
305
- patt=StringPattern.analyze(pattern)
306
- min_length=patt.min_length
307
- max_length=patt.max_length
308
- symbol_type=patt.symbol_type
309
-
310
- required_data=patt.required_data
311
- excluded_data=patt.excluded_data
312
- string_set=patt.string_set
313
- all_characters_set=patt.all_characters_set
314
-
315
- required_chars=Array.new
316
- unless required_data.size==0
317
- required_data.each {|rd|
318
- required_chars<<rd if rd.size==1
288
+ if expected_errors.kind_of?(Symbol)
289
+ expected_errors=[expected_errors]
290
+ end
291
+
292
+ if pattern.kind_of?(Array)
293
+ pattern.each {|pat|
294
+ if pat.kind_of?(Symbol)
295
+ if pat.to_s.scan(/^!?\d+-?\d*:.+/).size>0
296
+ string<<StringPattern.generate(pat.to_s, expected_errors: expected_errors)
297
+ else
298
+ string<<pat.to_s
299
+ end
300
+ elsif pat.kind_of?(String) then
301
+ if @optimistic and pat.to_s.scan(/^!?\d+-?\d*:.+/).size>0
302
+ string<<StringPattern.generate(pat.to_s, expected_errors: expected_errors)
303
+ else
304
+ string<<pat
305
+ end
306
+ else
307
+ puts "StringPattern.generate: it seems you supplied wrong array of patterns: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
308
+ return ''
309
+ end
319
310
  }
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 ''
311
+ return string
312
+ elsif pattern.kind_of?(String) or pattern.kind_of?(Symbol)
313
+ patt=StringPattern.analyze(pattern)
314
+ min_length=patt.min_length
315
+ max_length=patt.max_length
316
+ symbol_type=patt.symbol_type
317
+
318
+ required_data=patt.required_data
319
+ excluded_data=patt.excluded_data
320
+ string_set=patt.string_set
321
+ all_characters_set=patt.all_characters_set
322
+
323
+ required_chars=Array.new
324
+ unless required_data.size==0
325
+ required_data.each {|rd|
326
+ required_chars<<rd if rd.size==1
327
+ }
328
+ unless excluded_data.size==0
329
+ if (required_chars.flatten & excluded_data.flatten).size>0
330
+ 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}"
331
+ return ''
332
+ end
324
333
  end
325
334
  end
326
- end
327
- string_set_not_allowed=Array.new
335
+ string_set_not_allowed=Array.new
328
336
 
329
- else
330
- puts "pattern argument not valid on StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
331
- return pattern.to_s
332
- end
333
-
334
-
335
- allow_empty=false
336
- deny_pattern=false
337
- if symbol_type[0..0]=='!'
338
- deny_pattern=true
339
- possible_errors=[:length, :value, :required_data, :excluded_data, :string_set_not_allowed]
340
- (rand(possible_errors.size)+1).times {
341
- expected_errors<<possible_errors.sample
342
- }
343
- expected_errors.uniq!
344
- if symbol_type[1..1]=='0'
345
- allow_empty=true
346
- end
347
- elsif symbol_type[0..0]=='0' then
348
- allow_empty=true
349
- end
350
-
351
- if expected_errors.include?(:min_length) or expected_errors.include?(:length) or
352
- expected_errors.include?(:max_length)
353
- allow_empty=!allow_empty
354
- elsif expected_errors.include?(:value) or
355
- expected_errors.include?(:excluded_data) or
356
- expected_errors.include?(:required_data) or
357
- expected_errors.include?(:string_set_not_allowed) and allow_empty
358
- allow_empty=false
359
- end
337
+ else
338
+ puts "pattern argument not valid on StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
339
+ return pattern.to_s
340
+ end
360
341
 
361
- length=min_length
362
- symbol_type_orig=symbol_type
363
342
 
364
- expected_errors_left=expected_errors.dup
343
+ allow_empty=false
344
+ deny_pattern=false
345
+ if symbol_type[0..0]=='!'
346
+ deny_pattern=true
347
+ possible_errors=[:length, :value, :required_data, :excluded_data, :string_set_not_allowed]
348
+ (rand(possible_errors.size)+1).times {
349
+ expected_errors<<possible_errors.sample
350
+ }
351
+ expected_errors.uniq!
352
+ if symbol_type[1..1]=='0'
353
+ allow_empty=true
354
+ end
355
+ elsif symbol_type[0..0]=='0' then
356
+ allow_empty=true
357
+ end
358
+
359
+ if expected_errors.include?(:min_length) or expected_errors.include?(:length) or
360
+ expected_errors.include?(:max_length)
361
+ allow_empty=!allow_empty
362
+ elsif expected_errors.include?(:value) or
363
+ expected_errors.include?(:excluded_data) or
364
+ expected_errors.include?(:required_data) or
365
+ expected_errors.include?(:string_set_not_allowed) and allow_empty
366
+ allow_empty=false
367
+ end
365
368
 
366
- symbol_type=symbol_type_orig
367
-
368
- unless deny_pattern
369
- if required_data.size==0 and expected_errors_left.include?(:required_data)
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}"
371
- return ''
372
- end
369
+ length=min_length
370
+ symbol_type_orig=symbol_type
373
371
 
374
- if excluded_data.size==0 and expected_errors_left.include?(:excluded_data)
375
- puts "excluded 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}"
376
- return ''
377
- end
372
+ expected_errors_left=expected_errors.dup
378
373
 
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}"
374
+ symbol_type=symbol_type_orig
375
+
376
+ unless deny_pattern
377
+ if required_data.size==0 and expected_errors_left.include?(:required_data)
378
+ 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}"
383
379
  return ''
384
- end
385
- end
386
- end
387
-
388
- if expected_errors_left.include?(:min_length) or
389
- expected_errors_left.include?(:max_length) or
390
- expected_errors_left.include?(:length)
391
- if expected_errors_left.include?(:min_length) or
392
- (min_length>0 and expected_errors_left.include?(:length) and rand(2)==0)
393
- if min_length>0
394
- if allow_empty
395
- length=rand(min_length).to_i
396
- else
397
- length=rand(min_length-1).to_i+1
398
- end
399
- if required_data.size>length and required_data.size<min_length
400
- length=required_data.size
401
- end
402
- expected_errors_left.delete(:length)
403
- expected_errors_left.delete(:min_length)
404
- else
405
- puts "min_length is 0 so it won't be possible to generate a wrong string smaller than 0 characters. StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
406
- return ''
407
- end
408
- elsif expected_errors_left.include?(:max_length) or expected_errors_left.include?(:length)
409
- length=max_length+1+rand(max_length).to_i
410
- expected_errors_left.delete(:length)
411
- expected_errors_left.delete(:max_length)
412
- end
413
- else
414
- if allow_empty and rand(7)==1
415
- length=0
416
- else
417
- if max_length==min_length
418
- length=min_length
419
- else
420
- length=min_length + rand(max_length - min_length + 1)
421
- end
422
- end
423
- end
380
+ end
424
381
 
425
- if deny_pattern
426
- if required_data.size==0 and expected_errors_left.include?(:required_data)
427
- expected_errors_left.delete(:required_data)
428
- end
382
+ if excluded_data.size==0 and expected_errors_left.include?(:excluded_data)
383
+ puts "excluded 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}"
384
+ return ''
385
+ end
429
386
 
430
- if excluded_data.size==0 and expected_errors_left.include?(:excluded_data)
431
- expected_errors_left.delete(:excluded_data)
432
- end
387
+ if expected_errors_left.include?(:string_set_not_allowed)
388
+ string_set_not_allowed=all_characters_set-string_set
389
+ if string_set_not_allowed.size==0 then
390
+ 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}"
391
+ return ''
392
+ end
393
+ end
394
+ end
433
395
 
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)
396
+ if expected_errors_left.include?(:min_length) or
397
+ expected_errors_left.include?(:max_length) or
398
+ expected_errors_left.include?(:length)
399
+ if expected_errors_left.include?(:min_length) or
400
+ (min_length>0 and expected_errors_left.include?(:length) and rand(2)==0)
401
+ if min_length>0
402
+ if allow_empty
403
+ length=rand(min_length).to_i
404
+ else
405
+ length=rand(min_length-1).to_i+1
406
+ end
407
+ if required_data.size>length and required_data.size<min_length
408
+ length=required_data.size
409
+ end
410
+ expected_errors_left.delete(:length)
411
+ expected_errors_left.delete(:min_length)
412
+ else
413
+ puts "min_length is 0 so it won't be possible to generate a wrong string smaller than 0 characters. StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
414
+ return ''
415
+ end
416
+ elsif expected_errors_left.include?(:max_length) or expected_errors_left.include?(:length)
417
+ length=max_length+1+rand(max_length).to_i
418
+ expected_errors_left.delete(:length)
419
+ expected_errors_left.delete(:max_length)
420
+ end
421
+ else
422
+ if allow_empty and rand(7)==1
423
+ length=0
424
+ else
425
+ if max_length==min_length
426
+ length=min_length
427
+ else
428
+ length=min_length + rand(max_length - min_length + 1)
429
+ end
430
+ end
438
431
  end
439
- end
440
432
 
441
- if symbol_type=='!@' and expected_errors_left.size==0 and !expected_errors.include?(:length) and
442
- (expected_errors.include?(:required_data) or expected_errors.include?(:excluded_data))
443
- expected_errors_left.push(:value)
444
- end
433
+ if deny_pattern
434
+ if required_data.size==0 and expected_errors_left.include?(:required_data)
435
+ expected_errors_left.delete(:required_data)
436
+ end
445
437
 
446
- end
438
+ if excluded_data.size==0 and expected_errors_left.include?(:excluded_data)
439
+ expected_errors_left.delete(:excluded_data)
440
+ end
447
441
 
448
- string = ''
449
- if symbol_type!='@' and symbol_type!='!@' and length!=0 and string_set.size!=0
450
- if string_set.size!=0
451
- 1.upto(length) {|i| string << string_set.sample.to_s
452
- }
453
- end
454
- if required_data.size>0
455
- positions_to_set=(0..(string.size-1)).to_a
456
- required_data.each {|rd|
457
- if (string.chars & rd).size>0
458
- rd_to_set=(string.chars & rd).sample
459
- else
460
- rd_to_set=rd.sample
461
- end
462
- if ((0 ... string.length).find_all {|i| string[i, 1] == rd_to_set}).size==0
463
- if positions_to_set.size==0
464
- puts "pattern not valid on StringPattern.generate, not possible to generate a valid string: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
465
- return ''
466
- else
467
- k=positions_to_set.sample
468
- string[k]=rd_to_set
469
- positions_to_set.delete(k)
470
- end
471
- else
472
- k=((0 ... string.length).find_all {|i| string[i, 1] == rd_to_set}).sample
473
- positions_to_set.delete(k)
474
- end
475
- }
476
- end
477
- excluded_data.each {|ed|
478
- if (string.chars & ed).size>0
479
- (string.chars & ed).each {|s|
480
- string.gsub!(s, string_set.sample)
481
- }
482
- end
483
- }
442
+ if expected_errors_left.include?(:string_set_not_allowed)
443
+ string_set_not_allowed=all_characters_set-string_set
444
+ if string_set_not_allowed.size==0
445
+ expected_errors_left.delete(:string_set_not_allowed)
446
+ end
447
+ end
484
448
 
485
- if expected_errors_left.include?(:value)
486
- string_set_not_allowed=all_characters_set-string_set if string_set_not_allowed.size==0
487
- if string_set_not_allowed.size==0
488
- puts "Not possible to generate a non valid string on StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
489
- return ''
490
- end
491
- (rand(string.size)+1).times {
492
- string[rand(string.size)]=(all_characters_set-string_set).sample
493
- }
494
- expected_errors_left.delete(:value)
495
- end
449
+ if symbol_type=='!@' and expected_errors_left.size==0 and !expected_errors.include?(:length) and
450
+ (expected_errors.include?(:required_data) or expected_errors.include?(:excluded_data))
451
+ expected_errors_left.push(:value)
452
+ end
496
453
 
497
- if expected_errors_left.include?(:required_data) and required_data.size>0
498
- (rand(required_data.size)+1).times {
499
- chars_to_remove=required_data.sample
500
- chars_to_remove.each {|char_to_remove|
501
- string.gsub!(char_to_remove, (string_set-chars_to_remove).sample)
502
- }
503
- }
504
- expected_errors_left.delete(:required_data)
505
- end
454
+ end
506
455
 
507
- if expected_errors_left.include?(:excluded_data) and excluded_data.size>0
508
- (rand(string.size)+1).times {
509
- string[rand(string.size)]=excluded_data.sample.sample
510
- }
511
- expected_errors_left.delete(:excluded_data)
512
- end
456
+ string = ''
457
+ if symbol_type!='@' and symbol_type!='!@' and length!=0 and string_set.size!=0
458
+ if string_set.size!=0
459
+ 1.upto(length) {|i| string << string_set.sample.to_s
460
+ }
461
+ end
462
+ if required_data.size>0
463
+ positions_to_set=(0..(string.size-1)).to_a
464
+ required_data.each {|rd|
465
+ if (string.chars & rd).size>0
466
+ rd_to_set=(string.chars & rd).sample
467
+ else
468
+ rd_to_set=rd.sample
469
+ end
470
+ if ((0 ... string.length).find_all {|i| string[i, 1] == rd_to_set}).size==0
471
+ if positions_to_set.size==0
472
+ puts "pattern not valid on StringPattern.generate, not possible to generate a valid string: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
473
+ return ''
474
+ else
475
+ k=positions_to_set.sample
476
+ string[k]=rd_to_set
477
+ positions_to_set.delete(k)
478
+ end
479
+ else
480
+ k=((0 ... string.length).find_all {|i| string[i, 1] == rd_to_set}).sample
481
+ positions_to_set.delete(k)
482
+ end
483
+ }
484
+ end
485
+ excluded_data.each {|ed|
486
+ if (string.chars & ed).size>0
487
+ (string.chars & ed).each {|s|
488
+ string.gsub!(s, string_set.sample)
489
+ }
490
+ end
491
+ }
513
492
 
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
493
+ if expected_errors_left.include?(:value)
494
+ string_set_not_allowed=all_characters_set-string_set if string_set_not_allowed.size==0
495
+ if string_set_not_allowed.size==0
496
+ puts "Not possible to generate a non valid string on StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
497
+ return ''
498
+ end
517
499
  (rand(string.size)+1).times {
518
- string[rand(string.size)]=string_set_not_allowed.sample
500
+ string[rand(string.size)]=(all_characters_set-string_set).sample
519
501
  }
520
- expected_errors_left.delete(:string_set_not_allowed)
521
- end
522
- end
502
+ expected_errors_left.delete(:value)
503
+ end
523
504
 
524
- elsif (symbol_type=='@' or symbol_type=='!@') and length>0
525
- if min_length>6 and length<6
526
- length=6
527
- end
528
- if deny_pattern and
529
- (expected_errors.include?(:required_data) or expected_errors.include?(:excluded_data) or
530
- expected_errors.include?(:string_set_not_allowed))
531
- expected_errors_left.push(:value)
532
- expected_errors.push(:value)
533
- expected_errors.uniq!
534
- expected_errors_left.uniq!
535
- end
505
+ if expected_errors_left.include?(:required_data) and required_data.size>0
506
+ (rand(required_data.size)+1).times {
507
+ chars_to_remove=required_data.sample
508
+ chars_to_remove.each {|char_to_remove|
509
+ string.gsub!(char_to_remove, (string_set-chars_to_remove).sample)
510
+ }
511
+ }
512
+ expected_errors_left.delete(:required_data)
513
+ end
536
514
 
537
- expected_errors_left_orig=expected_errors_left.dup
538
- tries=0
539
- begin
540
- expected_errors_left=expected_errors_left_orig.dup
541
- tries+=1
542
- string=''
543
- alpha_set=ALPHA_SET_LOWER + ALPHA_SET_CAPITAL
544
- string_set=alpha_set + NUMBER_SET + ['.'] + ['_'] + ['-']
545
- string_set_not_allowed=all_characters_set-string_set
515
+ if expected_errors_left.include?(:excluded_data) and excluded_data.size>0
516
+ (rand(string.size)+1).times {
517
+ string[rand(string.size)]=excluded_data.sample.sample
518
+ }
519
+ expected_errors_left.delete(:excluded_data)
520
+ end
546
521
 
547
- extension='.'
548
- at_sign='@'
522
+ if expected_errors_left.include?(:string_set_not_allowed)
523
+ string_set_not_allowed=all_characters_set-string_set if string_set_not_allowed.size==0
524
+ if string_set_not_allowed.size>0
525
+ (rand(string.size)+1).times {
526
+ string[rand(string.size)]=string_set_not_allowed.sample
527
+ }
528
+ expected_errors_left.delete(:string_set_not_allowed)
529
+ end
530
+ end
549
531
 
550
- if expected_errors_left.include?(:value)
551
- if rand(2)==1
552
- extension=(all_characters_set-['.']).sample
553
- expected_errors_left.delete(:value)
554
- expected_errors_left.delete(:required_data)
555
- end
556
- if rand(2)==1
557
- 1.upto(rand(7)) {|i| extension << alpha_set.sample.downcase
558
- }
559
- (rand(extension.size)+1).times {
560
- extension[rand(extension.size)]=(string_set-alpha_set-['.']).sample
561
- }
562
- expected_errors_left.delete(:value)
563
- else
564
- 1.upto(rand(3)+2) {|i| extension << alpha_set.sample.downcase
565
- }
566
- end
567
- if rand(2)==1
568
- at_sign=(string_set-['@']).sample
569
- expected_errors_left.delete(:value)
570
- expected_errors_left.delete(:required_data)
571
- end
572
- else
573
- if length>6
574
- 1.upto(rand(3)+2) {|i| extension << alpha_set.sample.downcase
575
- }
576
- else
577
- 1.upto(2) {|i| extension << alpha_set.sample.downcase
578
- }
579
- end
580
- end
581
- length_e=length-extension.size - 1
582
- length1=rand(length_e-1) + 1
583
- length2=length_e-length1
584
- 1.upto(length1) {|i| string << string_set.sample}
532
+ elsif (symbol_type=='@' or symbol_type=='!@') and length>0
533
+ if min_length>6 and length<6
534
+ length=6
535
+ end
536
+ if deny_pattern and
537
+ (expected_errors.include?(:required_data) or expected_errors.include?(:excluded_data) or
538
+ expected_errors.include?(:string_set_not_allowed))
539
+ expected_errors_left.push(:value)
540
+ expected_errors.push(:value)
541
+ expected_errors.uniq!
542
+ expected_errors_left.uniq!
543
+ end
585
544
 
586
- string << at_sign
545
+ expected_errors_left_orig=expected_errors_left.dup
546
+ tries=0
547
+ begin
548
+ expected_errors_left=expected_errors_left_orig.dup
549
+ tries+=1
550
+ string=''
551
+ alpha_set=ALPHA_SET_LOWER + ALPHA_SET_CAPITAL
552
+ string_set=alpha_set + NUMBER_SET + ['.'] + ['_'] + ['-']
553
+ string_set_not_allowed=all_characters_set-string_set
554
+
555
+ extension='.'
556
+ at_sign='@'
557
+
558
+ if expected_errors_left.include?(:value)
559
+ if rand(2)==1
560
+ extension=(all_characters_set-['.']).sample
561
+ expected_errors_left.delete(:value)
562
+ expected_errors_left.delete(:required_data)
563
+ end
564
+ if rand(2)==1
565
+ 1.upto(rand(7)) {|i| extension << alpha_set.sample.downcase
566
+ }
567
+ (rand(extension.size)+1).times {
568
+ extension[rand(extension.size)]=(string_set-alpha_set-['.']).sample
569
+ }
570
+ expected_errors_left.delete(:value)
571
+ else
572
+ 1.upto(rand(3)+2) {|i| extension << alpha_set.sample.downcase
573
+ }
574
+ end
575
+ if rand(2)==1
576
+ at_sign=(string_set-['@']).sample
577
+ expected_errors_left.delete(:value)
578
+ expected_errors_left.delete(:required_data)
579
+ end
580
+ else
581
+ if length>6
582
+ 1.upto(rand(3)+2) {|i| extension << alpha_set.sample.downcase
583
+ }
584
+ else
585
+ 1.upto(2) {|i| extension << alpha_set.sample.downcase
586
+ }
587
+ end
588
+ end
589
+ length_e=length-extension.size - 1
590
+ length1=rand(length_e-1) + 1
591
+ length2=length_e-length1
592
+ 1.upto(length1) {|i| string << string_set.sample}
587
593
 
588
- domain=''
589
- domain_set=alpha_set + NUMBER_SET + ['.'] + ['-']
590
- 1.upto(length2) {|i| domain << domain_set.sample.downcase
591
- }
594
+ string << at_sign
592
595
 
593
- if expected_errors.include?(:value) and rand(2)==1 and domain.size>0
594
- (rand(domain.size)+1).times {
595
- domain[rand(domain.size)]=(all_characters_set-domain_set).sample
596
- }
597
- expected_errors_left.delete(:value)
598
- end
599
- string << domain << extension
596
+ domain=''
597
+ domain_set=alpha_set + NUMBER_SET + ['.'] + ['-']
598
+ 1.upto(length2) {|i| domain << domain_set.sample.downcase
599
+ }
600
600
 
601
- if expected_errors_left.include?(:value) or expected_errors_left.include?(:string_set_not_allowed)
602
- (rand(string.size)+1).times {
603
- string[rand(string.size)]=string_set_not_allowed.sample
604
- }
605
- expected_errors_left.delete(:value)
606
- expected_errors_left.delete(:string_set_not_allowed)
607
- end
601
+ if expected_errors.include?(:value) and rand(2)==1 and domain.size>0
602
+ (rand(domain.size)+1).times {
603
+ domain[rand(domain.size)]=(all_characters_set-domain_set).sample
604
+ }
605
+ expected_errors_left.delete(:value)
606
+ end
607
+ string << domain << extension
608
+
609
+ if expected_errors_left.include?(:value) or expected_errors_left.include?(:string_set_not_allowed)
610
+ (rand(string.size)+1).times {
611
+ string[rand(string.size)]=string_set_not_allowed.sample
612
+ }
613
+ expected_errors_left.delete(:value)
614
+ expected_errors_left.delete(:string_set_not_allowed)
615
+ end
608
616
 
609
- error_regular_expression=false
617
+ error_regular_expression=false
610
618
 
611
- if deny_pattern and expected_errors.include?(:length)
612
- good_result=true #it is already with wrong length
613
- else
614
- # I'm doing this because many times the regular expression checking hangs with these characters
615
- wrong=%w(.. __ -- ._ _. .- -. _- -_ @. @_ @- .@ _@ -@ @@)
616
- if !(Regexp.union(*wrong) === string) #don't include any or the wrong strings
617
- if string.index('@').to_i>0 and
618
- string[0..(string.index('@')-1)].scan(/([a-z0-9]+([\+\._\-][a-z0-9]|)*)/i).join==string[0..(string.index('@')-1)] and
619
- string[(string.index('@')+1)..-1].scan(/([0-9a-z]+([\.-][a-z0-9]|)*)/i).join==string[string[(string.index('@')+1)..-1]]
620
- error_regular_expression=false
621
- else
622
- error_regular_expression=true
623
- end
624
- else
625
- error_regular_expression=true
626
- end
619
+ if deny_pattern and expected_errors.include?(:length)
620
+ good_result=true #it is already with wrong length
621
+ else
622
+ # I'm doing this because many times the regular expression checking hangs with these characters
623
+ wrong=%w(.. __ -- ._ _. .- -. _- -_ @. @_ @- .@ _@ -@ @@)
624
+ if !(Regexp.union(*wrong) === string) #don't include any or the wrong strings
625
+ if string.index('@').to_i>0 and
626
+ string[0..(string.index('@')-1)].scan(/([a-z0-9]+([\+\._\-][a-z0-9]|)*)/i).join==string[0..(string.index('@')-1)] and
627
+ string[(string.index('@')+1)..-1].scan(/([0-9a-z]+([\.-][a-z0-9]|)*)/i).join==string[string[(string.index('@')+1)..-1]]
628
+ error_regular_expression=false
629
+ else
630
+ error_regular_expression=true
631
+ end
632
+ else
633
+ error_regular_expression=true
634
+ end
627
635
 
628
- if expected_errors.size==0
629
- if error_regular_expression
630
- good_result=false
631
- else
632
- good_result=true
633
- end
634
- elsif expected_errors_left.size==0 and
635
- (expected_errors-[:length, :min_length, :max_length]).size==0
636
- good_result=true
637
- elsif expected_errors!=[:length]
638
- if !error_regular_expression
639
- good_result=false
640
- elsif expected_errors.include?(:value)
641
- good_result=true
642
- end
643
- end
644
- end
636
+ if expected_errors.size==0
637
+ if error_regular_expression
638
+ good_result=false
639
+ else
640
+ good_result=true
641
+ end
642
+ elsif expected_errors_left.size==0 and
643
+ (expected_errors-[:length, :min_length, :max_length]).size==0
644
+ good_result=true
645
+ elsif expected_errors!=[:length]
646
+ if !error_regular_expression
647
+ good_result=false
648
+ elsif expected_errors.include?(:value)
649
+ good_result=true
650
+ end
651
+ end
652
+ end
645
653
 
646
- end until good_result or tries>100
647
- unless good_result
648
- puts "Not possible to generate an email on StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
649
- return ''
650
- end
654
+ end until good_result or tries>100
655
+ unless good_result
656
+ puts "Not possible to generate an email on StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
657
+ return ''
658
+ end
659
+ end
660
+ if @dont_repeat
661
+ if @cache_values[pattern.to_s].nil?
662
+ @cache_values[pattern.to_s]=Array.new()
663
+ @cache_values[pattern.to_s].push(string)
664
+ good_result=true
665
+ elsif @cache_values[pattern.to_s].include?(string)
666
+ good_result = false
667
+ else
668
+ @cache_values[pattern.to_s].push(string)
669
+ good_result=true
670
+ end
671
+ end
672
+ end until good_result or tries>10000
673
+ unless good_result
674
+ puts "Not possible to generate the string on StringPattern.generate: #{pattern.inspect}, expected_errors: #{expected_errors.inspect}"
675
+ puts "Take in consideration if you are using StringPattern.dont_repeat=true that you don't try to generate more strings that are possible to be generated"
676
+ return ''
651
677
  end
652
-
678
+
653
679
  return string
654
680
  end
655
681
 
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.2.0
4
+ version: 1.3.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-08-31 00:00:00.000000000 Z
11
+ date: 2018-09-01 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