Nicer error formatting, correct line numbering on errors thrown.

git-svn-id: svn://hamptoncatlin.com/haml/trunk@334 7063305b-7217-0410-af8c-cdc13e5119b9
This commit is contained in:
nex3 2007-02-02 06:15:28 +00:00
parent 6f636eb5b8
commit bbc8dc9582
4 changed files with 32 additions and 19 deletions

View File

@ -30,7 +30,7 @@ module Sass
#
#--
#
# TODO: Add current options to REFRENCE.
# TODO: Add current options to REFRENCE. Remember :filename!
#
# When adding options, remember to add information about them
# to README!
@ -59,7 +59,7 @@ module Sass
root.to_s
rescue SyntaxError => err
err.add_backtrace_entry
err.add_backtrace_entry(@options[:filename])
raise err
end
end
@ -109,7 +109,7 @@ module Sass
def build_tree(index)
line, tabs = @lines[index]
index += 1
@line = index + 1
@line = index
node = parse_line(line)
# Node is nil if it's non-outputting, like a constant assignment
@ -119,7 +119,7 @@ module Sass
while has_children
child, index = build_tree(index)
child.line = index
child.line = @line
node << child if child
has_children = has_children?(index, tabs)
end

View File

@ -22,7 +22,7 @@ module Sass
# Adds a properly formatted entry to the exception's backtrace.
# +filename+ should be the file in which the error occurred,
# if applicable (defaults to "(sass)").
def add_backtrace_entry(filename = nil) # :nodoc:
def add_backtrace_entry(filename) # :nodoc:
@sass_filename = filename
self.backtrace ||= []
self.backtrace.unshift "#{filename || '(sass)'}:#{@sass_line}"

View File

@ -45,14 +45,37 @@ module Sass
css = css_filename(name)
File.delete(css) if File.exists?(css)
engine = Engine.new(File.read(template_filename(name)), @@options.dup)
filename = template_filename(name)
options = @@options.dup
options[:filename] = filename
engine = Engine.new(File.read(filename), options)
begin
result = engine.render
rescue Exception => e
if RAILS_ENV != "production"
result = "#{e}\n\nBacktrace:\n#{e.backtrace.join("\n")}\n"
e_string = "#{e.class}: #{e.message}"
if e.is_a? Sass::SyntaxError
e_string << "\non line #{e.sass_line}"
if e.sass_filename
e_string << " of #{e.sass_filename}"
if File.exists?(e.sass_filename)
e_string << "\n\n"
min = [e.sass_line - 5, 0].max
File.read(e.sass_filename).rstrip.split("\n")[
min .. e.sass_line + 5
].each_with_index do |line, i|
e_string << "#{min + i + 1}: #{line}\n"
end
end
end
end
result = "/*\n#{e_string}\n\nBacktrace:\n#{e.backtrace.join("\n")}\n*/"
else
raise e
result = "/* Internal stylesheet error */"
end
end

View File

@ -37,19 +37,9 @@ class SassPluginTest < Test::Unit::TestCase
def test_exception_handling
File.open(tempfile_loc('bork')) do |file|
assert_equal("Undefined constant: \"!bork\"", file.gets.strip)
assert_equal("/*\nSass::SyntaxError: Undefined constant: \"!bork\"\non line 2 of #{File.dirname(__FILE__) + '/templates/bork.sass'}\n\n1: bork\n2: :bork= !bork", file.read.split("\n")[0...6].join("\n"))
end
File.delete(tempfile_loc('bork'))
Sass.const_set('RAILS_ENV', 'production')
raised = false
begin
Sass::Plugin.update_stylesheets
rescue
raised = true
end
assert raised
assert !File.exists?(tempfile_loc('bork'))
Sass::Plugin.const_set('RAILS_ENV', 'testing')
end
def test_controller_process