Fixed #13958 -- problem reporting exception from \r-line-ended file
Thanks petrvanblokland for reporting and saz for the patch
This commit is contained in:
parent
2c84f4434c
commit
ff881aef53
|
@ -347,7 +347,7 @@ class ExceptionReporter(object):
|
||||||
if source is None:
|
if source is None:
|
||||||
try:
|
try:
|
||||||
with open(filename, 'rb') as fp:
|
with open(filename, 'rb') as fp:
|
||||||
source = fp.readlines()
|
source = fp.read().splitlines()
|
||||||
except (OSError, IOError):
|
except (OSError, IOError):
|
||||||
pass
|
pass
|
||||||
if source is None:
|
if source is None:
|
||||||
|
@ -370,9 +370,9 @@ class ExceptionReporter(object):
|
||||||
lower_bound = max(0, lineno - context_lines)
|
lower_bound = max(0, lineno - context_lines)
|
||||||
upper_bound = lineno + context_lines
|
upper_bound = lineno + context_lines
|
||||||
|
|
||||||
pre_context = [line.strip('\n') for line in source[lower_bound:lineno]]
|
pre_context = source[lower_bound:lineno]
|
||||||
context_line = source[lineno].strip('\n')
|
context_line = source[lineno]
|
||||||
post_context = [line.strip('\n') for line in source[lineno+1:upper_bound]]
|
post_context = source[lineno+1:upper_bound]
|
||||||
|
|
||||||
return lower_bound, pre_context, context_line, post_context
|
return lower_bound, pre_context, context_line, post_context
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ from __future__ import absolute_import, unicode_literals
|
||||||
import inspect
|
import inspect
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import tempfile
|
||||||
|
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||||
|
@ -13,7 +14,7 @@ from django.core.urlresolvers import reverse
|
||||||
from django.test import TestCase, RequestFactory
|
from django.test import TestCase, RequestFactory
|
||||||
from django.test.utils import (override_settings, setup_test_template_loader,
|
from django.test.utils import (override_settings, setup_test_template_loader,
|
||||||
restore_template_loaders)
|
restore_template_loaders)
|
||||||
from django.utils.encoding import force_text
|
from django.utils.encoding import force_text, force_bytes
|
||||||
from django.views.debug import ExceptionReporter
|
from django.views.debug import ExceptionReporter
|
||||||
|
|
||||||
from .. import BrokenException, except_args
|
from .. import BrokenException, except_args
|
||||||
|
@ -122,6 +123,24 @@ class ExceptionReporterTests(TestCase):
|
||||||
self.assertIn('<h2>Request information</h2>', html)
|
self.assertIn('<h2>Request information</h2>', html)
|
||||||
self.assertIn('<p>Request data not supplied</p>', html)
|
self.assertIn('<p>Request data not supplied</p>', html)
|
||||||
|
|
||||||
|
def test_eol_support(self):
|
||||||
|
"""Test that the ExceptionReporter supports Unix, Windows and Macintosh EOL markers"""
|
||||||
|
LINES = list(u'print %d' % i for i in range(1,6))
|
||||||
|
reporter = ExceptionReporter(None, None, None, None)
|
||||||
|
|
||||||
|
for newline in ['\n','\r\n','\r']:
|
||||||
|
fd,filename = tempfile.mkstemp(text = False)
|
||||||
|
os.write(fd, force_bytes(newline.join(LINES)+newline))
|
||||||
|
os.close(fd)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.assertEqual(
|
||||||
|
reporter._get_lines_from_file(filename, 3, 2),
|
||||||
|
(1, LINES[1:3], LINES[3], LINES[4:])
|
||||||
|
)
|
||||||
|
finally:
|
||||||
|
os.unlink(filename)
|
||||||
|
|
||||||
def test_no_exception(self):
|
def test_no_exception(self):
|
||||||
"An exception report can be generated for just a request"
|
"An exception report can be generated for just a request"
|
||||||
request = self.rf.get('/test_view/')
|
request = self.rf.get('/test_view/')
|
||||||
|
|
Loading…
Reference in New Issue