Extracting suil
suil moved out of the inventory repository into its own, and is published to
PyPI as droch-shuil. The workspace installs it as a pinned package and keeps
its data and, for now, its modules as a repo: local entry of
modules.yaml.
Before
- suil lived in
suil/inside the inventory repository and was installed withpip install -e ./suilbymake install. suil/pyproject.tomldeclared no dependencies: pyinfra, pydantic, PyYAML, pyrage, Click and the rest came from the workspace'srequirements.txt.- The package directory was the project directory (
package-dirwas.), and the packages were listed by hand. make testran suil's own tests and every module's tests in one pytest call.
Preconditions
- 02-workspace.md: suil finds the workspace from the current directory, never from the location of its source.
- 04-migrate-sdk.md: the runner and the modules import
only
suil.sdkandsuil.testing. - 05-manifest.md: modules are declared in
modules.yaml.
Without these the extracted package would still reach into the workspace tree.
Repository
The new repository took suil/ with its history. A fresh clone of the
inventory repository was filtered with git filter-repo, keeping suil/ and
renaming paths on the way to the usual layout:
suil/stays the package directory;suil/tests/becomestests/;suil/docs/becomesdocs/;suil/pyproject.tomlbecomespyproject.toml.
The filtered history was merged into the new repository, whose tooling was
already committed, as one merge commit. Every commit that touched suil/
keeps its message, author and date.
What stays in the workspace: data/, modules/, its pre-commit
configuration, its Makefile, and the two tests that check the modules of a
workspace rather than suil itself.
Package
- The distribution is
droch-shuil: PyPI refusessuilas too close to an existing name. The import package stayssuil. - It installs one console script under two names,
suilanddroch-shuil, and keeps thesuil.testingpytest plugin entry point. pyproject.tomllists every runtime dependency suil imports, with lower bounds. setuptools findssuiland its sub-packages without a list.- The version follows SemVer and is released from a
vX.Y.Ztag. The first release is0.2.0;SDK_VERSIONmoves separately, only whensuil.sdkchanges.
CI
- A
vX.Y.Ztag runs.github/workflows/publish.yml. It checks that the tag matches the version inpyproject.toml, builds the sdist and the wheel, installs the wheel into a fresh virtual environment, runssuil --helpanddroch-shuil --help, and publishes to PyPI through trusted publishing. - A push to
mainthat changesdocs/,README.mdormkdocs.ymlpublishes the documentation to GitHub Pages. - The tests and the pre-commit hooks run locally, through
make testandmake lint.
The workspace after the move
requirements.txtpinsdroch-shuilto a release.make installdropspip install -e ./suil.make testrunspytest modules -q; the module tests keep their fixtures through the plugin of the installed package.- Working on suil and the workspace at once is
pip install -e ../suilin the workspace's virtual environment, by hand, and never committed. CLAUDE.mdandREADME.mddescribe suil as an installed tool.
Non-goals
No module leaves the workspace in this step.
Acceptance
- A fresh virtual environment installs
droch-shuilfrom PyPI and runssuil --helpanddroch-shuil --help. - No import or path in the suil repository refers to the workspace.
- The workspace's
make installandmake testpass with the released package, and a full rolesuil apply --dry-runwrites the same.runs/catalogue as before the move.