rdbc 0.3.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YzIzMDU2MWJlODM2ZmJlZWJjZmI3YjM0NzI4ZDU2MzQ4MTQ2Mjc5ZQ==
5
+ data.tar.gz: !binary |-
6
+ ZWNkOWU1ZmYwNmExYWEzNmNiYjkzZTlkM2NkMjViYzkyYmRhYmE1NA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ Mzg1YjQ5Y2I5ZmM4ODBkNzU2YWM0NTU1YzE1ZTZmZjkxMTNlNDkwMjhiODY5
10
+ MWZkMTJmZjRiMDFiNzM2NzA0YjA1OGRkYWFlYTM2MzlkZDYzYjk4YjdjOTAz
11
+ Y2Q1MWU5NWNhOWJmYTZlYzJhY2Y5MGIyODVmYjhjZmExODg3MjQ=
12
+ data.tar.gz: !binary |-
13
+ MjIwNzA0NGMyYTdlOTdmNGI1YWNlMjc4ZjJkN2VjZDBhNjdmOWYyMjdjN2Qw
14
+ NjBiYjk4ZjcwMTFkNjc3Y2QzMzQ4YjQyZGYyYmE5MTk1NDkwOTA5NzA0NmNj
15
+ MGE1MzAzNzJjMDI3MWJlYTc3YWI2YjU2MWZjODNjNGNkYWNkOWM=
@@ -4,42 +4,45 @@ This library supports Design by Contract for Ruby.
4
4
 
5
5
  =Installation
6
6
 
7
- Install the *rdbc* gem itself by the following command:
7
+ Install the *rdbc* gem by the following command:
8
8
 
9
- $ gem install armin-joellenbeck-rdbc --source http://gems.github.com
9
+ $ gem install rdbc
10
10
 
11
11
  =Usage
12
12
 
13
- Given there is a the class Foo.
14
- For instances of this class you can define a contract by subclassing
15
- <b>Rdbc::Contract</b>, in the example the contract is named
16
- FooContract.
17
- Then connect the class Foo to its contract FooContract by using the line
18
- contract FooContract
19
- in the class definition of Foo.
13
+ Given there is a the class *Foo*.
20
14
 
21
- Then the following happens when a method of a Foo instance is called:
15
+ For instances of this class you can define a contract by subclassing:
16
+ FooContract < Rdbc::Contract.
22
17
 
23
- 1. the corresponding pre condition is called with the parameters:
18
+ Then connect the class *Foo* to its contract *FooContract* by using
19
+ class Foo
20
+ contract FooContract
21
+ ...
22
+ end
23
+
24
+ Then the following happens when a method named *bar* of a *Foo* instance is called:
25
+
26
+ 1. the corresponding pre condition *pre_bar* is called with the parameters:
24
27
  * the instance itself
25
28
  * the parameters of the method call
26
29
 
27
- 2. the method is called
30
+ 2. the original method *bar* itself is called
28
31
 
29
- 3. the corresponding post condition is called with the parameters:
30
- * the instance before the method is called
31
- * the instance after the method is called
32
- * the return value of the method call
32
+ 3. the corresponding post condition *post_bar* is called with the parameters:
33
+ * the instance before the original method is called
34
+ * the instance after the original method is called
35
+ * the return value of the method call respectively a raised exception
33
36
  * the parameters of the method call
34
37
 
35
- 4. the invariant is called with the parameters:
36
- * the instance before the method is called
37
- * the instance after the method is called
38
+ 4. the mathod *invariant* is called with the parameters:
39
+ * the instance before the original method is called
40
+ * the instance after the original method is called
38
41
 
39
- The instance before the execution of *method* in 3. and 4.
42
+ The instance before the execution of the original method in 3. and 4.
40
43
  is in fact a copy of the instance before the execution. So you have to implement
41
44
  the method *initialize_copy* in the class under contract, i.e. the class
42
- Foo.
45
+ *Foo*.
43
46
 
44
47
  =Support
45
48
 
@@ -55,7 +58,7 @@ Feel free to send:
55
58
 
56
59
  =Copyright
57
60
 
58
- Copyright (c) 2007 - 2009 by Armin Jöllenbeck
61
+ Copyright (c) 2007 - 2013 by Armin Jöllenbeck
59
62
  <armin@joellenbeck.net[mailto:armin@joellenbeck.net]>
60
63
 
61
64
  All rights reserved.
@@ -1,15 +1,2 @@
1
1
  module Rdbc
2
- autoload 'Contract', 'rdbc/contract'
3
- autoload 'Decorator', 'rdbc/decorator'
4
- end
5
-
6
-
7
- class Class
8
- def contract(contract_class)
9
- old_new = self.method(:new)
10
- (class << self; self; end).send(:define_method, :new) do |*args|
11
- object = old_new.call(*args)
12
- Rdbc::Decorator.new(contract_class.new(object))
13
- end
14
- end
15
2
  end
@@ -1,87 +1,57 @@
1
- module Rdbc
2
- class Contract
3
- def self.method_pre(method)
4
- method_with_prefix(method, 'pre')
5
- end
1
+ require 'rdbc/translator'
6
2
 
7
- def self.method_post(method)
8
- method_with_prefix(method, 'post')
3
+ class Rdbc::Contract
4
+ class << self
5
+ private
6
+ def pre(method, &block)
7
+ define_method(Rdbc::Translator.method_pre(method), &block)
9
8
  end
10
9
 
11
- def self.method_with_prefix(method, type)
12
- (type + '_' + (operator?(method) ? operator(method) : method.to_s)).to_sym
10
+ def post(method, &block)
11
+ define_method(Rdbc::Translator.method_post(method), &block)
13
12
  end
14
13
 
15
- def self.operator?(method)
16
- /^[A-Za-z_]/ !~ method.to_s
14
+ def invariant(&block)
15
+ define_method(:invariant, &block)
17
16
  end
18
-
19
- def self.operator(method)
20
- 'op_' + OPERATOR[method]
17
+ end
18
+
19
+ private
20
+ def initialize(object)
21
+ @object = object
22
+ send_if_respond_to(:invariant, object)
23
+ end
24
+
25
+ def method_missing(method, *args)
26
+ send_if_respond_to(Rdbc::Translator.method_pre(method), @object, *args)
27
+ before = @object.dup
28
+ begin
29
+ result = @object.send(method, *args)
30
+ rescue RuntimeError => result
31
+ end
32
+ send_if_respond_to(:invariant, @object)
33
+ send_if_respond_to(Rdbc::Translator.method_post(method), before, @object, result, *args)
34
+ if result.kind_of?(RuntimeError)
35
+ raise result
36
+ else
37
+ result
21
38
  end
39
+ end
22
40
 
23
- OPERATOR = {
24
- :[] => 'element_read',
25
- :[]= => 'element_write',
26
- :** => 'power',
27
- :~ => 'not',
28
- :+@ => 'unary_plus',
29
- :-@ => 'unary_minus',
30
- :* => 'product',
31
- :/ => 'quotient',
32
- :% => 'modulo',
33
- :+ => 'plus',
34
- :- => 'minus',
35
- :>> => 'right_shift',
36
- :<< => 'left_shift',
37
- :& => 'and',
38
- :^ => 'xor',
39
- :| => 'or',
40
- :<= => 'less_or_equal',
41
- :< => 'less',
42
- :> => 'greater',
43
- :>= => 'greater_or_equal',
44
- :<=> => 'comparison',
45
- :== => 'eql',
46
- :=== => 'case_comparison',
47
- :=~ => 'match'
48
- }
49
-
50
- def self.pre(method, &block)
51
- define_method(method_pre(method), &block)
41
+ def send_if_respond_to(method, *args)
42
+ if respond_to?(method)
43
+ send(method, *args)
52
44
  end
45
+ end
46
+ end
53
47
 
54
- def self.post(method, &block)
55
- define_method(method_post(method), &block)
56
- end
57
48
 
58
- def self.invariant(&block)
59
- define_method(:invariant, &block)
60
- end
61
-
62
- def initialize(object)
63
- @object = object
64
- @translator = self.class
65
- end
66
-
67
- def method_missing(method, *args)
68
- @object_pre = @object.clone
69
- send_if_respond_to(@translator.method_pre(method), *args)
70
- result = nil
71
- begin
72
- result = @object.send(method, *args)
73
- rescue StandardError => result
74
- end
75
- send_if_respond_to(:invariant)
76
- send_if_respond_to(@translator.method_post(method), result, *args)
77
- raise result if result.kind_of?(StandardError)
78
- result
79
- end
80
-
81
- def send_if_respond_to(method, *args)
82
- if respond_to?(method)
83
- send(method, *args)
84
- end
49
+ class Class
50
+ def contract(contract_class)
51
+ old_new = self.method(:new)
52
+ (class << self; self; end).send(:define_method, :new) do |*args|
53
+ object = old_new.call(*args)
54
+ contract_class.new(object)
85
55
  end
86
56
  end
87
- end
57
+ end
@@ -0,0 +1,43 @@
1
+ require 'rdbc'
2
+
3
+ # TODO rename to Rdbc::Translating
4
+ module Rdbc::Translator
5
+ def self.method_pre(method)
6
+ method_with_prefix(method, :pre)
7
+ end
8
+
9
+ def self.method_post(method)
10
+ method_with_prefix(method, :post)
11
+ end
12
+
13
+ def self.method_with_prefix(method, type)
14
+ :"#{type}_#{OPERATOR[method] || method}"
15
+ end
16
+
17
+ OPERATOR = {
18
+ :[] => :op_element_read,
19
+ :[]= => :op_element_write,
20
+ :** => :op_power,
21
+ :~ => :op_not,
22
+ :+@ => :op_unary_plus,
23
+ :-@ => :op_unary_minus,
24
+ :* => :op_product,
25
+ :/ => :op_quotient,
26
+ :% => :op_modulo,
27
+ :+ => :op_plus,
28
+ :- => :op_minus,
29
+ :>> => :op_right_shift,
30
+ :<< => :op_left_shift,
31
+ :& => :op_and,
32
+ :^ => :op_xor,
33
+ :| => :op_or,
34
+ :<= => :op_less_or_equal,
35
+ :< => :op_less,
36
+ :> => :op_greater,
37
+ :>= => :op_greater_or_equal,
38
+ :<=> => :op_comparison,
39
+ :== => :op_eql,
40
+ :=== => :op_case_comparison,
41
+ :=~ => :op_match
42
+ }
43
+ end
metadata CHANGED
@@ -1,46 +1,34 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rdbc
3
- version: !ruby/object:Gem::Version
4
- version: 0.3.4
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
5
  platform: ruby
6
- authors:
7
- - Armin Joellenbeck
6
+ authors:
7
+ - Armin Jöllenbeck
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
+ date: 2013-10-03 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ! ' This library supports Design by Contract for the Ruby programming
14
+ language.
11
15
 
12
- date: 2009-12-25 00:00:00 +01:00
13
- default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: blankslate
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - "="
22
- - !ruby/object:Gem::Version
23
- version: 2.1.2.3
24
- version:
25
- description: " This library supports Design by Contract for Ruby.\n"
16
+ '
26
17
  email: armin@joellenbeck.net
27
18
  executables: []
28
-
29
19
  extensions: []
30
-
31
- extra_rdoc_files:
20
+ extra_rdoc_files:
32
21
  - README.rdoc
33
- files:
22
+ files:
34
23
  - README.rdoc
35
24
  - lib/rdbc.rb
36
25
  - lib/rdbc/contract.rb
37
- - lib/rdbc/decorator.rb
38
- has_rdoc: true
39
- homepage: http://github.com/armin-joellenbeck/rdbc/tree/master
26
+ - lib/rdbc/translator.rb
27
+ homepage: http://github.com/armin-joellenbeck/rdbc
40
28
  licenses: []
41
-
29
+ metadata: {}
42
30
  post_install_message:
43
- rdoc_options:
31
+ rdoc_options:
44
32
  - --all
45
33
  - --charset
46
34
  - utf8
@@ -48,26 +36,22 @@ rdoc_options:
48
36
  - README.rdoc
49
37
  - --title
50
38
  - Design by Contract for Ruby
51
- require_paths:
39
+ require_paths:
52
40
  - lib
53
- required_ruby_version: !ruby/object:Gem::Requirement
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- version: "0"
58
- version:
59
- required_rubygems_version: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- version: "0"
64
- version:
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
65
51
  requirements: []
66
-
67
52
  rubyforge_project:
68
- rubygems_version: 1.3.5
53
+ rubygems_version: 2.0.3
69
54
  signing_key:
70
- specification_version: 3
55
+ specification_version: 4
71
56
  summary: Design by Contract for Ruby.
72
57
  test_files: []
73
-
@@ -1,20 +0,0 @@
1
- require 'blankslate'
2
-
3
- module Rdbc
4
- class Decorator < BlankSlate
5
- instance_methods.reject do |method|
6
- /__.*__/ === method
7
- end.each do |method|
8
- undef_method(method)
9
- end
10
-
11
- def initialize(contract)
12
- @contract = contract
13
- @contract.send_if_respond_to(:invariant)
14
- end
15
-
16
- def method_missing(method, *args)
17
- @contract.method_missing(method, *args)
18
- end
19
- end
20
- end