A simple annotation-based language to generate code from templates
Project description
templang
A simple annotation-based language to generate code from templates
Templates
Templates are just source files with annotations. For example:
# BEGIN
from typing import Literal
Rank = Literal[
# LOOP RANK
'RANK',
# END
]
CLEARANCE_LEVEL = int # DELETE (just to make mypy happy)
# LOOP RANK CLEARANCE_LEVEL
class RANK:
clearance_level: CLEARANCE_LEVEL
# END
# END
Template Parsing
from templang import parse
with open('ranks.py') as f:
source = f.read()
code = parse(source, translations={
'RANK': ['Captain', 'Lieutenant', 'Sergeant'],
'CLEARANCE_LEVEL': ['1', '2', '3']
})
print(code)
# from typing import Literal
#
# Rank = Literal[
# 'Captain',
# 'Lieutenant',
# 'Sergeant',
# ]
#
# class Captain:
# clearance_level: 1
#
# class Lieutenant:
# clearance_level: 2
#
# class Sergeant:
# clearance_level: 3
Rules
Now, that's most of what you need to now. But, to be precise, here are the rules:
-
# BEGIN
and# END
delimit a template -
Lines starting with
# UNCOMMENT
are stripped to whatever proceeds the annotation -
Lines ending with
# DELETE
are removed -
translations: Mapping[str, str | Sequence[str]]
is the dictionary of translations:- If
value = translations[key]
is a string, all instances ofkey
are replaced byvalue
- If
value = translations[key]
is a sequence of strings,key
will be allowed in a# LOOP
declaration - The order of translations is not guaranteed. So, keys substrings of other keys will probably yield inentended results
- If
-
# LOOP VAR1 ... VARN
and# END
delimit a loop:translations[VARi]
must be a sequence of stringsLEN = len(translations[VAR1]) == ... == len(translations[VARN])
- The template inside the loop is substituted with
translations[VARi][j]
for eachj in range(LEN)
- Nested loops are allowed
- If nested loops involve a same variable
VAR
multiple times, thentranslations[VAR]
must be a nested sequence of strings (matching the loop depth)-
E.g:
# BEGIN from typing import Union, Literal Marriage = Union[ # LOOP NAMES tuple [ # LOOP NAMES Literal['NAMES'], # END ], # END ] # END parse(open(__file__).read(), { 'NAMES': [['John', 'Jane'], ['Stuart', 'Alice']] }) # from typing import Union, Literal # # Marriage = Union[ # tuple [ # Literal['John'], # Literal['Jane'], # ], # tuple [ # Literal['Stuart'], # Literal['Alice'], # ], # ]
-
-
Oh, and actually,
#
can be replaced by any custom string (e.g.//
)
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
File details
Details for the file templang-0.1.1.tar.gz
.
File metadata
- Download URL: templang-0.1.1.tar.gz
- Upload date:
- Size: 3.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.11.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 84ad17d0017271c6bdef1d17561e1cca31716bdf164a25b6ccbb952b654c31ef |
|
MD5 | 08467aaf0322e2303f093ab797b9d4cc |
|
BLAKE2b-256 | 0787778be404d6c679ae2e3eb7895d33697b8ca63c981814dfc0c3e5fd3a059b |
File details
Details for the file templang-0.1.1-py3-none-any.whl
.
File metadata
- Download URL: templang-0.1.1-py3-none-any.whl
- Upload date:
- Size: 3.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.11.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6b913bc9c914e02ce26fedb36b514f7d235f25366ac0bb0c5f1263de6e9b8c43 |
|
MD5 | 85f0f24a6971ae24cb030482428c5f80 |
|
BLAKE2b-256 | b8c5d6e2d0ea701be337a9d344eb8170797119b101eeeaa52eae3f50d2796670 |