hatch-angee
The one published implementation of Angee's addon machinery: the build
backend addon repos set as build-backend, and the library Angee's
composer calls in-process (manifest parsing, discovery, dependency
compilation, the generated pyproject block). An addon repo carries no
hatch_build.py, no hook tables, and no dynamic of its own — the
backend wires everything in.
# an addon repo's pyproject.toml — no Python hook code, no hook tables
[build-system]
requires = ["hatch-angee>=0.2"] # pulls hatchling transitively
build-backend = "hatch_angee.build"
[project]
name = "vendor-crm" # the addon name, PEP 503-normalized (vendor.crm)
version = "0.1.0"
# no `dynamic = [...]` — the backend declares entry-points dynamic for you
[tool.hatch.build.targets.wheel]
packages = ["vendor"] # the import package(s) to ship
On a wheel/editable build the backend discovers every addon.toml in the repo
(pruning node_modules, .venv, dist, …) and:
- generates the
angee.addonsentry points (name -> import anchor) — the runtime enumerates these overuv.lockto list available addons; - ships each addon's
web/,templates/,skills/into the wheel at the addon's import path (vendor.crm→vendor/crm/...), layout-agnostic.
Backend config lives in [tool.hatch-angee] — e.g. extra-web names glob roots
of non-addon shared web packages (no addon.toml) to ship verbatim. A normal
addon repo configures none.
The library face
Angee's composer imports the same package in-process during angee build:
parse_manifest(path)→ the validatedAddonManifest(addon.tomlvocabulary incl.dependencies— PEP 508 — andrequires, the core compatibility floor);discover(roots)→(addon_dir, manifest)pairs, caller root order = precedence, symlink-following with a cycle guard;compile_dependencies(manifests)/check_requires(manifests, core_version);write_block(pyproject, deps)→ the generated[dependency-groups].addonskey, comment-preserving, idempotent, atomically replaced.
The library face imports stdlib + packaging + tomlkit only — never
hatchling or Django (tests/test_layering.py enforces it).
Escape hatch: explicit hatchling hooks
The same two hooks are also registered by name, so a repo that prefers plain hatchling can wire them itself instead of using the backend:
[build-system]
requires = ["hatchling", "hatch-angee>=0.2"]
build-backend = "hatchling.build"
[project]
dynamic = ["entry-points"]
[tool.hatch.metadata.hooks.angee-addons]
[tool.hatch.build.targets.wheel.hooks.angee-addon-sources]
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hatch_angee-0.2.0.tar.gz.
File metadata
- Download URL: hatch_angee-0.2.0.tar.gz
- Upload date:
- Size: 52.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6782b6ae49a5d1886ddd4664fe8cce83873bc020174d4da0a7dd74926833d6d
|
|
| MD5 |
73a1d2bb6c1b903f4db4daeaa4339122
|
|
| BLAKE2b-256 |
f3c7f5dd392f840e66a57bcdbb61cc57effb6fe88a8037668c99d0cbc122ea84
|
File details
Details for the file hatch_angee-0.2.0-py3-none-any.whl.
File metadata
- Download URL: hatch_angee-0.2.0-py3-none-any.whl
- Upload date:
- Size: 26.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
33d6df201b8dc73530c56faf41123701f733307196bc27c1168248038cff25e1
|
|
| MD5 |
8d2632f5159cd38f0a00a2c68c038ff5
|
|
| BLAKE2b-256 |
4c84642323ded7616991599bccfbe23313aa6d21d29a53651335dcac09d182e4
|