Skip to content

Commit

Permalink
logging: always show source locations as absolute paths
Browse files Browse the repository at this point in the history
Nodes attached to the parse tree via the `include` directive have
their `source` attribute set to the relative path of the included
file. Other nodes in the tree use the full absolute path. For
consistent logging, ensure that the node location is always expressed
as an absolute path, when the filename is known.

See sphinx-contrib/spelling#153 for an
example of the effect of the original problem.
  • Loading branch information
dhellmann committed May 22, 2022
1 parent 3636776 commit d081ea3
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
3 changes: 3 additions & 0 deletions sphinx/util/logging.py
Expand Up @@ -12,6 +12,7 @@

from sphinx.errors import SphinxWarning
from sphinx.util.console import colorize
from sphinx.util.osutil import abspath

if TYPE_CHECKING:
from sphinx.application import Sphinx
Expand Down Expand Up @@ -514,6 +515,8 @@ class WarningLogRecordTranslator(SphinxLogRecordTranslator):

def get_node_location(node: Node) -> Optional[str]:
(source, line) = get_source_line(node)
if source:
source = abspath(source)
if source and line:
return "%s:%s" % (source, line)
elif source:
Expand Down
21 changes: 20 additions & 1 deletion tests/test_util_logging.py
Expand Up @@ -2,13 +2,14 @@

import codecs
import os
import os.path

import pytest
from docutils import nodes

from sphinx.errors import SphinxWarning
from sphinx.testing.util import strip_escseq
from sphinx.util import logging
from sphinx.util import logging, osutil
from sphinx.util.console import colorize
from sphinx.util.logging import is_suppressed_warning, prefixed_warnings
from sphinx.util.parallel import ParallelTasks
Expand Down Expand Up @@ -379,3 +380,21 @@ def test_prefixed_warnings(app, status, warning):
assert 'WARNING: Another PREFIX: message3' in warning.getvalue()
assert 'WARNING: PREFIX: message4' in warning.getvalue()
assert 'WARNING: message5' in warning.getvalue()


def test_get_node_location():
# Ensure that node locations are reported as an absolute path,
# even if the source attribute is a relative path.

relative_filename = os.path.join('relative', 'path.txt')
absolute_filename = osutil.abspath(relative_filename)

n = nodes.Node()
n.source = relative_filename
n.line = 100

location = logging.get_node_location(n)
source, line = location.split(':')

assert source == absolute_filename
assert line == '100'

0 comments on commit d081ea3

Please sign in to comment.