rspec-contracts 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/History.md +6 -0
- data/lib/rspec/contracts/interface_fulfillment.rb +10 -2
- data/lib/rspec/contracts/message.rb +29 -15
- data/lib/rspec/contracts/message_group.rb +27 -0
- data/lib/rspec/contracts/message_view.rb +4 -3
- data/lib/rspec/contracts/method_proxy.rb +10 -9
- data/lib/rspec/contracts/mock_proxy.rb +20 -11
- data/lib/rspec/contracts/returned_response.rb +19 -0
- data/lib/rspec/contracts/unspecified_response.rb +13 -0
- data/lib/rspec/contracts/version.rb +1 -1
- data/lib/rspec/contracts/yielded_response.rb +19 -0
- metadata +6 -4
- data/lib/rspec/contracts/message_arguments.rb +0 -19
- data/lib/rspec/contracts/message_return.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2498fd054ba675910e806c20dd6ad10affc4a205
|
4
|
+
data.tar.gz: 647201f2dfc73ba118bd9f3f19fba37805e16f89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58214e17ed15aee2ad8b9c2df684ae8c9be5bd37762198515b0f42dc47d82c791263732c60af30d1d89c20af5ea026d8634598c37389e5d7d6d61ac151eb59dc
|
7
|
+
data.tar.gz: dcaf8eb9cfe973ddc128040869409cb6c67359c09a93fa898cdb190bf309cd77a790702c2497fec9f6e9952be5251074f14e2511c6ef1c8ce52f0ce468ac925f
|
data/History.md
CHANGED
@@ -13,7 +13,7 @@ module RSpec
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def unfulfilled_messages
|
16
|
-
interface.unique_messages.reject{ |r|
|
16
|
+
interface.unique_messages.reject{ |r| fulfilled? r }
|
17
17
|
end
|
18
18
|
|
19
19
|
def messages_count
|
@@ -22,12 +22,20 @@ module RSpec
|
|
22
22
|
|
23
23
|
private
|
24
24
|
|
25
|
+
def fulfilled?(message)
|
26
|
+
fulfilled_by_any?(message) && fulfilled_by_all?(message.without_response)
|
27
|
+
end
|
28
|
+
|
25
29
|
def fulfilled_by_all?(message)
|
26
30
|
@implementors.all?{ |i| fulfilled_by? message, i }
|
27
31
|
end
|
28
32
|
|
33
|
+
def fulfilled_by_any?(message)
|
34
|
+
@implementors.any?{ |i| fulfilled_by? message, i }
|
35
|
+
end
|
36
|
+
|
29
37
|
def fulfilled_by?(message, implementor)
|
30
|
-
implementor.messages.any? { |m| message.
|
38
|
+
implementor.messages.any? { |m| message.described_by? m }
|
31
39
|
end
|
32
40
|
end
|
33
41
|
end
|
@@ -1,28 +1,42 @@
|
|
1
|
+
require "rspec/contracts/unspecified_response"
|
2
|
+
|
1
3
|
module RSpec
|
2
4
|
module Contracts
|
3
5
|
class Message
|
4
|
-
attr_reader :
|
5
|
-
attr_accessor :
|
6
|
+
attr_reader :name
|
7
|
+
attr_accessor :arguments, :response
|
8
|
+
|
9
|
+
def initialize(name, arguments = nil)
|
10
|
+
@name = name
|
11
|
+
@arguments = arguments
|
12
|
+
@response = UnspecifiedResponse.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def described_by?(message)
|
16
|
+
[:name, :arguments, :response].all? { |n| send "#{n}_described_by?", message }
|
17
|
+
end
|
18
|
+
|
19
|
+
def name_described_by?(message)
|
20
|
+
message.name == name
|
21
|
+
end
|
22
|
+
|
23
|
+
def arguments_described_by?(message)
|
24
|
+
arguments.nil? || arguments == message.arguments
|
25
|
+
end
|
6
26
|
|
7
|
-
def
|
8
|
-
|
9
|
-
@specifications = specifications
|
27
|
+
def response_described_by?(message)
|
28
|
+
response.described_by? message.response
|
10
29
|
end
|
11
30
|
|
12
|
-
def
|
13
|
-
|
14
|
-
@specifications.each do |name, specification|
|
15
|
-
unless specification.fully_described_by? message.specifications[name]
|
16
|
-
return false
|
17
|
-
end
|
18
|
-
end
|
19
|
-
true
|
31
|
+
def without_response
|
32
|
+
self.class.new name, arguments
|
20
33
|
end
|
21
34
|
|
22
35
|
def to_hash
|
23
36
|
{
|
24
|
-
:
|
25
|
-
:
|
37
|
+
:name => name,
|
38
|
+
:arguments => arguments,
|
39
|
+
:response => response.to_hash,
|
26
40
|
}
|
27
41
|
end
|
28
42
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "rspec/contracts/message"
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Contracts
|
5
|
+
class MessageGroup
|
6
|
+
def initialize(receiver, method_name, arguments = nil)
|
7
|
+
@receiver = receiver
|
8
|
+
add_message Message.new(method_name, arguments)
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_message(message)
|
12
|
+
@message = message
|
13
|
+
@receiver.add_message @message
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_arguments(arguments)
|
17
|
+
@message.arguments = arguments
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_response(response)
|
21
|
+
add_message @message.without_response if @multiple_responses
|
22
|
+
@message.response = response
|
23
|
+
@multiple_responses = true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -7,9 +7,10 @@ module RSpec
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def render
|
10
|
-
arg_string = @message.
|
11
|
-
return_string = @message.
|
12
|
-
|
10
|
+
arg_string = @message.arguments ? "()" : ""
|
11
|
+
return_string = @message.response.respond_to?(:returned_value) ? "and return #{@message.response.returned_value.inspect}" : ""
|
12
|
+
yield_string = @message.response.respond_to?(:yielded_value) ? "and return #{@message.response.yielded_value.inspect}" : ""
|
13
|
+
"Interface '#{@interface_name}' must respond to '#{@message.name}#{arg_string}' #{return_string} #{yield_string}"
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require "rspec/contracts/
|
2
|
-
require "rspec/contracts/
|
1
|
+
require "rspec/contracts/message_group"
|
2
|
+
require "rspec/contracts/returned_response"
|
3
|
+
require "rspec/contracts/yielded_response"
|
3
4
|
|
4
5
|
module RSpec
|
5
6
|
module Contracts
|
@@ -8,10 +9,8 @@ module RSpec
|
|
8
9
|
new(*args)
|
9
10
|
end
|
10
11
|
|
11
|
-
def add_message(
|
12
|
-
|
13
|
-
@implementor.add_message message
|
14
|
-
message
|
12
|
+
def add_message(arguments)
|
13
|
+
MessageGroup.new @implementor, @method_name, arguments
|
15
14
|
end
|
16
15
|
|
17
16
|
private
|
@@ -27,9 +26,11 @@ module RSpec
|
|
27
26
|
original_method = @proxied_class.instance_method @method_name
|
28
27
|
method_proxy = self
|
29
28
|
@proxied_class.send :define_method, @method_name do |*args|
|
30
|
-
|
31
|
-
return_value = original_method.bind(self).call(*args)
|
32
|
-
|
29
|
+
message_group = method_proxy.add_message args
|
30
|
+
return_value = original_method.bind(self).call(*args) do |*values|
|
31
|
+
message_group.add_response YieldedResponse.new(*values)
|
32
|
+
end
|
33
|
+
message_group.add_response ReturnedResponse.new(return_value)
|
33
34
|
return_value
|
34
35
|
end
|
35
36
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "rspec/mocks"
|
2
|
-
require "rspec/contracts/
|
3
|
-
require "rspec/contracts/
|
2
|
+
require "rspec/contracts/message_group"
|
3
|
+
require "rspec/contracts/returned_response"
|
4
|
+
require "rspec/contracts/yielded_response"
|
4
5
|
|
5
6
|
module RSpec
|
6
7
|
module Contracts
|
@@ -17,13 +18,20 @@ module RSpec
|
|
17
18
|
attr_reader :message
|
18
19
|
|
19
20
|
def initialize(interface, object, method_name, proxy)
|
20
|
-
@
|
21
|
-
interface.add_message @message
|
21
|
+
@message_group = MessageGroup.new(interface, method_name)
|
22
22
|
super(object, method_name, proxy)
|
23
23
|
end
|
24
24
|
|
25
|
+
def set_arguments(arguments)
|
26
|
+
@message_group.set_arguments arguments
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_response(response)
|
30
|
+
@message_group.add_response response
|
31
|
+
end
|
32
|
+
|
25
33
|
def add_simple_stub(method_name, return_value)
|
26
|
-
|
34
|
+
add_response ReturnedResponse.new(return_value)
|
27
35
|
super
|
28
36
|
end
|
29
37
|
|
@@ -33,17 +41,18 @@ module RSpec
|
|
33
41
|
end
|
34
42
|
|
35
43
|
class ContractMessageExpectation < Mocks::MessageExpectation
|
36
|
-
def contract_message
|
37
|
-
@method_double.message
|
38
|
-
end
|
39
|
-
|
40
44
|
def with(*args)
|
41
|
-
|
45
|
+
@method_double.set_arguments args
|
42
46
|
super
|
43
47
|
end
|
44
48
|
|
45
49
|
def and_return(*args)
|
46
|
-
|
50
|
+
args.each { |value| @method_double.add_response ReturnedResponse.new(value) }
|
51
|
+
super
|
52
|
+
end
|
53
|
+
|
54
|
+
def and_yield(*args)
|
55
|
+
@method_double.add_response YieldedResponse.new(*args)
|
47
56
|
super
|
48
57
|
end
|
49
58
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Contracts
|
3
|
+
class ReturnedResponse
|
4
|
+
attr_reader :returned_value
|
5
|
+
|
6
|
+
def initialize(value)
|
7
|
+
@returned_value = value
|
8
|
+
end
|
9
|
+
|
10
|
+
def described_by?(response)
|
11
|
+
response.respond_to?(:returned_value) && (returned_value == response.returned_value)
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_hash
|
15
|
+
{:returned_value => returned_value}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Contracts
|
3
|
+
class YieldedResponse
|
4
|
+
attr_reader :yielded_values
|
5
|
+
|
6
|
+
def initialize(*values)
|
7
|
+
@yielded_values = values
|
8
|
+
end
|
9
|
+
|
10
|
+
def described_by?(response)
|
11
|
+
response.respond_to?(:yielded_values) && (yielded_values == response.yielded_values)
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_hash
|
15
|
+
{:yielded_values => yielded_values}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-contracts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Auton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -73,13 +73,15 @@ files:
|
|
73
73
|
- lib/rspec/contracts/interface_group.rb
|
74
74
|
- lib/rspec/contracts/interface_proxy.rb
|
75
75
|
- lib/rspec/contracts/message.rb
|
76
|
-
- lib/rspec/contracts/
|
77
|
-
- lib/rspec/contracts/message_return.rb
|
76
|
+
- lib/rspec/contracts/message_group.rb
|
78
77
|
- lib/rspec/contracts/message_view.rb
|
79
78
|
- lib/rspec/contracts/method_proxy.rb
|
80
79
|
- lib/rspec/contracts/mock_proxy.rb
|
81
80
|
- lib/rspec/contracts/mocks_syntax.rb
|
81
|
+
- lib/rspec/contracts/returned_response.rb
|
82
|
+
- lib/rspec/contracts/unspecified_response.rb
|
82
83
|
- lib/rspec/contracts/version.rb
|
84
|
+
- lib/rspec/contracts/yielded_response.rb
|
83
85
|
homepage: http://github.com/brianauton/rspec-contracts
|
84
86
|
licenses:
|
85
87
|
- MIT
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Contracts
|
3
|
-
class MessageArguments
|
4
|
-
attr_reader :arguments
|
5
|
-
|
6
|
-
def initialize(arguments)
|
7
|
-
@arguments = arguments
|
8
|
-
end
|
9
|
-
|
10
|
-
def fully_described_by?(other)
|
11
|
-
other && (arguments == other.arguments)
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_hash
|
15
|
-
{:arguments => arguments}
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Contracts
|
3
|
-
class MessageReturn
|
4
|
-
attr_reader :value
|
5
|
-
|
6
|
-
def initialize(value)
|
7
|
-
@value = value
|
8
|
-
end
|
9
|
-
|
10
|
-
def fully_described_by?(other)
|
11
|
-
other && (value == other.value)
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_hash
|
15
|
-
{:value => value}
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|