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.2.tar.gz (13.3 kB view details)

Uploaded Source

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

Hashes for acellera_pmmanifest-0.0.2.tar.gz
Algorithm Hash digest
SHA256 4028d703fb4b3787a432121bbb136c15885f002a2f4f06d38e934095f7568dc2
MD5 eb650e10fb37556cfc70f9acaba5a389
BLAKE2b-256 372713524df8e5af7f9eac9a9b1adde95f0c621851d5096131530c726d80a304

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