Skip to content

Commit 9510d48

Browse files
refactor: convert wildcard re-exports to explicit imports for griffe compatibility
Convert all wildcard imports in public API re-export modules to explicit 'from X import Y as Y' style imports. This allows static analysis tools like griffe to properly detect re-exported symbols and verify API stability. Changes: - Convert wildcard imports to explicit re-exports in: * src/setuptools_scm/version.py (26 symbols) * src/setuptools_scm/git.py (14 symbols) * src/setuptools_scm/hg.py (6 symbols) * src/setuptools_scm/discover.py (4 symbols) * src/setuptools_scm/fallbacks.py (3 symbols) * src/setuptools_scm/integration.py (2 symbols) - Add missing re-export modules: * src/setuptools_scm/scm_workdir.py (Workdir, get_latest_file_mtime, log) * src/setuptools_scm/hg_git.py (GitWorkdirHgClient, log) - Add griffe-public-wildcard-imports extension to: * pyproject.toml (test and docs dependency groups) * mkdocs.yml (mkdocstrings configuration) - Create check_api.py script: * Local script to run griffe API checks with proper configuration * Includes vcs-versioning source path for resolving re-exports * Enables griffe-public-wildcard-imports extension - Update .github/workflows/api-check.yml to use check_api.py - Fix test import: use vcs_versioning._version_schemes.mismatches directly All re-exports maintain 100% backward compatibility. The griffe API check now passes cleanly (exit code 0).
1 parent 1ac9328 commit 9510d48

File tree

14 files changed

+234
-18
lines changed

14 files changed

+234
-18
lines changed

.github/workflows/api-check.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ jobs:
4545
- name: Check API stability against latest release
4646
run: |
4747
echo "Comparing current code against tag: ${{ steps.latest-tag.outputs.tag }}"
48-
uv run griffe check setuptools_scm -ssrc --verbose --against ${{ steps.latest-tag.outputs.tag }}
48+
# Use local check_api.py script which includes griffe-public-wildcard-imports extension
49+
uv run python check_api.py --against ${{ steps.latest-tag.outputs.tag }}

check_api.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Local script to check API stability using griffe.
4+
5+
Usage:
6+
uv run check_api.py [--against TAG]
7+
8+
This script runs griffe with the public-wildcard-imports extension enabled
9+
to properly detect re-exported symbols from vcs-versioning.
10+
"""
11+
12+
from __future__ import annotations
13+
14+
import subprocess
15+
import sys
16+
17+
from pathlib import Path
18+
19+
20+
def main() -> int:
21+
"""Run griffe API check with proper configuration."""
22+
# Parse arguments
23+
against = "v9.2.1" # Default baseline
24+
if len(sys.argv) > 1:
25+
if sys.argv[1] == "--against" and len(sys.argv) > 2:
26+
against = sys.argv[2]
27+
else:
28+
against = sys.argv[1]
29+
30+
# Ensure we're in the right directory
31+
repo_root = Path(__file__).parent
32+
33+
# Build griffe command
34+
cmd = [
35+
"griffe",
36+
"check",
37+
"setuptools_scm",
38+
"-ssrc",
39+
"-snextgen/vcs-versioning/src",
40+
"--verbose",
41+
"--extensions",
42+
"griffe_public_wildcard_imports",
43+
"--against",
44+
against,
45+
]
46+
47+
result = subprocess.run(cmd, cwd=repo_root)
48+
49+
return result.returncode
50+
51+
52+
if __name__ == "__main__":
53+
sys.exit(main())

mkdocs.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ plugins:
3131
default_handler: python
3232
handlers:
3333
python:
34-
paths: [ src ]
35-
34+
paths: [ src, nextgen/vcs-versioning/src ]
35+
import:
36+
- https://docs.python.org/3/objects.inv
3637
options:
3738
separate_signature: true
3839
show_signature_annotations: true
3940
allow_inspection: true
4041
show_root_heading: true
42+
extensions:
43+
- griffe_public_wildcard_imports

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ docs = [
6565
"mkdocs-material",
6666
"mkdocstrings[python]",
6767
"pygments",
68+
"griffe-public-wildcard-imports",
6869
]
6970
test = [
7071
"pip",
@@ -78,6 +79,7 @@ test = [
7879
'typing-extensions; python_version < "3.11"',
7980
"wheel",
8081
"griffe",
82+
"griffe-public-wildcard-imports",
8183
"flake8",
8284
]
8385

src/setuptools_scm/discover.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1-
# ruff: noqa: F405
21
"""Re-export discover from vcs_versioning for backward compatibility"""
32

43
from __future__ import annotations
54

6-
from vcs_versioning._discover import * # noqa: F403
5+
from vcs_versioning._discover import (
6+
iter_matching_entrypoints as iter_matching_entrypoints,
7+
)
8+
from vcs_versioning._discover import log as log
9+
from vcs_versioning._discover import match_entrypoint as match_entrypoint
10+
from vcs_versioning._discover import walk_potential_roots as walk_potential_roots
711

812
__all__ = [
13+
# Functions
914
"iter_matching_entrypoints",
15+
"log",
1016
"match_entrypoint",
1117
"walk_potential_roots",
1218
]

src/setuptools_scm/fallbacks.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
# ruff: noqa: F405
21
"""Re-export fallbacks from vcs_versioning for backward compatibility"""
32

43
from __future__ import annotations
54

6-
from vcs_versioning._fallbacks import * # noqa: F403
5+
from vcs_versioning._fallbacks import fallback_version as fallback_version
6+
from vcs_versioning._fallbacks import log as log
7+
from vcs_versioning._fallbacks import parse_pkginfo as parse_pkginfo
78

89
__all__ = [
10+
# Functions
911
"fallback_version",
12+
"log",
1013
"parse_pkginfo",
1114
]

src/setuptools_scm/git.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# ruff: noqa: F405
21
"""Re-export git backend from vcs_versioning for backward compatibility
32
43
NOTE: The git backend is private in vcs_versioning and accessed via entry points.
@@ -7,11 +6,43 @@
76

87
from __future__ import annotations
98

10-
from vcs_versioning._backends._git import * # noqa: F403
9+
from vcs_versioning._backends._git import DEFAULT_DESCRIBE as DEFAULT_DESCRIBE
10+
from vcs_versioning._backends._git import DESCRIBE_UNSUPPORTED as DESCRIBE_UNSUPPORTED
11+
from vcs_versioning._backends._git import REF_TAG_RE as REF_TAG_RE
12+
from vcs_versioning._backends._git import GitPreParse as GitPreParse
13+
from vcs_versioning._backends._git import GitWorkdir as GitWorkdir
14+
from vcs_versioning._backends._git import archival_to_version as archival_to_version
15+
from vcs_versioning._backends._git import (
16+
fail_on_missing_submodules as fail_on_missing_submodules,
17+
)
18+
from vcs_versioning._backends._git import fail_on_shallow as fail_on_shallow
19+
from vcs_versioning._backends._git import fetch_on_shallow as fetch_on_shallow
20+
from vcs_versioning._backends._git import get_working_directory as get_working_directory
21+
from vcs_versioning._backends._git import log as log
22+
from vcs_versioning._backends._git import parse as parse
23+
from vcs_versioning._backends._git import parse_archival as parse_archival
24+
from vcs_versioning._backends._git import run_git as run_git
25+
from vcs_versioning._backends._git import version_from_describe as version_from_describe
26+
from vcs_versioning._backends._git import warn_on_shallow as warn_on_shallow
1127

1228
__all__ = [
29+
# Constants
30+
"DEFAULT_DESCRIBE",
31+
"DESCRIBE_UNSUPPORTED",
32+
"REF_TAG_RE",
33+
# Classes
1334
"GitPreParse",
1435
"GitWorkdir",
36+
# Functions
37+
"archival_to_version",
38+
"fail_on_missing_submodules",
39+
"fail_on_shallow",
40+
"fetch_on_shallow",
41+
"get_working_directory",
42+
"log",
1543
"parse",
1644
"parse_archival",
45+
"run_git",
46+
"version_from_describe",
47+
"warn_on_shallow",
1748
]

src/setuptools_scm/hg.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# ruff: noqa: F405
21
"""Re-export hg backend from vcs_versioning for backward compatibility
32
43
NOTE: The hg backend is private in vcs_versioning and accessed via entry points.
@@ -7,10 +6,20 @@
76

87
from __future__ import annotations
98

10-
from vcs_versioning._backends._hg import * # noqa: F403
9+
from vcs_versioning._backends._hg import HgWorkdir as HgWorkdir
10+
from vcs_versioning._backends._hg import archival_to_version as archival_to_version
11+
from vcs_versioning._backends._hg import log as log
12+
from vcs_versioning._backends._hg import parse as parse
13+
from vcs_versioning._backends._hg import parse_archival as parse_archival
14+
from vcs_versioning._backends._hg import run_hg as run_hg
1115

1216
__all__ = [
17+
# Classes
1318
"HgWorkdir",
19+
# Functions
20+
"archival_to_version",
21+
"log",
1422
"parse",
1523
"parse_archival",
24+
"run_hg",
1625
]

src/setuptools_scm/hg_git.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""Re-export hg_git from vcs_versioning for backward compatibility
2+
3+
NOTE: The hg_git module is private in vcs_versioning.
4+
This module provides backward compatibility for code that imported from setuptools_scm.hg_git
5+
"""
6+
7+
from __future__ import annotations
8+
9+
from vcs_versioning._backends._hg_git import GitWorkdirHgClient as GitWorkdirHgClient
10+
from vcs_versioning._backends._hg_git import log as log
11+
12+
__all__ = [
13+
# Classes
14+
"GitWorkdirHgClient",
15+
"log",
16+
]

src/setuptools_scm/integration.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
# ruff: noqa: F405
21
"""Re-export integration from vcs_versioning for backward compatibility"""
32

43
from __future__ import annotations
54

6-
from vcs_versioning._integration import * # noqa: F403
5+
from vcs_versioning._integration import data_from_mime as data_from_mime
6+
from vcs_versioning._integration import log as log
77

88
__all__ = [
9+
# Functions
910
"data_from_mime",
11+
"log",
1012
]

0 commit comments

Comments
 (0)