On this page
Parses and validates the [tool.fastware.dev] table from pyproject.toml into a typed DevConfig, failing hard on missing settings.
#src.fastware.devconfig
#src.fastware.devconfig
File-driven dev configuration for the fastware dev CLI.
Reads a [tool.fastware.dev] table from the nearest owning pyproject.toml and validates it into a :class:DevConfig. All fields are explicit -- there are no silent defaults for anything that changes behaviour; invalid or ambiguous configuration is a hard error (:class:DevConfigError).
Location rule (enforced by :func:find_dev_pyproject): starting from a directory, walk up to the filesystem root collecting every pyproject.toml that contains a [tool.fastware.dev] table. Zero found is an error naming the rule; two or more (a table nested under another table) is an ambiguity error listing both. Exactly one is required. In a monorepo the table lives in the package that owns the fastware app + frontend.
#DevConfigError
Raised for any missing, unknown, or contradictory dev-config value.
#BackendSpec
How to run the backend: in-process app OR an arbitrary spawn command.
Exactly one of app ("module:attr" served in-process via serve, wrapped with ViteDevProxy) or cmd (arbitrary argv spawned directly) must be set -- never both, never neither.
#is_in_process
def is_in_process(self) -> bool#ViteSpec
Vite dev server: command, working dir, port, and env.
--strictPort is always enforced (appended if absent) so Vite fails loudly on a port collision instead of silently drifting to another port that the readiness probe and proxy would then miss.
#HealthCheck
A readiness check for an aux service: exactly one of http/tcp/cmd.
#AuxService
An ordered auxiliary service started (and health-gated) before the backend.
#PreSpawnGate
A pre-flight gate that must pass BEFORE anything spawns.
Exactly one probe kind (cmd/http/tcp/file) plus a mandatory human-readable message shown when the gate fails.
#DevConfig
Validated dev configuration resolved from [tool.fastware.dev].
#base_dir
def base_dir(self) -> Path#resolve_cwd
def resolve_cwd(self, cwd: str | None) -> PathResolve a component cwd relative to the owning pyproject directory.
#build_dev_config
def build_dev_config(table: dict, *, source_path: Path | None=None, app_name: str='fastware') -> DevConfigBuild a :class:DevConfig from a raw [tool.fastware.dev] mapping.
#find_dev_pyproject
def find_dev_pyproject(start: Path | str | None=None) -> PathReturn the single owning pyproject.toml per the location rule.
Walks up from start (default CWD) to the filesystem root collecting every pyproject.toml that contains a [tool.fastware.dev] table:
- zero found -> :class:
DevConfigErrornaming the location rule - two or more -> :class:
DevConfigErrorlisting all candidates (ambiguous) - exactly one -> that path
#load_dev_config
def load_dev_config(start: Path | str | None=None) -> DevConfigLocate and parse the dev config per the location rule.