Class: RSpec::Core::Formatters::SnippetExtractor

### Home Classes Methods

### In Files

- lib/rspec/core/formatters/snippet_extractor.rb

### Parent

Object

### Namespace

- CLASS RSpec::Core::Formatters::SnippetExtractor::NullConverter

### Methods

- #lines_around
- #post_process
- #snippet
- #snippet_for

### Class/Module Index

Quicksearch

- RSpec
- RSpec::Core
- RSpec::Core::BacktraceCleaner
- RSpec::Core::BacktraceFormatter
- RSpec::Core::CommandLine
- RSpec::Core::Configuration
- RSpec::Core::Configuration::MustBeConfiguredBeforeExampleGroupsError
- RSpec::Core::ConfigurationOptions
- RSpec::Core::ConstMissing
- RSpec::Core::DRbCommandLine
- RSpec::Core::DSL
- RSpec::Core::Deprecation
- RSpec::Core::DrbOptions
- RSpec::Core::Example
- RSpec::Core::Example::NotPendingExampleFixed
- RSpec::Core::Example::Procsy
- RSpec::Core::ExampleGroup
- RSpec::Core::Extensions
- RSpec::Core::Extensions::InstanceEvalWithArgs
- RSpec::Core::Extensions::ModuleEvalWithArgs
- RSpec::Core::Extensions::Ordered
- RSpec::Core::Extensions::Ordered::ExampleGroups
- RSpec::Core::Extensions::Ordered::Examples
- RSpec::Core::FilterManager
- RSpec::Core::FilterManager::BackwardCompatibility
- RSpec::Core::FilterManager::Describable
- RSpec::Core::Formatters
- RSpec::Core::Formatters::BaseFormatter
- RSpec::Core::Formatters::BaseTextFormatter
- RSpec::Core::Formatters::DeprecationFormatter
- RSpec::Core::Formatters::DocumentationFormatter
- RSpec::Core::Formatters::Helpers
- RSpec::Core::Formatters::HtmlFormatter
- RSpec::Core::Formatters::HtmlPrinter
- RSpec::Core::Formatters::JsonFormatter
- RSpec::Core::Formatters::ProgressFormatter
- RSpec::Core::Formatters::SnippetExtractor
- RSpec::Core::Formatters::SnippetExtractor::NullConverter
- RSpec::Core::Formatters::TextMateFormatter
- RSpec::Core::Hooks
- RSpec::Core::Hooks::AfterAllHook
- RSpec::Core::Hooks::AfterHook
- RSpec::Core::Hooks::AroundHook
- RSpec::Core::Hooks::AroundHookCollection
- RSpec::Core::Hooks::BeforeHook
- RSpec::Core::Hooks::GroupHookCollection
- RSpec::Core::Hooks::Hook
- RSpec::Core::Hooks::HookCollection
- RSpec::Core::Hooks::HookCollectionAliases
- RSpec::Core::Hooks::RegistersGlobals
- RSpec::Core::MemoizedHelpers
- RSpec::Core::MemoizedHelpers::BeforeAllMemoizedHash
- RSpec::Core::MemoizedHelpers::ClassMethods
- RSpec::Core::Metadata
- RSpec::Core::Metadata::ExampleMetadataHash
- RSpec::Core::Metadata::GroupMetadataHash
- RSpec::Core::Metadata::MetadataHash
- RSpec::Core::MetadataHashBuilder
- RSpec::Core::MetadataHashBuilder::Common
- RSpec::Core::MetadataHashBuilder::WithConfigWarning
- RSpec::Core::MetadataHashBuilder::WithDeprecationWarning
- RSpec::Core::MockFrameworkAdapter
- RSpec::Core::Parser
- RSpec::Core::Pending
- RSpec::Core::Pending::PendingDeclaredInExample
- RSpec::Core::Pending::PendingExampleFixedError
- RSpec::Core::ProjectInitializer
- RSpec::Core::RakeTask
- RSpec::Core::Reporter
- RSpec::Core::RubyProject
- RSpec::Core::Runner
- RSpec::Core::SharedContext
- RSpec::Core::SharedExampleGroup
- RSpec::Core::SharedExampleGroup::Collection
- RSpec::Core::SharedExampleGroup::Registry
- RSpec::Core::SharedExampleGroup::TopLevelDSL
- RSpec::Core::Time
- RSpec::Core::Version
- RSpec::Core::World
- RSpec::Rake
- RSpec::Runner
- Autotest
- Autotest::Rspec2
- Kernel

No matching classes.

# RSpec::Core::Formatters::SnippetExtractor

@api private

Extracts code snippets by looking at the backtrace of the passed error and applies synax highlighting and line numbers using html.

### Public Instance Methods

lines_around(file, line) click to toggle source

@api private

Extract lines of code centered around a particular line within a source file.

@param [String] file filename @param [Fixnum] line line number @return [String] lines around the target line within the file (2 above and 1 below).

    # File lib/rspec/core/formatters/snippet_extractor.rb, line 57
    def lines_around(file, line)
      if File.file?(file)
        lines = File.read(file).split("\n")
        min = [0, line-3].max
        max = [line+1, lines.length-1].min
        selected_lines = []
        selected_lines.join("\n")
        lines[min..max].join("\n")
      else
        "# Couldn't get snippet for #{file}"
      end
    rescue SecurityError
      "# Couldn't get snippet for #{file}"
    end

post_process(highlighted, offending_line) click to toggle source

@api private

Adds line numbers to all lines and highlights the line where the failure occurred using html `span` tags.

@param [String] highlighted syntax-highlighted snippet surrounding the offending line of code @param [Fixnum] offending_line line where failure occured @return [String] completed snippet

    # File lib/rspec/core/formatters/snippet_extractor.rb, line 79
    def post_process(highlighted, offending_line)
      new_lines = []
      highlighted.split("\n").each_with_index do |line, i|
        new_line = "<span class=\"linenum\">#{offending_line+i-2}</span>#{line}"
        new_line = "<span class=\"offending\">#{new_line}</span>" if i == 2
        new_lines << new_line
      end
      new_lines.join("\n")
    end

snippet(backtrace) click to toggle source

@api private

Extract lines of code corresponding to a backtrace.

@param [String] backtrace the backtrace from a test failure @return [String] highlighted code snippet indicating where the test failure occured

@see post_process

    # File lib/rspec/core/formatters/snippet_extractor.rb, line 25
    def snippet(backtrace)
      raw_code, line = snippet_for(backtrace[0])
      highlighted = @@converter.convert(raw_code, false)
      highlighted << "\n<span class=\"comment\"># gem install syntax to get syntax highlighting</span>" if @@converter.is_a?(NullConverter)
      post_process(highlighted, line)
    end

snippet_for(error_line) click to toggle source

@api private

Create a snippet from a line of code.

@param [String] error_line file name with line number (i.e. 'foo_spec.rb:12') @return [String] lines around the target line within the file

@see lines_around

    # File lib/rspec/core/formatters/snippet_extractor.rb, line 40
    def snippet_for(error_line)
      if error_line =~ /(.*):(\d+)/
        file = $1
        line = $2.to_i
        [lines_around(file, line), line]
      else
        ["# Couldn't get snippet for #{error_line}", 1]
      end
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.