Module: RSpec::Support
- Defined in:
- lib/rspec/support.rb,
lib/rspec/support/spec.rb,
lib/rspec/support/mutex.rb,
lib/rspec/support/differ.rb,
lib/rspec/support/source.rb,
lib/rspec/support/version.rb,
lib/rspec/support/warnings.rb,
lib/rspec/support/source/node.rb,
lib/rspec/support/source/token.rb,
lib/rspec/support/fuzzy_matcher.rb,
lib/rspec/support/ruby_features.rb,
lib/rspec/support/encoded_string.rb,
lib/rspec/support/hunk_generator.rb,
lib/rspec/support/spec/shell_out.rb,
lib/rspec/support/directory_maker.rb,
lib/rspec/support/reentrant_mutex.rb,
lib/rspec/support/source/location.rb,
lib/rspec/support/object_formatter.rb,
lib/rspec/support/comparable_version.rb,
lib/rspec/support/matcher_definition.rb,
lib/rspec/support/spec/in_sub_process.rb,
lib/rspec/support/spec/stderr_splitter.rb,
lib/rspec/support/recursive_const_methods.rb,
lib/rspec/support/spec/formatting_support.rb,
lib/rspec/support/spec/library_wide_checks.rb,
lib/rspec/support/method_signature_verifier.rb,
lib/rspec/support/spec/with_isolated_stderr.rb
Defined Under Namespace
Modules: AllExceptionsExceptOnesWeMustNotRescue, FormattingSupport, FuzzyMatcher, InSubProcess, OS, RecursiveConstMethods, Ruby, RubyFeatures, ShellOut, Spec, Version, Warnings, WhitespaceChecks, WithIsolatedStdErr Classes: BlockSignature, ComparableVersion, Differ, DirectoryMaker, EncodedString, HunkGenerator, LooseSignatureVerifier, MethodSignature, MethodSignatureExpectation, MethodSignatureVerifier, Mutex, ObjectFormatter, ReentrantMutex, Source, StdErrSplitter
Constant Summary collapse
- KERNEL_METHOD_METHOD =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
::Kernel.instance_method(:method)
- DEFAULT_FAILURE_NOTIFIER =
lambda { |failure, _opts| raise failure }
- DEFAULT_WARNING_NOTIFIER =
lambda { |warning| ::Kernel.warn warning }
- StrictSignatureVerifier =
Figures out wether a given method can accept various arguments. Surprisingly non-trivial.
MethodSignatureVerifier
Class Attribute Summary collapse
- .warning_notifier ⇒ Object private
Class Method Summary collapse
-
.class_of(object) ⇒ Object
private
Used internally to get a class of a given object, even if it does not respond to #class.
-
.define_optimized_require_for_rspec(lib, &require_relative) ⇒ Object
private
Defines a helper method that is optimized to require files from the named lib.
-
.deregister_matcher_definition(&block) ⇒ Object
Remove a previously registered matcher.
- .failure_notifier ⇒ Object private
- .failure_notifier=(callable) ⇒ Object private
- .is_a_matcher?(object) ⇒ Boolean
- .matcher_definitions ⇒ Object
- .method_handle_for(object, method_name) ⇒ Object
- .notify_failure(failure, options = {}) ⇒ Object private
-
.register_matcher_definition(&block) ⇒ Object
Used internally to break cyclic dependency between mocks, expectations, and support.
-
.rspec_description_for_object(object) ⇒ Object
private
gives a string representation of an object for use in RSpec descriptions.
-
.thread_local_data ⇒ Object
A single thread local variable so we don’t excessively pollute that namespace.
- .with_failure_notifier(callable) ⇒ Object private
Class Attribute Details
.warning_notifier ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
127 128 129 |
# File 'lib/rspec/support.rb', line 127 def self.warning_notifier @warning_notifier ||= DEFAULT_WARNING_NOTIFIER end |
Class Method Details
.class_of(object) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Used internally to get a class of a given object, even if it does not respond to #class.
79 80 81 82 83 84 |
# File 'lib/rspec/support.rb', line 79 def self.class_of(object) object.class rescue NoMethodError singleton_class = class << object; self; end singleton_class.ancestors.find { |ancestor| !ancestor.equal?(singleton_class) } end |
.define_optimized_require_for_rspec(lib, &require_relative) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Defines a helper method that is optimized to require files from the named lib. The passed block MUST be ‘{ |f| require_relative f }` because for `require_relative` to work properly from within the named lib the line of code must be IN that lib.
‘require_relative` is preferred when available because it is always O(1), regardless of the number of dirs in $LOAD_PATH. `require`, on the other hand, does a linear O(N) search over the dirs in the $LOAD_PATH until it can resolve the file relative to one of the dirs.
14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/rspec/support.rb', line 14 def self.define_optimized_require_for_rspec(lib, &require_relative) name = "require_rspec_#{lib}" if Kernel.respond_to?(:require_relative) (class << self; self; end).__send__(:define_method, name) do |f| require_relative.call("#{lib}/#{f}") end else (class << self; self; end).__send__(:define_method, name) do |f| require "rspec/#{lib}/#{f}" end end end |
.deregister_matcher_definition(&block) ⇒ Object
Remove a previously registered matcher. Useful for cleaning up after yourself in specs.
22 23 24 |
# File 'lib/rspec/support/matcher_definition.rb', line 22 def self.deregister_matcher_definition(&block) matcher_definitions.delete(block) end |
.failure_notifier ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
100 101 102 |
# File 'lib/rspec/support.rb', line 100 def self.failure_notifier thread_local_data[:failure_notifier] || DEFAULT_FAILURE_NOTIFIER end |
.failure_notifier=(callable) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
92 93 94 |
# File 'lib/rspec/support.rb', line 92 def self.failure_notifier=(callable) thread_local_data[:failure_notifier] = callable end |
.is_a_matcher?(object) ⇒ Boolean
27 28 29 |
# File 'lib/rspec/support/matcher_definition.rb', line 27 def self.is_a_matcher?(object) matcher_definitions.any? { |md| md.call(object) } end |
.matcher_definitions ⇒ Object
4 5 6 |
# File 'lib/rspec/support/matcher_definition.rb', line 4 def self.matcher_definitions @matcher_definitions ||= [] end |
.method_handle_for(object, method_name) ⇒ Object
47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/rspec/support.rb', line 47 def self.method_handle_for(object, method_name) KERNEL_METHOD_METHOD.bind(object).call(method_name) rescue NameError => original begin handle = object.method(method_name) raise original unless handle.is_a? Method handle rescue Support::AllExceptionsExceptOnesWeMustNotRescue raise original end end |
.notify_failure(failure, options = {}) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
105 106 107 |
# File 'lib/rspec/support.rb', line 105 def self.notify_failure(failure, ={}) failure_notifier.call(failure, ) end |
.register_matcher_definition(&block) ⇒ Object
Used internally to break cyclic dependency between mocks, expectations, and support. We don’t currently have a consistent implementation of our matchers, though we are considering changing that: github.com/rspec/rspec-mocks/issues/513
14 15 16 |
# File 'lib/rspec/support/matcher_definition.rb', line 14 def self.register_matcher_definition(&block) matcher_definitions << block end |
.rspec_description_for_object(object) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
gives a string representation of an object for use in RSpec descriptions
34 35 36 37 38 39 40 |
# File 'lib/rspec/support/matcher_definition.rb', line 34 def self.rspec_description_for_object(object) if RSpec::Support.is_a_matcher?(object) && object.respond_to?(:description) object.description else object end end |
.thread_local_data ⇒ Object
A single thread local variable so we don’t excessively pollute that namespace.
87 88 89 |
# File 'lib/rspec/support.rb', line 87 def self.thread_local_data Thread.current[:__rspec] ||= {} end |
.with_failure_notifier(callable) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
110 111 112 113 114 115 116 |
# File 'lib/rspec/support.rb', line 110 def self.with_failure_notifier(callable) orig_notifier = failure_notifier self.failure_notifier = callable yield ensure self.failure_notifier = orig_notifier end |