Avoid misreporting line number

This commit is contained in:
Zac-HD 2018-02-08 00:29:51 +11:00
parent 68bccb01ac
commit b62628f678
2 changed files with 22 additions and 4 deletions

View File

@ -380,6 +380,23 @@ Doctest summary
return filename.encode(fs_encoding)
return filename
@staticmethod
def get_line_number(node):
# type: (nodes.Node) -> Optional[int]
"""Get the real line number or admit we don't know."""
# TODO: Work out how to store or calculate real (file-relative)
# line numbers for doctest blocks in docstrings.
if ':docstring of ' in path.basename(node.source or ''):
# The line number is given relative to the stripped docstring,
# not the file. This is correct where it is set, in
# `docutils.nodes.Node.setup_child`, but Sphinx should report
# relative to the file, not the docstring.
return None
if node.line is not None:
# TODO: find the root cause of this off by one error.
return node.line - 1
return None
def test_doc(self, docname, doctree):
# type: (unicode, nodes.Node) -> None
groups = {} # type: Dict[unicode, TestGroup]
@ -408,12 +425,13 @@ Doctest summary
for node in doctree.traverse(condition):
source = node['test'] if 'test' in node else node.astext()
filename = self.get_filename_for_node(node, docname)
line_number = self.get_line_number(node)
if not source:
logger.warning('no code/output in %s block at %s:%s',
node.get('testnodetype', 'doctest'),
filename, node.line)
filename, line_number)
code = TestCode(source, type=node.get('testnodetype', 'doctest'),
filename=filename, lineno=node.line,
filename=filename, lineno=line_number,
options=node.get('options'))
node_groups = node.get('groups', ['default'])
if '*' in node_groups:

View File

@ -71,8 +71,8 @@ def test_reporting_with_autodoc(app, status, warning, capfd):
failures = [l for l in lines if l.startswith('File')]
expected = [
'File "dir/inner.rst", line 1, in default',
'File "dir/bar.py", line 2, in default',
'File "foo.py", line 3, in default',
'File "dir/bar.py", line ?, in default',
'File "foo.py", line ?, in default',
'File "index.rst", line 4, in default',
]
for location in expected: