chore: drop .rhiza/requirements and move the make layer to rhiza v1.3.3 - #93
Closed
tschm wants to merge 3 commits into
Closed
chore: drop .rhiza/requirements and move the make layer to rhiza v1.3.3#93tschm wants to merge 3 commits into
tschm wants to merge 3 commits into
Conversation
v1.3.3 replaces the nested .rhiza/tests/{api,integration,shell,stress,
structure,sync,utils} tree with five flat modules. test_docstrings.py moves
unchanged; test_pyproject.py and test_readme_validation.py move and are
rewritten; test_readme.py and test_release_tags.py are new. The rest of the
old tree goes, along with test_utils.py, whose helpers the flat modules no
longer import.
Isolated from #27 on request so the test-suite churn — 445 insertions
against 2627 deletions — is reviewable on its own.
Note that it does not stand up alone: quality.mk's rhiza-test provisions
this layout's dependencies (pytest-timeout, python-dotenv, packaging),
python.mk reads .rhiza/tests/test_pyproject.py, and pytest.ini supplies the
pythonpath these modules import through. All three land in #27, which is
stacked on this branch. Expect CI to be red here until both have merged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
test_no_license_classifier: PyPI deprecated the `License ::` trove
classifiers in favour of the license field, so the MIT one is dropped.
`license = {text = "MIT"}` still carries it — the built wheel reports
License: MIT with no license classifiers.
test_a_discoverable_config_exists: the bumpversion config lived in
.rhiza/.cfg.toml, which bump-my-version never searches. It searches
.bumpversion.toml, .bumpversion.cfg, setup.cfg and pyproject.toml, and on
finding none does not fail — it falls back to `git describe` and treats the
newest reachable tag as the current version, so a release can be cut at a
number already published. A [tool.bumpversion] table now lives in
pyproject.toml.
The table is deliberately three settings and no current_version:
bump-my-version rewrites PEP 621 [project].version natively, and commit/tag
stay false because the release flow makes its own commit and tag. The stale
.rhiza/.cfg.toml is removed in the stacked PR, where the rest of the paths
v1.3.3 dropped are removed; until then it is inert, since nothing
auto-discovers that path.
.rhiza/tests now reports 37 passed, 3 skipped.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
.rhiza/requirements/*.txt was a second dependency manifest: `make install` pip-installed every file in it into the project venv up front. v1.3.3 drops the directory and has each target provision what it needs on the fly instead (`uv run --with pytest --with pytest-timeout …`), so the venv holds the project's own dependencies and nothing else. Removing the lists alone would not work, which is why the make layer comes with them: - the v1.3.3 bootstrap.mk no longer defines `install` at all — that moves to the new python.mk, which also takes over test, typecheck, security, license and docs-coverage from the old test.mk and quality.mk, so mixing old and new files gives duplicate target definitions; - the old .rhiza/tests suite asserts against the old layout (it copies make.d files into a temp dir and inspects `make -sn test`), so it fails the moment `test` moves to python.mk. The v1.3.3 suite this branch is stacked on replaces it. Two knock-on effects worth naming: - `make license` now passes. The old tests.txt pulled in pygal, which is LGPLv3+, and the license gate fails on LGPL — the pinned list was itself the violation. - v1.3.3 changes the `typecheck` default from ty to `both`, adding `mypy --strict`. That reports 43 errors in src/ that pre-date this branch, so custom-env.mk pins TYPECHECKER to ty, holding the gate exactly where master has it rather than turning a template bump into a source rewrite. `make typecheck TYPECHECKER=mypy` still runs it. Verified against a venv pruned to the locked set, so it matches a fresh CI checkout: install, test (172 passed, 100% coverage), rhiza-test (37 passed, 3 skipped), docs-coverage (100%), security, deps, typecheck and license all pass. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
tschm
added a commit
to tschm/pycharting
that referenced
this pull request
Aug 18, 2026
The remainder of the v0.18.8 -> v1.3.3 sync: the rhiza_*.yml callers repinned from @v0.19.9 to @v1.3.3, three new workflows (fuzzing, mutation, scorecard), root tooling config, docs, shell completions, cliff.toml and the lock. The rest of the same sync is split out and already reviewable on its own — the .rhiza/tests layout (alihaskar#92 upstream), the make layer and the .rhiza/requirements removal (alihaskar#93 upstream), and the GitHub repo metadata (alihaskar#91 upstream). What is left here is what those three do not need. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
tschm
added a commit
to tschm/pycharting
that referenced
this pull request
Aug 18, 2026
.github/workflows/rhiza_sync.yml, .rhiza/.cfg.toml, .rhiza/.rhiza-version and .rhiza/utils/. The other paths v1.3.3 dropped go with the branches that make them obsolete: .rhiza/requirements and make.d/releasing.mk in alihaskar#93 upstream, the old .rhiza/tests tree in alihaskar#92. .rhiza/.cfg.toml held the bumpversion config that alihaskar#92 moved into pyproject.toml, where bump-my-version actually looks for it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR syncs the repository to the rhiza v1.3.3 “make layer” model by removing the legacy .rhiza/requirements/ manifests and updating the .rhiza/make.d/ and .rhiza/tests/ layout accordingly, while also adding a discoverable bump-my-version configuration in pyproject.toml.
Changes:
- Remove
.rhiza/requirements/*.txtand shift tooling provisioning to per-targetuv run --with …usage. - Add/reshape rhiza make fragments (notably introducing
.rhiza/make.d/python.mk) and update core make behavior. - Replace the legacy
.rhiza/tests/**structure with the v1.3.3 flat test modules and updated shared fixtures.
Reviewed changes
Copilot reviewed 44 out of 45 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| pyproject.toml | Removes deprecated license classifier; adds [tool.bumpversion] config so bump-my-version is discoverable. |
| Makefile | Updates repo-owned overrides (notably MKDOCS_EXTRA_PACKAGES) while delegating to .rhiza/rhiza.mk. |
| .rhiza/tests/utils/test_git_repo_fixture.py | Removes legacy fixture validation tests tied to old suite structure. |
| .rhiza/tests/test_utils.py | Removes legacy shared helpers used by the old nested test suite. |
| .rhiza/tests/test_release_tags.py | Adds core test asserting newest tag reachability from a branch. |
| .rhiza/tests/test_readme.py | Adds language-neutral README checks (exists + bash fences parse). |
| .rhiza/tests/test_readme_validation.py | Refocuses on executable Python fences; removes bash/readme-existence checks moved to test_readme.py. |
| .rhiza/tests/test_pyproject.py | Updates pyproject validation, including bumpversion discoverability and license-classifier deprecation checks. |
| .rhiza/tests/test_docstrings.py | Adds doctest discovery/execution across modules under the source folder. |
| .rhiza/tests/sync/conftest.py | Removes old sync-test environment scaffolding (old layout). |
| .rhiza/tests/structure/test_requirements.py | Removes checks that enforced the now-deleted .rhiza/requirements/ layout. |
| .rhiza/tests/structure/test_project_layout.py | Removes old root layout assertions from the previous test suite structure. |
| .rhiza/tests/stress/README.md | Removes old stress-suite documentation (old layout). |
| .rhiza/tests/stress/conftest.py | Removes old stress-suite CLI options/fixtures (old layout). |
| .rhiza/tests/stress/init.py | Removes old stress test module marker package. |
| .rhiza/tests/shell/test_scripts.sh | Removes old shell-script test harness from the suite. |
| .rhiza/tests/README.md | Updates suite documentation to describe the v1.3.3 flat modules and ownership. |
| .rhiza/tests/integration/test_virtual_env_unexport.py | Removes legacy integration test tied to previous make/test plumbing. |
| .rhiza/tests/integration/test_test_mk.py | Removes legacy integration test for old test.mk behavior. |
| .rhiza/tests/integration/test_docs_targets.py | Removes legacy integration tests around MKDOCS_EXTRA_PACKAGES behavior (old layer). |
| .rhiza/tests/integration/test_book_targets.py | Removes legacy integration tests for book targets (old layer). |
| .rhiza/tests/conftest.py | Simplifies shared fixtures to root/logger/latest-tag; removes mock git repo fixture setup. |
| .rhiza/tests/api/test_makefile_targets.py | Removes legacy makefile API dry-run tests (old layout/targets). |
| .rhiza/tests/api/test_makefile_api.py | Removes legacy makefile API tests for wrapper/extension behavior (old layout). |
| .rhiza/tests/api/test_make_variable_overrides.py | Removes legacy tests asserting old variable override mechanics. |
| .rhiza/tests/api/test_github_targets.py | Removes legacy GitHub target tests (replaced by new make layer structure). |
| .rhiza/tests/api/conftest.py | Removes old temporary makefile test environment fixture (old suite structure). |
| .rhiza/rhiza.mk | Updates core rhiza make behavior (POSIX shell guard on Windows, defaults, help/ci-os-matrix adjustments). |
| .rhiza/requirements/tools.txt | Deletes legacy tool requirements manifest. |
| .rhiza/requirements/tests.txt | Deletes legacy test requirements manifest. |
| .rhiza/requirements/README.md | Deletes legacy requirements documentation. |
| .rhiza/requirements/marimo.txt | Deletes legacy marimo requirements manifest. |
| .rhiza/requirements/docs.txt | Deletes legacy docs requirements manifest. |
| .rhiza/make.d/test.mk | Reduces tests bundle to optional extras (benchmark/hypothesis/stress/mutation) and switches to uv run --with …. |
| .rhiza/make.d/releasing.mk | Removes old release/bump make targets layer file. |
| .rhiza/make.d/quality.mk | Reframes quality targets around prek/todos/semgrep + rhiza-test runner. |
| .rhiza/make.d/python.mk | Adds Python language layer: install, all, test, typecheck, security, docs-coverage, license, deps. |
| .rhiza/make.d/marimo.mk | Contributes marimo folder to deptry scan and adds a license ignore accumulator entry. |
| .rhiza/make.d/github.mk | Adds GitHub helper targets built around the gh CLI. |
| .rhiza/make.d/doctor.mk | Updates doctor target to a double-colon rule and tweaks reporting output. |
| .rhiza/make.d/custom-env.mk | Pins TYPECHECKER ?= ty to preserve current typecheck strictness under v1.3.3 defaults. |
| .rhiza/make.d/completions.mk | Adds installer target for shell completions. |
| .rhiza/make.d/bootstrap.mk | Keeps language-neutral bootstrap (install-uv, hooks, clean) and removes the old Python install recipe. |
| .rhiza/make.d/book.mk | Updates marimo notebook export to provision marimo via uv run --with. |
| .rhiza/.env | Documents default env var behavior and sets project overrides (folders + CI OS matrix). |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+82
to
+103
| # Install the dependencies from pyproject.toml (if it exists). | ||
| # --inexact leaves packages uv did not manage in place instead of pruning them each | ||
| # run, so repeated 'make' targets don't churn the environment. Per-target tooling | ||
| # (pytest, interrogate, mutmut, ...) is provisioned on the fly via `uv run --with` | ||
| # in the individual targets, so there is no separate dependency-install step here. | ||
| @if [ -f "pyproject.toml" ]; then \ | ||
| if [ -f "uv.lock" ]; then \ | ||
| if ! ${UV_BIN} lock --check >/dev/null 2>&1; then \ | ||
| printf "${YELLOW}[WARN] uv.lock is out of sync with pyproject.toml${RESET}\n"; \ | ||
| printf "${YELLOW} Run 'uv sync' to update your lock file and environment${RESET}\n"; \ | ||
| printf "${YELLOW} Or run 'uv lock' to update only the lock file${RESET}\n"; \ | ||
| exit 1; \ | ||
| fi; \ | ||
| printf "${BLUE}[INFO] Installing dependencies from lock file${RESET}\n"; \ | ||
| ${UV_BIN} sync $(UV_SYNC_ARGS) --inexact --frozen || { printf "${RED}[ERROR] Failed to install dependencies${RESET}\n"; exit 1; }; \ | ||
| else \ | ||
| printf "${YELLOW}[WARN] uv.lock not found. Generating lock file and installing dependencies...${RESET}\n"; \ | ||
| ${UV_BIN} sync $(UV_SYNC_ARGS) --inexact || { printf "${RED}[ERROR] Failed to install dependencies${RESET}\n"; exit 1; }; \ | ||
| fi; \ | ||
| else \ | ||
| printf "${YELLOW}[WARN] No pyproject.toml found, skipping install${RESET}\n"; \ | ||
| fi |
Comment on lines
+73
to
+74
| `.rhiza/tests` is on `pythonpath` (see `pytest.ini`), so intra-suite imports resolve | ||
| without any `sys.path` manipulation. |
| @printf "${BLUE}[INFO] Running suppression audit...${RESET}\n" | ||
| @${UV_BIN} run python .rhiza/utils/suppression_audit.py | ||
|
|
||
| semgrep: install ## run Semgrep static analysis |
This was referenced Aug 18, 2026
tschm
added a commit
to tschm/pycharting
that referenced
this pull request
Aug 18, 2026
The tail of the v0.18.8 -> v1.3.3 sync: the rhiza_*.yml callers repinned from @v0.19.9 to @v1.3.3, three new workflows (fuzzing, mutation, scorecard), the pre-commit and bandit configs, the ruff rule set, TESTS.md and the lock. Everything separable has been separated and sent upstream: repo metadata (alihaskar#91), the .rhiza/tests layout (alihaskar#92), the make layer and the .rhiza/requirements removal (alihaskar#93), the packaging test and pytest.ini (alihaskar#94), and the inert config and data files (alihaskar#95). What is left needs the v1.3.3 make layer underneath it, or in ruff.toml's case needs source changes first. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
tschm
added a commit
to tschm/pycharting
that referenced
this pull request
Aug 18, 2026
.github/workflows/rhiza_sync.yml, .rhiza/.cfg.toml, .rhiza/.rhiza-version and .rhiza/utils/. The other paths v1.3.3 dropped go with the branches that make them obsolete: .rhiza/requirements and make.d/releasing.mk in alihaskar#93, the old .rhiza/tests tree in alihaskar#92. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Removes
.rhiza/requirements/and brings the rhizav1.3.3make layer that replaces it..rhiza/requirements/*.txtwas a second dependency manifest sitting besidepyproject.toml:make installpip-installed every file in it into the project venv up front. Inv1.3.3the directory is gone and each target provisions what it needs on the fly —uv run --with pytest --with pytest-timeout …— so the venv holds the project's own dependencies and nothing else.Why the make layer comes with it
Removing the lists on their own does not work:
v1.3.3bootstrap.mkno longer definesinstall. It moves to the newpython.mk, which also takes overtest,typecheck,security,licenseanddocs-coveragefrom the oldtest.mk/quality.mk— so mixing old and new files gives duplicate target definitions;.rhiza/testssuite asserts against the old layout: it copiesmake.dfiles into a temp dir and inspectsmake -sn test. It fails as soon astestmoves topython.mk. Thev1.3.3suite in chore: update .rhiza/tests to the rhiza v1.3.3 layout, and make it pass #92 replaces it, which is why this branch is stacked there.Two things that fall out of it
make licensenow passes. The oldtests.txtpulled inpygal, which is LGPLv3+, and the license gate fails on LGPL. The pinned list was itself the violation:typecheckneeded pinning.v1.3.3changes its default fromtytoboth, which addsmypy --strict. That reports 43 errors insrc/— missing generic parameters,Anyreturns, no pandas stubs — none introduced here and all pre-dating the upgrade.custom-env.mkpinsTYPECHECKER ?= ty, holding the gate exactly wheremasterhas it rather than turning a template bump into a source rewrite.make typecheck TYPECHECKER=mypystill runs it on demand, and the pin is one line to drop once the source is strict-clean.Verification
Run against a venv pruned to the locked set, so it matches a fresh CI checkout rather than a developer machine carrying leftovers:
make installmake testmake rhiza-testmake docs-coveragemake securitymake depsmake typecheckmake licenseNot run here:
make fmt, which rewrites files, and the optional benchmark/stress/mutation tiers.Stacking
Based on #92 (the
.rhiza/testslayout), so this PR shows that branch's commits until it merges. Merge #92 first. The remaining pieces of the same template sync — workflow pins, root tooling config, the lockfile — are in tschm#27 in my fork and are not needed for anything here.