contracts 0.14.0 → 0.15.0

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: bb93546d34391727b5f9e866f193cddea67ac952
4
- data.tar.gz: c214e45aba01fe36d90b3b74f670ccc3254c4b6b
3
+ metadata.gz: 5f95ed9c9dca3e23e9feb707360335388730304e
4
+ data.tar.gz: 634613562833a5f69e2171163eb71e64314ae252
5
5
  SHA512:
6
- metadata.gz: 855e9377f9637943e20ebbf82b522bb915208523bfa3bc6bd23b939b613fe860354e9fabdc4d8d3ef3d61d0cbde7f2aa716c6274055d4d948ec998f92f8185e4
7
- data.tar.gz: 20341d6090d35f0abc1bee62d9eccb618530d78a2e68a60bd67c22d85776a0a2dd7afaf9899088c77e03e84aa2b576804d52990ab614546a6a04eb0bf20b67bb
6
+ metadata.gz: 3e9393b9202596fbd5df5a53c1e4fd963ed9f5d881277f7705415fce911cba40c47ad0cf6ce993b1f94670fb8e5c7ab4ff9bcff9c20990826600969b686f7cce
7
+ data.tar.gz: 30bddf252a1e2da5a53223189bae378e834087ba3e1813c5acb8ad96bd62f75878d9bcf1afd4e861d87c63d1195af26ca1f9d89248b7089a54913090b52d1449
@@ -1,3 +1,7 @@
1
+ ## v0.15.0
2
+ - Bugfix: Func contract's return value isn't enforced with blocks - [Piotr Szmielew](https://github.com/esse) [#251](https://github.com/egonSchiele/contracts.ruby/pull/251)
3
+ - Bugfx: Fix contracts used in AR-models - [Gert Goet](https://github.com/eval) [#237](https://github.com/egonSchiele/contracts.ruby/pull/237)
4
+
1
5
  ## v0.14.0
2
6
  - Enhancement: Add StrictHash contract - [Fyodor](https://github.com/cbrwizard) [#236](https://github.com/egonSchiele/contracts.ruby/pull/236)
3
7
  - Bugfix: dont fail if something other than a hash is passed to a KeywordArgs - [Dan Padilha](https://github.com/dpad) [#234](https://github.com/egonSchiele/contracts.ruby/pull/234)
data/Gemfile CHANGED
@@ -6,7 +6,7 @@ group :test do
6
6
  gem "rspec"
7
7
  gem "aruba"
8
8
  gem "cucumber", "~> 1.3.20"
9
- gem "rubocop", "~> 0.29.1", :platform => [:ruby_20, :ruby_21, :ruby_22, :ruby_23]
9
+ gem "rubocop", "~> 0.29.1" if RUBY_VERSION >= "2"
10
10
  end
11
11
 
12
12
  group :development do
data/README.md CHANGED
@@ -69,8 +69,12 @@ To get started do the following:
69
69
 
70
70
  2. Run our test suite
71
71
 
72
- `bundle exec rake`
73
-
72
+ `bundle exec rspec`
73
+
74
+ 3. Run our code style checks
75
+
76
+ `bundle exec rubocop`
77
+
74
78
  ## Performance
75
79
 
76
80
  Using contracts.ruby results in very little slowdown. Check out [this blog post](http://adit.io/posts/2013-03-04-How-I-Made-My-Ruby-Project-10x-Faster.html#seconds-6) for more info.
@@ -441,7 +441,7 @@ module Contracts
441
441
  end
442
442
 
443
443
  # Use this for specifying contracts for class arguments
444
- # Example: <tt>Descendant[ e: Range, f: Optional[Num] ]</tt>
444
+ # Example: <tt>DescendantOf[ e: Range, f: Optional[Num] ]</tt>
445
445
  class DescendantOf < CallableClass
446
446
  def initialize(parent_class)
447
447
  @parent_class = parent_class
@@ -26,7 +26,9 @@ module Contracts
26
26
  :return_value => false)
27
27
  end
28
28
 
29
- if contract.is_a?(Contracts::Func)
29
+ if contract.is_a?(Contracts::Func) && blk && !nil_block_appended
30
+ blk = Contract.new(klass, arg, *contract.contracts)
31
+ elsif contract.is_a?(Contracts::Func)
30
32
  args[i] = Contract.new(klass, arg, *contract.contracts)
31
33
  end
32
34
  end
@@ -73,7 +75,8 @@ module Contracts
73
75
  method.call(*args, &blk)
74
76
  else
75
77
  # original method name referrence
76
- method.send_to(this, *args, &blk)
78
+ added_block = blk ? lambda { |*params| blk.call(*params) } : nil
79
+ method.send_to(this, *args, &added_block)
77
80
  end
78
81
 
79
82
  unless @ret_validator[result]
@@ -6,6 +6,7 @@ module Contracts
6
6
 
7
7
  def inherited(subclass)
8
8
  Engine.fetch_from(subclass).set_eigenclass_owner
9
+ super
9
10
  end
10
11
 
11
12
  def method_added(name)
@@ -1,3 +1,3 @@
1
1
  module Contracts
2
- VERSION = "0.14.0"
2
+ VERSION = "0.15.0"
3
3
  end
@@ -3,296 +3,304 @@ RSpec.describe "Contracts:" do
3
3
  @o = GenericExample.new
4
4
  end
5
5
 
6
+ def fails(&some)
7
+ expect { some.call }.to raise_error(ContractError)
8
+ end
9
+
10
+ def passes(&some)
11
+ expect { some.call }.to_not raise_error
12
+ end
13
+
6
14
  describe "DescendantOf:" do
7
15
  it "should pass for Array" do
8
- expect { @o.enumerable_descendant_test(Array) }.to_not raise_error
16
+ passes { @o.enumerable_descendant_test(Array) }
9
17
  end
10
18
 
11
19
  it "should pass for a hash" do
12
- expect { @o.enumerable_descendant_test(Hash) }.to_not raise_error
20
+ passes { @o.enumerable_descendant_test(Hash) }
13
21
  end
14
22
 
15
23
  it "should fail for a number class" do
16
- expect { @o.enumerable_descendant_test(Integer) }.to raise_error(ContractError)
24
+ fails { @o.enumerable_descendant_test(Integer) }
17
25
  end
18
26
 
19
27
  it "should fail for a non-class" do
20
- expect { @o.enumerable_descendant_test(1) }.to raise_error(ContractError)
28
+ fails { @o.enumerable_descendant_test(1) }
21
29
  end
22
30
  end
23
31
 
24
32
  describe "Num:" do
25
33
  it "should pass for Fixnums" do
26
- expect { @o.double(2) }.to_not raise_error
34
+ passes { @o.double(2) }
27
35
  end
28
36
 
29
37
  it "should pass for Floats" do
30
- expect { @o.double(2.2) }.to_not raise_error
38
+ passes { @o.double(2.2) }
31
39
  end
32
40
 
33
41
  it "should fail for nil and other data types" do
34
- expect { @o.double(nil) }.to raise_error(ContractError)
35
- expect { @o.double(:x) }.to raise_error(ContractError)
36
- expect { @o.double("x") }.to raise_error(ContractError)
37
- expect { @o.double(/x/) }.to raise_error(ContractError)
42
+ fails { @o.double(nil) }
43
+ fails { @o.double(:x) }
44
+ fails { @o.double("x") }
45
+ fails { @o.double(/x/) }
38
46
  end
39
47
  end
40
48
 
41
49
  describe "Pos:" do
42
50
  it "should pass for positive numbers" do
43
- expect { @o.pos_test(1) }.to_not raise_error
44
- expect { @o.pos_test(1.6) }.to_not raise_error
51
+ passes { @o.pos_test(1) }
52
+ passes { @o.pos_test(1.6) }
45
53
  end
46
54
 
47
55
  it "should fail for 0" do
48
- expect { @o.pos_test(0) }.to raise_error(ContractError)
56
+ fails { @o.pos_test(0) }
49
57
  end
50
58
 
51
59
  it "should fail for negative numbers" do
52
- expect { @o.pos_test(-1) }.to raise_error(ContractError)
53
- expect { @o.pos_test(-1.6) }.to raise_error(ContractError)
60
+ fails { @o.pos_test(-1) }
61
+ fails { @o.pos_test(-1.6) }
54
62
  end
55
63
 
56
64
  it "should fail for nil and other data types" do
57
- expect { @o.pos_test(nil) }.to raise_error(ContractError)
58
- expect { @o.pos_test(:x) }.to raise_error(ContractError)
59
- expect { @o.pos_test("x") }.to raise_error(ContractError)
60
- expect { @o.pos_test(/x/) }.to raise_error(ContractError)
65
+ fails { @o.pos_test(nil) }
66
+ fails { @o.pos_test(:x) }
67
+ fails { @o.pos_test("x") }
68
+ fails { @o.pos_test(/x/) }
61
69
  end
62
70
  end
63
71
 
64
72
  describe "Neg:" do
65
73
  it "should pass for negative numbers" do
66
- expect { @o.neg_test(-1) }.to_not raise_error
67
- expect { @o.neg_test(-1.6) }.to_not raise_error
74
+ passes { @o.neg_test(-1) }
75
+ passes { @o.neg_test(-1.6) }
68
76
  end
69
77
 
70
78
  it "should fail for 0" do
71
- expect { @o.neg_test(0) }.to raise_error(ContractError)
79
+ fails { @o.neg_test(0) }
72
80
  end
73
81
 
74
82
  it "should fail for positive numbers" do
75
- expect { @o.neg_test(1) }.to raise_error(ContractError)
76
- expect { @o.neg_test(1.6) }.to raise_error(ContractError)
83
+ fails { @o.neg_test(1) }
84
+ fails { @o.neg_test(1.6) }
77
85
  end
78
86
 
79
87
  it "should fail for nil and other data types" do
80
- expect { @o.neg_test(nil) }.to raise_error(ContractError)
81
- expect { @o.neg_test(:x) }.to raise_error(ContractError)
82
- expect { @o.neg_test("x") }.to raise_error(ContractError)
83
- expect { @o.neg_test(/x/) }.to raise_error(ContractError)
88
+ fails { @o.neg_test(nil) }
89
+ fails { @o.neg_test(:x) }
90
+ fails { @o.neg_test("x") }
91
+ fails { @o.neg_test(/x/) }
84
92
  end
85
93
  end
86
94
 
87
95
  describe "Nat:" do
88
96
  it "should pass for 0" do
89
- expect { @o.nat_test(0) }.to_not raise_error
97
+ passes { @o.nat_test(0) }
90
98
  end
91
99
 
92
100
  it "should pass for positive whole numbers" do
93
- expect { @o.nat_test(1) }.to_not raise_error
101
+ passes { @o.nat_test(1) }
94
102
  end
95
103
 
96
104
  it "should fail for positive non-whole numbers" do
97
- expect { @o.nat_test(1.5) }.to raise_error(ContractError)
105
+ fails { @o.nat_test(1.5) }
98
106
  end
99
107
 
100
108
  it "should fail for negative numbers" do
101
- expect { @o.nat_test(-1) }.to raise_error(ContractError)
102
- expect { @o.nat_test(-1.6) }.to raise_error(ContractError)
109
+ fails { @o.nat_test(-1) }
110
+ fails { @o.nat_test(-1.6) }
103
111
  end
104
112
 
105
113
  it "should fail for nil and other data types" do
106
- expect { @o.nat_test(nil) }.to raise_error(ContractError)
107
- expect { @o.nat_test(:x) }.to raise_error(ContractError)
108
- expect { @o.nat_test("x") }.to raise_error(ContractError)
109
- expect { @o.nat_test(/x/) }.to raise_error(ContractError)
114
+ fails { @o.nat_test(nil) }
115
+ fails { @o.nat_test(:x) }
116
+ fails { @o.nat_test("x") }
117
+ fails { @o.nat_test(/x/) }
110
118
  end
111
119
  end
112
120
 
113
121
  describe "Any:" do
114
122
  it "should pass for numbers" do
115
- expect { @o.show(1) }.to_not raise_error
123
+ passes { @o.show(1) }
116
124
  end
117
125
  it "should pass for strings" do
118
- expect { @o.show("bad") }.to_not raise_error
126
+ passes { @o.show("bad") }
119
127
  end
120
128
  it "should pass for procs" do
121
- expect { @o.show(lambda {}) }.to_not raise_error
129
+ passes { @o.show(lambda {}) }
122
130
  end
123
131
  it "should pass for nil" do
124
- expect { @o.show(nil) }.to_not raise_error
132
+ passes { @o.show(nil) }
125
133
  end
126
134
  end
127
135
 
128
136
  describe "None:" do
129
137
  it "should fail for numbers" do
130
- expect { @o.fail_all(1) }.to raise_error(ContractError)
138
+ fails { @o.fail_all(1) }
131
139
  end
132
140
  it "should fail for strings" do
133
- expect { @o.fail_all("bad") }.to raise_error(ContractError)
141
+ fails { @o.fail_all("bad") }
134
142
  end
135
143
  it "should fail for procs" do
136
- expect { @o.fail_all(lambda {}) }.to raise_error(ContractError)
144
+ fails { @o.fail_all(lambda {}) }
137
145
  end
138
146
  it "should fail for nil" do
139
- expect { @o.fail_all(nil) }.to raise_error(ContractError)
147
+ fails { @o.fail_all(nil) }
140
148
  end
141
149
  end
142
150
 
143
151
  describe "Or:" do
144
152
  it "should pass for nums" do
145
- expect { @o.num_or_string(1) }.to_not raise_error
153
+ passes { @o.num_or_string(1) }
146
154
  end
147
155
 
148
156
  it "should pass for strings" do
149
- expect { @o.num_or_string("bad") }.to_not raise_error
157
+ passes { @o.num_or_string("bad") }
150
158
  end
151
159
 
152
160
  it "should fail for nil" do
153
- expect { @o.num_or_string(nil) }.to raise_error(ContractError)
161
+ fails { @o.num_or_string(nil) }
154
162
  end
155
163
  end
156
164
 
157
165
  describe "Xor:" do
158
166
  it "should pass for an object with a method :good" do
159
- expect { @o.xor_test(A.new) }.to_not raise_error
167
+ passes { @o.xor_test(A.new) }
160
168
  end
161
169
 
162
170
  it "should pass for an object with a method :bad" do
163
- expect { @o.xor_test(B.new) }.to_not raise_error
171
+ passes { @o.xor_test(B.new) }
164
172
  end
165
173
 
166
174
  it "should fail for an object with neither method" do
167
- expect { @o.xor_test(1) }.to raise_error(ContractError)
175
+ fails { @o.xor_test(1) }
168
176
  end
169
177
 
170
178
  it "should fail for an object with both methods :good and :bad" do
171
- expect { @o.xor_test(F.new) }.to raise_error(ContractError)
179
+ fails { @o.xor_test(F.new) }
172
180
  end
173
181
  end
174
182
 
175
183
  describe "And:" do
176
184
  it "should pass for an object of class A that has a method :good" do
177
- expect { @o.and_test(A.new) }.to_not raise_error
185
+ passes { @o.and_test(A.new) }
178
186
  end
179
187
 
180
188
  it "should fail for an object that has a method :good but isn't of class A" do
181
- expect { @o.and_test(F.new) }.to raise_error(ContractError)
189
+ fails { @o.and_test(F.new) }
182
190
  end
183
191
  end
184
192
 
185
193
  describe "Enum:" do
186
194
  it "should pass for an object that is included" do
187
- expect { @o.enum_test(:a) }.to_not raise_error
195
+ passes { @o.enum_test(:a) }
188
196
  end
189
197
 
190
198
  it "should fail for an object that is not included" do
191
- expect { @o.enum_test(:z) }.to raise_error(ContractError)
199
+ fails { @o.enum_test(:z) }
192
200
  end
193
201
  end
194
202
 
195
203
  describe "RespondTo:" do
196
204
  it "should pass for an object that responds to :good" do
197
- expect { @o.responds_test(A.new) }.to_not raise_error
205
+ passes { @o.responds_test(A.new) }
198
206
  end
199
207
 
200
208
  it "should fail for an object that doesn't respond to :good" do
201
- expect { @o.responds_test(B.new) }.to raise_error(ContractError)
209
+ fails { @o.responds_test(B.new) }
202
210
  end
203
211
  end
204
212
 
205
213
  describe "Send:" do
206
214
  it "should pass for an object that returns true for method :good" do
207
- expect { @o.send_test(A.new) }.to_not raise_error
215
+ passes { @o.send_test(A.new) }
208
216
  end
209
217
 
210
218
  it "should fail for an object that returns false for method :good" do
211
- expect { @o.send_test(F.new) }.to raise_error(ContractError)
219
+ fails { @o.send_test(F.new) }
212
220
  end
213
221
  end
214
222
 
215
223
  describe "Exactly:" do
216
224
  it "should pass for an object that is exactly a Parent" do
217
- expect { @o.exactly_test(Parent.new) }.to_not raise_error
225
+ passes { @o.exactly_test(Parent.new) }
218
226
  end
219
227
 
220
228
  it "should fail for an object that inherits from Parent" do
221
- expect { @o.exactly_test(Child.new) }.to raise_error(ContractError)
229
+ fails { @o.exactly_test(Child.new) }
222
230
  end
223
231
 
224
232
  it "should fail for an object that is not related to Parent at all" do
225
- expect { @o.exactly_test(A.new) }.to raise_error(ContractError)
233
+ fails { @o.exactly_test(A.new) }
226
234
  end
227
235
  end
228
236
 
229
237
  describe "Eq:" do
230
238
  it "should pass for a class" do
231
- expect { @o.eq_class_test(Foo) }
239
+ passes { @o.eq_class_test(Foo) }
232
240
  end
233
241
 
234
242
  it "should pass for a module" do
235
- expect { @o.eq_module_test(Bar) }
243
+ passes { @o.eq_module_test(Bar) }
236
244
  end
237
245
 
238
246
  it "should pass for other values" do
239
- expect { @o.eq_value_test(Baz) }
247
+ passes { @o.eq_value_test(Baz) }
240
248
  end
241
249
 
242
250
  it "should fail when not equal" do
243
- expect { @o.eq_class_test(Bar) }.to raise_error(ContractError)
251
+ fails { @o.eq_class_test(Bar) }
244
252
  end
245
253
 
246
254
  it "should fail when given instance of class" do
247
- expect { @o.eq_class_test(Foo.new) }.to raise_error(ContractError)
255
+ fails { @o.eq_class_test(Foo.new) }
248
256
  end
249
257
  end
250
258
 
251
259
  describe "Not:" do
252
260
  it "should pass for an argument that isn't nil" do
253
- expect { @o.not_nil(1) }.to_not raise_error
261
+ passes { @o.not_nil(1) }
254
262
  end
255
263
 
256
264
  it "should fail for nil" do
257
- expect { @o.not_nil(nil) }.to raise_error(ContractError)
265
+ fails { @o.not_nil(nil) }
258
266
  end
259
267
  end
260
268
 
261
269
  describe "ArrayOf:" do
262
270
  it "should pass for an array of nums" do
263
- expect { @o.product([1, 2, 3]) }.to_not raise_error
271
+ passes { @o.product([1, 2, 3]) }
264
272
  end
265
273
 
266
274
  it "should fail for an array with one non-num" do
267
- expect { @o.product([1, 2, 3, "bad"]) }.to raise_error(ContractError)
275
+ fails { @o.product([1, 2, 3, "bad"]) }
268
276
  end
269
277
 
270
278
  it "should fail for a non-array" do
271
- expect { @o.product(1) }.to raise_error(ContractError)
279
+ fails { @o.product(1) }
272
280
  end
273
281
  end
274
282
 
275
283
  describe "RangeOf:" do
276
284
  require "date"
277
285
  it "should pass for a range of nums" do
278
- expect { @o.first_in_range_num(3..10) }.to_not raise_error
286
+ passes { @o.first_in_range_num(3..10) }
279
287
  end
280
288
 
281
289
  it "should pass for a range of dates" do
282
290
  d1 = Date.today
283
291
  d2 = d1 + 18
284
- expect { @o.first_in_range_date(d1..d2) }.to_not raise_error
292
+ passes { @o.first_in_range_date(d1..d2) }
285
293
  end
286
294
 
287
295
  it "should fail for a non-range" do
288
- expect { @o.first_in_range_num("foo") }.to raise_error(ContractError)
289
- expect { @o.first_in_range_num(:foo) }.to raise_error(ContractError)
290
- expect { @o.first_in_range_num(5) }.to raise_error(ContractError)
291
- expect { @o.first_in_range_num(nil) }.to raise_error(ContractError)
296
+ fails { @o.first_in_range_num("foo") }
297
+ fails { @o.first_in_range_num(:foo) }
298
+ fails { @o.first_in_range_num(5) }
299
+ fails { @o.first_in_range_num(nil) }
292
300
  end
293
301
 
294
302
  it "should fail for a range with incorrect data type" do
295
- expect { @o.first_in_range_num("a".."z") }.to raise_error(ContractError)
303
+ fails { @o.first_in_range_num("a".."z") }
296
304
  end
297
305
 
298
306
  it "should fail for a badly-defined range" do
@@ -302,8 +310,8 @@ RSpec.describe "Contracts:" do
302
310
  # This test guards against ranges with inconsistent data types.
303
311
  begin
304
312
  d1 = Date.today
305
- expect { @o.first_in_range_date(d1..10).to raise_error(ContractError) }
306
- expect { @o.first_in_range_num(d1..10).to raise_error(ContractError) }
313
+ fails { @o.first_in_range_date(d1..10) }
314
+ fails { @o.first_in_range_num(d1..10) }
307
315
  rescue ArgumentError
308
316
  # If Ruby doesn't like the range, we ignore the test.
309
317
  :nop
@@ -313,26 +321,26 @@ RSpec.describe "Contracts:" do
313
321
 
314
322
  describe "SetOf:" do
315
323
  it "should pass for a set of nums" do
316
- expect { @o.product_from_set(Set.new([1, 2, 3])) }.to_not raise_error
324
+ passes { @o.product_from_set(Set.new([1, 2, 3])) }
317
325
  end
318
326
 
319
327
  it "should fail for an array with one non-num" do
320
- expect { @o.product_from_set(Set.new([1, 2, 3, "bad"])) }.to raise_error(ContractError)
328
+ fails { @o.product_from_set(Set.new([1, 2, 3, "bad"])) }
321
329
  end
322
330
 
323
331
  it "should fail for a non-array" do
324
- expect { @o.product_from_set(1) }.to raise_error(ContractError)
332
+ fails { @o.product_from_set(1) }
325
333
  end
326
334
  end
327
335
 
328
336
  describe "Bool:" do
329
337
  it "should pass for an argument that is a boolean" do
330
- expect { @o.bool_test(true) }.to_not raise_error
331
- expect { @o.bool_test(false) }.to_not raise_error
338
+ passes { @o.bool_test(true) }
339
+ passes { @o.bool_test(false) }
332
340
  end
333
341
 
334
342
  it "should fail for nil" do
335
- expect { @o.bool_test(nil) }.to raise_error(ContractError)
343
+ fails { @o.bool_test(nil) }
336
344
  end
337
345
  end
338
346
 
@@ -346,31 +354,31 @@ RSpec.describe "Contracts:" do
346
354
  end
347
355
 
348
356
  it "should fail for strings" do
349
- expect { @o.maybe_double("foo") }.to raise_error(ContractError)
357
+ fails { @o.maybe_double("foo") }
350
358
  end
351
359
  end
352
360
 
353
361
  describe "KeywordArgs:" do
354
362
  it "should pass for exact correct input" do
355
- expect { @o.person_keywordargs(:name => "calvin", :age => 10) }.to_not raise_error
363
+ passes { @o.person_keywordargs(:name => "calvin", :age => 10) }
356
364
  end
357
365
 
358
366
  it "should fail if some keys don't have contracts" do
359
- expect { @o.person_keywordargs(:name => "calvin", :age => 10, :foo => "bar") }.to raise_error(ContractError)
367
+ fails { @o.person_keywordargs(:name => "calvin", :age => 10, :foo => "bar") }
360
368
  end
361
369
 
362
370
  it "should fail if a key with a contract on it isn't provided" do
363
- expect { @o.person_keywordargs(:name => "calvin") }.to raise_error(ContractError)
371
+ fails { @o.person_keywordargs(:name => "calvin") }
364
372
  end
365
373
 
366
374
  it "should fail for incorrect input" do
367
- expect { @o.person_keywordargs(:name => 50, :age => 10) }.to raise_error(ContractError)
368
- expect { @o.hash_keywordargs(:hash => nil) }.to raise_error(ContractError)
369
- expect { @o.hash_keywordargs(:hash => 1) }.to raise_error(ContractError)
375
+ fails { @o.person_keywordargs(:name => 50, :age => 10) }
376
+ fails { @o.hash_keywordargs(:hash => nil) }
377
+ fails { @o.hash_keywordargs(:hash => 1) }
370
378
  end
371
379
 
372
380
  it "should pass if a method is overloaded with non-KeywordArgs" do
373
- expect { @o.person_keywordargs("name", 10) }.to_not raise_error
381
+ passes { @o.person_keywordargs("name", 10) }
374
382
  end
375
383
  end
376
384
 
@@ -402,10 +410,10 @@ RSpec.describe "Contracts:" do
402
410
  end
403
411
 
404
412
  context "given an unfulfilled contract" do
405
- it { expect { @o.gives_max_value(:panda => "1", :bamboo => "2") }.to raise_error(ContractError) }
406
- it { expect { @o.gives_max_value(nil) }.to raise_error(ContractError) }
407
- it { expect { @o.gives_max_value(1) }.to raise_error(ContractError) }
408
- it { expect { @o.pretty_gives_max_value(:panda => "1", :bamboo => "2") }.to raise_error(ContractError) }
413
+ it { fails { @o.gives_max_value(:panda => "1", :bamboo => "2") } }
414
+ it { fails { @o.gives_max_value(nil) } }
415
+ it { fails { @o.gives_max_value(1) } }
416
+ it { fails { @o.pretty_gives_max_value(:panda => "1", :bamboo => "2") } }
409
417
  end
410
418
 
411
419
  describe "#to_s" do
@@ -422,39 +430,31 @@ RSpec.describe "Contracts:" do
422
430
  describe "StrictHash:" do
423
431
  context "when given an exact correct input" do
424
432
  it "does not raise an error" do
425
- expect do
426
- @o.strict_person(:name => "calvin", :age => 10)
427
- end.to_not raise_error
433
+ passes { @o.strict_person(:name => "calvin", :age => 10) }
428
434
  end
429
435
  end
430
436
 
431
437
  context "when given an input with correct keys but wrong types" do
432
438
  it "raises an error" do
433
- expect do
434
- @o.strict_person(:name => "calvin", :age => "10")
435
- end.to raise_error(ContractError)
439
+ fails { @o.strict_person(:name => "calvin", :age => "10") }
436
440
  end
437
441
  end
438
442
 
439
443
  context "when given an input with missing keys" do
440
444
  it "raises an error" do
441
- expect do
442
- @o.strict_person(:name => "calvin")
443
- end.to raise_error(ContractError)
445
+ fails { @o.strict_person(:name => "calvin") }
444
446
  end
445
447
  end
446
448
 
447
449
  context "when given an input with extra keys" do
448
450
  it "raises an error" do
449
- expect do
450
- @o.strict_person(:name => "calvin", :age => "10", :soft => true)
451
- end.to raise_error(ContractError)
451
+ fails { @o.strict_person(:name => "calvin", :age => "10", :soft => true) }
452
452
  end
453
453
  end
454
454
 
455
455
  context "when given not a hash" do
456
456
  it "raises an error" do
457
- expect { @o.strict_person(1337) }.to raise_error(ContractError)
457
+ fails { @o.strict_person(1337) }
458
458
  end
459
459
  end
460
460
  end
@@ -0,0 +1,54 @@
1
+ RSpec.describe "Contracts:" do
2
+ describe "method called with blocks" do
3
+ module FuncTest
4
+ include Contracts::Core
5
+ include Contracts::Builtin
6
+
7
+ Contract Func[Num=>Num] => nil
8
+ def foo(&blk)
9
+ _ = blk.call(2)
10
+ nil
11
+ end
12
+
13
+ Contract Num, Func[Num=>Num] => nil
14
+ def foo2(a, &blk)
15
+ _ = blk.call(2)
16
+ nil
17
+ end
18
+
19
+ Contract Func[Num=>Num] => nil
20
+ def bar(blk)
21
+ _ = blk.call(2)
22
+ nil
23
+ end
24
+
25
+ Contract Num, Func[Num=>Num] => nil
26
+ def bar2(a, blk)
27
+ _ = blk.call(2)
28
+ nil
29
+ end
30
+ end
31
+
32
+ def obj
33
+ Object.new.tap do |o|
34
+ o.extend(FuncTest)
35
+ end
36
+ end
37
+
38
+ it "should enforce return value inside block with no other parameter" do
39
+ expect { obj.foo(&:to_s) }.to raise_error
40
+ end
41
+
42
+ it "should enforce return value inside block with other parameter" do
43
+ expect { obj.foo2(2) { |x| x.to_s } }.to raise_error
44
+ end
45
+
46
+ it "should enforce return value inside lambda with no other parameter" do
47
+ expect { obj.bar lambda { |x| x.to_s } }.to raise_error
48
+ end
49
+
50
+ it "should enforce return value inside lambda with other parameter" do
51
+ expect { obj.bar2(2, lambda { |x| x.to_s }) }.to raise_error
52
+ end
53
+ end
54
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contracts
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aditya Bhargava
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-26 00:00:00.000000000 Z
11
+ date: 2017-02-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This library provides contracts for Ruby. Contracts let you clearly express
14
14
  how your code behaves, and free you from writing tons of boilerplate, defensive
@@ -92,6 +92,7 @@ files:
92
92
  - spec/contracts_spec.rb
93
93
  - spec/fixtures/fixtures.rb
94
94
  - spec/invariants_spec.rb
95
+ - spec/methods_spec.rb
95
96
  - spec/module_spec.rb
96
97
  - spec/override_validators_spec.rb
97
98
  - spec/ruby_version_specific/contracts_spec_1.9.rb
@@ -121,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
122
  version: '0'
122
123
  requirements: []
123
124
  rubyforge_project:
124
- rubygems_version: 2.4.6
125
+ rubygems_version: 2.5.1
125
126
  signing_key:
126
127
  specification_version: 4
127
128
  summary: Contracts for Ruby.