rubyqc 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9ff877141825f4a8516b956d216de5dcae3a9ae9
4
- data.tar.gz: 0284ea73671c159c38a5a8c6249e477159666c1f
3
+ metadata.gz: 69a41de60f5a0b9675a0633fadaf4961e743661d
4
+ data.tar.gz: 5ec783f8ba6d9f68e0a58d2c5603d7b73da8e649
5
5
  SHA512:
6
- metadata.gz: a0e49da081b1af4fc05e43be982395ba6fe0521013589c0e244b148873ab2ba7eb7ca3fecf9515ff6454f75c27b5ef9c14998df181c40659830bf8f0b2979273
7
- data.tar.gz: c4427a5669c4c7d9c7085e562c6d4f1d1aa4ef833513ac893f9fbd9d3efdb7beee07bc5da82de126252c39bdd75b593ce2875c30d8dcad1ab9f2ad181cd37290
6
+ metadata.gz: fd3c8b14af326d8c19714f6172239bab8568e69d7cdb2fee46c525127532e63cc5bade28450efb0c0ec6378ac61143cfe0933d27ed2e15cff24cd5698fc03803
7
+ data.tar.gz: 1884e6da6b62adaf3ecfd71918c589988c7a1878bd59b36039b79d90c0f19a9ce2f75432e3ade0ca4e1793d1d2eb1ff46b45a629f6ef2ea95469e003989fa411
data/.travis.yml CHANGED
@@ -4,6 +4,6 @@ script: 'ruby -r bundler/setup -S rake test'
4
4
  rvm:
5
5
  - 1.9.3
6
6
  - 2.0.0
7
- - 2.1.0
7
+ - ruby
8
8
  - rbx
9
9
  - jruby
data/CHANGES.md ADDED
@@ -0,0 +1,11 @@
1
+ # CHANGES
2
+
3
+ ## RubyQC 0.0.2 -- 2014-04-18
4
+
5
+ * Renamed one_of to oneof
6
+ * Added forall, booleans, and someof
7
+ * Implemented a lot of rubyqc methods
8
+
9
+ ## RubyQC 0.0.1 -- 2014-01-30
10
+
11
+ * Birthday!
data/README.md CHANGED
@@ -70,7 +70,7 @@ it and raise our level of confidence about correctness.
70
70
 
71
71
  ## REQUIREMENTS:
72
72
 
73
- * Tested with MRI (official CRuby) 2.0.0, 2.1.0, Rubinius and JRuby.
73
+ * Tested with MRI (official CRuby), Rubinius and JRuby.
74
74
 
75
75
  ## INSTALLATION:
76
76
 
@@ -78,6 +78,8 @@ it and raise our level of confidence about correctness.
78
78
 
79
79
  ## SYNOPSIS:
80
80
 
81
+ ### RubyQC::API.check
82
+
81
83
  Here's a quick example using [Bacon][]. We check if `Array#sort` has the
82
84
  property that the front elements of the result array would be `<=` than
83
85
  the rear elements of the result array for all arrays.
@@ -130,9 +132,36 @@ class Fixnum
130
132
  end
131
133
  ```
132
134
 
133
- You get the idea. See next section for the list of built-in generators.
135
+ You get the idea.
136
+
137
+ ### RubyQC::API.forall
134
138
 
135
- ### Kernel
139
+ Other than `check`, we also have `forall` which would iterate through all the
140
+ possible choices in case you would simply like to test all combinations.
141
+ Here's an example for checking compare_by_identity:
142
+
143
+ ``` ruby
144
+ describe Hash do
145
+ describe 'compare_by_identity' do
146
+ should 'Treat diff arr with the same contents diff when set' do
147
+ arr = [0]
148
+ forall(booleans, [arr, [0]], [arr, [1]]) do |flag, a, b|
149
+ h = {}
150
+ h.compare_by_identity if flag
151
+ h[a] = h[b] = true
152
+
153
+ if (flag && a.object_id != b.object_id) || a != b
154
+ h.size.should == 2
155
+ else
156
+ h.size.should == 1
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ ```
163
+
164
+ ### Kernel generator
136
165
 
137
166
  The very default generator would simply return the instance itself.
138
167
  So if there's no generator defined for a given class or instance, it
@@ -142,7 +171,7 @@ would merely take `self`.
142
171
  true.rubyqc # true
143
172
  ```
144
173
 
145
- ### Class
174
+ ### Class generator
146
175
 
147
176
  This default generator for classes would simply return a new instance via
148
177
  `new` method. This could fail if the `initialize` method for the particular
@@ -152,7 +181,7 @@ class does not take zero argument.
152
181
  Object.rubyqc # kind_of?(Object)
153
182
  ```
154
183
 
155
- ### Fixnum, Bignum, and Integer
184
+ ### Fixnum, Bignum, and Integer generator
156
185
 
157
186
  This would give you a random integer. Fixnum and Bignum would guarantee to
158
187
  give you the particular class, whereas Integer would give you either a Fixnum
@@ -162,7 +191,7 @@ or Bignum.
162
191
  Fixnum.rubyqc # kind_of?(Fixnum)
163
192
  ```
164
193
 
165
- ### array
194
+ ### array generator
166
195
 
167
196
  We also have instance level generator, which was used in the first example.
168
197
  The array instance generator would recursively call `rubyqc` for all elements
@@ -172,7 +201,7 @@ of the array, and collect the results.
172
201
  [Fixnum, Fixnum].rubyqc # [kind_of?(Fixnum), kind_of?(Fixnum)]
173
202
  ```
174
203
 
175
- ### hash
204
+ ### hash generator
176
205
 
177
206
  This also applies to hashes which would do the same thing as arrays for the
178
207
  values, keeping the key.
@@ -181,7 +210,7 @@ values, keeping the key.
181
210
  {:fixnum => Fixnum}.rubyqc # {:fixnum => kind_of?(Fixnum)}
182
211
  ```
183
212
 
184
- ### range
213
+ ### range generator
185
214
 
186
215
  Fixnum would actually give a very large or very small (negative) number in
187
216
  most cases. If you want to have a number with specific range, use a range
@@ -199,10 +228,32 @@ combinators we need to have a unified interface.
199
228
  Just define `rubyqc` method for your classes or instances. This weird name
200
229
  was simply chosen to avoid name conflicting since we don't have [typeclass][]
201
230
  in Ruby, and it's quite natural to open and insert new methods into classes
202
- in Ruby.
231
+ in Ruby. Here's a quick example:
232
+
233
+ ``` ruby
234
+ class User < Struct.new(:id, :name)
235
+ def self.rubyqc
236
+ new(Fixnum.rubyqc, String.rubyqc)
237
+ end
238
+ end
239
+
240
+ describe 'User.rubyqc' do
241
+ should 'Generate random users' do
242
+ check(User) do |user|
243
+ user .should.kind_of User
244
+ user.id .should.kind_of Fixnum
245
+ user.name.should.kind_of String
246
+ end
247
+ end
248
+ end
249
+ ```
203
250
 
204
251
  [typeclass]: http://learnyouahaskell.com/types-and-typeclasses
205
252
 
253
+ ### Implementation reference
254
+
255
+ [QuickCheck.hs](http://www.cse.chalmers.se/~rjmh/QuickCheck/QuickCheck.hs)
256
+
206
257
  ## CONTRIBUTORS:
207
258
 
208
259
  * Lin Jen-Shin (@godfat)
data/lib/rubyqc.rb CHANGED
@@ -1,16 +1,3 @@
1
1
 
2
+ require 'rubyqc/api'
2
3
  require 'rubyqc/prelude'
3
- require 'rubyqc/modifier'
4
-
5
- module RubyQC
6
- module API
7
- module_function
8
- def check *args, &block
9
- RubyQC::Modifier.new(args, &block)
10
- end
11
-
12
- def one_of *args
13
- args.sample
14
- end
15
- end
16
- end
data/lib/rubyqc/all.rb ADDED
@@ -0,0 +1,3 @@
1
+
2
+ require 'rubyqc'
3
+ require 'rubyqc/stdlib'
data/lib/rubyqc/api.rb ADDED
@@ -0,0 +1,45 @@
1
+
2
+ require 'rubyqc/modifier'
3
+
4
+ module RubyQC
5
+ module API
6
+ module_function
7
+ def check *args, &block
8
+ RubyQC::Modifier.new(args, &block)
9
+ end
10
+
11
+ def forall *args, &block
12
+ args[0].product(*args[1..-1]).each do |val|
13
+ yield(*val)
14
+ end
15
+ end
16
+
17
+ def booleans
18
+ [true, false]
19
+ end
20
+
21
+ class SomeOf < Struct.new(:num, :args)
22
+ def rubyqc
23
+ args.sample(num).rubyqc
24
+ end
25
+ end
26
+
27
+ class OneOf < SomeOf
28
+ def initialize args
29
+ super(1, args)
30
+ end
31
+
32
+ def rubyqc
33
+ super.first
34
+ end
35
+ end
36
+
37
+ def someof num, *args
38
+ SomeOf.new(num, args)
39
+ end
40
+
41
+ def oneof *args
42
+ OneOf.new(args)
43
+ end
44
+ end
45
+ end
@@ -1,6 +1,11 @@
1
1
 
2
2
  module RubyQC
3
- FixnumMax = 2 ** (0.size * 8 - 2) - 1
3
+ big = 2 ** (0.size * 8 - 2)
4
+ FixnumMax = if big.kind_of?(Bignum)
5
+ big - 1
6
+ else # probably jruby...
7
+ 2 ** (0.size * 8 - 1) - 1
8
+ end
4
9
  FixnumMin = - FixnumMax - 1
5
10
  FixnumSuc = FixnumMax + 1
6
11
  BignumMax = FixnumMax * 10
@@ -20,6 +25,9 @@ end
20
25
  class Class
21
26
  def rubyqc
22
27
  new
28
+ rescue => e
29
+ warn "Cannot new #{self}: #{e}"
30
+ raise
23
31
  end
24
32
  end
25
33
 
@@ -65,17 +73,15 @@ class UnboundMethod
65
73
  end
66
74
  end
67
75
 
68
- # TODO
69
76
  class Binding
70
77
  def self.rubyqc
71
78
  binding
72
79
  end
73
80
  end
74
81
 
75
- # TODO
76
82
  class Symbol
77
83
  def self.rubyqc
78
- String.rubyqc.to_sym
84
+ all_symbols.sample
79
85
  end
80
86
  end
81
87
 
@@ -85,15 +91,16 @@ class Encoding
85
91
  end
86
92
  end
87
93
 
88
- # TODO
89
94
  class Dir
90
95
  def self.rubyqc
91
- Dir.open(__dir__)
96
+ Dir.open(File.dirname($LOADED_FEATURES.sample))
92
97
  end
93
98
  end
94
99
 
95
100
  class File
96
101
  def self.rubyqc
102
+ File.open($LOADED_FEATURES.sample)
103
+ rescue Errno::ENOENT # e.g. thread.rb, enumerator.so
97
104
  File.open(__FILE__)
98
105
  end
99
106
  end
@@ -125,9 +132,10 @@ end
125
132
 
126
133
  class Class
127
134
  def self.rubyqc
128
- Object.constants.map{ |name|
129
- unless [:Class, :BasicObject, :Data,
130
- :Config, :RubyVM, :TracePoint].include?(name)
135
+ Object.constants.map{ |name| # rubinius # jruby
136
+ if ![:BasicObject, :Class, :Config, :Data, :Autoload, :Continuation,
137
+ :RubyVM, :Struct, :WeakRef, :TracePoint].include?(name) &&
138
+ name !~ /Java/
131
139
  const_get(name)
132
140
  end
133
141
  }.select{ |const| const.kind_of?(Class) }.sample
@@ -197,27 +205,27 @@ class Float
197
205
  end
198
206
  end
199
207
 
200
- class Thread::SizedQueue
208
+ class Fiber
201
209
  def self.rubyqc
202
- new(rand(0..100))
210
+ new(&Proc.rubyqc)
203
211
  end
204
212
  end
205
213
 
206
- class Fiber
214
+ class Thread
207
215
  def self.rubyqc
208
216
  new(&Proc.rubyqc)
209
217
  end
210
218
  end
211
219
 
212
- class Thread
220
+ class SizedQueue
213
221
  def self.rubyqc
214
- new(&Proc.rubyqc)
222
+ new(rand(1..100))
215
223
  end
216
224
  end
217
225
 
218
226
  class SignalException
219
227
  def self.rubyqc
220
- new(rand(0..32))
228
+ new(rand(0..31))
221
229
  end
222
230
  end
223
231
 
@@ -0,0 +1,8 @@
1
+
2
+ require 'rubyqc/stdlib/delegate'
3
+ require 'rubyqc/stdlib/pathname'
4
+ require 'rubyqc/stdlib/socket'
5
+ require 'rubyqc/stdlib/stringio'
6
+ require 'rubyqc/stdlib/strscan'
7
+ require 'rubyqc/stdlib/tempfile'
8
+ require 'rubyqc/stdlib/weakref'
@@ -0,0 +1,14 @@
1
+
2
+ require 'delegate'
3
+
4
+ class Delegator
5
+ def self.rubyqc
6
+ SimpleDelegator.rubyqc
7
+ end
8
+ end
9
+
10
+ class SimpleDelegator
11
+ def self.rubyqc
12
+ new(Class.rubyqc.rubyqc)
13
+ end
14
+ end
@@ -0,0 +1,8 @@
1
+
2
+ require 'pathname'
3
+
4
+ class Pathname
5
+ def self.rubyqc
6
+ new(File.dirname($LOADED_FEATURES.sample))
7
+ end
8
+ end
@@ -0,0 +1,60 @@
1
+
2
+ require 'socket'
3
+
4
+ class Addrinfo
5
+ def self.rubyqc
6
+ Socket.ip_address_list.sample
7
+ end
8
+ end if Object.const_defined?(:Addrinfo) # rubinius does not have this class
9
+
10
+ class Socket
11
+ def self.rubyqc
12
+ for_fd(BasicSocket.rubyqc.fileno)
13
+ end
14
+ end
15
+
16
+ class BasicSocket
17
+ def self.rubyqc
18
+ [UNIXSocket, IPSocket].sample.rubyqc
19
+ end
20
+ end
21
+
22
+ class IPSocket
23
+ def self.rubyqc
24
+ [TCPSocket, UDPSocket].sample.rubyqc
25
+ end
26
+ end
27
+
28
+ class UNIXServer
29
+ def self.rubyqc
30
+ require 'tempfile'
31
+ tmp = Tempfile.new('sock')
32
+ path = tmp.path
33
+ tmp.close!
34
+ new(path)
35
+ end
36
+ end
37
+
38
+ class UNIXSocket
39
+ def self.rubyqc
40
+ new(UNIXServer.rubyqc.path)
41
+ end
42
+ end
43
+
44
+ class TCPServer
45
+ def self.rubyqc
46
+ new(0)
47
+ end
48
+ end
49
+
50
+ class TCPSocket
51
+ def self.rubyqc
52
+ new(*TCPServer.rubyqc.addr[1..2].reverse)
53
+ end
54
+ end
55
+
56
+ class UDPSocket
57
+ def self.rubyqc
58
+ new
59
+ end
60
+ end
@@ -0,0 +1,8 @@
1
+
2
+ require 'stringio'
3
+
4
+ class StringIO
5
+ def self.rubyqc
6
+ new(String.rubyqc)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+
2
+ require 'strscan'
3
+
4
+ class StringScanner
5
+ def self.rubyqc
6
+ new(String.rubyqc)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+
2
+ require 'tempfile'
3
+
4
+ class Tempfile
5
+ def self.rubyqc
6
+ new('rubyqc')
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+
2
+ require 'weakref'
3
+
4
+ # In MRI, WeakRef is a Delegator, so this is not really needed.
5
+ # But in Rubinius, WeakRef is not a Delegator, therefore we need
6
+ # to provide the exact same implementation here.
7
+ class WeakRef
8
+ def self.rubyqc
9
+ # Since Rubinius use BasicObject to implement WeakRef, it can't see
10
+ # Object::Class but ::Class.
11
+ new(::Class.rubyqc.rubyqc)
12
+ end
13
+ end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module RubyQC
3
- VERSION = '0.0.1'
3
+ VERSION = '0.0.2'
4
4
  end
data/rubyqc.gemspec CHANGED
@@ -1,27 +1,38 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rubyqc 0.0.1 ruby lib
2
+ # stub: rubyqc 0.0.2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "rubyqc"
6
- s.version = "0.0.1"
6
+ s.version = "0.0.2"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib"]
10
10
  s.authors = ["Lin Jen-Shin (godfat)"]
11
- s.date = "2014-01-30"
11
+ s.date = "2014-04-18"
12
12
  s.description = "RubyQC -- A conceptual [QuickCheck][] library for Ruby.\n\nIt's not a faithful port since Hsakell is totally different than Ruby.\nHowever it's still benefit to use some of the ideas behind QuickCheck,\nand we could also use RubyQC for generating arbitrary objects.\n\n[QuickCheck]: http://en.wikipedia.org/wiki/QuickCheck"
13
13
  s.email = ["godfat (XD) godfat.org"]
14
14
  s.files = [
15
15
  ".gitignore",
16
16
  ".gitmodules",
17
17
  ".travis.yml",
18
+ "CHANGES.md",
18
19
  "Gemfile",
19
20
  "LICENSE",
20
21
  "README.md",
21
22
  "Rakefile",
22
23
  "lib/rubyqc.rb",
24
+ "lib/rubyqc/all.rb",
25
+ "lib/rubyqc/api.rb",
23
26
  "lib/rubyqc/modifier.rb",
24
27
  "lib/rubyqc/prelude.rb",
28
+ "lib/rubyqc/stdlib.rb",
29
+ "lib/rubyqc/stdlib/delegate.rb",
30
+ "lib/rubyqc/stdlib/pathname.rb",
31
+ "lib/rubyqc/stdlib/socket.rb",
32
+ "lib/rubyqc/stdlib/stringio.rb",
33
+ "lib/rubyqc/stdlib/strscan.rb",
34
+ "lib/rubyqc/stdlib/tempfile.rb",
35
+ "lib/rubyqc/stdlib/weakref.rb",
25
36
  "lib/rubyqc/test.rb",
26
37
  "lib/rubyqc/version.rb",
27
38
  "rubyqc.gemspec",
@@ -32,7 +43,7 @@ Gem::Specification.new do |s|
32
43
  "test/test_readme.rb"]
33
44
  s.homepage = "https://github.com/godfat/rubyqc"
34
45
  s.licenses = ["Apache License 2.0"]
35
- s.rubygems_version = "2.2.1"
46
+ s.rubygems_version = "2.2.2"
36
47
  s.summary = "RubyQC -- A conceptual [QuickCheck][] library for Ruby."
37
48
  s.test_files = [
38
49
  "test/test_api.rb",
data/test/test_api.rb CHANGED
@@ -1,11 +1,57 @@
1
1
 
2
2
  require 'rubyqc/test'
3
+ require 'rubyqc/all'
3
4
 
4
5
  describe RubyQC::API do
5
- should 'one_of' do
6
+ should 'oneof' do
6
7
  check([Class]*5) do |klasses|
7
- check(one_of(*klasses)) do |obj|
8
- klasses.find{ |klass| obj.kind_of?(klass) }.should.not.nil
8
+ klasses -= [Should] # bacon's Should won't work...
9
+ check(oneof(*klasses)) do |obj|
10
+ begin
11
+ klasses.find{ |klass| obj.kind_of?(klass) }.should.not.nil
12
+ rescue => e
13
+ warn "Cannot find #{obj} in #{klasses}: #{e}"
14
+ raise
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ describe 'forall' do
21
+ should 'hard code' do
22
+ times = 0
23
+ forall([1,2], [3,4], [5,6]) do |a, b, c|
24
+ times += 1
25
+ [1,2].should.include a
26
+ [3,4].should.include b
27
+ [5,6].should.include c
28
+ end
29
+ times.should.eq 2**3
30
+ end
31
+
32
+ should 'check' do
33
+ check([Fixnum, Fixnum], [Fixnum, Fixnum], [Fixnum, Fixnum]) do |a, b, c|
34
+ times = 0
35
+ forall(a, b, c) do |aa, bb, cc|
36
+ times += 1
37
+ a.should.include aa
38
+ b.should.include bb
39
+ c.should.include cc
40
+ end
41
+ times.should.eq 2**3
42
+ end
43
+ end
44
+
45
+ should 'check check' do
46
+ check(1..5, 1..5) do |n, m|
47
+ check([[Fixnum]*n.abs]*m.abs) do |a|
48
+ times = 0
49
+ forall(*a) do |*aa|
50
+ times += 1
51
+ a.zip(aa).each{ |(b, bb)| b.should.include bb }
52
+ end
53
+ times.should.eq n**m
54
+ end
9
55
  end
10
56
  end
11
57
  end
data/test/test_readme.rb CHANGED
@@ -10,3 +10,38 @@ describe Array do
10
10
  end
11
11
  end
12
12
  end
13
+
14
+ describe Hash do
15
+ describe 'compare_by_identity' do
16
+ should 'Treat diff arr with the same contents diff when set' do
17
+ arr = [0]
18
+ forall(booleans, [arr, [0]], [arr, [1]]) do |flag, a, b|
19
+ h = {}
20
+ h.compare_by_identity if flag
21
+ h[a] = h[b] = true
22
+
23
+ if (flag && a.object_id != b.object_id) || a != b
24
+ h.size.should.eq 2
25
+ else
26
+ h.size.should.eq 1
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ class User < Struct.new(:id, :name)
34
+ def self.rubyqc
35
+ new(Fixnum.rubyqc, String.rubyqc)
36
+ end
37
+ end
38
+
39
+ describe 'User.rubyqc' do
40
+ should 'Generate random users' do
41
+ check(User) do |user|
42
+ user .should.kind_of User
43
+ user.id .should.kind_of Fixnum
44
+ user.name.should.kind_of String
45
+ end
46
+ end
47
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyqc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Jen-Shin (godfat)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-30 00:00:00.000000000 Z
11
+ date: 2014-04-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |-
14
14
  RubyQC -- A conceptual [QuickCheck][] library for Ruby.
@@ -27,13 +27,24 @@ files:
27
27
  - ".gitignore"
28
28
  - ".gitmodules"
29
29
  - ".travis.yml"
30
+ - CHANGES.md
30
31
  - Gemfile
31
32
  - LICENSE
32
33
  - README.md
33
34
  - Rakefile
34
35
  - lib/rubyqc.rb
36
+ - lib/rubyqc/all.rb
37
+ - lib/rubyqc/api.rb
35
38
  - lib/rubyqc/modifier.rb
36
39
  - lib/rubyqc/prelude.rb
40
+ - lib/rubyqc/stdlib.rb
41
+ - lib/rubyqc/stdlib/delegate.rb
42
+ - lib/rubyqc/stdlib/pathname.rb
43
+ - lib/rubyqc/stdlib/socket.rb
44
+ - lib/rubyqc/stdlib/stringio.rb
45
+ - lib/rubyqc/stdlib/strscan.rb
46
+ - lib/rubyqc/stdlib/tempfile.rb
47
+ - lib/rubyqc/stdlib/weakref.rb
37
48
  - lib/rubyqc/test.rb
38
49
  - lib/rubyqc/version.rb
39
50
  - rubyqc.gemspec
@@ -62,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
73
  version: '0'
63
74
  requirements: []
64
75
  rubyforge_project:
65
- rubygems_version: 2.2.1
76
+ rubygems_version: 2.2.2
66
77
  signing_key:
67
78
  specification_version: 4
68
79
  summary: RubyQC -- A conceptual [QuickCheck][] library for Ruby.