rantly 1.2.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +9 -6
- data/CHANGELOG.md +33 -0
- data/Gemfile +5 -2
- data/README.md +10 -1
- data/Rakefile +15 -2
- data/VERSION.yml +4 -4
- data/lib/rantly/data.rb +1 -1
- data/lib/rantly/generator.rb +88 -95
- data/lib/rantly/minitest_extensions.rb +1 -0
- data/lib/rantly/property.rb +20 -23
- data/lib/rantly/rspec_extensions.rb +1 -1
- data/lib/rantly/shrinks.rb +31 -37
- data/lib/rantly/silly.rb +40 -38
- data/lib/rantly/spec.rb +4 -4
- data/lib/rantly.rb +4 -4
- data/rantly.gemspec +37 -42
- data/test/rantly_test.rb +85 -216
- data/test/shrinks_test.rb +38 -42
- metadata +9 -66
data/lib/rantly/shrinks.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Integer : shrink to zero
|
2
2
|
class Integer
|
3
3
|
def shrink
|
4
|
-
|
4
|
+
if self > 8
|
5
5
|
self / 2
|
6
6
|
elsif self > 0
|
7
7
|
self - 1
|
@@ -12,7 +12,6 @@ class Integer
|
|
12
12
|
else
|
13
13
|
0
|
14
14
|
end
|
15
|
-
return shrunk
|
16
15
|
end
|
17
16
|
|
18
17
|
def retry?
|
@@ -27,12 +26,12 @@ end
|
|
27
26
|
# String : shrink to ""
|
28
27
|
class String
|
29
28
|
def shrink
|
30
|
-
shrunk =
|
31
|
-
|
32
|
-
idx = Random
|
33
|
-
shrunk[idx] =
|
29
|
+
shrunk = dup
|
30
|
+
unless empty?
|
31
|
+
idx = Random.rand(size)
|
32
|
+
shrunk[idx] = ''
|
34
33
|
end
|
35
|
-
|
34
|
+
shrunk
|
36
35
|
end
|
37
36
|
|
38
37
|
def retry?
|
@@ -40,7 +39,7 @@ class String
|
|
40
39
|
end
|
41
40
|
|
42
41
|
def shrinkable?
|
43
|
-
self !=
|
42
|
+
self != ''
|
44
43
|
end
|
45
44
|
end
|
46
45
|
|
@@ -64,39 +63,36 @@ class Tuple
|
|
64
63
|
end
|
65
64
|
|
66
65
|
def size
|
67
|
-
|
66
|
+
length
|
68
67
|
end
|
69
68
|
|
70
69
|
def to_s
|
71
|
-
@array.to_s.insert(1,
|
70
|
+
@array.to_s.insert(1, 'T ')
|
72
71
|
end
|
73
72
|
|
74
73
|
def inspect
|
75
|
-
|
74
|
+
to_s
|
76
75
|
end
|
77
76
|
|
78
77
|
def each(&block)
|
79
78
|
@array.each(&block)
|
80
79
|
end
|
81
80
|
|
82
|
-
|
83
|
-
return @array
|
84
|
-
end
|
81
|
+
attr_reader :array
|
85
82
|
|
86
83
|
def shrink
|
87
84
|
shrunk = @array.dup
|
88
85
|
while @position >= 0
|
89
86
|
e = @array.at(@position)
|
90
|
-
if e.respond_to?(:shrinkable?) && e.shrinkable?
|
91
|
-
|
92
|
-
end
|
87
|
+
break if e.respond_to?(:shrinkable?) && e.shrinkable?
|
88
|
+
|
93
89
|
@position -= 1
|
94
90
|
end
|
95
91
|
if @position >= 0
|
96
92
|
shrunk[@position] = e.shrink
|
97
93
|
@position -= 1
|
98
94
|
end
|
99
|
-
|
95
|
+
Tuple.new(shrunk)
|
100
96
|
end
|
101
97
|
|
102
98
|
def retry?
|
@@ -104,7 +100,7 @@ class Tuple
|
|
104
100
|
end
|
105
101
|
|
106
102
|
def shrinkable?
|
107
|
-
@array.any? {|e| e.respond_to?(:shrinkable?) && e.shrinkable? }
|
103
|
+
@array.any? { |e| e.respond_to?(:shrinkable?) && e.shrinkable? }
|
108
104
|
end
|
109
105
|
end
|
110
106
|
|
@@ -128,24 +124,22 @@ class Deflating
|
|
128
124
|
end
|
129
125
|
|
130
126
|
def size
|
131
|
-
|
127
|
+
length
|
132
128
|
end
|
133
129
|
|
134
130
|
def to_s
|
135
|
-
@array.to_s.insert(1,
|
131
|
+
@array.to_s.insert(1, 'D ')
|
136
132
|
end
|
137
133
|
|
138
134
|
def inspect
|
139
|
-
|
135
|
+
to_s
|
140
136
|
end
|
141
137
|
|
142
138
|
def each(&block)
|
143
139
|
@array.each(&block)
|
144
140
|
end
|
145
141
|
|
146
|
-
|
147
|
-
return @array
|
148
|
-
end
|
142
|
+
attr_reader :array
|
149
143
|
|
150
144
|
def shrink
|
151
145
|
shrunk = @array.dup
|
@@ -158,7 +152,7 @@ class Deflating
|
|
158
152
|
end
|
159
153
|
@position -= 1
|
160
154
|
end
|
161
|
-
|
155
|
+
Deflating.new(shrunk)
|
162
156
|
end
|
163
157
|
|
164
158
|
def retry?
|
@@ -172,24 +166,24 @@ end
|
|
172
166
|
|
173
167
|
class Hash
|
174
168
|
def shrink
|
175
|
-
if
|
176
|
-
key,
|
177
|
-
clone =
|
169
|
+
if any? { |_, v| v.respond_to?(:shrinkable?) && v.shrinkable? }
|
170
|
+
key, = detect { |_, v| v.respond_to?(:shrinkable?) && v.shrinkable? }
|
171
|
+
clone = dup
|
178
172
|
clone[key] = clone[key].shrink
|
179
|
-
|
180
|
-
elsif !
|
181
|
-
key =
|
182
|
-
h2 =
|
173
|
+
clone
|
174
|
+
elsif !empty?
|
175
|
+
key = keys.first
|
176
|
+
h2 = dup
|
183
177
|
h2.delete(key)
|
184
|
-
|
178
|
+
h2
|
185
179
|
else
|
186
|
-
|
180
|
+
self
|
187
181
|
end
|
188
182
|
end
|
189
183
|
|
190
184
|
def shrinkable?
|
191
|
-
|
192
|
-
!
|
185
|
+
any? { |_, v| v.respond_to?(:shrinkable?) && v.shrinkable? } ||
|
186
|
+
!empty?
|
193
187
|
end
|
194
188
|
|
195
189
|
def retry?
|
data/lib/rantly/silly.rb
CHANGED
@@ -8,18 +8,17 @@ module Rantly::Silly
|
|
8
8
|
end
|
9
9
|
|
10
10
|
module Rantly::Silly::Love
|
11
|
+
def letter(n = 3)
|
12
|
+
body = array(n) { paragraph }.join "\n\n"
|
13
|
+
<<~EOS
|
14
|
+
#{address}:
|
11
15
|
|
12
|
-
|
13
|
-
body = array(n){paragraph}.join "\n\n"
|
14
|
-
<<-EOS
|
15
|
-
#{address}:
|
16
|
+
#{body}
|
16
17
|
|
17
|
-
#{
|
18
|
+
#{sign}
|
18
19
|
|
19
|
-
#{
|
20
|
-
|
21
|
-
#{post_script}
|
22
|
-
EOS
|
20
|
+
#{post_script}
|
21
|
+
EOS
|
23
22
|
end
|
24
23
|
|
25
24
|
def address
|
@@ -27,31 +26,34 @@ EOS
|
|
27
26
|
end
|
28
27
|
|
29
28
|
def extremifier
|
30
|
-
choose
|
29
|
+
choose 'most', 'ultimate', 'unbelievable', 'incredible', 'burning'
|
31
30
|
end
|
32
31
|
|
33
32
|
def pedestal_label
|
34
|
-
choose
|
33
|
+
choose 'beloved', 'desire', 'dove', 'virgin goddess', 'existential solution', 'lighthouse', 'beacon', 'holy mother', 'queen', 'mistress'
|
35
34
|
end
|
36
35
|
|
37
36
|
def double_plus_good
|
38
|
-
choose
|
37
|
+
choose 'holy', 'shiny', 'glittering', 'joyous', 'delicious'
|
39
38
|
end
|
40
39
|
|
41
40
|
def how_i_feel
|
42
|
-
choose
|
41
|
+
choose 'my heart aches', 'my spine pines', 'my spirit wanders and wonders', 'my soul is awed', 'my loin burns'
|
43
42
|
end
|
44
43
|
|
45
44
|
def paragraph
|
46
|
-
array(range(2,4)){ sentence}.join
|
45
|
+
array(range(2, 4)) { sentence }.join ' '
|
47
46
|
end
|
48
47
|
|
49
48
|
def sentence
|
50
49
|
freq \
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
proc {
|
51
|
+
"when #{how_i_feel}, my #{pedestal_label}, i feel the need to #{stalk_action},"\
|
52
|
+
"but this is not because #{how_i_feel}, but rather a symptom of my being your #{whoami}."
|
53
|
+
},
|
54
|
+
proc { "because you are my #{pedestal_label}, and i am your #{whoami}, no, rather your #{whoami}, #{fragment}." },
|
55
|
+
proc { "do not think that saying '#{how_i_feel}' suffices to show the depth of how #{how_i_feel}, because more than that, #{fantasy}" },
|
56
|
+
proc { "as a #{whoami}, that #{how_i_feel} is never quite enough for you, my #{double_plus_good} #{pedestal_label}." }
|
55
57
|
end
|
56
58
|
|
57
59
|
def fragment
|
@@ -59,8 +61,7 @@ EOS
|
|
59
61
|
choose "i hope to god #{fun}", "i believe #{fun}", "i will that #{fun}"
|
60
62
|
end
|
61
63
|
|
62
|
-
def caused_by
|
63
|
-
end
|
64
|
+
def caused_by; end
|
64
65
|
|
65
66
|
def whoami
|
66
67
|
"#{extremifier} #{humbleizer} #{groveler}"
|
@@ -71,11 +72,11 @@ EOS
|
|
71
72
|
end
|
72
73
|
|
73
74
|
def humbleizer
|
74
|
-
choose
|
75
|
+
choose 'undeserving', 'insignificant', 'unremarkable', 'fearful', 'menial'
|
75
76
|
end
|
76
77
|
|
77
78
|
def groveler
|
78
|
-
choose
|
79
|
+
choose 'slave', 'servant', 'captive', 'lapdog'
|
79
80
|
end
|
80
81
|
|
81
82
|
def post_script
|
@@ -88,27 +89,28 @@ EOS
|
|
88
89
|
|
89
90
|
def fantasy
|
90
91
|
freq \
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
92
|
+
proc {
|
93
|
+
make = choose 'raise', 'nurture', 'bring into the world'
|
94
|
+
babies = choose 'brood of babies', "#{double_plus_good} angels"
|
95
|
+
good = double_plus_good
|
96
|
+
effect = choose "the world becomes all the more #{good}",
|
97
|
+
"we may at the end of our lives rest in #{good} peace.",
|
98
|
+
"you, my #{pedestal_label}, would continue to live."
|
99
|
+
"we would #{make} #{babies}, so #{effect}."
|
100
|
+
},
|
101
|
+
proc {
|
102
|
+
do_thing = choose('kiss', 'hug', 'read poetry to each other', 'massage', "whisper empty nothings into each others' ears",
|
103
|
+
'be with each other, and oblivious to the entire world')
|
104
|
+
affect = choose 'joy', 'mindfulness', 'calm', 'sanctity'
|
105
|
+
"we would #{do_thing} with #{double_plus_good} #{affect}"
|
106
|
+
}
|
105
107
|
end
|
106
108
|
|
107
109
|
def stalk_action
|
108
|
-
choose
|
110
|
+
choose 'think of you', 'dream of us together', 'look at your picture and sigh'
|
109
111
|
end
|
110
112
|
|
111
113
|
def time_duration
|
112
|
-
choose
|
114
|
+
choose 'once in a while', 'night', 'day', 'hour', 'minute'
|
113
115
|
end
|
114
116
|
end
|
data/lib/rantly/spec.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'rantly'
|
2
2
|
module Rantly::Check
|
3
|
-
def check(n=100
|
4
|
-
Rantly.gen.each(n
|
3
|
+
def check(n = 100, &block)
|
4
|
+
Rantly.gen.each(n, &block)
|
5
5
|
end
|
6
6
|
|
7
|
-
def sample(n=100
|
8
|
-
Rantly.gen.map(n
|
7
|
+
def sample(n = 100, &block)
|
8
|
+
Rantly.gen.map(n, &block)
|
9
9
|
end
|
10
10
|
end
|
data/lib/rantly.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$LOAD_PATH.include?(File.dirname(__FILE__)) || $LOAD_PATH.include?(__dir__)
|
3
3
|
|
4
4
|
class Rantly
|
5
5
|
end
|
6
6
|
|
7
7
|
require 'rantly/generator'
|
8
8
|
|
9
|
-
def Rantly(n=1
|
9
|
+
def Rantly(n = 1, &block)
|
10
10
|
if n > 1
|
11
|
-
Rantly.map(n
|
11
|
+
Rantly.map(n, &block)
|
12
12
|
else
|
13
13
|
Rantly.value(&block)
|
14
14
|
end
|
data/rantly.gemspec
CHANGED
@@ -1,47 +1,42 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
-
s.name =
|
3
|
-
s.summary =
|
4
|
-
s.homepage =
|
5
|
-
s.version =
|
6
|
-
s.license =
|
7
|
-
s.require_paths = [
|
8
|
-
s.authors = [
|
9
|
-
s.email = [
|
2
|
+
s.name = 'rantly'
|
3
|
+
s.summary = 'Ruby Imperative Random Data Generator and Quickcheck'
|
4
|
+
s.homepage = 'https://github.com/rantly-rb/rantly'
|
5
|
+
s.version = '3.0.0'
|
6
|
+
s.license = 'MIT'
|
7
|
+
s.require_paths = ['lib']
|
8
|
+
s.authors = ['Ana María Martínez Gómez', 'Howard Yeh', 'Anthony Bargnesi', 'Eric Bischoff']
|
9
|
+
s.email = ['anamma06@gmail.com', 'hayeah@gmail.com', 'abargnesi@gmail.com', 'ebischoff@nerim.net']
|
10
10
|
s.extra_rdoc_files = [
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
'LICENSE',
|
12
|
+
'README.md',
|
13
|
+
'CHANGELOG.md'
|
14
14
|
]
|
15
|
-
s.files
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
15
|
+
s.files = [
|
16
|
+
'.document',
|
17
|
+
'.travis.yml',
|
18
|
+
'Gemfile',
|
19
|
+
'LICENSE',
|
20
|
+
'README.md',
|
21
|
+
'CHANGELOG.md',
|
22
|
+
'Rakefile',
|
23
|
+
'VERSION.yml',
|
24
|
+
'lib/rantly.rb',
|
25
|
+
'lib/rantly/data.rb',
|
26
|
+
'lib/rantly/generator.rb',
|
27
|
+
'lib/rantly/minitest.rb',
|
28
|
+
'lib/rantly/minitest_extensions.rb',
|
29
|
+
'lib/rantly/property.rb',
|
30
|
+
'lib/rantly/rspec.rb',
|
31
|
+
'lib/rantly/rspec_extensions.rb',
|
32
|
+
'lib/rantly/shrinks.rb',
|
33
|
+
'lib/rantly/silly.rb',
|
34
|
+
'lib/rantly/spec.rb',
|
35
|
+
'lib/rantly/testunit_extensions.rb',
|
36
|
+
'rantly.gemspec',
|
37
|
+
'test/rantly_test.rb',
|
38
|
+
'test/shrinks_test.rb',
|
39
|
+
'test/test_helper.rb'
|
40
40
|
]
|
41
|
-
|
42
|
-
s.add_development_dependency('rake', '~> 12.0.0')
|
43
|
-
s.add_development_dependency('minitest', '~> 5.10.0')
|
44
|
-
s.add_development_dependency('simplecov', '>= 0')
|
45
|
-
s.add_development_dependency('coveralls', '>= 0')
|
41
|
+
s.required_ruby_version = '>= 3.3.0'
|
46
42
|
end
|
47
|
-
|