Skip to main content

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


Download files

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

Source Distribution

acellera_pmmanifest-0.0.3.tar.gz (14.1 kB view details)

Uploaded Source

File details

Details for the file acellera_pmmanifest-0.0.3.tar.gz.

File metadata

  • Download URL: acellera_pmmanifest-0.0.3.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for acellera_pmmanifest-0.0.3.tar.gz
Algorithm Hash digest
SHA256 9c48f39c278865054bef8fe620a03c095d3af5ede342c7537676b137730228df
MD5 f59804ca6c88ff6eb4e28922c29774f9
BLAKE2b-256 0a142deaa662486ed62c604edcdc47b40dd16652f9db70a9d9acb0a4a095cc5b

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