genny 0.3.0 → 0.4.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 +8 -8
- data/VERSION +1 -1
- data/lib/genny/regexp.rb +76 -1
- data/lib/genny/string.rb +3 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NjMzY2FjYWYxN2UzOTE1ZTdmOTVjMmU1M2Q5N2MwMmEzOTNkMjEzNg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MGZlNjNlYTE3NjkwZGM5ZmExYjk5NmFlZmZhMGU3NTU3YWMxOTlkNQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NGYxNmM0N2MyYWJiMGFkOTNlYTU2NzI5Y2QzMzNiNTU3MjIwNzJkODg0ZDc4
|
10
|
+
ZjE0ZTQ4OWUzMDU0NmNiYjI3MGU4NTY3ODg5MGFkNTIzZGVmMzdmN2E5NWE3
|
11
|
+
YTVkOWFiMWRkZGJlNTRlYTI2ZWFlZjYyZWRlM2RmOTZlY2JjMDU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MmVjNWYwMDk4MGY3Nzg5ZjQ0MWFiYjU4OTg1OTMxYTEyNGQwZTg0ZTY2ZjYx
|
14
|
+
ODdlYjkyMWJhZDkxOGIyMmViMWZjNmU3YjViZDNmYTI3MGE3OTFiNWE2YzQw
|
15
|
+
YWU4Nzc2ZGEyYjAwZDg0ZGI1OGYwMDliNDhlODNmNmVhOTFiYzU=
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/genny/regexp.rb
CHANGED
@@ -2,13 +2,88 @@ require "genny/base"
|
|
2
2
|
|
3
3
|
module Genny
|
4
4
|
module Regexp
|
5
|
+
DEFAULT_OPTS = {
|
6
|
+
min: 2,
|
7
|
+
max: 5
|
8
|
+
}
|
5
9
|
# A bit unecessary, but who knows, maybe someone will have use for it
|
6
10
|
def self.genny(_opts = {})
|
7
11
|
%r{.*}
|
8
12
|
end
|
9
13
|
|
10
14
|
def genny(opts = {})
|
11
|
-
raise NotImplementedError, "
|
15
|
+
raise NotImplementedError, "This regular expression doesn't seem to support the `source` method" unless self.respond_to?(:source)
|
16
|
+
begin
|
17
|
+
str = generate_from_regexp_string(self.source, DEFAULT_OPTS.merge(opts))
|
18
|
+
raise unless str.match(self)
|
19
|
+
rescue
|
20
|
+
raise NotImplementedError, "Looks like Genny doesn't support the regular expression #{self.source}#{str.nil? ? '.' : ", it made '#{str}'."} Feel like adding support? https://github.com/blinkboxbooks/genny"
|
21
|
+
end
|
22
|
+
str
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def generate_from_regexp_string(string, opts = {})
|
28
|
+
string.sub!(/^\^?(.+?)\$?$/, '\1')
|
29
|
+
string.scan(/(?:\[([^\]]+)\]|\((?:\?<[^>]+>|\?:)?(.*)\)|\\([*+?\\\{\}\[\]WwDdSs.^$])|([^*+?\{\}\[\]]))(\*\??|\+\??|\{(\d*),?(\d*)\})?/).map do |group|
|
30
|
+
ranges, subexpr, special_char, char, limit, min, max = group
|
31
|
+
if !ranges.nil?
|
32
|
+
chars = array_from_ranges(ranges)
|
33
|
+
get_char = proc { chars.sample }
|
34
|
+
elsif !subexpr.nil?
|
35
|
+
get_char = proc { generate_from_regexp_string(subexpr, opts) }
|
36
|
+
elsif !special_char.nil?
|
37
|
+
get_char = special_char_parser(special_char)
|
38
|
+
else
|
39
|
+
get_char = proc { char }
|
40
|
+
end
|
41
|
+
|
42
|
+
min = max = "1" if limit.nil?
|
43
|
+
if min.nil? || min.empty?
|
44
|
+
max = (max.nil? || max.empty?) ? opts[:max] : max.to_i
|
45
|
+
min = [opts[:min], max].min
|
46
|
+
elsif max.empty?
|
47
|
+
min = max = min.to_i
|
48
|
+
else
|
49
|
+
min = min.to_i
|
50
|
+
max = max.to_i
|
51
|
+
end
|
52
|
+
num = max == min ? min : Random.rand(max - min) + min
|
53
|
+
|
54
|
+
num.times.inject("") do |str, _|
|
55
|
+
str << get_char.call
|
56
|
+
end
|
57
|
+
end.join
|
58
|
+
end
|
59
|
+
|
60
|
+
def array_from_ranges(ranges)
|
61
|
+
ranges.scan(/(([^\\])-(.)|.)/).inject([]) do |all, match|
|
62
|
+
if match[2].nil?
|
63
|
+
all.push(match.first)
|
64
|
+
else
|
65
|
+
all.push(*(match[1]..match[2]).to_a)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def special_char_parser(special_char)
|
71
|
+
case special_char
|
72
|
+
when "w"
|
73
|
+
proc { (('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a + %w{_}).sample }
|
74
|
+
when "W"
|
75
|
+
proc { ((" ".."/").to_a + ("[".."`").to_a + ("{".."~").to_a - %w{_}).sample }
|
76
|
+
when "d"
|
77
|
+
proc { ("0".."9").to_a.sample }
|
78
|
+
when "D"
|
79
|
+
proc { (('a'..'z').to_a + ('A'..'Z').to_a).sample }
|
80
|
+
when "s"
|
81
|
+
proc { " " }
|
82
|
+
when "S"
|
83
|
+
proc { (' '..'~').to_a .sample }
|
84
|
+
else
|
85
|
+
proc { special_char }
|
86
|
+
end
|
12
87
|
end
|
13
88
|
end
|
14
89
|
end
|
data/lib/genny/string.rb
CHANGED
@@ -17,6 +17,9 @@ module Genny
|
|
17
17
|
opts = Genny.symbolize(opts)
|
18
18
|
viable_formats = @@formats.keys & [*opts[:format]]
|
19
19
|
return @@formats[viable_formats.sample].call(opts) unless viable_formats.empty?
|
20
|
+
if (re = ::Regexp.new(opts[:format]) rescue false)
|
21
|
+
return re.extend(Genny::Regexp).genny
|
22
|
+
end
|
20
23
|
guess = @@hints.inject(nil) { |guess, hint|
|
21
24
|
break guess if !(guess = hint.call(opts)).nil?
|
22
25
|
} if opts[:hint]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: genny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JP Hastings-Spital
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|