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 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
- .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.
138 139 140 |
# File 'lib/rspec/support.rb', line 138 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.
84 85 86 87 88 89 |
# File 'lib/rspec/support.rb', line 84 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 27 28 29 30 31 |
# File 'lib/rspec/support.rb', line 14 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.
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.
111 112 113 |
# File 'lib/rspec/support.rb', line 111 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.
103 104 105 |
# File 'lib/rspec/support.rb', line 103 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
52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/rspec/support.rb', line 52 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.
116 117 118 |
# File 'lib/rspec/support.rb', line 116 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
93 94 95 |
# File 'lib/rspec/support.rb', line 93 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.
121 122 123 124 125 126 127 |
# File 'lib/rspec/support.rb', line 121 def self.with_failure_notifier(callable) orig_notifier = failure_notifier self.failure_notifier = callable yield ensure self.failure_notifier = orig_notifier end |