Skip to main content

Mu configuration language parser and typed decoder for Python.

Project description

lang-mu

lang-mu is a Python distribution for the mu Python package, an implementation of the Mu configuration language. It provides:

  • A parser that preserves Mu syntax as an AST.
  • A typed decoder that maps Mu expressions into Python dataclasses and typing constructs.
  • An experimental runtime evaluator (mu.exec) for callable execution semantics.

Why this library

Mu configuration files can describe nested structures, tagged records, and mixed positional/named arguments. This package gives you a strict, testable way to parse and decode those configs into Python types.

Installation

pip install lang-mu

Quickstart: Parsing

from mu import AtomExpr, Document, GroupExpr, parse

source = """
; application plus shared includes
(app-jvm "billing-api"
  :main "billing.Main"
  :ports [8080 8443]
  :env {profile: prod, region: us-east-1}
)
(include "shared/logging.mu")
"""

doc = parse(source)
assert isinstance(doc, Document)
assert len(doc.exprs) == 2

app = doc.exprs[0]
assert isinstance(app, GroupExpr)
assert isinstance(app.values[0], AtomExpr)
assert app.values[0].value == "app-jvm"

Parser Literals

The parser supports both single- and double-quoted strings, and parses numeric literals into dedicated AST node types:

  • SInt for integers
  • SReal for real numbers and percentages
  • SRational for rational values
from mu import parse
from mu.types import AtomExpr, SInt, SRational, SReal, StringExpr

doc = parse("'hi' 42 1.5 50% 2/3 first'")
assert doc.exprs == [
    StringExpr("hi"),
    SInt(42),
    SReal(1.5),
    SReal(0.5),
    SRational((2, 3)),
    AtomExpr("first'"),
]

Quickstart: Typed decoding

from dataclasses import dataclass

from mu import parse_one


@dataclass
class Http:
    port: int


@dataclass
class Worker:
    queue: str


@dataclass
class Service:
    name: str
    mode: Http | Worker


cfg = parse_one('(service "api" :mode (http :port 8080))', Service)
assert cfg == Service(name="api", mode=Http(port=8080))

Error handling

Typed decoding raises DecodeError with structured context:

  • path: decode path (for example $.field[0])
  • expected: human-readable expected target/type
  • got: actual Mu expression description
  • span: optional source span/token information
  • cause: optional underlying exception
from dataclasses import dataclass
from mu import DecodeError, parse_one


@dataclass
class Counter:
    value: int


try:
    parse_one('(counter :value "not-an-int")', Counter)
except DecodeError as e:
    print(e.path, e.expected, e.got)

API contract

Stable API (from mu import ...)

  • Stable symbol reference is generated from code: docs/api-stable.md.
  • Main entry points:
    • parse, ParseError
    • parse_one, parse_many, decode
    • DecodeError, DecoderRegistry, Quoted

Experimental API (from mu.exec import ...)

  • Experimental symbol reference is generated from code: docs/api-experimental.md.

The experimental runtime API is available but not considered stable yet. Non-exported internals (for example mu.arg_match and parser private helpers) are unsupported and may change without notice.

Python support

  • Python >=3.10

License

This project is licensed under AGPL-3.0-or-later. See LICENSE.md for full text.

Development and release checks

python scripts/generate_api_docs.py --check
python scripts/check_docs_links.py
pytest -q tests/test_docs_snippets.py
codespell README.md docs CHANGELOG.md CONTRIBUTING.md --ignore-words=.codespell-ignore-words.txt
mkdocs build --strict
pytest -q
ruff check .
python -m build --sdist --wheel
python -m twine check dist/*
./scripts/check_wheel_contents.sh

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

lang_mu-0.3.2.tar.gz (37.4 kB view details)

Uploaded Source

Built Distribution

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

lang_mu-0.3.2-py3-none-any.whl (40.2 kB view details)

Uploaded Python 3

File details

Details for the file lang_mu-0.3.2.tar.gz.

File metadata

  • Download URL: lang_mu-0.3.2.tar.gz
  • Upload date:
  • Size: 37.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for lang_mu-0.3.2.tar.gz
Algorithm Hash digest
SHA256 1f5a5b0caccd539e43cba9e9ef5e4aeea39d9780290ddf15bed9fbab84c212aa
MD5 8aa5cab6d4fcf88dbc09c8a6c5bf016d
BLAKE2b-256 5f4fa3f5b40673337570c190152c8f297dc01b048e6fd5e962ef4f1f1ba8960d

See more details on using hashes here.

File details

Details for the file lang_mu-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: lang_mu-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 40.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for lang_mu-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 439e68c2a6d79dcd7fce638e8cd95a71c9c1d7b00fd9a0dfbc988ea59279203e
MD5 0dcb5ea689ee1cdced1262263327f219
BLAKE2b-256 71f6d82d5cdf9aa9eef90751604d044f15e91e0613545d08ead3d94d8d450c60

See more details on using hashes here.

Supported by

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