* feat(infra): backend cookiecutter template with fastapi tortoise * feat(infra): cli cookiecutter template with typer entry point * feat(infra): fullstack cookiecutter template with sveltekit frontend * test(infra): cookiecutter template tests and render fixes * style(infra): ruff cleanup for cookiecutter template tests * style(infra): ruff format cookiecutter template tests * fix(infra): handle use_db no use_auth no in cookiecutter --------- Co-authored-by: opencode-agent <agent@opencode.local>
60 lines
No EOL
2.1 KiB
Python
60 lines
No EOL
2.1 KiB
Python
"""Post-generation hook for the backend cookiecutter template.
|
|
|
|
Removes files that are conditional on the ``use_auth`` and ``use_db`` flags
|
|
so the rendered tree only contains the parts the user asked for.
|
|
|
|
- ``use_auth == "no"`` -> drop ``routes/auth.py``, ``services/auth_service.py``,
|
|
``models/user.py`` (hashed_password), and strip the auth dependency wiring.
|
|
- ``use_db == "no"`` -> drop ``db/``, ``migrations/``, ``connection.py``.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import shutil
|
|
from pathlib import Path
|
|
|
|
PROJECT_DIR = Path.cwd()
|
|
|
|
|
|
def _remove(path: str) -> None:
|
|
"""Remove a file or directory relative to the generated project root."""
|
|
p = PROJECT_DIR / path
|
|
if p.is_dir():
|
|
shutil.rmtree(p, ignore_errors=True)
|
|
elif p.exists():
|
|
p.unlink()
|
|
|
|
|
|
def main() -> None:
|
|
use_auth = "{{ cookiecutter.use_auth }}"
|
|
use_db = "{{ cookiecutter.use_db }}"
|
|
pkg = "{{ cookiecutter.project_name }}"
|
|
|
|
if use_auth == "no":
|
|
_remove(f"src/{pkg}/api/v1/routes/auth.py")
|
|
_remove(f"src/{pkg}/services/auth_service.py")
|
|
_remove(f"tests/test_auth.py")
|
|
|
|
if use_db == "no":
|
|
# db is the root cause for the broken-conditional findings: files
|
|
# with unconditional ``from ...db.models.user import User`` must be
|
|
# stripped together with db/, otherwise the generated project
|
|
# fails to import (ImportError/NameError on startup).
|
|
_remove(f"src/{pkg}/db")
|
|
_remove("migrations")
|
|
_remove(f"src/{pkg}/services/user_service.py")
|
|
_remove(f"src/{pkg}/api/v1/routes/users.py")
|
|
_remove(f"src/{pkg}/api/v1/dependencies.py")
|
|
_remove(f"src/{pkg}/schemas/user.py")
|
|
_remove(f"tests/unit/test_user.py")
|
|
_remove(f"tests/unit/test_user_service.py")
|
|
_remove(f"tests/api/test_users.py")
|
|
if use_auth == "yes":
|
|
# auth_service imports User; strip it and its wiring too.
|
|
_remove(f"src/{pkg}/api/v1/routes/auth.py")
|
|
_remove(f"src/{pkg}/services/auth_service.py")
|
|
_remove(f"tests/test_auth.py")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |