ruby_contracts 0.2.4 → 0.2.5

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.
@@ -1,3 +1,3 @@
1
1
  module RubyContracts
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
@@ -87,13 +87,15 @@ module Contracts
87
87
  case type
88
88
  when :type
89
89
  classes = args[0]
90
- code << "if __args.size < #{classes.size} then\n"
91
- code << " __before_contracts_conjunction << ['#{name}', \"need at least #{classes.size} arguments (%i given)\" % [__args.size], nil, *args]\n"
92
- code << "else\n"
90
+ code << "if __before_contracts_conjunction.empty? then\n"
91
+ code << " if __args.size < #{classes.size} then\n"
92
+ code << " __before_contracts_conjunction << ['#{name}', \"need at least #{classes.size} arguments (%i given)\" % [__args.size], nil, *args]\n"
93
+ code << " else\n"
93
94
  conditions = []
94
95
  classes.each_with_index{ |klass, i| conditions << "__args[#{i}].kind_of?(#{klass})" }
95
- code << " if !(#{conditions.join(' && ')}) then\n"
96
- code << " __before_contracts_conjunction << ['#{name}', 'input type error', nil, *__args]\n"
96
+ code << " if !(#{conditions.join(' && ')}) then\n"
97
+ code << " __before_contracts_conjunction << ['#{name}', 'input type error', nil, *__args]\n"
98
+ code << " end\n"
97
99
  code << " end\n"
98
100
  code << "end\n"
99
101
  code
@@ -103,8 +105,10 @@ module Contracts
103
105
  contract_method_name = "__verify_contract_#{name}_in_#{count = count + 1}"
104
106
  define_method(contract_method_name) { |*params| self.instance_exec(*params, &args[1]) }
105
107
 
106
- code << "if !#{contract_method_name}(*__args) then\n"
107
- code << " __before_contracts_conjunction << ['#{name}', \"invalid precondition: #{args[0]}\", nil, *__args]\n"
108
+ code << "if __before_contracts_conjunction.empty? then\n"
109
+ code << " if !#{contract_method_name}(*__args) then\n"
110
+ code << " __before_contracts_conjunction << ['#{name}', \"invalid precondition: #{args[0]}\", nil, *__args]\n"
111
+ code << " end\n"
108
112
  code << "end\n"
109
113
  code
110
114
  else
@@ -0,0 +1,14 @@
1
+ class SomeClass
2
+ include Contracts::DSL
3
+
4
+ type :in => [Numeric]
5
+ def method(num)
6
+ num + 5
7
+ end
8
+
9
+ type :in => [Numeric]
10
+ pre 'input should be > 0' do |input| input > 0 end
11
+ def method2(num)
12
+ num + 5
13
+ end
14
+ end
@@ -0,0 +1,26 @@
1
+ require 'test_helper'
2
+
3
+ require_relative 'fixtures/preconditions_classes'
4
+
5
+
6
+ describe 'the type precondition' do
7
+ # method contains only one precondition about the input type
8
+ # method2 is used to see the behaviour in presence of other preconditions
9
+
10
+ let(:instance) { SomeClass.new }
11
+
12
+ it 'should raise an exception if there is an unexpected number of arguments' do
13
+ proc { instance.method() }.must_raise Contracts::Error
14
+ proc { instance.method2() }.must_raise Contracts::Error
15
+ end
16
+
17
+ it 'should raise an exception if an argument have the wrong type' do
18
+ proc { instance.method('five') }.must_raise Contracts::Error
19
+ proc { instance.method2('five') }.must_raise Contracts::Error
20
+ end
21
+
22
+ it 'should run and return normally if there is the expected arguments' do
23
+ instance.method(5).must_equal 10
24
+ instance.method2(5).must_equal 10
25
+ end
26
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_contracts
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-14 00:00:00.000000000 Z
12
+ date: 2013-06-15 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Micro DSL to add pre & post condition to methods. It tries to bring some
15
15
  design by contract in the Ruby world.
@@ -28,7 +28,9 @@ files:
28
28
  - lib/ruby_contracts/version.rb
29
29
  - ruby_contracts.gemspec
30
30
  - test/fixtures/inheritance_classes.rb
31
+ - test/fixtures/preconditions_classes.rb
31
32
  - test/inheritance_test.rb
33
+ - test/preconditions_test.rb
32
34
  - test/test_helper.rb
33
35
  homepage: ''
34
36
  licenses: []
@@ -57,6 +59,8 @@ summary: Micro DSL to add pre & post condition to methods. It tries to bring som
57
59
  design by contract in the Ruby world.
58
60
  test_files:
59
61
  - test/fixtures/inheritance_classes.rb
62
+ - test/fixtures/preconditions_classes.rb
60
63
  - test/inheritance_test.rb
64
+ - test/preconditions_test.rb
61
65
  - test/test_helper.rb
62
66
  has_rdoc: