Generate PlayMolecule v2 app manifests (JSON Schema + uiSchema) from typed Python function signatures, with a live RJSF GUI preview.
Project description
pmmanifest
Generate PlayMolecule v2 app manifests — standard JSON Schema (inputSchema)
plus an RJSF uiSchema — directly from a typed Python function signature, and
preview the resulting GUI locally. The successor to func2argparse's
manifest-generation role (the argparse path is dropped; apps run via
inputs.json).
Why
One typed signature is the single source of truth: it drives the manifest
(what the GUI renders), runtime validation/coercion, and the Python API.
Standard JSON Schema means an off-the-shelf renderer (RJSF) handles nested
objects, arrays-of-objects, enums and oneOf — no bespoke widgets.
Authoring (signature-first)
Apps stay plain annotated functions — no BaseModel per function. Plain
pathlib.Path is auto-substituted with the path-role type, so most apps need
no rewrite. Presentation rides along in Annotated[T, UI(...)].
from pathlib import Path
from typing import Annotated, Literal
from pmmanifest import UI, func_to_manifest, build_app_manifest
def systembuilder(
outdir: Path,
structure: Annotated[Path | None, UI(widget="file")] = None,
forcefield: Annotated[Literal["GAFF2", "openff-2.3.0"], UI(group="Force field")] = "GAFF2",
):
"""SystemBuilder builds systems for MD simulation."""
entry = func_to_manifest(systembuilder, function="myapp.app.systembuilder")
manifest = build_app_manifest("systembuilder", [entry])
Preview the GUI
pmmanifest serve myapp.app:systembuilder # live RJSF form at http://127.0.0.1:8000
pmmanifest emit myapp.app:systembuilder # print the v2 manifest JSON
Docstring fallback (existing functions work unchanged)
Annotations are optional. If a parameter has no Field(description=...) / UI(...),
pmmanifest reads the function's numpydoc Parameters section (func2argparse style) for the
description, choices= (→ enum/dropdown), and gui_options= (→ groups, labels, hidden,
legacy columns). The annotation always wins when present. Labels follow the PlayMolecule
rule: the description's first sentence if ≤4 words, else a prettified field name.
def systembuilder(outdir: Path, forcefield: str = "GAFF2"):
"""SystemBuilder builds systems for MD simulation.
Parameters
----------
outdir : Path
Output directory to store results
forcefield : str, choices=("GAFF2", "openff-2.3.0"), gui_options={"group": "Force field"}
Force field. Used for non-canonical residue parameterization.
"""
...
# -> outdir labeled "Output directory" (+tooltip), forcefield a "Force field"-group dropdown.
Flexible path types
A path argument is always a string on the wire and may be a local path or a
remote URI (slpm://, app://, bck://). PMPath is a permissive tagged
string ({"type":"string","format":"path"}), never pathlib.Path (which would
corrupt slpm://x to slpm:/x). File-staging keys off format:"path".
Shared dialect contract
detect_dialect, iter_path_values, set_in are the v1/v2 coexistence helpers
intended for the execution backends to import (so the contract can't drift).
detect_dialect works on a full envelope or a bare function dict (autodiscovers
from keys: inputSchema ⇒ v2, params ⇒ v1).
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
File details
Details for the file acellera_pmmanifest-0.0.2.tar.gz.
File metadata
- Download URL: acellera_pmmanifest-0.0.2.tar.gz
- Upload date:
- Size: 13.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4028d703fb4b3787a432121bbb136c15885f002a2f4f06d38e934095f7568dc2
|
|
| MD5 |
eb650e10fb37556cfc70f9acaba5a389
|
|
| BLAKE2b-256 |
372713524df8e5af7f9eac9a9b1adde95f0c621851d5096131530c726d80a304
|