Skip to main content

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 of key are replaced by value
    • 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
  • # LOOP VAR1 ... VARN and # END delimit a loop:

    • translations[VARi] must be a sequence of strings
    • LEN = len(translations[VAR1]) == ... == len(translations[VARN])
    • The template inside the loop is substituted with translations[VARi][j] for each j in range(LEN)
    • Nested loops are allowed
    • If nested loops involve a same variable VAR multiple times, then translations[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. //)

Metadata

Release files for templang 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for templang 0.1.1
File Size Uploaded
templang-0.1.1.tar.gz 3.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for templang 0.1.1
File Interpreter ABI Platform
templang-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 7.2 kB

Release files / templang-0.1.1.tar.gz

Download URL templang-0.1.1.tar.gz
Size 3.4 kB
Tags Source
SHA-256 checksum
How to use checksums
84ad17d0017271c6bdef1d17561e1cca31716bdf164a25b6ccbb952b654c31ef
BLAKE2b-256 checksum
How to use checksums
0787778be404d6c679ae2e3eb7895d33697b8ca63c981814dfc0c3e5fd3a059b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.6

Release files / templang-0.1.1-py3-none-any.whl

Download URL templang-0.1.1-py3-none-any.whl
Size 3.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6b913bc9c914e02ce26fedb36b514f7d235f25366ac0bb0c5f1263de6e9b8c43
BLAKE2b-256 checksum
How to use checksums
b8c5d6e2d0ea701be337a9d344eb8170797119b101eeeaa52eae3f50d2796670
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.6

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page