rspec-expectations 3.0.0.beta2 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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?_)?)(.*)/