rantly 0.3.2 → 1.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/CHANGELOG.md +30 -0
- data/README.textile +57 -24
- data/Rakefile +2 -2
- data/VERSION.yml +3 -3
- data/lib/rantly/property.rb +28 -18
- data/lib/rantly/shrinks.rb +140 -23
- data/rantly.gemspec +8 -6
- data/test/shrinks_test.rb +12 -12
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f2c8ec7d03b419778a6671029bf86bf946d4e06
|
4
|
+
data.tar.gz: 3363b988ec1f4a7ee3a03f22f99f41b3783c20eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa41245990c513af23ca3830db8403d4fb7e3108ef2216aa562399e6c590baafc11d3be1970b0c9fdc8c785366535c67901bd4cd6e61a39b135e887a3da60ae5
|
7
|
+
data.tar.gz: 593f20b00e41d467c213372b031578921fdbd4bb6bd5295ae85ffb389c1c62c9b8a7e981034fb9b52b1c356dc552acbb38aaa6af3d5c9d629eaf487617d5ecbf
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Change Log
|
2
|
+
All notable changes to rantly will be documented in this file. The curated log begins at changes to version 0.4.0.
|
3
|
+
|
4
|
+
This project adheres to [Semantic Versioning](http://semver.org/).
|
5
|
+
|
6
|
+
## [1.0.0][1.0.0] - 2016-07-06
|
7
|
+
### Added
|
8
|
+
- Trying harder to shrink collections instead of giving up on first success of property (thanks [Eric Bischoff][Eric Bischoff]).
|
9
|
+
- Added convenience classes Deflating and Tuple for more control on shrinking (thanks [Eric Bischoff][Eric Bischoff]).
|
10
|
+
- Added usage examples for Deflating and Tuple shrinking strategies (thanks [Oleksii Fedorov][Oleksii Fedorov]).
|
11
|
+
- `Property#check` will now use the `RANTLY_COUNT` environment variable to control the number of values generated (thanks [Jamie English][Jamie English]).
|
12
|
+
|
13
|
+
### Major changes
|
14
|
+
- Array shrink was removed in favor of Tuple and Deflating.
|
15
|
+
|
16
|
+
## [0.3.2][0.3.2] - 2015-09-16
|
17
|
+
### Added
|
18
|
+
- Ability to shrink an object (`Integer`, `String`, `Array`, `Hash`). This is useful in finding the minimum value that fails a property check condition.
|
19
|
+
|
20
|
+
### Changed
|
21
|
+
- Improved RSpec and Minitest test extensions.
|
22
|
+
- Improved readability and execution of test suite ([Issue #4][4]).
|
23
|
+
- Updates to documentation.
|
24
|
+
|
25
|
+
[1.0.0]: https://github.com/abargnesi/rantly/compare/0.3.2...1.0.0
|
26
|
+
[0.3.2]: https://github.com/abargnesi/rantly/compare/0.3.1...0.3.2
|
27
|
+
[4]: https://github.com/abargnesi/rantly/issues/13
|
28
|
+
[Eric Bischoff]: https://github.com/Bischoff
|
29
|
+
[Jamie English]: https://github.com/english
|
30
|
+
[Oleksii Fedorov]: https://github.com/waterlink
|
data/README.textile
CHANGED
@@ -1,26 +1,12 @@
|
|
1
|
-
!https://
|
1
|
+
!https://badge.fury.io/rb/rantly.svg!:https://badge.fury.io/rb/rantly
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
The official _rantly_ repository has moved from "hayeah/rantly":https://github.com/hayeah/rantly to "abargnesi/rantly":https://github.com/abargnesi/rantly. The creator of _rantly_ is "Howard Yeh":https://github.com/hayeah. "Anthony Bargnesi":https://github.com/abargnesi is the current maintainer.
|
6
|
-
|
7
|
-
New development will occur in "abargnesi/rantly":https://github.com/abargnesi/rantly.
|
8
|
-
|
9
|
-
The transition plan is as follows:
|
10
|
-
|
11
|
-
* [x] Investigate and move open issues from "hayeah/rantly":https://github.com/hayeah/rantly to "abargnesi/rantly":https://github.com/abargnesi/rantly.
|
12
|
-
* [x] Evaluate and likely merge pull requests into hayeah/rantly. Push these changes to "abargnesi/rantly":https://github.com/abargnesi/rantly.
|
13
|
-
* [x] Move over any closed issues that have relevant discourse.
|
14
|
-
* [ ] Fix open issues.
|
15
|
-
* [x] Push new gem version after testing functionality.
|
16
|
-
* [ ] Continue new development; Changes will be pushed back upstream to "hayeah/rantly":https://github.com/hayeah/rantly over the course of the next month.
|
17
|
-
* [x] Added CHANGELOG markdown file. Includes what was added between 0.3.1 (2011-12-15) and 0.3.2 (2015-09-16).
|
3
|
+
!https://travis-ci.org/abargnesi/rantly.svg?branch=master!:https://travis-ci.org/abargnesi/rantly
|
18
4
|
|
19
5
|
h1. Imperative Random Data Generator and Quickcheck
|
20
6
|
|
21
|
-
You can use
|
7
|
+
You can use Rantly to generate random test data, and use its Test::Unit extension for property-based testing.
|
22
8
|
|
23
|
-
|
9
|
+
Rantly is basically a recursive descent interpreter, each of its method returns a random value of some type (string, integer, float, etc.).
|
24
10
|
|
25
11
|
Its implementation has no alien mathematics inside. Completely side-effect-free-free.
|
26
12
|
|
@@ -331,6 +317,26 @@ property_of {
|
|
331
317
|
}
|
332
318
|
</code></pre>
|
333
319
|
|
320
|
+
To control the number of property tests to generate, you have three options. In order of precedence:
|
321
|
+
|
322
|
+
# Pass an integer argument to @check@
|
323
|
+
|
324
|
+
<pre><code>
|
325
|
+
property_of {
|
326
|
+
integer
|
327
|
+
}.check(9000) { |i|
|
328
|
+
assert_kind_of Integer, i
|
329
|
+
}
|
330
|
+
</code></pre>
|
331
|
+
|
332
|
+
#_ Set the @RANTLY_COUNT@ environment variable
|
333
|
+
|
334
|
+
<pre><code>
|
335
|
+
RANTLY_COUNT=9000 ruby my_property_test.rb
|
336
|
+
</code></pre>
|
337
|
+
|
338
|
+
#_ If neither of the above are set, the default will be to run the @check@ block 100 times.
|
339
|
+
|
334
340
|
If you wish to have quiet output from Rantly, set environmental variable:
|
335
341
|
<pre><code>
|
336
342
|
RANTLY_VERBOSE=0 # silent
|
@@ -345,13 +351,19 @@ Shrinking reduces the value of common types to some terminal lower bound. These
|
|
345
351
|
For example a <code>String</code> is shrinkable until it is empty (e.g. <code>""</code>),
|
346
352
|
|
347
353
|
<pre><code>
|
348
|
-
"foo".
|
349
|
-
"foo".shrink
|
350
|
-
"
|
351
|
-
"".
|
354
|
+
"foo".shrinkable? # => true
|
355
|
+
"foo".shrink # => "fo"
|
356
|
+
"fo".shrink # => "f"
|
357
|
+
"f".shrink # => ""
|
358
|
+
"".shrinkable? # => false
|
352
359
|
</code></pre>
|
353
360
|
|
354
|
-
Shrinking allows <code>Property#check</code> to find
|
361
|
+
Shrinking allows <code>Property#check</code> to find a reduced value that still fails the condition. The value is not truely minimal because:
|
362
|
+
|
363
|
+
* we do not perform a complete in-depth traversal of the failure tree
|
364
|
+
* we limit the search to a maximum 1024 shrinking operations
|
365
|
+
|
366
|
+
but is usually reduced enough to start debugging.
|
355
367
|
|
356
368
|
Enable shrinking with
|
357
369
|
|
@@ -359,8 +371,29 @@ Enable shrinking with
|
|
359
371
|
require 'rantly/shrinks'
|
360
372
|
</code></pre>
|
361
373
|
|
374
|
+
Use <code>Tuple</code> class if you want an array whose elements are individually shrinked, but are not removed. Example:
|
375
|
+
|
376
|
+
<pre><code>
|
377
|
+
property_of {
|
378
|
+
len = range(0, 10)
|
379
|
+
Tuple.new( array(len) { integer } )
|
380
|
+
}.check {
|
381
|
+
# .. property check here ..
|
382
|
+
}
|
383
|
+
</code></pre>
|
384
|
+
|
385
|
+
Use <code>Deflating</code> class if you want an array whose elements are individully shrinked whenever possible, and removed otherwise. Example:
|
386
|
+
|
387
|
+
<pre><code>
|
388
|
+
property_of {
|
389
|
+
len = range(0, 10)
|
390
|
+
Deflated.new( array(len) { integer } )
|
391
|
+
}.check {
|
392
|
+
# .. property check here ..
|
393
|
+
}
|
394
|
+
</code></pre>
|
362
395
|
|
363
|
-
|
396
|
+
Normal arrays or hashes are not shrinked.
|
364
397
|
|
365
398
|
|
366
399
|
h1. Copyright
|
data/Rakefile
CHANGED
@@ -6,9 +6,9 @@ begin
|
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "rantly"
|
8
8
|
gem.summary = %Q{Ruby Imperative Random Data Generator and Quickcheck}
|
9
|
-
gem.email = ["hayeah@gmail.com", "abargnesi@gmail.com"]
|
9
|
+
gem.email = ["hayeah@gmail.com", "abargnesi@gmail.com", "ebischoff@nerim.net"]
|
10
10
|
gem.homepage = "https://github.com/abargnesi/rantly"
|
11
|
-
gem.authors = ["Howard Yeh", "Anthony Bargnesi"]
|
11
|
+
gem.authors = ["Howard Yeh", "Anthony Bargnesi", "Eric Bischoff"]
|
12
12
|
|
13
13
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
14
|
end
|
data/VERSION.yml
CHANGED
data/lib/rantly/property.rb
CHANGED
@@ -6,6 +6,7 @@ class Rantly::Property
|
|
6
6
|
attr_reader :failed_data, :shrunk_failed_data, :io
|
7
7
|
|
8
8
|
VERBOSITY = ENV.fetch('RANTLY_VERBOSE'){ 1 }.to_i
|
9
|
+
RANTLY_COUNT = ENV.fetch('RANTLY_COUNT'){ 100 }.to_i
|
9
10
|
|
10
11
|
def io
|
11
12
|
@io ||= if VERBOSITY >= 1
|
@@ -23,7 +24,7 @@ class Rantly::Property
|
|
23
24
|
@property = property
|
24
25
|
end
|
25
26
|
|
26
|
-
def check(n=
|
27
|
+
def check(n=RANTLY_COUNT,limit=10,&assertion)
|
27
28
|
i = 0
|
28
29
|
test_data = nil
|
29
30
|
begin
|
@@ -46,30 +47,39 @@ class Rantly::Property
|
|
46
47
|
pretty_print test_data
|
47
48
|
@failed_data = test_data
|
48
49
|
if @failed_data.respond_to?(:shrink)
|
49
|
-
@shrunk_failed_data = shrinkify(assertion, @failed_data)
|
50
|
-
io.puts "minimal failed data is:"
|
50
|
+
@shrunk_failed_data, @depth = shrinkify(assertion, @failed_data)
|
51
|
+
io.puts "minimal failed data (depth #{@depth}) is:"
|
51
52
|
pretty_print @shrunk_failed_data
|
52
53
|
end
|
53
54
|
raise boom
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
|
-
#
|
58
|
-
def shrinkify(assertion, data)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
58
|
+
# Explore the failures tree
|
59
|
+
def shrinkify(assertion, data, depth=0, iteration=0)
|
60
|
+
io.puts "Shrinking at depth #{depth}:"
|
61
|
+
pretty_print data
|
62
|
+
|
63
|
+
min_data = data
|
64
|
+
max_depth = depth
|
65
|
+
if data.shrinkable?
|
66
|
+
while iteration < 1024 do
|
67
|
+
# We assume that data.shrink is non-destructive
|
68
|
+
shrunk_data = data.shrink
|
69
|
+
begin
|
70
|
+
assertion.call(shrunk_data)
|
71
|
+
rescue Exception
|
72
|
+
# If the assertion was verified, recursively shrink failure case
|
73
|
+
branch_data, branch_depth, iteration = shrinkify(assertion, shrunk_data, depth + 1, iteration + 1)
|
74
|
+
if branch_depth > max_depth
|
75
|
+
min_data = branch_data
|
76
|
+
max_depth = branch_depth
|
77
|
+
end
|
78
|
+
end
|
79
|
+
break if !data.retry?
|
80
|
+
end
|
72
81
|
end
|
82
|
+
return min_data, max_depth, iteration
|
73
83
|
end
|
74
84
|
|
75
85
|
def report
|
data/lib/rantly/shrinks.rb
CHANGED
@@ -1,11 +1,22 @@
|
|
1
|
+
# Integer : shrink to zero
|
1
2
|
class Integer
|
2
3
|
def shrink
|
3
|
-
|
4
|
-
|
5
|
-
elsif self > 0
|
4
|
+
shrunk = if self > 8
|
5
|
+
self / 2
|
6
|
+
elsif self > 0
|
7
|
+
self - 1
|
8
|
+
elsif self < -8
|
9
|
+
(self + 1) / 2
|
10
|
+
elsif self < 0
|
11
|
+
self + 1
|
6
12
|
else
|
7
|
-
|
13
|
+
0
|
8
14
|
end
|
15
|
+
return shrunk
|
16
|
+
end
|
17
|
+
|
18
|
+
def retry?
|
19
|
+
false
|
9
20
|
end
|
10
21
|
|
11
22
|
def shrinkable?
|
@@ -13,16 +24,19 @@ class Integer
|
|
13
24
|
end
|
14
25
|
end
|
15
26
|
|
27
|
+
# String : shrink to ""
|
16
28
|
class String
|
17
29
|
def shrink
|
30
|
+
shrunk = self.dup
|
18
31
|
if self.size > 0
|
19
32
|
idx = Random::rand(self.size)
|
20
|
-
shrunk = self.dup
|
21
33
|
shrunk[idx] = ""
|
22
|
-
return shrunk
|
23
|
-
else
|
24
|
-
return ""
|
25
34
|
end
|
35
|
+
return shrunk
|
36
|
+
end
|
37
|
+
|
38
|
+
def retry?
|
39
|
+
false
|
26
40
|
end
|
27
41
|
|
28
42
|
def shrinkable?
|
@@ -30,26 +44,129 @@ class String
|
|
30
44
|
end
|
31
45
|
end
|
32
46
|
|
33
|
-
|
47
|
+
# Array where elements can be shrunk but not removed
|
48
|
+
class Tuple
|
49
|
+
def initialize(a)
|
50
|
+
@array = a
|
51
|
+
@position = a.size - 1
|
52
|
+
end
|
53
|
+
|
54
|
+
def [](i)
|
55
|
+
@array[i]
|
56
|
+
end
|
57
|
+
|
58
|
+
def []=(i, value)
|
59
|
+
@array[i] = value
|
60
|
+
end
|
61
|
+
|
62
|
+
def length
|
63
|
+
@array.length
|
64
|
+
end
|
65
|
+
|
66
|
+
def size
|
67
|
+
self.length
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_s
|
71
|
+
@array.to_s.insert(1, "T ")
|
72
|
+
end
|
73
|
+
|
74
|
+
def inspect
|
75
|
+
self.to_s
|
76
|
+
end
|
77
|
+
|
78
|
+
def each(&block)
|
79
|
+
@array.each(&block)
|
80
|
+
end
|
81
|
+
|
82
|
+
def array
|
83
|
+
return @array
|
84
|
+
end
|
85
|
+
|
34
86
|
def shrink
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
87
|
+
shrunk = @array.dup
|
88
|
+
while @position >= 0
|
89
|
+
e = @array.at(@position)
|
90
|
+
if e.respond_to?(:shrinkable?) && e.shrinkable?
|
91
|
+
break
|
92
|
+
end
|
93
|
+
@position -= 1
|
94
|
+
end
|
95
|
+
if @position >= 0
|
96
|
+
shrunk[@position] = e.shrink
|
97
|
+
@position -= 1
|
98
|
+
end
|
99
|
+
return Tuple.new(shrunk)
|
100
|
+
end
|
101
|
+
|
102
|
+
def retry?
|
103
|
+
@position >= 0
|
104
|
+
end
|
105
|
+
|
106
|
+
def shrinkable?
|
107
|
+
@array.any? {|e| e.respond_to?(:shrinkable?) && e.shrinkable? }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Array where the elements that can't be shrunk are removed
|
112
|
+
class Deflating
|
113
|
+
def initialize(a)
|
114
|
+
@array = a
|
115
|
+
@position = a.size - 1
|
116
|
+
end
|
117
|
+
|
118
|
+
def [](i)
|
119
|
+
@array[i]
|
120
|
+
end
|
121
|
+
|
122
|
+
def []=(i, value)
|
123
|
+
@array[i] = value
|
124
|
+
end
|
125
|
+
|
126
|
+
def length
|
127
|
+
@array.length
|
128
|
+
end
|
129
|
+
|
130
|
+
def size
|
131
|
+
self.length
|
132
|
+
end
|
133
|
+
|
134
|
+
def to_s
|
135
|
+
@array.to_s.insert(1, "D ")
|
136
|
+
end
|
137
|
+
|
138
|
+
def inspect
|
139
|
+
self.to_s
|
140
|
+
end
|
141
|
+
|
142
|
+
def each(&block)
|
143
|
+
@array.each(&block)
|
144
|
+
end
|
145
|
+
|
146
|
+
def array
|
147
|
+
return @array
|
148
|
+
end
|
149
|
+
|
150
|
+
def shrink
|
151
|
+
shrunk = @array.dup
|
152
|
+
if @position >= 0
|
153
|
+
e = @array.at(@position)
|
154
|
+
if e.respond_to?(:shrinkable?) && e.shrinkable?
|
155
|
+
shrunk[@position] = e.shrink
|
156
|
+
else
|
157
|
+
shrunk.delete_at(@position)
|
158
|
+
end
|
159
|
+
@position -= 1
|
47
160
|
end
|
161
|
+
return Deflating.new(shrunk)
|
162
|
+
end
|
163
|
+
|
164
|
+
def retry?
|
165
|
+
@position >= 0
|
48
166
|
end
|
49
167
|
|
50
168
|
def shrinkable?
|
51
|
-
|
52
|
-
!self.empty?
|
169
|
+
!@array.empty?
|
53
170
|
end
|
54
171
|
end
|
55
172
|
|
data/rantly.gemspec
CHANGED
@@ -2,20 +2,21 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: rantly 0.
|
5
|
+
# stub: rantly 1.0.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "rantly"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "1.0.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
|
-
s.authors = ["Howard Yeh", "Anthony Bargnesi"]
|
14
|
-
s.date = "
|
15
|
-
s.email = ["hayeah@gmail.com", "abargnesi@gmail.com"]
|
13
|
+
s.authors = ["Howard Yeh", "Anthony Bargnesi", "Eric Bischoff"]
|
14
|
+
s.date = "2016-07-06"
|
15
|
+
s.email = ["hayeah@gmail.com", "abargnesi@gmail.com", "ebischoff@nerim.net"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"LICENSE",
|
18
|
-
"README.textile"
|
18
|
+
"README.textile",
|
19
|
+
"CHANGELOG.md"
|
19
20
|
]
|
20
21
|
s.files = [
|
21
22
|
".document",
|
@@ -23,6 +24,7 @@ Gem::Specification.new do |s|
|
|
23
24
|
"Gemfile",
|
24
25
|
"LICENSE",
|
25
26
|
"README.textile",
|
27
|
+
"CHANGELOG.md",
|
26
28
|
"Rakefile",
|
27
29
|
"VERSION.yml",
|
28
30
|
"lib/rantly.rb",
|
data/test/shrinks_test.rb
CHANGED
@@ -47,24 +47,24 @@ describe String do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
describe
|
50
|
+
describe Tuple do
|
51
51
|
|
52
|
-
it "not be able to shrink empty
|
53
|
-
assert ![].shrinkable?
|
52
|
+
it "not be able to shrink empty tuple" do
|
53
|
+
assert !Tuple.new([]).shrinkable?
|
54
54
|
end
|
55
55
|
|
56
|
-
it "shrink
|
57
|
-
assert_equal [0
|
58
|
-
assert_equal [0,0
|
56
|
+
it "shrink tuple by trying to shrink the last shrinkable element available" do
|
57
|
+
assert_equal [1,0], Tuple.new([1,1]).shrink.array
|
58
|
+
assert_equal [1,0,0], Tuple.new([1,1,0]).shrink.array
|
59
59
|
end
|
60
60
|
|
61
|
-
it "
|
61
|
+
it "do not remove element from array when no element is shrinkable" do
|
62
62
|
property_of {
|
63
63
|
n = integer(1..10)
|
64
|
-
a = Array.new(n,0)
|
64
|
+
a = Tuple.new(Array.new(n,0))
|
65
65
|
[n,a]
|
66
66
|
}.check { |n,a|
|
67
|
-
assert_equal n
|
67
|
+
assert_equal n, a.shrink.length
|
68
68
|
}
|
69
69
|
end
|
70
70
|
end
|
@@ -92,17 +92,17 @@ describe "Shrinker Test" do
|
|
92
92
|
# The property we try to test is that non of the element is
|
93
93
|
# larger than 1, and the array's length is less than 4.
|
94
94
|
test = property_of {
|
95
|
-
a = Array.new(10,1)
|
95
|
+
a = Deflating.new(Array.new(10,1))
|
96
96
|
i = Random::rand(a.length)
|
97
97
|
a[i] = 1
|
98
98
|
a
|
99
99
|
}
|
100
100
|
assert_raises MiniTest::Assertion do
|
101
101
|
test.check { |a|
|
102
|
-
assert(!a.any? { |e| e > 0 } && a.length < 4,"contains 1")
|
102
|
+
assert(!a.array.any? { |e| e > 0 } && a.length < 4,"contains 1")
|
103
103
|
}
|
104
104
|
end
|
105
105
|
|
106
|
-
assert_equal [
|
106
|
+
assert_equal [1], test.shrunk_failed_data.array
|
107
107
|
end
|
108
108
|
end
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rantly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Howard Yeh
|
8
8
|
- Anthony Bargnesi
|
9
|
+
- Eric Bischoff
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2016-07-06 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: minitest
|
@@ -71,14 +72,17 @@ description:
|
|
71
72
|
email:
|
72
73
|
- hayeah@gmail.com
|
73
74
|
- abargnesi@gmail.com
|
75
|
+
- ebischoff@nerim.net
|
74
76
|
executables: []
|
75
77
|
extensions: []
|
76
78
|
extra_rdoc_files:
|
77
79
|
- LICENSE
|
78
80
|
- README.textile
|
81
|
+
- CHANGELOG.md
|
79
82
|
files:
|
80
83
|
- ".document"
|
81
84
|
- ".travis.yml"
|
85
|
+
- CHANGELOG.md
|
82
86
|
- Gemfile
|
83
87
|
- LICENSE
|
84
88
|
- README.textile
|
@@ -119,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
123
|
version: '0'
|
120
124
|
requirements: []
|
121
125
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
126
|
+
rubygems_version: 2.5.1
|
123
127
|
signing_key:
|
124
128
|
specification_version: 4
|
125
129
|
summary: Ruby Imperative Random Data Generator and Quickcheck
|