From b01f7db79cbb7c289bd392cb6cb7d1b48f008620 Mon Sep 17 00:00:00 2001 From: Louis Deconinck Date: Thu, 10 Sep 2026 21:06:38 +0200 Subject: [PATCH] Fix copying Template objects --- CHANGES.rst | 1 + src/jinja2/environment.py | 6 ++++++ tests/test_regression.py | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 338dc9966..b541e1729 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -10,6 +10,7 @@ Unreleased - Update minimum Babel version to >= 2.17. - Deprecate the ``__version__`` attribute. Use feature detection or ``importlib.metadata.version("jinja2")`` instead. +- Support copying ``Template`` objects. :issue:`758` - Use modern packaging metadata with ``pyproject.toml`` instead of ``setup.cfg``. :pr:`1793` - Use ``flit_core`` instead of ``setuptools`` as build backend. diff --git a/src/jinja2/environment.py b/src/jinja2/environment.py index acaaffb59..f24572bf7 100644 --- a/src/jinja2/environment.py +++ b/src/jinja2/environment.py @@ -1210,6 +1210,12 @@ def __new__( ) return env.from_string(source, template_class=cls) + def __copy__(self) -> "Template": + return self + + def __deepcopy__(self, memo: dict[int, t.Any]) -> "Template": + return self + @classmethod def from_code( cls, diff --git a/tests/test_regression.py b/tests/test_regression.py index 93d72c5e6..408020c55 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -1,3 +1,5 @@ +import copy + import pytest from jinja2 import DictLoader @@ -11,6 +13,13 @@ class TestCorner: + def test_template_copy(self): + template = Template("Hello {{ name }}") + + assert copy.copy(template) is template + assert copy.deepcopy(template) is template + assert template.render(name="world") == "Hello world" + def test_assigned_scoping(self, env): t = env.from_string( """