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

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec/core/formatters/snippet_extractor.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

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

Instance Method Summary (collapse)

Instance Method Details

- (String) lines_around(file, line)

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.

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



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/rspec/core/formatters/snippet_extractor.rb', line 70

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

- (String) post_process(highlighted, offending_line)

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.

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



92
93
94
95
96
97
98
99
100
# File 'lib/rspec/core/formatters/snippet_extractor.rb', line 92

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

- (String) snippet(backtrace)

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.

Extract lines of code corresponding to a backtrace.

See Also:



39
40
41
42
43
# File 'lib/rspec/core/formatters/snippet_extractor.rb', line 39

def snippet(backtrace)
  raw_code, line = snippet_for(backtrace[0])
  highlighted = @@converter.convert(raw_code)
  post_process(highlighted, line)
end

- (String) snippet_for(error_line)

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.

Create a snippet from a line of code.

See Also:



53
54
55
56
57
58
59
60
61
# File 'lib/rspec/core/formatters/snippet_extractor.rb', line 53

def snippet_for(error_line)
  if error_line =~ /(.*):(\d+)/
    file = Regexp.last_match[1]
    line = Regexp.last_match[2].to_i
    [lines_around(file, line), line]
  else
    ["# Couldn't get snippet for #{error_line}", 1]
  end
end