A simple templates loader
Project description
Stencils — Lightweight Template Loader for Python
Overview
Stencils is a minimal, zero-dependency Python library for managing text templates embedded in files.
It’s ideal for projects that need small, human-readable, and reusable template snippets (e.g., config fragments, codegen templates, or documentation blocks).
The library parses .tmpl (or any text) files containing named template blocks, resolves duplicates, and provides a clean dictionary-like interface for use in your code.
Installation
pip install stencils
Template Format
A single file can contain multiple named template blocks.
Each block must start with a line of the form:
===== TEMPLATE:<name> =====
and must end with:
===== /TEMPLATE =====
Example:
===== TEMPLATE:greeting =====
Hello {name}!
Welcome to {place}.
===== /TEMPLATE =====
===== TEMPLATE:farewell =====
Goodbye {name}, see you soon!
===== /TEMPLATE =====
Usage
Loading Templates
from stencils import load, render
templates = load("templates/example.tmpl")
print(templates["greeting"])
# Output:
# Hello {name}!
# Welcome to {place}.
You can also load multiple files, directories, or patterns:
templates = load(["./templates", "common/*.tmpl"])
Each
.tmplfile is scanned forTEMPLATE:blocks.
Duplicate keys across files will raiseTemplateConflictErrorunless the templates are identical.
Rendering Templates
You can render any loaded template with a dictionary of values:
text = render(templates["greeting"], {"name": "Alice", "place": "Wonderland"})
print(text)
Output:
Hello Alice!
Welcome to Wonderland.
Missing placeholders default to empty strings, so this is safe:
render(templates["farewell"], {})
# -> "Goodbye , see you soon!"
Errors
| Exception | Description |
|---|---|
TemplateConflictError |
Raised when a template key appears in multiple files with different content. |
TemplateParseError |
Raised on malformed templates (e.g., unclosed or nested blocks, missing start/end). |
API Reference
load(targets)
Load one or more template sources (files, directories, or globs).
Args:
targets: Path, string, or iterable of paths/globs.
Returns:
A dict[str, str] mapping template names to their contents.
Each template is also available under an alias prefixed with a colon (:{name}).
render(template, data)
Render a template using Python’s str.format_map, defaulting missing keys to empty strings.
Args:
template: Template string.data: Dict of substitutions.
Returns: Rendered string.
Example Project Structure
myproject/
├── templates/
│ ├── main.tmpl
│ └── footer.tmpl
└── app.py
# app.py
from stencils import load, render
templates = load("templates")
output = render(templates["main"], {"title": "Hello World"})
print(output)
🧾 License
This project is licensed under the MIT License — see the LICENSE file for details.
© 2025 Ioannis D. (devcoons)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stencils-0.1.5.tar.gz.
File metadata
- Download URL: stencils-0.1.5.tar.gz
- Upload date:
- Size: 5.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98124f053d327390658793a664d823135e43f6c950854e383d95a6817a76da38
|
|
| MD5 |
61772f87158756fcc34b6c8d6e87fac5
|
|
| BLAKE2b-256 |
da4806e29b9bd032e7cfd39ad5fd2b9155a507238c39266907951b3bcf586722
|
File details
Details for the file stencils-0.1.5-py3-none-any.whl.
File metadata
- Download URL: stencils-0.1.5-py3-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34d4e9d84124705779eea6fa96a4ef0ebf6a19905a251a7fcfb4982b41f79478
|
|
| MD5 |
d2ea20221e2081b9ce54894daeb7d9cb
|
|
| BLAKE2b-256 |
2708d6f862e54e14121d791124b1efe462b5ab9de757447f59a47d86be47f311
|