rspec-contracts 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87b15ff10f754beb89ee5b1d4243b8aea51ca5c3
4
- data.tar.gz: b28190904c6dc5fd3c909ee73cdbb7c9dd4df3ac
3
+ metadata.gz: 2498fd054ba675910e806c20dd6ad10affc4a205
4
+ data.tar.gz: 647201f2dfc73ba118bd9f3f19fba37805e16f89
5
5
  SHA512:
6
- metadata.gz: 27e3827e0404171952cdc793c8032caf74182e1621b2ad932c1d33cbf116ab63fd4ea8fcbbb4bde6bc8493f08c4ce4b9912341a02780b6d8e1eb2cb79cefe738
7
- data.tar.gz: f3f091d6f3f01819b6122727b678992068ef2304f59e7036777ef4ce49200d43c9352ce106a9b95e12d5c8b0e71da657037da8ba921aece444f346db428246ec
6
+ metadata.gz: 58214e17ed15aee2ad8b9c2df684ae8c9be5bd37762198515b0f42dc47d82c791263732c60af30d1d89c20af5ea026d8634598c37389e5d7d6d61ac151eb59dc
7
+ data.tar.gz: dcaf8eb9cfe973ddc128040869409cb6c67359c09a93fa898cdb190bf309cd77a790702c2497fec9f6e9952be5251074f14e2511c6ef1c8ce52f0ce468ac925f
data/History.md CHANGED
@@ -1,3 +1,9 @@
1
+ ### Version 0.0.3
2
+ 2014-3-30
3
+
4
+ * Require one or more implementors (not all) to satisfy each message response
5
+ * Support for yielded values
6
+
1
7
  ### Version 0.0.2
2
8
  2014-3-15
3
9
 
@@ -13,7 +13,7 @@ module RSpec
13
13
  end
14
14
 
15
15
  def unfulfilled_messages
16
- interface.unique_messages.reject{ |r| fulfilled_by_all? 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.fully_described_by? m }
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 :method_name
5
- attr_accessor :specifications
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 initialize(method_name, specifications = {})
8
- @method_name = method_name
9
- @specifications = specifications
27
+ def response_described_by?(message)
28
+ response.described_by? message.response
10
29
  end
11
30
 
12
- def fully_described_by?(message)
13
- return false if message.method_name != method_name
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
- :method_name => method_name,
25
- :specifications => specifications.values.map(&:to_hash),
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.specifications[:arguments] ? "()" : ""
11
- return_string = @message.specifications[:return_value] ? "and return #{@message.specifications[:return_value].value.inspect}" : ""
12
- "Interface '#{@interface_name}' must respond to '#{@message.method_name}#{arg_string}' #{return_string}"
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/message"
2
- require "rspec/contracts/message_arguments"
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(options)
12
- message = Message.new(@method_name, options)
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
- message = method_proxy.add_message :arguments => MessageArguments.new(args)
31
- return_value = original_method.bind(self).call(*args)
32
- message.specifications[:return_value] = MessageReturn.new(return_value)
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/message"
3
- require "rspec/contracts/message_return"
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
- @message = Message.new method_name
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
- @message.specifications[:return_value] = MessageReturn.new(return_value)
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
- contract_message.specifications[:arguments] = MessageArguments.new(args)
45
+ @method_double.set_arguments args
42
46
  super
43
47
  end
44
48
 
45
49
  def and_return(*args)
46
- contract_message.specifications[:return_value] = MessageReturn.new(args.first)
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,13 @@
1
+ module RSpec
2
+ module Contracts
3
+ class UnspecifiedResponse
4
+ def described_by?(response)
5
+ true
6
+ end
7
+
8
+ def to_hash
9
+ {}
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module Contracts
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  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.2
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-15 00:00:00.000000000 Z
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/message_arguments.rb
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