Skip to content

Commit f3db5f4

Browse files
authored
Merge pull request #1638 from pallets/windows-altsep
normpath on final template filename
2 parents 155e51d + 1b02fcc commit f3db5f4

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

CHANGES.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ Version 3.1.1
55

66
Unreleased
77

8+
- The template filename on Windows uses the primary path separator.
9+
:issue:`1637`
10+
811

912
Version 3.1.0
1013
-------------

src/jinja2/loaders.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ def uptodate() -> bool:
213213
except OSError:
214214
return False
215215

216-
return contents, filename, uptodate
216+
# Use normpath to convert Windows altsep to sep.
217+
return contents, os.path.normpath(filename), uptodate
217218
raise TemplateNotFound(template)
218219

219220
def list_templates(self) -> t.List[str]:
@@ -330,8 +331,11 @@ def get_source(
330331
self, environment: "Environment", template: str
331332
) -> t.Tuple[str, str, t.Optional[t.Callable[[], bool]]]:
332333
# Use posixpath even on Windows to avoid "drive:" or UNC
333-
# segments breaking out of the search directory.
334-
p = posixpath.join(self._template_root, *split_template_path(template))
334+
# segments breaking out of the search directory. Use normpath to
335+
# convert Windows altsep to sep.
336+
p = os.path.normpath(
337+
posixpath.join(self._template_root, *split_template_path(template))
338+
)
335339
up_to_date: t.Optional[t.Callable[[], bool]]
336340

337341
if self._archive is None:

tests/test_loader.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import importlib.util
44
import os
55
import platform
6-
import posixpath
76
import shutil
87
import sys
98
import tempfile
@@ -172,6 +171,15 @@ def test_uses_specified_encoding(self, encoding, expect):
172171
t = e.get_template("mojibake.txt")
173172
assert t.render() == expect
174173

174+
def test_filename_normpath(self):
175+
"""Nested template names should only contain ``os.sep`` in the
176+
loaded filename.
177+
"""
178+
loader = loaders.FileSystemLoader(self.searchpath)
179+
e = Environment(loader=loader)
180+
t = e.get_template("foo/test.html")
181+
assert t.filename == str(self.searchpath / "foo" / "test.html")
182+
175183

176184
class TestModuleLoader:
177185
archive = None
@@ -304,7 +312,7 @@ def package_dir_loader(monkeypatch):
304312
def test_package_dir_source(package_dir_loader, template, expect):
305313
source, name, up_to_date = package_dir_loader.get_source(None, template)
306314
assert source.rstrip() == expect
307-
assert name.endswith(posixpath.join(*split_template_path(template)))
315+
assert name.endswith(os.path.join(*split_template_path(template)))
308316
assert up_to_date()
309317

310318

@@ -326,7 +334,7 @@ def package_file_loader(monkeypatch):
326334
def test_package_file_source(package_file_loader, template, expect):
327335
source, name, up_to_date = package_file_loader.get_source(None, template)
328336
assert source.rstrip() == expect
329-
assert name.endswith(posixpath.join(*split_template_path(template)))
337+
assert name.endswith(os.path.join(*split_template_path(template)))
330338
assert up_to_date()
331339

332340

@@ -349,7 +357,7 @@ def package_zip_loader(monkeypatch):
349357
def test_package_zip_source(package_zip_loader, template, expect):
350358
source, name, up_to_date = package_zip_loader.get_source(None, template)
351359
assert source.rstrip() == expect
352-
assert name.endswith(posixpath.join(*split_template_path(template)))
360+
assert name.endswith(os.path.join(*split_template_path(template)))
353361
assert up_to_date is None
354362

355363

0 commit comments

Comments
 (0)