build: subpackages implementation (#164)

* migrate to hatch

* reorder tests

* generic fixtures

* straight forward conftest

* fix docs generation

* fix tox environments

* reformat tomls

* cleanup pyproject

* some play with renaming

* move root conftest into pytest plugins

* fix setup script

* move fixtures to __init__.py

* remove duplicate fixtures

* disable pylint warning

* simplify configuration fixture

* remove empty conftest

* remove crap from local pyprojects
This commit is contained in:
2026-07-17 14:00:20 +03:00
committed by GitHub
parent f12278a31d
commit 700893ecac
815 changed files with 833 additions and 638 deletions
+51
View File
@@ -0,0 +1,51 @@
from pathlib import Path
from ahriman.core.utils import walk
def _test_path(source_root: Path, source_file: Path) -> Path:
"""
generate expected test path for source file
Args:
source_root(Path): package source root
source_file(Path): source file
Returns:
Path: expected test file path
"""
relative_path = source_file.relative_to(source_root)
match relative_path.parts:
# some workaround for well known files
case ("ahriman", "application", "handlers", *_, source_name) if source_name != "handler.py":
return relative_path.parent / f"test_handler_{source_name}"
case ("ahriman", "web", "views", "api", source_name):
return relative_path.parent / f"test_view_api_{source_name}"
case ("ahriman", "web", "views", version, api, source_name) if version in ("v1", "v2"):
return relative_path.parent / f"test_view_{version}_{api}_{source_name}"
case ("ahriman", "web", "views", *_, source_name):
if source_name.endswith("_guard.py"):
return relative_path.parent / f"test_{source_name}"
else:
return relative_path.parent / f"test_view_{source_name}"
case _:
return relative_path.parent / f"test_{source_file.name}"
def test_test_coverage() -> None:
"""
must have test files for each source file
"""
package_roots = [
Path("ahriman-core"),
Path("ahriman-triggers"),
Path("ahriman-web"),
]
for package_root in package_roots:
source_root = package_root / "src"
for source_file in filter(lambda fn: fn.suffix == ".py" and fn.name != "__init__.py", walk(source_root)):
test_file = package_root / "tests" / _test_path(source_root, source_file)
assert test_file.is_file(), test_file