rantly 1.2.0 → 3.0.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 +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
|
-
|