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:
-
# BEGINand# ENDdelimit a template -
Lines starting with
# UNCOMMENTare stripped to whatever proceeds the annotation -
Lines ending with
# DELETEare removed -
translations: Mapping[str, str | Sequence[str]]is the dictionary of translations:- If
value = translations[key]is a string, all instances ofkeyare replaced byvalue - If
value = translations[key]is a sequence of strings,keywill be allowed in a# LOOPdeclaration - The order of translations is not guaranteed. So, keys substrings of other keys will probably yield inentended results
- If
-
# LOOP VAR1 ... VARNand# ENDdelimit 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
VARmultiple 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
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 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
|