Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ jobs:
- name: Install docs (and dev) dependencies
run: |
uv sync --extra docs

- name: Generate API reference pages (real files)
run: uv run python scripts/generate_api_docs.py

- name: Build site
run: uv run mkdocs build --strict
Expand Down
30 changes: 15 additions & 15 deletions docs/_scripts/gen_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,27 @@
import mkdocs_gen_files

# -------------------------------------------------------------------
# Konfiguration
# Falls du den Namen kennst, trag ihn hier ein; None => Auto-Detect.
PACKAGE: str | None = "fastflowtransform" # <- bei Bedarf anpassen oder auf None setzen
# Configuration
# If you already know the package name, set it here; None => auto-detect.
PACKAGE: str | None = "fastflowtransform" # adjust as needed or set to None
SRC_DIR = Path("src")
# -------------------------------------------------------------------


def detect_package() -> tuple[str, Path]:
"""
Liefert (package_name, package_root_path).
Prüft zuerst src-Layout (src/<pkg>/__init__.py), dann Flat-Layout (<pkg>/__init__.py).
Returns (package_name, package_root_path).
Checks src layout first (src/<pkg>/__init__.py), then flat layout (<pkg>/__init__.py).
"""
candidates: list[tuple[str, str, Path]] = []

# src-Layout
# src layout
if SRC_DIR.exists():
for p in SRC_DIR.iterdir():
if p.is_dir() and (p / "__init__.py").exists():
candidates.append(("src", p.name, p))

# Flat-Layout (im Repo-Root)
# Flat layout (at the repository root)
root = Path(".")
ignore = {
"docs",
Expand All @@ -48,43 +48,43 @@ def detect_package() -> tuple[str, Path]:
if name == PACKAGE:
return name, path
raise AssertionError(
f'Paket "{PACKAGE}" nicht gefunden. Erwartet z. B. src/{PACKAGE}/ oder {PACKAGE}/ mit __init__.py'
f'Package "{PACKAGE}" not found. Expected e.g. src/{PACKAGE}/ or {PACKAGE}/ with __init__.py'
)

unique = {(name, str(path)) for _, name, path in candidates}
if not unique:
raise AssertionError(
"Kein Paket gefunden. Lege src/<paket>/__init__.py an oder setze PACKAGE im Skript."
"No package found. Create src/<package>/__init__.py or set PACKAGE in the script."
)
if len(unique) > 1:
formatted = "\n".join(f"- {name} @ {path}" for name, path in sorted(unique))
raise AssertionError(
f"Mehrere mögliche Pakete gefunden:\n{formatted}\nSetze PACKAGE explizit im Skript."
f"Multiple possible packages found:\n{formatted}\nSet PACKAGE explicitly in the script."
)
name, path_str = next(iter(unique))
return name, Path(path_str)


package, pkg_root = detect_package()
print(f"[gen_api] Paket erkannt: {package} | Pfad: {pkg_root}")
print(f"[gen_api] Detected package: {package} | Path: {pkg_root}")

generated_files: list[tuple[str, str]] = [] # (module, doc_file)

for path in sorted(pkg_root.rglob("*.py")):
# Rausfiltern
# Filter out unwanted cache directories
if any(part in {"__pycache__", ".pytest_cache"} for part in path.parts):
continue

rel = path.with_suffix("").relative_to(pkg_root)
parts = list(rel.parts)

# Modulname bestimmen
# Determine module name
if path.name == "__init__.py":
module = package + ("" if not parts[:-1] else "." + ".".join(parts[:-1]))
else:
module = package + "." + ".".join(parts)

# Zielpfad (mkdocs_gen_files.open legt Ordner an)
# Target path (mkdocs_gen_files.open creates directories)
doc_file = f"reference/{module.replace('.', '/')}.md"
generated_files.append((module, doc_file))

Expand All @@ -96,7 +96,7 @@ def detect_package() -> tuple[str, Path]:
f.write(" filters:\n")
f.write(' - "!^_"\n')

# Index-Seite erzeugen
# Generate index page
index_path = "reference/index.md"
with mkdocs_gen_files.open(index_path, "w") as f:
f.write("# API Reference\n\n")
Expand Down