69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
"""BanGUI backend application package.
|
|
|
|
This package exposes the application version based on the project metadata.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from typing import Final
|
|
|
|
import importlib.metadata
|
|
import tomllib
|
|
|
|
PACKAGE_NAME: Final[str] = "bangui-backend"
|
|
|
|
|
|
def _read_pyproject_version() -> str:
|
|
"""Read the project version from ``pyproject.toml``.
|
|
|
|
This is used as a fallback when the package metadata is not available (e.g.
|
|
when running directly from a source checkout without installing the package).
|
|
"""
|
|
|
|
project_root = Path(__file__).resolve().parents[1]
|
|
pyproject_path = project_root / "pyproject.toml"
|
|
if not pyproject_path.exists():
|
|
raise FileNotFoundError(f"pyproject.toml not found at {pyproject_path}")
|
|
|
|
data = tomllib.loads(pyproject_path.read_text(encoding="utf-8"))
|
|
return str(data["project"]["version"])
|
|
|
|
|
|
def _read_docker_version() -> str:
|
|
"""Read the project version from ``Docker/VERSION``.
|
|
|
|
This file is the single source of truth for release scripts and must not be
|
|
out of sync with the frontend and backend versions.
|
|
"""
|
|
|
|
repo_root = Path(__file__).resolve().parents[2]
|
|
version_path = repo_root / "Docker" / "VERSION"
|
|
if not version_path.exists():
|
|
raise FileNotFoundError(f"Docker/VERSION not found at {version_path}")
|
|
|
|
version = version_path.read_text(encoding="utf-8").strip()
|
|
return version.lstrip("v")
|
|
|
|
|
|
def _read_version() -> str:
|
|
"""Return the current package version.
|
|
|
|
Prefer the release artifact in ``Docker/VERSION`` when available so the
|
|
backend version always matches what the release tooling publishes.
|
|
|
|
If that file is missing (e.g. in a production wheel or a local checkout),
|
|
fall back to ``pyproject.toml`` and finally installed package metadata.
|
|
"""
|
|
|
|
try:
|
|
return _read_docker_version()
|
|
except FileNotFoundError:
|
|
try:
|
|
return _read_pyproject_version()
|
|
except FileNotFoundError:
|
|
return importlib.metadata.version(PACKAGE_NAME)
|
|
|
|
|
|
__version__ = _read_version()
|