Sha256: 9750306c9775b610e34acaa477fc318b040a27e223c9c161d3d59861424ef6f6

Contents?: true

Size: 1.73 KB

Versions: 8

Compression:

Stored size: 1.73 KB

Contents

module RSpec
  # Consistent implementation for "cleaning" the caller method to strip out
  # non-rspec lines. This enables errors to be reported at the call site in
  # the code using the library, which is far more useful than the particular
  # internal method that raised an error.
  class CallerFilter

    RSPEC_LIBS = %w[
      core
      mocks
      expectations
      support
      matchers
      rails
    ]

    ADDITIONAL_TOP_LEVEL_FILES = %w[ autorun ]

    LIB_REGEX = %r{/lib/rspec/(#{(RSPEC_LIBS + ADDITIONAL_TOP_LEVEL_FILES).join('|')})(\.rb|/)}

    if RUBY_VERSION >= '2.0.0'
      def self.first_non_rspec_line
        # `caller` is an expensive method that scales linearly with the size of
        # the stack. The performance hit for fetching it in chunks is small,
        # and since the target line is probably near the top of the stack, the
        # overall improvement of a chunked search like this is significant.
        #
        # See benchmarks/caller.rb for measurements.

        # Initial value here is mostly arbitrary, but is chosen to give good
        # performance on the common case of creating a double.
        increment = 5
        i         = 1
        line      = nil

        while !line
          stack = caller(i, increment)
          raise "No non-lib lines in stack" unless stack

          line = stack.find { |l| l !~ LIB_REGEX }

          i         += increment
          increment *= 2 # The choice of two here is arbitrary.
        end

        line
      end
    else
      # Earlier rubies do not support the two argument form of `caller`. This
      # fallback is logically the same, but slower.
      def self.first_non_rspec_line
        caller.find { |line| line !~ LIB_REGEX }
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 3 rubygems

Version Path
opal-rspec-cj-0.4.4 vendor_lib/rspec/support/caller_filter.rb
opal-rspec-0.4.3 vendor_lib/rspec/support/caller_filter.rb
opal-rspec-0.4.2 vendor_lib/rspec/support/caller_filter.rb
opal-rspec-0.4.1 vendor_lib/rspec/support/caller_filter.rb
opal-rspec-0.4.0 vendor_lib/rspec/support/caller_filter.rb
opal-rspec-0.4.0.beta4 vendor_lib/rspec/support/caller_filter.rb
rspec-support-3.0.0.beta2 lib/rspec/support/caller_filter.rb
rspec-support-3.0.0.beta1 lib/rspec/support/caller_filter.rb