Morphify
Lightweight string templating with safe variable resolution and value formatting.
Key features
- Simple
{{ ... }}expressions with function calls and string concatenation - Safe variable lookup with dot-paths (returns empty string on missing keys)
- Built-in helpers:
if(condition, then, else)andformat(value, pattern) - Value formatting for decimals and dates with human-friendly patterns
Installation
pip install morphify
Quick start
from morphify import TemplateMorpher
tpl = "Hello, {{ if($name, $name, 'guest') }}! Today is {{ format($date, 'DD.MM.YYYY') }}."
print(TemplateMorpher(tpl, {"name": "Alex", "date": "2025-10-05"}).render())
# -> Hello, Alex! Today is 05.10.2025.
API
from morphify import TemplateMorpher, ValueMorpher
-
TemplateMorpher(template: str, context: dict, config: TemplateConfig | None = None).render() -> str
- Replaces
{{ ... }}expressions withintemplateusing values fromcontext. - Supported features:
- Variables:
$user.name - Literals:
'text', "text" - Concatenation:
'A' + 'B' + $x - Functions:
if(condition, then, else)format(value, pattern)— pattern must be quoted
- Variables:
- Replaces
-
ValueMorpher(fmt: str, value: Any).render() -> str
- Automatically detects format type:
- Decimal: patterns like
0.00(precision is taken from the pattern) - Date: tokens like
DD,MM,YYYY,HH,mm,ss
- Decimal: patterns like
- Automatically detects format type:
Configuration
from morphify import TemplateMorpher
from morphify.morphify.template_morpher import TemplateConfig
tpl = 'Today: {{$date}}' # no explicit format()
cfg = TemplateConfig(default_date_format='DD/MM/YY')
print(TemplateMorpher(tpl, {"date": "2025-10-05"}, config=cfg).render())
# -> Today: 05/10/25
Formatting examples
from morphify import ValueMorpher
ValueMorpher('0.000', '3.14159').render() # '3.142'
ValueMorpher('DD/MM/YY HH:mm', 1728096000).render() # timestamp -> '05/10/25 00:00'
Testing
pytest -q
Coverage
The project uses coverage.py. Settings live in pyproject.toml.
- Run locally:
coverage run -m pytest -q && coverage report
CI integrates with Codecov. Provide CODECOV_TOKEN if required.
Contributing
- Run linters and tests before pushing:
uv sync --dev --locked
uv run pre-commit run --all-files
uv run pytest -q
License
MIT
Metadata
Release files for morphify 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| morphify-0.1.2.tar.gz | 42.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| morphify-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 49.1 kB
Release files / morphify-0.1.2.tar.gz
| Download URL | morphify-0.1.2.tar.gz |
|---|---|
| Size | 42.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
17e96b2e1fb5a2f68e109ee55b9b2856fc0ed23fec5cc172b2f7739d4e248dc3
|
|
BLAKE2b-256 checksum How to use checksums |
88a5431b12b515b6d775429d52d5154b163d4be71bea5309110401e58d252fd7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.23
|
Release files / morphify-0.1.2-py3-none-any.whl
| Download URL | morphify-0.1.2-py3-none-any.whl |
|---|---|
| Size | 6.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e168cf738aef822ebe9e68efa69012814db1832a12bf63aa56d88eb8e5456477
|
|
BLAKE2b-256 checksum How to use checksums |
a6188e861ccf78e732d400d786bcab3dccd265e4fd1671ca066f9a76fb271510
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.23
|