Lightweight templating and value formatting utilities
Project description
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
Project details
Release history Release notifications | RSS feed
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 morphify-0.1.2.tar.gz.
File metadata
- Download URL: morphify-0.1.2.tar.gz
- Upload date:
- Size: 42.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17e96b2e1fb5a2f68e109ee55b9b2856fc0ed23fec5cc172b2f7739d4e248dc3
|
|
| MD5 |
35943546419b11b82db5619eee0dfbbd
|
|
| BLAKE2b-256 |
88a5431b12b515b6d775429d52d5154b163d4be71bea5309110401e58d252fd7
|
File details
Details for the file morphify-0.1.2-py3-none-any.whl.
File metadata
- Download URL: morphify-0.1.2-py3-none-any.whl
- Upload date:
- Size: 6.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e168cf738aef822ebe9e68efa69012814db1832a12bf63aa56d88eb8e5456477
|
|
| MD5 |
2486f6e39332e2b93a8e126a9281a68b
|
|
| BLAKE2b-256 |
a6188e861ccf78e732d400d786bcab3dccd265e4fd1671ca066f9a76fb271510
|