Mixin designed to support the composable matcher features of RSpec 3+. Mix it into your custom matcher classes to allow them to be used in a composable fashion.
@api public
Wraps an item in order to surface its `description` via `inspect`. @api private
Strings are not enumerable on 1.9, and on 1.8 they are an infinitely nested enumerable: since ruby lacks a character class, it yields 1-character strings, which are themselves enumerable, composed of a a single 1-character string, which is an enumerable, etc.
@api private
# File lib/rspec/matchers/composable.rb, line 158 def enumerable?(item) return false if String === item Enumerable === item end
Transforms the given data structue (typically a hash or array) into a new data structure that, when `inspect` is called on it, will provide descriptions of any contained matchers rather than the normal `inspect` output.
You are encouraged to use this in your custom matcher’s `description`, `failure_message` or `failure_message_when_negated` implementation if you are supporting any arguments which may be a data structure containing matchers.
@!visibility public
# File lib/rspec/matchers/composable.rb, line 99 def surface_descriptions_in(item) if Matchers.is_a_describable_matcher?(item) DescribableItem.new(item) elsif Hash === item Hash[surface_descriptions_in(item.to_a)] elsif Struct === item item.inspect elsif enumerable?(item) begin item.map { |subitem| surface_descriptions_in(subitem) } rescue IOError # STDOUT is enumerable but `map` raises an error item.inspect end else item end end
Delegates to `matches?`. Allows matchers to be used in composable fashion and also supports using matchers in case statements.
# File lib/rspec/matchers/composable.rb, line 45 def ===(value) matches?(value) end
Creates a compound `and` expectation. The matcher will only pass if both sub-matchers pass. This can be chained together to form an arbitrarily long chain of matchers.
@example
expect(alphabet).to start_with("a").and end_with("z") expect(alphabet).to start_with("a") & end_with("z")
@note The negative form (`expect(…).not_to matcher.and other`)
is not supported at this time.
# File lib/rspec/matchers/composable.rb, line 22 def and(matcher) BuiltIn::Compound::And.new self, matcher end
Creates a compound `or` expectation. The matcher will pass if either sub-matcher passes. This can be chained together to form an arbitrarily long chain of matchers.
@example
expect(stoplight.color).to eq("red").or eq("green").or eq("yellow") expect(stoplight.color).to eq("red") | eq("green") | eq("yellow")
@note The negative form (`expect(…).not_to matcher.or other`)
is not supported at this time.
# File lib/rspec/matchers/composable.rb, line 38 def or(matcher) BuiltIn::Compound::Or.new self, matcher end
Generated with the Darkfish Rdoc Generator 2.