contracts 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -312,6 +312,15 @@ module Contracts
312
312
  end
313
313
  end
314
314
 
315
+ # Takes a Contract.
316
+ # The contract passes if the contract passes or the given value is nil.
317
+ # Maybe(foo) is equivalent to Or[foo, nil].
318
+ class Maybe < Or
319
+ def initialize(*vals)
320
+ super(*(vals + [nil]))
321
+ end
322
+ end
323
+
315
324
  class ::Hash
316
325
  def testable?
317
326
  self.values.all? do |val|
data/lib/contracts.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'decorators'
2
2
  require 'builtin_contracts'
3
+
3
4
  module Contracts
4
5
  def self.included(base)
5
6
  common base
@@ -15,6 +16,15 @@ module Contracts
15
16
  def Contract(*args)
16
17
  self.class.Contract(*args)
17
18
  end
19
+
20
+ def functype(funcname)
21
+ contracts = self.class.decorated_methods[funcname]
22
+ if contracts.nil? || contracts.empty?
23
+ "No contract for #{self.class}.#{funcname}"
24
+ else
25
+ "#{funcname} :: #{contracts[0]}"
26
+ end
27
+ end
18
28
  end
19
29
  end
20
30
  end
@@ -22,7 +32,7 @@ end
22
32
  # This is the main Contract class. When you write a new contract, you'll
23
33
  # write it as:
24
34
  #
25
- # Contract [contract names]
35
+ # Contract [contract names] => return_value
26
36
  #
27
37
  # This class also provides useful callbacks and a validation method.
28
38
  class Contract < Decorator
@@ -38,6 +48,10 @@ class Contract < Decorator
38
48
  @klass, @method, @contracts = klass, method, contracts
39
49
  end
40
50
 
51
+ def to_s
52
+ (contracts[0, contracts.size - 1].join(", ") + " => #{contracts[-1]}").gsub("Contracts::", "")
53
+ end
54
+
41
55
  # Given a hash, prints out a failure message.
42
56
  # This function is used by the default #failure_callback method
43
57
  # and uses the hash passed into the failure_callback method.
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contracts
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 1
9
- - 2
10
- version: 0.1.2
4
+ prerelease:
5
+ version: 0.1.3
11
6
  platform: ruby
12
7
  authors:
13
8
  - Aditya Bhargava
@@ -15,8 +10,7 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2012-06-07 00:00:00 -07:00
19
- default_executable:
13
+ date: 2012-06-07 00:00:00 Z
20
14
  dependencies: []
21
15
 
22
16
  description: This library provides contracts for Ruby. Contracts let you clearly express how your code behaves, and free you from writing tons of boilerplate, defensive code.
@@ -31,10 +25,7 @@ files:
31
25
  - lib/builtin_contracts.rb
32
26
  - lib/contracts.rb
33
27
  - lib/decorators.rb
34
- - lib/foo.rb
35
- - lib/test.rb
36
28
  - lib/testable.rb
37
- has_rdoc: true
38
29
  homepage: http://github.com/egonSchiele/contracts.ruby
39
30
  licenses: []
40
31
 
@@ -48,23 +39,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
48
39
  requirements:
49
40
  - - ">="
50
41
  - !ruby/object:Gem::Version
51
- hash: 3
52
- segments:
53
- - 0
54
42
  version: "0"
55
43
  required_rubygems_version: !ruby/object:Gem::Requirement
56
44
  none: false
57
45
  requirements:
58
46
  - - ">="
59
47
  - !ruby/object:Gem::Version
60
- hash: 3
61
- segments:
62
- - 0
63
48
  version: "0"
64
49
  requirements: []
65
50
 
66
51
  rubyforge_project:
67
- rubygems_version: 1.3.7
52
+ rubygems_version: 1.8.11
68
53
  signing_key:
69
54
  specification_version: 3
70
55
  summary: Contracts for Ruby.
data/lib/foo.rb DELETED
@@ -1,9 +0,0 @@
1
- require 'contracts'
2
- include Contracts
3
-
4
- Contract None => Num
5
- def add
6
- 4
7
- end
8
-
9
- p add
data/lib/test.rb DELETED
@@ -1,60 +0,0 @@
1
- require 'contracts'
2
- require 'testable'
3
- include Contracts
4
-
5
- class Object
6
-
7
- Contract Num, Num
8
- def double(x)
9
- x * 2
10
- end
11
-
12
- # bug: the `b` here doesn't get typechecked and throws an error.
13
- Contract Num, Num, Num
14
- def add(a, b="hello!")
15
- a + b
16
- end
17
-
18
- Contract Proc, nil
19
- def run(&blk)
20
- puts "running:"
21
- blk.call
22
- end
23
-
24
- Contract Method, Num
25
- def call(func)
26
- func.call
27
- end
28
-
29
- Contract Args[Num], Num
30
- def sum(*vals)
31
- vals.inject(0) do |acc, v|
32
- acc + v
33
- end
34
- end
35
-
36
- Contract ({ :age => Num, :name => String }), nil
37
- def person(data)
38
- p data
39
- end
40
-
41
- Contract Num, Num
42
- def test(x)
43
- x + 2
44
- end
45
- end
46
-
47
- # this doesn't work
48
- # p Object.send(:sum, 1, 2)
49
-
50
- # but this does:
51
- # p send(:sum, 1, 2)
52
- #
53
- # why???
54
-
55
- Testable.check_all
56
- # Testable.check(method(:double))
57
-
58
- # p Object.test(5)
59
- #
60
- Object.Hello