rspec-expectations 3.1.2 → 3.2.0

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