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/spec/diff_helpers.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,
lib/rspec/support/with_keywords_when_needed.rb
Defined Under Namespace
Modules: AllExceptionsExceptOnesWeMustNotRescue, FormattingSupport, FuzzyMatcher, InSubProcess, OS, RecursiveConstMethods, Ruby, RubyFeatures, ShellOut, Spec, Version, Warnings, WhitespaceChecks, WithIsolatedStdErr, WithKeywordsWhenNeeded 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 whether 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
- .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.
140 141 142 |
# File 'lib/rspec/support.rb', line 140 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.
86 87 88 89 90 91 |
# File 'lib/rspec/support.rb', line 86 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.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/rspec/support.rb', line 16 def self.define_optimized_require_for_rspec(lib, &require_relative) name = "require_rspec_#{lib}" if RUBY_PLATFORM == 'java' && !Kernel.respond_to?(:require) # JRuby 9.1.17.0 has developed a regression for require (class << self; self; end).__send__(:define_method, name) do |f| Kernel.send(:require, "rspec/#{lib}/#{f}") end elsif 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.
24 25 26 |
# File 'lib/rspec/support/matcher_definition.rb', line 24 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.
113 114 115 |
# File 'lib/rspec/support.rb', line 113 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.
105 106 107 |
# File 'lib/rspec/support.rb', line 105 def self.failure_notifier=(callable) thread_local_data[:failure_notifier] = callable end |
.is_a_matcher?(object) ⇒ Boolean
29 30 31 |
# File 'lib/rspec/support/matcher_definition.rb', line 29 def self.is_a_matcher?(object) matcher_definitions.any? { |md| md.call(object) } end |
.matcher_definitions ⇒ Object
6 7 8 |
# File 'lib/rspec/support/matcher_definition.rb', line 6 def self.matcher_definitions @matcher_definitions ||= [] end |
.method_handle_for(object, method_name) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/rspec/support.rb', line 54 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.
118 119 120 |
# File 'lib/rspec/support.rb', line 118 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
16 17 18 |
# File 'lib/rspec/support/matcher_definition.rb', line 16 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
36 37 38 39 40 41 42 |
# File 'lib/rspec/support/matcher_definition.rb', line 36 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
95 96 97 |
# File 'lib/rspec/support.rb', line 95 def self.thread_local_data Thread.current.thread_variable_get(:__rspec) || Thread.current.thread_variable_set(:__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.
123 124 125 126 127 128 129 |
# File 'lib/rspec/support.rb', line 123 def self.with_failure_notifier(callable) orig_notifier = failure_notifier self.failure_notifier = callable yield ensure self.failure_notifier = orig_notifier end |