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 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