From 0114d91099a4d43476782a38d71e1f3bd7d8c4c9 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Tue, 2 Dec 2025 11:27:30 -0800 Subject: [PATCH 1/7] TST,CI: Add workflow to check sdist. --- .github/workflows/test.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dc85fadc..fc395e4f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -182,3 +182,39 @@ jobs: - name: Test coverage run: | codecov + + test-sdist: + runs-on: ${{ matrix.os }}-latest + strategy: + matrix: + os: [ubuntu] + python-version: ["3.14"] + steps: + - uses: actions/checkout@v5 + + - name: Python setup + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + + - name: Setup environment + run: | + python -m pip install --upgrade pip wheel setuptools build + python -m pip list + + - name: Install dependencies + run: | + python -m pip install --group test --group doc + pip list + + - name: Build numpydoc + run: python -m build + + - name: Install numpydoc from source tarball + run: | + python -m pip install --no-binary numpydoc dist/*.tar.gz + pip list + + - name: Run test suite + run: | + pytest -v --pyargs numpydoc From aac1ac6fe15fb284c8ad0a05cd6f3b57f16af7e3 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Tue, 2 Dec 2025 11:33:37 -0800 Subject: [PATCH 2/7] Split build + install, limit to one Python. --- .github/workflows/test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fc395e4f..391ab332 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -211,7 +211,6 @@ jobs: run: python -m build - name: Install numpydoc from source tarball - run: | python -m pip install --no-binary numpydoc dist/*.tar.gz pip list From a496a5dd39272803e2713989b9b3dd481b34c06f Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Tue, 2 Dec 2025 13:06:42 -0800 Subject: [PATCH 3/7] CI,TST: Prevent test file pickup from source dir. --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 391ab332..38bf7e05 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -215,5 +215,8 @@ jobs: pip list - name: Run test suite + # NOTE: Move outside of source directory to prevent any file pickup - + # ensure all tests/tests files are derived from the package *only* run: | + mkdir foo && cd foo pytest -v --pyargs numpydoc From 6298e1d864d781caa6e3cf6f1f6ec599ada8b509 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Wed, 3 Dec 2025 11:43:11 -0800 Subject: [PATCH 4/7] TST: Update tst paths to pkged paths * replace relpath in example_module tst fixture. * Update __main__ rel to install path. * Update importlib.resources.path incantation to a pattern that works on 3.12 and 3.14. * Use cwd instead of requests.root_dir --- numpydoc/tests/hooks/test_utils.py | 2 +- numpydoc/tests/hooks/test_validate_hook.py | 13 +++++-------- numpydoc/tests/test_main.py | 8 ++++++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/numpydoc/tests/hooks/test_utils.py b/numpydoc/tests/hooks/test_utils.py index 7aa11cf3..f0e64b01 100644 --- a/numpydoc/tests/hooks/test_utils.py +++ b/numpydoc/tests/hooks/test_utils.py @@ -30,7 +30,7 @@ def test_find_project_root(tmp_path, request, reason_file, files, expected_reaso for file in files: (tmp_path / file).touch() else: - expected_dir = request.config.rootdir + expected_dir = Path.cwd() root_dir, reason = utils.find_project_root(files if not files else [tmp_path]) assert reason == expected_reason diff --git a/numpydoc/tests/hooks/test_validate_hook.py b/numpydoc/tests/hooks/test_validate_hook.py index 6281ceef..9c8bd044 100644 --- a/numpydoc/tests/hooks/test_validate_hook.py +++ b/numpydoc/tests/hooks/test_validate_hook.py @@ -1,24 +1,21 @@ """Test the numpydoc validate pre-commit hook.""" +import importlib.resources import inspect import re from pathlib import Path import pytest +import numpydoc from numpydoc.hooks.validate_docstrings import run_hook @pytest.fixture def example_module(request): - fullpath = ( - Path(request.config.rootdir) - / "numpydoc" - / "tests" - / "hooks" - / "example_module.py" - ) - return str(fullpath.relative_to(request.config.rootdir)) + with importlib.resources.path(numpydoc, "tests") as fpath: + fullpath = str(fpath / "hooks/example_module.py") + return str(fullpath) @pytest.mark.parametrize("config", [None, "fake_dir"]) diff --git a/numpydoc/tests/test_main.py b/numpydoc/tests/test_main.py index e07e7df2..12a5a086 100644 --- a/numpydoc/tests/test_main.py +++ b/numpydoc/tests/test_main.py @@ -1,3 +1,4 @@ +import importlib.resources import inspect import io import sys @@ -119,12 +120,15 @@ def test_validate_perfect_docstring(): @pytest.mark.parametrize("args", [[], ["--ignore", "SS03"]]) def test_lint(capsys, args): - argv = ["lint", "numpydoc/__main__.py"] + args + with importlib.resources.path(numpydoc, "__main__.py") as fpath: + strpath = str(fpath) + + argv = ["lint", strpath] + args if args: expected = "" expected_status = 0 else: - expected = "numpydoc/__main__.py:1: SS03 Summary does not end with a period" + expected = f"{strpath}:1: SS03 Summary does not end with a period" expected_status = 1 return_status = numpydoc.cli.main(argv) From d9d6b34875bef265e04d42dd2b8be3d5ed2a0790 Mon Sep 17 00:00:00 2001 From: Julien Schueller Date: Tue, 2 Dec 2025 20:14:37 +0100 Subject: [PATCH 5/7] pyproject: include example_module.py Closes #668 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ae6e7b96..6cae975e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -168,7 +168,7 @@ attr = 'numpydoc.__version__' [tool.setuptools.package-data] numpydoc = [ 'tests/test_*.py', - 'tests/hooks/test_*.py', + 'tests/hooks/*.py', 'tests/tinybuild/Makefile', 'tests/tinybuild/index.rst', 'tests/tinybuild/*.py', From 6fb9ce81dc5b916c81fd1c30c5e307304fc3ff1f Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Wed, 3 Dec 2025 12:39:46 -0800 Subject: [PATCH 6/7] Fixup after rebase. --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 38bf7e05..a8145b58 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -211,6 +211,7 @@ jobs: run: python -m build - name: Install numpydoc from source tarball + run: | python -m pip install --no-binary numpydoc dist/*.tar.gz pip list From abebdb886add7192a0217752ec32e22f75fad598 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Wed, 3 Dec 2025 12:47:00 -0800 Subject: [PATCH 7/7] Add note about strange importlib.resource pattern. --- numpydoc/tests/hooks/test_validate_hook.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/numpydoc/tests/hooks/test_validate_hook.py b/numpydoc/tests/hooks/test_validate_hook.py index 9c8bd044..543cd818 100644 --- a/numpydoc/tests/hooks/test_validate_hook.py +++ b/numpydoc/tests/hooks/test_validate_hook.py @@ -13,6 +13,10 @@ @pytest.fixture def example_module(request): + # TODO: When Python3.13 is the minimum version supported version, this + # can be simplified to: + # with importlib.resources.path(numpydoc, "tests/hooks/example_module.py") as fpath: + # fullpath = str(fpath) with importlib.resources.path(numpydoc, "tests") as fpath: fullpath = str(fpath / "hooks/example_module.py") return str(fullpath)