NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3779 most downloaded on PyPI
Cheetah is a template engine and code generation tool
Last release 10 months ago
29 Nov 2025
Release timing varies
gaps range from 2 weeks to 12 months
Most releases are documented
notes for 8 of 9 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
19 releases · first in 2022
One column per quarter.
What's new in CheetahTemplate3 ============================== - Tested with Python 3.14.
Fixed ImportHooks: it must raise ModuleNotFoundError instead of ImportError.
Bug fixes:
Fixed ImportHooks: it must raise ModuleNotFoundError
instead of ImportError.
Fixed absolute import in ImportHooks under Python 3.
Use cache_from_source in ImportManager to find out
.pyc/.pyo byte-code files.
Fixed unmarshalling .pyc/.pyo byte-code files
in ImportManager.
Fixed Template.webInput: Use urllib.parse.parse_qs
instead of cgi.FieldStorage; Python 3.13 dropped cgi.
Fixed _namemapper.c: Silent an inadvertent TypeError exception
in PyMapping_HasKeyString under Python 3.13+
caused by _namemapper looking up a key in a non-dictionary.
Fixed _namemapper.c: Silence IndexError when testing
name[attr]. Some objects like re.MatchObject implement both
attribute access and index access. This confuses NameMapper because
it expects name[attr] to raise TypeError for objects that don't
implement mapping protocol.
Fixed mapping test in NameMapper.py:
Python 3.13 brough a new mapping type FrameLocalsProxy.
Fixed another RecursionError in ImportHooks under PyPy3.
Tests:
CI:
CI(GHActions): Switch to setup-miniconda.
CI(GHActions): Run tests under Python 3.13.
Build/release:
Fixed ImportHooks: it must raise ModuleNotFoundError instead of ImportError.
Bug fixes:
Fixed ImportHooks: it must raise ModuleNotFoundError
instead of ImportError.
Fixed absolute import in ImportHooks under Python 3.
Use cache_from_source in ImportManager to find out
.pyc/.pyo byte-code files.
Fixed unmarshalling .pyc/.pyo byte-code files
in ImportManager.
Fixed Template.webInput: Use urllib.parse.parse_qs
instead of cgi.FieldStorage; Python 3.13 dropped cgi.
Fixed _namemapper.c: Silent an inadvertent TypeError exception
in PyMapping_HasKeyString under Python 3.13+
caused by _namemapper looking up a key in a non-dictionary.
Fixed _namemapper.c: Silence IndexError when testing
name[attr]. Some objects like re.MatchObject implement both
attribute access and index access. This confuses NameMapper because
it expects name[attr] to raise TypeError for objects that don't
implement mapping protocol.
Fixed mapping test in NameMapper.py:
Python 3.13 brough a new mapping type FrameLocalsProxy.
Fixed another RecursionError in ImportHooks under PyPy3.
Tests:
CI:
CI(GHActions): Switch to setup-miniconda.
CI(GHActions): Run tests under Python 3.13.
Build/release:
Fixed ImportHooks: it must raise ModuleNotFoundError instead of ImportError.
Bug fixes:
Fixed ImportHooks: it must raise ModuleNotFoundError
instead of ImportError.
Fixed absolute import in ImportHooks under Python 3.
Use cache_from_source in ImportManager to find out
.pyc/.pyo byte-code files.
Fixed unmarshalling .pyc/.pyo byte-code files
in ImportManager.
Fixed Template.webInput: Use urllib.parse.parse_qs
instead of cgi.FieldStorage; Python 3.13 dropped cgi.
Fixed _namemapper.c: Silent an inadvertent TypeError exception
in PyMapping_HasKeyString under Python 3.13+
caused by _namemapper looking up a key in a non-dictionary.
Fixed _namemapper.c: Silence IndexError when testing
name[attr]. Some objects like re.MatchObject implement both
attribute access and index access. This confuses NameMapper because
it expects name[attr] to raise TypeError for objects that don't
implement mapping protocol.
Fixed mapping test in NameMapper.py:
Python 3.13 brough a new mapping type FrameLocalsProxy.
Fixed another RecursionError in ImportHooks under PyPy3.
Tests:
CI:
CI(GHActions): Switch to setup-miniconda.
CI(GHActions): Run tests under Python 3.13.
Fixed ImportHooks: it must raise ModuleNotFoundError instead of ImportError.
Bug fixes:
Fixed ImportHooks: it must raise ModuleNotFoundError
instead of ImportError.
Fixed absolute import in ImportHooks under Python 3.
Fixed Template.webInput: Use urllib.parse.parse_qs
instead of cgi.FieldStorage; Python 3.13 dropped cgi.
Fixed _namemapper.c: Silent an inadvertent TypeError exception
in PyMapping_HasKeyString under Python 3.13+
caused by _namemapper looking up a key in a non-dictionary.
Fixed _namemapper.c: Silence IndexError when testing
name[attr]. Some objects like re.MatchObject implement both
attribute access and index access. This confuses NameMapper because
it expects name[attr] to raise TypeError for objects that don't
implement mapping protocol.
Fixed mapping test in NameMapper.py:
Python 3.13 brough a new mapping type FrameLocalsProxy.
Fixed another RecursionError in ImportHooks under PyPy3.
Tests:
CI:
CI(GHActions): Switch to setup-miniconda.
CI(GHActions): Run tests under Python 3.13.
Fixed ImportHooks: it must raise ModuleNotFoundError instead of ImportError.
Bug fixes:
Fixed ImportHooks: it must raise ModuleNotFoundError
instead of ImportError.
Fixed absolute import in ImportHooks under Python 3.
Fixed Template.webInput: Use urllib.parse.parse_qs
instead of cgi.FieldStorage; Python 3.13 dropped cgi.
Fixed _namemapper.c: Silent an inadvertent TypeError exception
in PyMapping_HasKeyString under Python 3.13+
caused by _namemapper looking up a key in a non-dictionary.
Fixed _namemapper.c: Silence IndexError when testing
name[attr]. Some objects like re.MatchObject implement both
attribute access and index access. This confuses NameMapper because
it expects name[attr] to raise TypeError for objects that don't
implement mapping protocol.
Fixed mapping test in NameMapper.py:
Python 3.13 brough a new mapping type FrameLocalsProxy.
Fixed another RecursionError in ImportHooks under PyPy3.
Tests:
CI:
CI(GHActions): Switch to setup-miniconda.
CI(GHActions): Run tests under Python 3.13.
CI(GHActions): Build and publish wheels on Linux/aarch64.
CI(GHActions): Build and publish wheels on Linux/aarch64.
CI(GHActions): Build and publish wheels on Linux/aarch64.
CI(GHActions): Build and publish wheels on Linux/aarch64.
Protect import cgi in preparation to Python 3.13.
Minor features:
import cgi in preparation to Python 3.13.Tests:
CI:
GHActions: Ensure pip only if needed
This is to work around a problem in conda with Python 3.7 -
it brings in wrong version of setuptools incompatible with Python 3.7.
Protect import cgi in preparation to Python 3.13.
Minor features:
import cgi in preparation to Python 3.13.Tests:
CI:
GHActions: Ensure pip only if needed
This is to work around a problem in conda with Python 3.7 -
it brings in wrong version of setuptools incompatible with Python 3.7.
Fixed printing to stdout in CheetahWrapper.
Bug fixes:
CheetahWrapper.CI:
conda-forge.Fixed printing to stdout in CheetahWrapper.
Bug fixes:
CheetahWrapper.CI:
conda-forge.Fixed printing to stdout in CheetahWrapper.
Bug fixes:
CheetahWrapper.Code style:
F811 warning from flake8:
redefinition of unused 'join' in ImportManager.py.CI:
conda-forge.Use conda to install older Pythons
Bug fixes:
ImportHooks under PyPy3.Tests:
CI:
Use conda to install older Pythons
Ubuntu >= 22 and setup-python dropped Pythons < 3.7.
Use s-weigand/setup-conda instead of setup-python.
Use conda to install older Pythons
Bug fixes:
ImportHooks under PyPy3.Tests:
CI:
Use conda to install older Pythons
Ubuntu >= 22 and setup-python dropped Pythons < 3.7.
Use s-weigand/setup-conda instead of setup-python.
Fix DeprecationWarning: unittest.findTestCases() is deprecated. Use unittest.TestLoader.loadTestsFromModule() instead.
Tests:
Run tests with Python 3.11.
Fix DeprecationWarning: unittest.findTestCases() is deprecated. Use
unittest.TestLoader.loadTestsFromModule() instead.
CI:
PyPI has wrongfully classified project Cheetah3 as “critical”. This puts a burden to use 2FA to manage the project at PyPI. To avoid the burden the pr
Great move:
Minor features:
Tests:
Run pure-python NameMapper tests in a separate process.
Fixed a bug in tests with pure-python NameMapper .
Add Python 3.10 to tox.ini .
CI:
Migrated to GitHub Actions.
Due to the absent of Python 3.4 at GH Actions tests are not run and wheels are not built. Installation from sources should work.
Due to GH Actions lacking old compilers for w32/w64 releases for old Python versions (currently 2.7) are packaged without compiled _namemapper.pyd extension. Cheetah can be used without compiled _namemapper.pyd extension. A pure-python replacement should work; Cheetah imports it automatically if the compiled extension is not available.
Stop testing at Travis CI.
Stop testing at AppVeyor.
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →