Skip to main content

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

Project details


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

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.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page