ruby_contracts 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # RubyContracts
2
2
 
3
- RubyContracts is a small DSL to add pre & post condition to methods. It try to bring some design by contract in the Ruby world.
3
+ RubyContracts is a small DSL to add pre & post condition to methods. It tries to bring some design by contract in the Ruby world.
4
4
 
5
5
  ## Installation
6
6
 
data/Rakefile CHANGED
@@ -1,2 +1,12 @@
1
1
  #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
2
+ require 'bundler/gem_tasks'
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << 'test'
7
+ t.pattern = 'test/*_test.rb'
8
+ t.verbose = true
9
+ end
10
+
11
+ desc "Run tests"
12
+ task :default => :test
@@ -1,3 +1,3 @@
1
1
  module RubyContracts
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
@@ -34,7 +34,7 @@ module Contracts
34
34
  def __contracts_for(name, current_contracts=nil)
35
35
  inherited_contracts = ancestors[1..-1].reduce(Contracts.empty_contracts) do |c, klass|
36
36
  ancestor_hash = klass.instance_variable_get('@__contracts_for') || {}
37
- c[:before] << ancestor_hash[name][:before] if ancestor_hash.has_key?(name)
37
+ c[:before] += ancestor_hash[name][:before] if ancestor_hash.has_key?(name)
38
38
  c[:after] += ancestor_hash[name][:after] if ancestor_hash.has_key?(name)
39
39
  c
40
40
  end
@@ -115,8 +115,8 @@ module Contracts
115
115
  code << "__before_contracts_disjunction << __before_contracts_conjunction\n"
116
116
  code
117
117
  end
118
- before_contracts << "if __before_contracts_disjunction.any?{|conj| !conj.empty?} then\n"
119
- before_contracts << " self.class.__contract_failure!(*__before_contracts_disjunction.first.first)\n"
118
+ before_contracts << "unless __before_contracts_disjunction.any?{|conj| conj.empty?} then\n"
119
+ before_contracts << " self.class.__contract_failure!(*__before_contracts_disjunction.find{|conj| !conj.empty?}.first)\n"
120
120
  before_contracts << "end\n"
121
121
 
122
122
  after_contracts = __contracts[:after].reduce("") do |code, contract|
@@ -124,7 +124,7 @@ module Contracts
124
124
  case type
125
125
  when :type
126
126
  code << "if !result.kind_of?(#{args[0]}) then\n"
127
- code << "self.class.__contract_failure!(name, \"result must be a kind of '#{args[0]}' not '%s'\" % [result.class.to_s], result, *__args)\n"
127
+ code << " self.class.__contract_failure!(name, \"result must be a kind of '#{args[0]}' not '%s'\" % [result.class.to_s], result, *__args)\n"
128
128
  code << "end\n"
129
129
  code
130
130
  when :result
@@ -7,8 +7,8 @@ require 'ruby_contracts/version'
7
7
  Gem::Specification.new do |gem|
8
8
  gem.authors = ["nicoolas25"]
9
9
  gem.email = ["nicoolas25@gmail.com"]
10
- gem.description = %q{Micro DSL to add pre & post condition to methods. It try to bring some design by contract in the Ruby world.}
11
- gem.summary = %q{Micro DSL to add pre & post condition to methods. It try to bring some design by contract in the Ruby world.}
10
+ gem.description = %q{Micro DSL to add pre & post condition to methods. It tries to bring some design by contract in the Ruby world.}
11
+ gem.summary = %q{Micro DSL to add pre & post condition to methods. It tries to bring some design by contract in the Ruby world.}
12
12
  gem.homepage = ""
13
13
 
14
14
  gem.files = `git ls-files`.split($\)
@@ -0,0 +1,37 @@
1
+ class Parent
2
+ include Contracts::DSL
3
+ EPSILON = 1e-7
4
+ attr_reader :value, :minimum_incr
5
+
6
+ type :in => [Numeric, Numeric]
7
+ pre "val >= 0, mininc > 0" do |v, mininc| v >= 0 && mininc > 0 end
8
+ post "initialized" do |result, v, mininc| @value == v && @minimum_incr == mininc end
9
+ def initialize(v, mininc)
10
+ @value = v
11
+ @minimum_incr = mininc
12
+ end
13
+
14
+ type :in => [Numeric], :out => Numeric
15
+ pre "n > minimum_incr" do |n| n > minimum_incr end
16
+ post "value == old value + n" do "[dummy]" end
17
+ def increment(n)
18
+ value += n
19
+ end
20
+
21
+ def to_s
22
+ value.to_s
23
+ end
24
+ end
25
+
26
+ class ChildWithRedef < Parent
27
+ def increment(n)
28
+ @value += n
29
+ end
30
+ end
31
+
32
+ class ChildWithAddedPrecondition < Parent
33
+ pre "n >= minimum_incr" do |n| n >= minimum_incr end
34
+ def increment(n)
35
+ @value += n
36
+ end
37
+ end
@@ -0,0 +1,41 @@
1
+ require 'test_helper'
2
+
3
+ require_relative 'fixtures/inheritance_classes'
4
+
5
+ describe 'the contracts behavior in an inheritance context' do
6
+ describe 'the initialization process' do
7
+ describe 'with valid arguments' do
8
+ it 'should not raise any exception' do
9
+ Parent.new(10, 2).wont_be_nil
10
+ ChildWithRedef.new(10, 2).wont_be_nil
11
+ end
12
+ end
13
+
14
+ describe 'with invalid arguments' do
15
+ it 'should raise an Contracts::Error' do
16
+ proc { ChildWithRedef.new(10, 0) }.must_raise Contracts::Error
17
+ end
18
+ end
19
+ end
20
+
21
+
22
+ describe 'the redifinition of an existing method with precondition' do
23
+ describe 'the child\'s overriden method call' do
24
+ describe 'the child specifies no precondition' do
25
+ let(:child) { ChildWithRedef.new(10,3) }
26
+ it 'satisfies the parent preconditions' do
27
+ child.increment(4)
28
+ proc { child.increment(3) }.must_raise Contracts::Error
29
+ end
30
+ end
31
+
32
+ describe 'the child specifies additionnal preconditions' do
33
+ let(:child) { ChildWithAddedPrecondition.new(10, 3) }
34
+ it 'satisfies the parent OR the child preconditions' do
35
+ child.increment(3)
36
+ proc { child.increment(2) }.must_raise Contracts::Error
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,4 @@
1
+ ENV['ENABLE_ASSERTION'] = '1'
2
+
3
+ require 'ruby_contracts'
4
+ require 'minitest/autorun'
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.3
4
+ version: 0.2.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,9 +9,9 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-13 00:00:00.000000000 Z
12
+ date: 2013-06-14 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: Micro DSL to add pre & post condition to methods. It try to bring some
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.
16
16
  email:
17
17
  - nicoolas25@gmail.com
@@ -27,6 +27,9 @@ files:
27
27
  - lib/ruby_contracts.rb
28
28
  - lib/ruby_contracts/version.rb
29
29
  - ruby_contracts.gemspec
30
+ - test/fixtures/inheritance_classes.rb
31
+ - test/inheritance_test.rb
32
+ - test/test_helper.rb
30
33
  homepage: ''
31
34
  licenses: []
32
35
  post_install_message:
@@ -50,7 +53,10 @@ rubyforge_project:
50
53
  rubygems_version: 1.8.23
51
54
  signing_key:
52
55
  specification_version: 3
53
- summary: Micro DSL to add pre & post condition to methods. It try to bring some design
54
- by contract in the Ruby world.
55
- test_files: []
56
+ summary: Micro DSL to add pre & post condition to methods. It tries to bring some
57
+ design by contract in the Ruby world.
58
+ test_files:
59
+ - test/fixtures/inheritance_classes.rb
60
+ - test/inheritance_test.rb
61
+ - test/test_helper.rb
56
62
  has_rdoc: