rspec-expectations 3.1.2 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,79 @@
1
+ module RSpec
2
+ module Matchers
3
+ # @api private
4
+ # Handles list of expected values when there is a need to render
5
+ # multiple diffs. Also can handle one value.
6
+ class ExpectedsForMultipleDiffs
7
+ # @private
8
+ # Default diff label when there is only one matcher in diff
9
+ # output
10
+ DEFAULT_DIFF_LABEL = "Diff:".freeze
11
+
12
+ # @private
13
+ # Maximum readable matcher description length
14
+ DESCRIPTION_MAX_LENGTH = 65
15
+
16
+ def initialize(expected_list)
17
+ @expected_list = expected_list
18
+ end
19
+
20
+ # @api private
21
+ # Wraps provided expected value in instance of
22
+ # ExpectedForMultipleDiffs. If provided value is already an
23
+ # ExpectedForMultipleDiffs then it just returns it.
24
+ # @param [Any] expected value to be wrapped
25
+ # @return [RSpec::Matchers::ExpectedsForMultipleDiffs]
26
+ def self.from(expected)
27
+ return expected if self === expected
28
+ new([[expected, DEFAULT_DIFF_LABEL]])
29
+ end
30
+
31
+ # @api private
32
+ # Wraps provided matcher list in instance of
33
+ # ExpectedForMultipleDiffs.
34
+ # @param [Array<Any>] matchers list of matchers to wrap
35
+ # @return [RSpec::Matchers::ExpectedsForMultipleDiffs]
36
+ def self.for_many_matchers(matchers)
37
+ new(matchers.map { |m| [m.expected, diff_label_for(m)] })
38
+ end
39
+
40
+ # @api private
41
+ # Returns message with diff(s) appended for provided differ
42
+ # factory and actual value if there are any
43
+ # @param [String] message original failure message
44
+ # @param [Proc] differ
45
+ # @param [Any] actual value
46
+ # @return [String]
47
+ def message_with_diff(message, differ, actual)
48
+ diff = diffs(differ, actual)
49
+ message = "#{message}\n#{diff}" unless diff.empty?
50
+ message
51
+ end
52
+
53
+ private
54
+
55
+ def self.diff_label_for(matcher)
56
+ "Diff for (#{truncated(description_for(matcher))}):"
57
+ end
58
+
59
+ def self.description_for(matcher)
60
+ matcher.description
61
+ rescue NoMethodError
62
+ matcher.inspect
63
+ end
64
+
65
+ def self.truncated(description)
66
+ return description if description.length <= DESCRIPTION_MAX_LENGTH
67
+ description[0...DESCRIPTION_MAX_LENGTH - 3] << "..."
68
+ end
69
+
70
+ def diffs(differ, actual)
71
+ @expected_list.map do |(expected, diff_label)|
72
+ diff = differ.diff(actual, expected)
73
+ next if diff.empty?
74
+ "#{diff_label}#{diff}"
75
+ end.compact.join("\n")
76
+ end
77
+ end
78
+ end
79
+ end
@@ -7,91 +7,91 @@ module RSpec
7
7
  class MatcherProtocol
8
8
  # @!group Required Methods
9
9
 
10
- # @method matches?
11
- # @param actual [Object] The object being matched against.
12
- # @yield For an expression like `expect(x).to matcher do...end`, the `do/end`
13
- # block binds to `to`. It passes that block, if there is one, on to this method.
14
- # @return [Boolean] true if this matcher matches the provided object.
10
+ # @!method matches?(actual)
11
+ # @param actual [Object] The object being matched against.
12
+ # @yield For an expression like `expect(x).to matcher do...end`, the `do/end`
13
+ # block binds to `to`. It passes that block, if there is one, on to this method.
14
+ # @return [Boolean] true if this matcher matches the provided object.
15
15
 
16
- # @method failure_message
17
- # This will only be called if {#matches?} returns false.
18
- # @return [String] Explanation for the failure.
16
+ # @!method failure_message
17
+ # This will only be called if {#matches?} returns false.
18
+ # @return [String] Explanation for the failure.
19
19
 
20
20
  # @!endgroup
21
21
 
22
22
  # @!group Optional Methods
23
23
 
24
- # @method does_not_match?
25
- # In a negative expectation such as `expect(x).not_to foo`, RSpec will
26
- # call `foo.does_not_match?(x)` if this method is defined. If it's not
27
- # defined it will fall back to using `!foo.matches?(x)`. This allows you
28
- # to provide custom logic for the negative case.
24
+ # @!method does_not_match?(actual)
25
+ # In a negative expectation such as `expect(x).not_to foo`, RSpec will
26
+ # call `foo.does_not_match?(x)` if this method is defined. If it's not
27
+ # defined it will fall back to using `!foo.matches?(x)`. This allows you
28
+ # to provide custom logic for the negative case.
29
29
  #
30
- # @param actual [Object] The object being matched against.
31
- # @yield For an expression like `expect(x).not_to matcher do...end`, the `do/end`
32
- # block binds to `not_to`. It passes that block, if there is one, on to this method.
33
- # @return [Boolean] true if this matcher does not match the provided object.
30
+ # @param actual [Object] The object being matched against.
31
+ # @yield For an expression like `expect(x).not_to matcher do...end`, the `do/end`
32
+ # block binds to `not_to`. It passes that block, if there is one, on to this method.
33
+ # @return [Boolean] true if this matcher does not match the provided object.
34
34
 
35
- # @method failure_message_when_negated
36
- # This will only be called when a negative match fails.
37
- # @return [String] Explanation for the failure.
38
- # @note This method is listed as optional because matchers do not have to
39
- # support negation. But if your matcher does support negation, this is a
40
- # required method -- otherwise, you'll get a `NoMethodError`.
35
+ # @!method failure_message_when_negated
36
+ # This will only be called when a negative match fails.
37
+ # @return [String] Explanation for the failure.
38
+ # @note This method is listed as optional because matchers do not have to
39
+ # support negation. But if your matcher does support negation, this is a
40
+ # required method -- otherwise, you'll get a `NoMethodError`.
41
41
 
42
- # @method description
43
- # The description is used for two things:
42
+ # @!method description
43
+ # The description is used for two things:
44
44
  #
45
- # * When using RSpec's one-liner syntax
46
- # (e.g. `it { is_expected.to matcher }`), the description
47
- # is used to generate the example's doc string since you
48
- # have not provided one.
49
- # * In a composed matcher expression, the description is used
50
- # as part of the failure message (and description) of the outer
51
- # matcher.
45
+ # * When using RSpec's one-liner syntax
46
+ # (e.g. `it { is_expected.to matcher }`), the description
47
+ # is used to generate the example's doc string since you
48
+ # have not provided one.
49
+ # * In a composed matcher expression, the description is used
50
+ # as part of the failure message (and description) of the outer
51
+ # matcher.
52
52
  #
53
- # @return [String] Description of the matcher.
53
+ # @return [String] Description of the matcher.
54
54
 
55
- # @method supports_block_expectations?
56
- # Indicates that this matcher can be used in a block expectation expression,
57
- # such as `expect { foo }.to raise_error`. Generally speaking, this is
58
- # only needed for matchers which operate on a side effect of a block, rather
59
- # than on a particular object.
60
- # @return [Boolean] true if this matcher can be used in block expressions.
61
- # @note If not defined, RSpec assumes a value of `false` for this method.
55
+ # @!method supports_block_expectations?
56
+ # Indicates that this matcher can be used in a block expectation expression,
57
+ # such as `expect { foo }.to raise_error`. Generally speaking, this is
58
+ # only needed for matchers which operate on a side effect of a block, rather
59
+ # than on a particular object.
60
+ # @return [Boolean] true if this matcher can be used in block expressions.
61
+ # @note If not defined, RSpec assumes a value of `false` for this method.
62
62
 
63
- # @method expects_call_stack_jump?
64
- # Indicates that when this matcher is used in a block expectation
65
- # expression, it expects the block to use a ruby construct that causes
66
- # a call stack jump (such as raising an error or throwing a symbol).
63
+ # @!method expects_call_stack_jump?
64
+ # Indicates that when this matcher is used in a block expectation
65
+ # expression, it expects the block to use a ruby construct that causes
66
+ # a call stack jump (such as raising an error or throwing a symbol).
67
67
  #
68
- # This is used internally for compound block expressions, as matchers
69
- # which expect call stack jumps must be treated with care to work properly.
68
+ # This is used internally for compound block expressions, as matchers
69
+ # which expect call stack jumps must be treated with care to work properly.
70
70
  #
71
- # @return [Boolean] true if the matcher expects a call stack jump
71
+ # @return [Boolean] true if the matcher expects a call stack jump
72
72
  #
73
- # @note This method is very rarely used or needed.
74
- # @note If not defined, RSpec assumes a value of `false` for this method.
73
+ # @note This method is very rarely used or needed.
74
+ # @note If not defined, RSpec assumes a value of `false` for this method.
75
75
 
76
- # @method diffable?
77
- # @return [Boolean] true if `actual` and `expected` can be diffed.
78
- # Indicates that this matcher provides `actual` and `expected` attributes,
79
- # and that the values returned by these can be usefully diffed, which can
80
- # be included in the output.
76
+ # @!method diffable?
77
+ # @return [Boolean] true if `actual` and `expected` can be diffed.
78
+ # Indicates that this matcher provides `actual` and `expected` attributes,
79
+ # and that the values returned by these can be usefully diffed, which can
80
+ # be included in the output.
81
81
 
82
- # @method actual
83
- # @return [String, Object] If an object (rather than a string) is provided,
84
- # RSpec will use the `pp` library to convert it to multi-line output in
85
- # order to diff.
86
- # The actual value for the purposes of a diff.
87
- # @note This method is required if `diffable?` returns true.
82
+ # @!method actual
83
+ # @return [String, Object] If an object (rather than a string) is provided,
84
+ # RSpec will use the `pp` library to convert it to multi-line output in
85
+ # order to diff.
86
+ # The actual value for the purposes of a diff.
87
+ # @note This method is required if `diffable?` returns true.
88
88
 
89
- # @method expected
90
- # @return [String, Object] If an object (rather than a string) is provided,
91
- # RSpec will use the `pp` library to convert it to multi-line output in
92
- # order to diff.
93
- # The expected value for the purposes of a diff.
94
- # @note This method is required if `diffable?` returns true.
89
+ # @!method expected
90
+ # @return [String, Object] If an object (rather than a string) is provided,
91
+ # RSpec will use the `pp` library to convert it to multi-line output in
92
+ # order to diff.
93
+ # The expected value for the purposes of a diff.
94
+ # @note This method is required if `diffable?` returns true.
95
95
 
96
96
  # @!endgroup
97
97
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-expectations
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.2
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Baker
@@ -12,28 +12,40 @@ bindir: bin
12
12
  cert_chain:
13
13
  - |
14
14
  -----BEGIN CERTIFICATE-----
15
- MIIDjjCCAnagAwIBAgIBATANBgkqhkiG9w0BAQUFADBGMRIwEAYDVQQDDAlyc3Bl
16
- Yy1kZXYxGzAZBgoJkiaJk/IsZAEZFgtnb29nbGVnb3VwczETMBEGCgmSJomT8ixk
17
- ARkWA2NvbTAeFw0xMzExMDcxOTQyNTlaFw0xNDExMDcxOTQyNTlaMEYxEjAQBgNV
18
- BAMMCXJzcGVjLWRldjEbMBkGCgmSJomT8ixkARkWC2dvb2dsZWdvdXBzMRMwEQYK
19
- CZImiZPyLGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
20
- nhCeZouDLXWO55no+EdZNCtjXjfJQ1X9TbPcvBDD29OypIUce2h/VdKXB2gI7ZHs
21
- F5NkPggslTErGFmWAtIiur7u943RVqHOsyoIsy065F9fCtrykkA+22elvTDha4Iz
22
- RUCvuhQ3klatYk4jF+cGt1jNONNVdLOiy0bMynvcM7hoVQ2AomwGs+cEOWQ/4dkD
23
- JcNV3qfzF5QBcTD2372XNM53b25nYVQSX2KH5FF7BhlKyov33bOm2gA9M+mWIujW
24
- qgkyxVlfrlE+ZBgV3wXn1Cojg1LpTq35yOArgwioyrwwlZZJR9joN9s/nDklfr5A
25
- +dyETjFc6cmEPWZrt2cJBQIDAQABo4GGMIGDMAkGA1UdEwQCMAAwCwYDVR0PBAQD
26
- AgSwMB0GA1UdDgQWBBSW+WD7hn1swJ1A7i8tbuFeuNCJCjAkBgNVHREEHTAbgRly
27
- c3BlYy1kZXZAZ29vZ2xlZ291cHMuY29tMCQGA1UdEgQdMBuBGXJzcGVjLWRldkBn
28
- b29nbGVnb3Vwcy5jb20wDQYJKoZIhvcNAQEFBQADggEBAH27jAZ8sD7vnXupj6Y+
29
- BaBdfHtCkFaslLJ0aKuMDIVXwYuKfqoW15cZPDLmSIEBuQFM3lw6d/hEEL4Uo2jZ
30
- FvtmH5OxifPDzFyUtCL4yp6qgNe/Xf6sDsRg6FmKcpgqCwNOmsViaf0LPSUH/GYQ
31
- 3Teoz8QCaDbD7AKsffT7eDrnbHnKweO1XdemRJC98u/yYxnGzMSWKEsn09etBlZ9
32
- 7H67k5Z3uf6cfLZgToWL6zShzZY3Nun5r73YsNf2/QZOe4UZe4vfGvn6baw53ys9
33
- 1yHC1AcSYpvi2dAbOiHT5iQF+krm4wse8KctXgTNnjMsHEoGKulJS2/sZl90jcCz
34
- muA=
15
+ MIIF1TCCA72gAwIBAgIJAPXjfUbCjdXUMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD
16
+ VQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO
17
+ MAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B
18
+ CQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMTQxMjIzMDkzNTIyWhcNMjQx
19
+ MjIyMDkzNTIyWjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x
20
+ EDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl
21
+ Yy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC
22
+ IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI
23
+ KMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C
24
+ e/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0
25
+ tQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc
26
+ 6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo
27
+ mLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ
28
+ efLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO
29
+ s3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7
30
+ Xeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK
31
+ blXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC
32
+ gpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u
33
+ 2FUsqZbbJcCmkBrGposCAwEAAaNQME4wHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrW
34
+ Vv35J+TeMB8GA1UdIwQYMBaAFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMAwGA1UdEwQF
35
+ MAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAIqbQSWH2aAF537DKwAMB8nMFsoe24MD
36
+ gtuQAyjTtbH+QBE4N2RdQF/sU7Y3PYR7nqdrCsYc3RxyqM5XXi7I3IYdpfe1RuxY
37
+ +pyPzVQsPPDhMlJlCrwJsADnxlpxZlAgxYSLKOan55ihscaAWA90wqRUrf/ZJM36
38
+ 8LWCPVn5teIt5aaxZWX68RMxa+AXvpbtJOBwXLkIFk3apD8CX4DhelIdw67DbkUe
39
+ ghUd/u62qrnqBTVgditt7OoWIZjzh24/Fda5d0MxZyvLILGOrf5bN4cTbe/q9Cid
40
+ Xrik7Upm+mu3y3yQIfrw85xybHq6iNXyYHvCdSrFfCIKrGpd/0CAdmYnJlx59Fk/
41
+ UbD3Eyx4psBSkU+WKO0Uf+3zNI7N/nVeNIwU/Ft+l8l7/K+427656c+ZGWDO0Gt/
42
+ BeEOSTDKP7qQ1T+JvMrBcBQo+i0cnRT10J1aoV90BhxsvWTRizIbugbaqR6Tq3bj
43
+ Akt00cIlNSplL6DenIAKSh5kF7s0tRD0tC3bNkZmNjNGkdoGEcUODEpTB3RHKKiu
44
+ e6k2Jg6m00z5vGFQhOnROG/QaUzMA3A3mFBe1RHFo07xd0pFeoeWL3vF69Gx9Jwp
45
+ ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
46
+ F3MdtaDehhjC
35
47
  -----END CERTIFICATE-----
36
- date: 2014-09-26 00:00:00.000000000 Z
48
+ date: 2015-02-03 00:00:00.000000000 Z
37
49
  dependencies:
38
50
  - !ruby/object:Gem::Dependency
39
51
  name: rspec-support
@@ -41,14 +53,14 @@ dependencies:
41
53
  requirements:
42
54
  - - "~>"
43
55
  - !ruby/object:Gem::Version
44
- version: 3.1.0
56
+ version: 3.2.0
45
57
  type: :runtime
46
58
  prerelease: false
47
59
  version_requirements: !ruby/object:Gem::Requirement
48
60
  requirements:
49
61
  - - "~>"
50
62
  - !ruby/object:Gem::Version
51
- version: 3.1.0
63
+ version: 3.2.0
52
64
  - !ruby/object:Gem::Dependency
53
65
  name: diff-lcs
54
66
  requirement: !ruby/object:Gem::Requirement
@@ -103,14 +115,14 @@ dependencies:
103
115
  requirements:
104
116
  - - "~>"
105
117
  - !ruby/object:Gem::Version
106
- version: '0.5'
118
+ version: '0.6'
107
119
  type: :development
108
120
  prerelease: false
109
121
  version_requirements: !ruby/object:Gem::Requirement
110
122
  requirements:
111
123
  - - "~>"
112
124
  - !ruby/object:Gem::Version
113
- version: '0.5'
125
+ version: '0.6'
114
126
  - !ruby/object:Gem::Dependency
115
127
  name: minitest
116
128
  requirement: !ruby/object:Gem::Requirement
@@ -172,11 +184,12 @@ files:
172
184
  - lib/rspec/matchers/built_in/raise_error.rb
173
185
  - lib/rspec/matchers/built_in/respond_to.rb
174
186
  - lib/rspec/matchers/built_in/satisfy.rb
175
- - lib/rspec/matchers/built_in/start_and_end_with.rb
187
+ - lib/rspec/matchers/built_in/start_or_end_with.rb
176
188
  - lib/rspec/matchers/built_in/throw_symbol.rb
177
189
  - lib/rspec/matchers/built_in/yield.rb
178
190
  - lib/rspec/matchers/composable.rb
179
191
  - lib/rspec/matchers/dsl.rb
192
+ - lib/rspec/matchers/expecteds_for_multiple_diffs.rb
180
193
  - lib/rspec/matchers/generated_descriptions.rb
181
194
  - lib/rspec/matchers/matcher_delegator.rb
182
195
  - lib/rspec/matchers/matcher_protocol.rb
@@ -205,6 +218,6 @@ rubyforge_project: rspec
205
218
  rubygems_version: 2.2.2
206
219
  signing_key:
207
220
  specification_version: 4
208
- summary: rspec-expectations-3.1.2
221
+ summary: rspec-expectations-3.2.0
209
222
  test_files: []
210
223
  has_rdoc:
metadata.gz.sig CHANGED
Binary file