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. //)

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

templang-0.1.1.tar.gz (3.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

templang-0.1.1-py3-none-any.whl (3.8 kB view details)

Uploaded Python 3

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

Hashes for templang-0.1.1.tar.gz
Algorithm Hash digest
SHA256 84ad17d0017271c6bdef1d17561e1cca31716bdf164a25b6ccbb952b654c31ef
MD5 08467aaf0322e2303f093ab797b9d4cc
BLAKE2b-256 0787778be404d6c679ae2e3eb7895d33697b8ca63c981814dfc0c3e5fd3a059b

See more details on using hashes here.

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

Hashes for templang-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6b913bc9c914e02ce26fedb36b514f7d235f25366ac0bb0c5f1263de6e9b8c43
MD5 85f0f24a6971ae24cb030482428c5f80
BLAKE2b-256 b8c5d6e2d0ea701be337a9d344eb8170797119b101eeeaa52eae3f50d2796670

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page