From 6244866f5a5fb33965e7dc519c2062cd3c3a9ff5 Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Wed, 5 Aug 2026 18:18:37 +0100 Subject: [PATCH 1/3] Add no-defaults linting --- .pre-commit-config.yaml | 6 ++++++ pyproject.toml | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 22b2e2b7..90abbe1b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -430,3 +430,9 @@ repos: types_or: [markdown, rst] additional_dependencies: - *uv_version + + - repo: https://github.com/adamtheturtle/no-defaults + rev: v1.0.0 + hooks: + - id: no-defaults + stages: [pre-commit] diff --git a/pyproject.toml b/pyproject.toml index 8686694c..f4e37e26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -171,6 +171,7 @@ lint.per-file-ignores."tests/test_*.py" = [ lint.unfixable = [ "ERA001", ] +lint.external = [ "NOD" ] lint.flake8-tidy-imports.banned-api."typing.cast".msg = "typing.cast is banned: use explicit type narrowing or a typed variable instead." lint.pydocstyle.convention = "google" @@ -461,3 +462,7 @@ ignore_path = [ [tool.yamlfix] section_whitelines = 1 whitelines = 1 + +[tool.no_defaults] +private_only = true +per_file_enforcement."tests/**" = "all" From 630fd86dd989c6e7cd2618b9528ef1d65e924e8d Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Wed, 5 Aug 2026 23:14:35 +0100 Subject: [PATCH 2/3] Bump no-defaults to v1.0.1 Picks up the fix for annotated locals in dataclass methods being misreported as fields (adamtheturtle/no-defaults#6). Co-Authored-By: Claude Opus 5 (1M context) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 90abbe1b..d8f1e2d7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -432,7 +432,7 @@ repos: - *uv_version - repo: https://github.com/adamtheturtle/no-defaults - rev: v1.0.0 + rev: v1.0.1 hooks: - id: no-defaults stages: [pre-commit] From 1c35e5274f458fca385657a6b6f2ea6898af5763 Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Thu, 6 Aug 2026 05:31:28 +0100 Subject: [PATCH 3/3] Run no-defaults as a local uv hook Run no-defaults as a local uv hook instead of the upstream pre-commit hook, matching the other locally-defined hooks. The pin moves to the dev extra in pyproject.toml, and the hook joins the pre-commit.ci skip list alongside the other hooks that need project dependencies. Co-Authored-By: Claude Opus 5 (1M context) --- .pre-commit-config.yaml | 16 ++++++++++------ pyproject.toml | 1 + uv.lock | 13 +++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d8f1e2d7..7a35ad16 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -289,6 +289,16 @@ repos: stages: [pre-commit] require_serial: true + - id: no-defaults + name: no-defaults + entry: uv run --extra=dev no-defaults + language: python + types_or: [python] + additional_dependencies: + - *uv_version + stages: [pre-commit] + require_serial: true + - id: interrogate-docs name: interrogate docs entry: uv run --extra=dev doccmd --no-write-to-file --example-workers 0 --language=python @@ -430,9 +440,3 @@ repos: types_or: [markdown, rst] additional_dependencies: - *uv_version - - - repo: https://github.com/adamtheturtle/no-defaults - rev: v1.0.1 - hooks: - - id: no-defaults - stages: [pre-commit] diff --git a/pyproject.toml b/pyproject.toml index f4e37e26..b2b61c21 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,6 +49,7 @@ optional-dependencies.dev = [ "interrogate==1.7.0", "mypy[faster-cache]==2.3.0", "mypy-strict-kwargs==2026.7.19.1", + "no-defaults==1.0.1", "prek==0.4.11", "pydocstringformatter==1.0.0", "pylint[spelling]==4.0.6", diff --git a/uv.lock b/uv.lock index 5c36e8bc..d7d13b54 100644 --- a/uv.lock +++ b/uv.lock @@ -976,6 +976,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, ] +[[package]] +name = "no-defaults" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/54/3454e62945b092758b587e0e4b7cf35aa77f88da5fc43f20790bf5d433ad/no_defaults-1.0.1.tar.gz", hash = "sha256:c309ae30960a08ebc2436e7a45aeea46b5eb1c73c65bf02220e41e5b5d01721c", size = 28426, upload-time = "2026-08-05T22:15:00.523Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/de/1e7659c6ce5babd9fa57c14463e2b50536b9d6d1754f58db0f0307da6986/no_defaults-1.0.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4584dff7a7bdf632ccff600bae628276ba66a9ede156808e55e6c9c411982d4f", size = 2034147, upload-time = "2026-08-05T22:14:55.306Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2c/ff7f38b88649560ca6d18a0a5652c30f969438f0a8d993991825ba8c7ee9/no_defaults-1.0.1-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:da5ed90cedddebddfbda4bd3fa180eba42b39814e118b7f297cd6f7705edb6a7", size = 2206221, upload-time = "2026-08-05T22:14:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a0/66a4ac44d0216e88e924e54756cee8282f4f04f646c02c5931b7f9bed933/no_defaults-1.0.1-py3-none-win_amd64.whl", hash = "sha256:31c9f3252b54d5e04e061f7aaf3b08571236eec5db1f20be91cc3cbf4be92827", size = 1931806, upload-time = "2026-08-05T22:14:59.254Z" }, +] + [[package]] name = "nodeenv" version = "1.10.0" @@ -2452,6 +2463,7 @@ dev = [ { name = "interrogate" }, { name = "mypy", extra = ["faster-cache"] }, { name = "mypy-strict-kwargs" }, + { name = "no-defaults" }, { name = "prek" }, { name = "pydocstringformatter" }, { name = "pylint", extra = ["spelling"] }, @@ -2513,6 +2525,7 @@ requires-dist = [ { name = "interrogate", marker = "extra == 'dev'", specifier = "==1.7.0" }, { name = "mypy", extras = ["faster-cache"], marker = "extra == 'dev'", specifier = "==2.3.0" }, { name = "mypy-strict-kwargs", marker = "extra == 'dev'", specifier = "==2026.7.19.1" }, + { name = "no-defaults", marker = "extra == 'dev'", specifier = "==1.0.1" }, { name = "prek", marker = "extra == 'dev'", specifier = "==0.4.11" }, { name = "pydocstringformatter", marker = "extra == 'dev'", specifier = "==1.0.0" }, { name = "pylint", extras = ["spelling"], marker = "extra == 'dev'", specifier = "==4.0.6" },