rspec-expectations 3.0.0.beta2 → 3.0.0.rc1

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.
Files changed (135) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -2
  4. data/.yardopts +0 -1
  5. data/Changelog.md +115 -35
  6. data/README.md +2 -2
  7. data/lib/rspec/expectations.rb +13 -8
  8. data/lib/rspec/{matchers → expectations}/configuration.rb +38 -13
  9. data/lib/rspec/expectations/expectation_target.rb +72 -8
  10. data/lib/rspec/expectations/fail_with.rb +10 -52
  11. data/lib/rspec/expectations/handler.rb +9 -11
  12. data/lib/rspec/expectations/syntax.rb +37 -35
  13. data/lib/rspec/expectations/version.rb +1 -1
  14. data/lib/rspec/matchers.rb +60 -9
  15. data/lib/rspec/matchers/aliased_matcher.rb +6 -0
  16. data/lib/rspec/matchers/built_in.rb +9 -1
  17. data/lib/rspec/matchers/built_in/all.rb +78 -0
  18. data/lib/rspec/matchers/built_in/base_matcher.rb +39 -1
  19. data/lib/rspec/matchers/built_in/be.rb +117 -42
  20. data/lib/rspec/matchers/built_in/be_between.rb +22 -0
  21. data/lib/rspec/matchers/built_in/be_instance_of.rb +11 -3
  22. data/lib/rspec/matchers/built_in/be_kind_of.rb +5 -0
  23. data/lib/rspec/matchers/built_in/be_within.rb +26 -6
  24. data/lib/rspec/matchers/built_in/change.rb +89 -13
  25. data/lib/rspec/matchers/built_in/compound.rb +19 -3
  26. data/lib/rspec/matchers/built_in/contain_exactly.rb +17 -6
  27. data/lib/rspec/matchers/built_in/cover.rb +3 -0
  28. data/lib/rspec/matchers/built_in/eq.rb +20 -5
  29. data/lib/rspec/matchers/built_in/eql.rb +15 -3
  30. data/lib/rspec/matchers/built_in/equal.rb +23 -6
  31. data/lib/rspec/matchers/built_in/exist.rb +74 -10
  32. data/lib/rspec/matchers/built_in/has.rb +58 -3
  33. data/lib/rspec/matchers/built_in/include.rb +16 -1
  34. data/lib/rspec/matchers/built_in/match.rb +14 -4
  35. data/lib/rspec/matchers/built_in/operators.rb +16 -0
  36. data/lib/rspec/matchers/built_in/output.rb +47 -5
  37. data/lib/rspec/matchers/built_in/raise_error.rb +40 -23
  38. data/lib/rspec/matchers/built_in/respond_to.rb +37 -16
  39. data/lib/rspec/matchers/built_in/satisfy.rb +15 -0
  40. data/lib/rspec/matchers/built_in/start_and_end_with.rb +29 -14
  41. data/lib/rspec/matchers/built_in/throw_symbol.rb +32 -3
  42. data/lib/rspec/matchers/built_in/yield.rb +148 -44
  43. data/lib/rspec/matchers/composable.rb +48 -7
  44. data/lib/rspec/matchers/dsl.rb +45 -17
  45. data/lib/rspec/matchers/generated_descriptions.rb +7 -0
  46. data/lib/rspec/matchers/matcher_delegator.rb +6 -2
  47. data/lib/rspec/matchers/pretty.rb +15 -19
  48. metadata +33 -236
  49. metadata.gz.sig +0 -0
  50. data/features/README.md +0 -48
  51. data/features/Upgrade.md +0 -53
  52. data/features/built_in_matchers/README.md +0 -96
  53. data/features/built_in_matchers/be.feature +0 -175
  54. data/features/built_in_matchers/be_within.feature +0 -48
  55. data/features/built_in_matchers/comparisons.feature +0 -97
  56. data/features/built_in_matchers/contain_exactly.feature +0 -46
  57. data/features/built_in_matchers/cover.feature +0 -47
  58. data/features/built_in_matchers/end_with.feature +0 -48
  59. data/features/built_in_matchers/equality.feature +0 -136
  60. data/features/built_in_matchers/exist.feature +0 -45
  61. data/features/built_in_matchers/expect_change.feature +0 -59
  62. data/features/built_in_matchers/expect_error.feature +0 -144
  63. data/features/built_in_matchers/include.feature +0 -126
  64. data/features/built_in_matchers/match.feature +0 -51
  65. data/features/built_in_matchers/output.feature +0 -70
  66. data/features/built_in_matchers/predicates.feature +0 -161
  67. data/features/built_in_matchers/respond_to.feature +0 -84
  68. data/features/built_in_matchers/satisfy.feature +0 -33
  69. data/features/built_in_matchers/start_with.feature +0 -48
  70. data/features/built_in_matchers/throw_symbol.feature +0 -91
  71. data/features/built_in_matchers/types.feature +0 -116
  72. data/features/built_in_matchers/yield.feature +0 -161
  73. data/features/composing_matchers.feature +0 -250
  74. data/features/compound_expectations.feature +0 -45
  75. data/features/custom_matchers/access_running_example.feature +0 -53
  76. data/features/custom_matchers/define_diffable_matcher.feature +0 -27
  77. data/features/custom_matchers/define_matcher.feature +0 -340
  78. data/features/custom_matchers/define_matcher_outside_rspec.feature +0 -34
  79. data/features/custom_matchers/define_matcher_with_fluent_interface.feature +0 -24
  80. data/features/customized_message.feature +0 -39
  81. data/features/diffing.feature +0 -85
  82. data/features/implicit_docstrings.feature +0 -52
  83. data/features/step_definitions/additional_cli_steps.rb +0 -22
  84. data/features/support/env.rb +0 -21
  85. data/features/support/rubinius.rb +0 -6
  86. data/features/syntax_configuration.feature +0 -71
  87. data/features/test_frameworks/minitest.feature +0 -44
  88. data/lib/rspec-expectations.rb +0 -1
  89. data/lib/rspec/expectations/diff_presenter.rb +0 -141
  90. data/lib/rspec/expectations/differ.rb +0 -44
  91. data/lib/rspec/expectations/encoded_string.rb +0 -56
  92. data/spec/rspec/expectations/diff_presenter_spec.rb +0 -249
  93. data/spec/rspec/expectations/encoded_string_spec.rb +0 -74
  94. data/spec/rspec/expectations/expectation_target_spec.rb +0 -82
  95. data/spec/rspec/expectations/extensions/kernel_spec.rb +0 -67
  96. data/spec/rspec/expectations/fail_with_spec.rb +0 -114
  97. data/spec/rspec/expectations/handler_spec.rb +0 -205
  98. data/spec/rspec/expectations/minitest_integration_spec.rb +0 -27
  99. data/spec/rspec/expectations/syntax_spec.rb +0 -89
  100. data/spec/rspec/expectations_spec.rb +0 -12
  101. data/spec/rspec/matchers/aliased_matcher_spec.rb +0 -48
  102. data/spec/rspec/matchers/aliases_spec.rb +0 -449
  103. data/spec/rspec/matchers/built_in/base_matcher_spec.rb +0 -83
  104. data/spec/rspec/matchers/built_in/be_between_spec.rb +0 -159
  105. data/spec/rspec/matchers/built_in/be_instance_of_spec.rb +0 -63
  106. data/spec/rspec/matchers/built_in/be_kind_of_spec.rb +0 -41
  107. data/spec/rspec/matchers/built_in/be_spec.rb +0 -592
  108. data/spec/rspec/matchers/built_in/be_within_spec.rb +0 -141
  109. data/spec/rspec/matchers/built_in/change_spec.rb +0 -808
  110. data/spec/rspec/matchers/built_in/compound_spec.rb +0 -292
  111. data/spec/rspec/matchers/built_in/contain_exactly_spec.rb +0 -441
  112. data/spec/rspec/matchers/built_in/cover_spec.rb +0 -69
  113. data/spec/rspec/matchers/built_in/eq_spec.rb +0 -156
  114. data/spec/rspec/matchers/built_in/eql_spec.rb +0 -41
  115. data/spec/rspec/matchers/built_in/equal_spec.rb +0 -106
  116. data/spec/rspec/matchers/built_in/exist_spec.rb +0 -124
  117. data/spec/rspec/matchers/built_in/has_spec.rb +0 -161
  118. data/spec/rspec/matchers/built_in/include_spec.rb +0 -540
  119. data/spec/rspec/matchers/built_in/match_spec.rb +0 -102
  120. data/spec/rspec/matchers/built_in/operators_spec.rb +0 -252
  121. data/spec/rspec/matchers/built_in/output_spec.rb +0 -165
  122. data/spec/rspec/matchers/built_in/raise_error_spec.rb +0 -461
  123. data/spec/rspec/matchers/built_in/respond_to_spec.rb +0 -292
  124. data/spec/rspec/matchers/built_in/satisfy_spec.rb +0 -44
  125. data/spec/rspec/matchers/built_in/start_and_end_with_spec.rb +0 -253
  126. data/spec/rspec/matchers/built_in/throw_symbol_spec.rb +0 -135
  127. data/spec/rspec/matchers/built_in/yield_spec.rb +0 -627
  128. data/spec/rspec/matchers/configuration_spec.rb +0 -213
  129. data/spec/rspec/matchers/description_generation_spec.rb +0 -191
  130. data/spec/rspec/matchers/dsl_spec.rb +0 -895
  131. data/spec/rspec/matchers/legacy_spec.rb +0 -101
  132. data/spec/rspec/matchers_spec.rb +0 -74
  133. data/spec/spec_helper.rb +0 -85
  134. data/spec/support/matchers.rb +0 -22
  135. data/spec/support/shared_examples.rb +0 -35
@@ -1,18 +1,43 @@
1
1
  module RSpec
2
2
  module Expectations
3
3
  # Wraps the target of an expectation.
4
+ #
4
5
  # @example
5
- # expect(something) # => ExpectationTarget wrapping something
6
+ # expect(something) # => ExpectationTarget wrapping something
7
+ # expect { do_something } # => ExpectationTarget wrapping the block
6
8
  #
7
9
  # # used with `to`
8
10
  # expect(actual).to eq(3)
9
11
  #
10
12
  # # with `not_to`
11
13
  # expect(actual).not_to eq(3)
14
+ #
15
+ # @note `ExpectationTarget` is not intended to be instantiated
16
+ # directly by users. Use `expect` instead.
12
17
  class ExpectationTarget
18
+ # @private
19
+ # Used as a sentinel value to be able to tell when the user
20
+ # did not pass an argument. We can't use `nil` for that because
21
+ # `nil` is a valid value to pass.
22
+ UndefinedValue = Module.new
23
+
13
24
  # @api private
14
- def initialize(target)
15
- @target = target
25
+ def initialize(value)
26
+ @target = value
27
+ end
28
+
29
+ # @private
30
+ def self.for(value, block)
31
+ if UndefinedValue.equal?(value)
32
+ unless block
33
+ raise ArgumentError, "You must pass either an argument or a block to `expect`."
34
+ end
35
+ BlockExpectationTarget.new(block)
36
+ elsif block
37
+ raise ArgumentError, "You cannot pass both an argument and a block to `expect`."
38
+ else
39
+ new(value)
40
+ end
16
41
  end
17
42
 
18
43
  # Runs the given expectation, passing if `matcher` returns true.
@@ -25,7 +50,7 @@ module RSpec
25
50
  # @return [Boolean] true if the expectation succeeds (else raises)
26
51
  # @see RSpec::Matchers
27
52
  def to(matcher=nil, message=nil, &block)
28
- prevent_operator_matchers(:to, matcher)
53
+ prevent_operator_matchers(:to) unless matcher
29
54
  RSpec::Expectations::PositiveExpectationHandler.handle_matcher(@target, matcher, message, &block)
30
55
  end
31
56
 
@@ -38,20 +63,59 @@ module RSpec
38
63
  # @return [Boolean] false if the negative expectation succeeds (else raises)
39
64
  # @see RSpec::Matchers
40
65
  def not_to(matcher=nil, message=nil, &block)
41
- prevent_operator_matchers(:not_to, matcher)
66
+ prevent_operator_matchers(:not_to) unless matcher
42
67
  RSpec::Expectations::NegativeExpectationHandler.handle_matcher(@target, matcher, message, &block)
43
68
  end
44
69
  alias to_not not_to
45
70
 
46
71
  private
47
72
 
48
- def prevent_operator_matchers(verb, matcher)
49
- return if matcher
50
-
73
+ def prevent_operator_matchers(verb)
51
74
  raise ArgumentError, "The expect syntax does not support operator matchers, " +
52
75
  "so you must pass a matcher to `##{verb}`."
53
76
  end
54
77
  end
78
+
79
+ # @private
80
+ # Validates the provided matcher to ensure it supports block
81
+ # expectations, in order to avoid user confusion when they
82
+ # use a block thinking the expectation will be on the return
83
+ # value of the block rather than the block itself.
84
+ class BlockExpectationTarget < ExpectationTarget
85
+ def to(matcher, message=nil, &block)
86
+ enforce_block_expectation(matcher)
87
+ super
88
+ end
89
+
90
+ def not_to(matcher, message=nil, &block)
91
+ enforce_block_expectation(matcher)
92
+ super
93
+ end
94
+ alias to_not not_to
95
+
96
+ private
97
+
98
+ def enforce_block_expectation(matcher)
99
+ return if supports_block_expectations?(matcher)
100
+
101
+ raise ExpectationNotMetError,
102
+ "You must pass an argument rather than a block to use the provided " +
103
+ "matcher (#{description_of matcher}), or the matcher must implement " +
104
+ "`supports_block_expectations?`."
105
+ end
106
+
107
+ def supports_block_expectations?(matcher)
108
+ matcher.supports_block_expectations?
109
+ rescue NoMethodError
110
+ false
111
+ end
112
+
113
+ def description_of(matcher)
114
+ matcher.description
115
+ rescue NoMethodError
116
+ matcher.inspect
117
+ end
118
+ end
55
119
  end
56
120
  end
57
121
 
@@ -1,9 +1,14 @@
1
+ RSpec::Support.require_rspec_support 'differ'
2
+
1
3
  module RSpec
2
4
  module Expectations
3
5
  class << self
4
6
  # @private
5
7
  def differ
6
- DiffPresenter.new
8
+ RSpec::Support::Differ.new(
9
+ :object_preparer => lambda {|object| RSpec::Matchers::Composable.surface_descriptions_in(object) },
10
+ :color => RSpec::Matchers.configuration.color?
11
+ )
7
12
  end
8
13
 
9
14
  # Raises an RSpec::Expectations::ExpectationNotMetError with message.
@@ -19,60 +24,13 @@ module RSpec
19
24
  "appropriate failure_message[_when_negated] method to return a string?"
20
25
  end
21
26
 
22
- if actual && expected
23
- if all_strings?(actual, expected)
24
- if any_multiline_strings?(actual, expected)
25
- message << "\nDiff:" << differ.diff_as_string(coerce_to_string(actual), coerce_to_string(expected))
26
- end
27
- elsif no_procs?(actual, expected) && no_numbers?(actual, expected)
28
- message << "\nDiff:" << differ.diff_as_object(actual, expected)
29
- end
30
- end
31
-
32
- raise(RSpec::Expectations::ExpectationNotMetError.new(message))
33
- end
34
-
35
- private
36
-
37
- def no_procs?(*args)
38
- args.flatten.none? {|a| Proc === a}
39
- end
40
-
41
- def all_strings?(*args)
42
- args.flatten.all? {|a| String === a}
43
- end
44
-
45
- def any_multiline_strings?(*args)
46
- all_strings?(*args) && args.flatten.any? { |a| multiline?(a) }
47
- end
27
+ diff = differ.diff(actual, expected)
48
28
 
49
- def no_numbers?(*args)
50
- args.flatten.none? {|a| Numeric === a}
51
- end
52
-
53
- def coerce_to_string(string_or_array)
54
- return string_or_array unless Array === string_or_array
55
- diffably_stringify(string_or_array).join("\n")
56
- end
57
-
58
- def diffably_stringify(array)
59
- array.map do |entry|
60
- if Array === entry
61
- entry.inspect
62
- else
63
- entry.to_s.gsub("\n", "\\n")
64
- end
29
+ unless diff.empty?
30
+ message = "#{message}\nDiff:#{diff}"
65
31
  end
66
- end
67
32
 
68
- if String.method_defined?(:encoding)
69
- def multiline?(string)
70
- string.include?("\n".encode(string.encoding))
71
- end
72
- else
73
- def multiline?(string)
74
- string.include?("\n")
75
- end
33
+ raise RSpec::Expectations::ExpectationNotMetError.new(message)
76
34
  end
77
35
  end
78
36
  end
@@ -1,8 +1,8 @@
1
1
  module RSpec
2
2
  module Expectations
3
3
 
4
- # @api private
5
- class ExpectationHelper
4
+ # @private
5
+ module ExpectationHelper
6
6
  def self.check_message(msg)
7
7
  unless msg.nil? || msg.respond_to?(:to_str) || msg.respond_to?(:call)
8
8
  ::Kernel.warn [
@@ -16,7 +16,7 @@ module RSpec
16
16
  # Returns an RSpec-3+ compatible matcher, wrapping a legacy one
17
17
  # in an adapter if necessary.
18
18
  #
19
- # @api private
19
+ # @private
20
20
  def self.modern_matcher_from(matcher)
21
21
  LegacyMacherAdapter::RSpec2.wrap(matcher) ||
22
22
  LegacyMacherAdapter::RSpec1.wrap(matcher) || matcher
@@ -40,7 +40,7 @@ module RSpec
40
40
  end
41
41
  end
42
42
 
43
- # @api private
43
+ # @private
44
44
  class PositiveExpectationHandler
45
45
  def self.handle_matcher(actual, initial_matcher, message=nil, &block)
46
46
  matcher = ExpectationHelper.setup(self, initial_matcher, message)
@@ -62,7 +62,7 @@ module RSpec
62
62
  end
63
63
  end
64
64
 
65
- # @api private
65
+ # @private
66
66
  class NegativeExpectationHandler
67
67
  def self.handle_matcher(actual, initial_matcher, message=nil, &block)
68
68
  matcher = ExpectationHelper.setup(self, initial_matcher, message)
@@ -95,17 +95,15 @@ module RSpec
95
95
  # Wraps a matcher written against one of the legacy protocols in
96
96
  # order to present the current protocol.
97
97
  #
98
- # @api private
98
+ # @private
99
99
  class LegacyMacherAdapter < Matchers::MatcherDelegator
100
100
  def initialize(matcher)
101
101
  super
102
- ::RSpec.warn_deprecation(<<-EOS.gsub(/^\s+\|/, ''))
103
- |--------------------------------------------------------------------------
102
+ ::RSpec.warn_deprecation(<<-EOS.gsub(/^\s+\|/, ''), :type => "legacy_matcher")
104
103
  |#{matcher.class.name || matcher.inspect} implements a legacy RSpec matcher
105
104
  |protocol. For the current protocol you should expose the failure messages
106
105
  |via the `failure_message` and `failure_message_when_negated` methods.
107
106
  |(Used from #{CallerFilter.first_non_rspec_line})
108
- |--------------------------------------------------------------------------
109
107
  EOS
110
108
  end
111
109
 
@@ -117,7 +115,7 @@ module RSpec
117
115
  # the failure message protocol was:
118
116
  # * `failure_message_for_should`
119
117
  # * `failure_message_for_should_not`
120
- # @api private
118
+ # @private
121
119
  class RSpec2 < self
122
120
  def failure_message
123
121
  base_matcher.failure_message_for_should
@@ -141,7 +139,7 @@ module RSpec
141
139
  # Before RSpec 1.2, the failure message protocol was:
142
140
  # * `failure_message`
143
141
  # * `negative_failure_message`
144
- # @api private
142
+ # @private
145
143
  class RSpec1 < self
146
144
  def failure_message
147
145
  base_matcher.failure_message
@@ -6,47 +6,22 @@ module RSpec
6
6
  module Syntax
7
7
  module_function
8
8
 
9
- # @method should
10
- # Passes if `matcher` returns true. Available on every `Object`.
11
- # @example
12
- # actual.should eq expected
13
- # actual.should match /expression/
14
- # @param [Matcher]
15
- # matcher
16
- # @param [String] message optional message to display when the expectation fails
17
- # @return [Boolean] true if the expectation succeeds (else raises)
18
- # @see RSpec::Matchers
19
-
20
- # @method should_not
21
- # Passes if `matcher` returns false. Available on every `Object`.
22
- # @example
23
- # actual.should_not eq expected
24
- # @param [Matcher]
25
- # matcher
26
- # @param [String] message optional message to display when the expectation fails
27
- # @return [Boolean] false if the negative expectation succeeds (else raises)
28
- # @see RSpec::Matchers
29
-
30
- # @method expect
31
- # Supports `expect(actual).to matcher` syntax by wrapping `actual` in an
32
- # `ExpectationTarget`.
33
- # @example
34
- # expect(actual).to eq(expected)
35
- # expect(actual).not_to eq(expected)
36
- # @return [ExpectationTarget]
37
- # @see ExpectationTarget#to
38
- # @see ExpectationTarget#not_to
39
-
40
9
  # @api private
41
10
  # Determines where we add `should` and `should_not`.
42
11
  def default_should_host
43
12
  @default_should_host ||= ::Object.ancestors.last
44
13
  end
45
14
 
15
+ # @api private
16
+ # Instructs rspec-expectations to warn on first usage of `should` or `should_not`.
17
+ # Enabled by default. This is largely here to facilitate testing.
46
18
  def warn_about_should!
47
19
  @warn_about_should = true
48
20
  end
49
21
 
22
+ # @api private
23
+ # Generates a deprecation warning for the given method if no warning
24
+ # has already been issued.
50
25
  def warn_about_should_unless_configured(method_name)
51
26
  if @warn_about_should
52
27
  RSpec.deprecate(
@@ -94,10 +69,8 @@ module RSpec
94
69
  return if expect_enabled?(syntax_host)
95
70
 
96
71
  syntax_host.module_exec do
97
- def expect(*target, &target_block)
98
- target << target_block if block_given?
99
- raise ArgumentError.new("You must pass an argument or a block to #expect but not both.") unless target.size == 1
100
- ::RSpec::Expectations::ExpectationTarget.new(target.first)
72
+ def expect(value=::RSpec::Expectations::ExpectationTarget::UndefinedValue, &block)
73
+ ::RSpec::Expectations::ExpectationTarget.for(value, block)
101
74
  end
102
75
  end
103
76
  end
@@ -126,3 +99,32 @@ module RSpec
126
99
  end
127
100
  end
128
101
  end
102
+
103
+ # The legacy `:should` syntax adds the following methods directly to
104
+ # `BasicObject` so that they are available off of any object. Note, however,
105
+ # that this syntax does not always play nice with delegate/proxy objects.
106
+ # We recommend you use the non-monkeypatching `:expect` syntax instead.
107
+ class BasicObject
108
+ # @method should
109
+ # Passes if `matcher` returns true. Available on every `Object`.
110
+ # @example
111
+ # actual.should eq expected
112
+ # actual.should match /expression/
113
+ # @param [Matcher]
114
+ # matcher
115
+ # @param [String] message optional message to display when the expectation fails
116
+ # @return [Boolean] true if the expectation succeeds (else raises)
117
+ # @note This is only available when you have enabled the `:should` syntax.
118
+ # @see RSpec::Matchers
119
+
120
+ # @method should_not
121
+ # Passes if `matcher` returns false. Available on every `Object`.
122
+ # @example
123
+ # actual.should_not eq expected
124
+ # @param [Matcher]
125
+ # matcher
126
+ # @param [String] message optional message to display when the expectation fails
127
+ # @return [Boolean] false if the negative expectation succeeds (else raises)
128
+ # @note This is only available when you have enabled the `:should` syntax.
129
+ # @see RSpec::Matchers
130
+ end
@@ -2,7 +2,7 @@ module RSpec
2
2
  module Expectations
3
3
  # @private
4
4
  module Version
5
- STRING = '3.0.0.beta2'
5
+ STRING = '3.0.0.rc1'
6
6
  end
7
7
  end
8
8
  end
@@ -1,11 +1,18 @@
1
- require 'rspec/matchers/pretty'
2
- require 'rspec/matchers/composable'
3
- require 'rspec/matchers/built_in'
4
- require 'rspec/matchers/generated_descriptions'
5
- require 'rspec/matchers/dsl'
6
- require 'rspec/matchers/matcher_delegator'
7
- require 'rspec/matchers/aliased_matcher'
8
-
1
+ require 'rspec/support'
2
+ RSpec::Support.define_optimized_require_for_rspec(:matchers) { |f| require_relative(f) }
3
+
4
+ %w[
5
+ pretty
6
+ composable
7
+ built_in
8
+ generated_descriptions
9
+ dsl
10
+ matcher_delegator
11
+ aliased_matcher
12
+ ].each { |file| RSpec::Support.require_rspec_matchers(file) }
13
+
14
+ # RSpec's top level namespace. All of rspec-expectations is contained
15
+ # in the `RSpec::Expectations` and `RSpec::Matchers` namespaces.
9
16
  module RSpec
10
17
  # RSpec::Matchers provides a number of useful matchers we use to define
11
18
  # expectations. A matcher is any object that responds to the following:
@@ -18,6 +25,7 @@ module RSpec
18
25
  # does_not_match?(actual)
19
26
  # failure_message_when_negated
20
27
  # description
28
+ # supports_block_expectations?
21
29
  #
22
30
  # ## Predicates
23
31
  #
@@ -202,6 +210,16 @@ module RSpec
202
210
  # for readable failure messages. You can alias your custom matchers in similar fashion
203
211
  # using {RSpec::Matchers.alias_matcher}.
204
212
  module Matchers
213
+ # @method expect
214
+ # Supports `expect(actual).to matcher` syntax by wrapping `actual` in an
215
+ # `ExpectationTarget`.
216
+ # @example
217
+ # expect(actual).to eq(expected)
218
+ # expect(actual).not_to eq(expected)
219
+ # @return [ExpectationTarget]
220
+ # @see ExpectationTarget#to
221
+ # @see ExpectationTarget#not_to
222
+
205
223
  # Defines a matcher alias. The returned matcher's `description` will be overriden
206
224
  # to reflect the phrasing of the new name, which will be used in failure messages
207
225
  # when passed as an argument to another matcher in a composed matcher expression.
@@ -227,6 +245,10 @@ module RSpec
227
245
  #
228
246
  # be_sorted_by(:age).description # => "be sorted by age"
229
247
  # a_list_sorted_by(:age).description # => "a list sorted by age"
248
+ #
249
+ # @!macro [attach] alias_matcher
250
+ # @!parse
251
+ # alias $1 $2
230
252
  def self.alias_matcher(new_name, old_name, &description_override)
231
253
  description_override ||= lambda do |old_desc|
232
254
  old_desc.gsub(Pretty.split_words(old_name), Pretty.split_words(new_name))
@@ -559,6 +581,26 @@ module RSpec
559
581
  alias_matcher :a_hash_including, :include
560
582
  alias_matcher :including, :include
561
583
 
584
+ # Passes if actual all expected objects pass. This works for
585
+ # any enumerable object.
586
+ #
587
+ # @example
588
+ #
589
+ # expect([1, 3, 5]).to all be_odd
590
+ # expect([1, 3, 6]).to all be_odd # fails
591
+ #
592
+ # @note The negative form `not_to all` is not supported. Instead
593
+ # use `not_to include` or pass a negative form of a matcher
594
+ # as the argument (e.g. `all exclude(:foo)`).
595
+ #
596
+ # @note You can also use this with compound matchers as well.
597
+ #
598
+ # @example
599
+ # expect([1, 3, 5]).to all( be_odd.and be_an(Integer) )
600
+ def all(expected)
601
+ BuiltIn::All.new(expected)
602
+ end
603
+
562
604
  # Given a `Regexp` or `String`, passes if `actual.match(pattern)`
563
605
  # Given an arbitrary nested data structure (e.g. arrays and hashes),
564
606
  # matches if `expected === actual` || `actual == expected` for each
@@ -675,7 +717,7 @@ module RSpec
675
717
  #
676
718
  # @example
677
719
  #
678
- # expect("string").to respond_to(:length)
720
+ # expect("string").to respond_to(:length)
679
721
  #
680
722
  def respond_to(*names)
681
723
  BuiltIn::RespondTo.new(*names)
@@ -837,6 +879,15 @@ module RSpec
837
879
  alias_matcher :a_block_yielding_successive_args, :yield_successive_args
838
880
  alias_matcher :yielding_successive_args, :yield_successive_args
839
881
 
882
+ # Delegates to {RSpec::Expectations.configuration}.
883
+ # This is here because rspec-core's `expect_with` option
884
+ # looks for a `configuration` method on the mixin
885
+ # (`RSpec::Matchers`) to yield to a block.
886
+ # @return [RSpec::Expectations::Configuration] the configuration object
887
+ def self.configuration
888
+ Expectations.configuration
889
+ end
890
+
840
891
  private
841
892
 
842
893
  BE_PREDICATE_REGEX = /^(be_(?:an?_)?)(.*)/