0ef5fcb1c5
Security / Dependency audit (pip-audit) (push) Has been cancelled
Security / CodeQL (javascript-typescript) (push) Has been cancelled
Security / CodeQL (python) (push) Has been cancelled
Security / Secret scan (gitleaks) (push) Has been cancelled
rust / test (ubuntu) (push) Has been cancelled
rust / simulator e2e (macos-latest) (push) Has been cancelled
rust / simulator e2e (ubuntu-latest) (push) Has been cancelled
rust / simulator e2e (windows-latest) (push) Has been cancelled
rust / wheels (aarch64-apple-darwin) (push) Has been cancelled
rust / wheels (x86_64-unknown-linux-gnu) (push) Has been cancelled
rust / wheels (x86_64-apple-darwin) (push) Has been cancelled
rust / audit (push) Has been cancelled
rust / parity (nightly, allowed to fail during Phase 0) (push) Has been cancelled
CI / commitlint (push) Has been skipped
Dev Containers / validate (.devcontainer/devcontainer.json, default) (push) Failing after 0s
Dev Containers / validate (.devcontainer/memory-stack/devcontainer.json, memory-stack) (push) Failing after 0s
Dev Containers / validate-worktree (push) Failing after 0s
CI / changes (push) Failing after 4s
Deploy Documentation / validate (push) Has been skipped
Deploy Documentation / deploy (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, claude) (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, codex) (push) Failing after 1s
Install Native E2E / install-native (ubuntu-latest) (push) Failing after 1s
OpenCode Plugin / typecheck + build + test (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, copilot) (push) Failing after 1s
Release Please / release-please (push) Failing after 1s
Wrap E2E / docker-wrap-e2e (push) Failing after 1s
Wrap Native E2E / wrap-native (ubuntu-latest) (push) Failing after 1s
Init E2E / docker-init-e2e (push) Failing after 4s
Merge Conflicts / merge-conflicts (push) Failing after 4s
CI / lint (push) Has been cancelled
CI / build-wheel (push) Has been cancelled
CI / build-wheel-windows (push) Has been cancelled
CI / prefetch-model (push) Has been cancelled
CI / test-dashboard-ui (push) Has been cancelled
CI / test (1) (push) Has been cancelled
CI / test (2) (push) Has been cancelled
CI / test (3) (push) Has been cancelled
CI / test (4) (push) Has been cancelled
CI / test-extras (push) Has been cancelled
CI / test-agno (push) Has been cancelled
CI / build (push) Has been cancelled
CI / workflow-validation (push) Has been cancelled
CI / docker-native-e2e (push) Has been cancelled
CI / windows-native-wrapper (push) Has been cancelled
CI / macos-native-wrapper (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / promote-latest (push) Has been cancelled
Init Native E2E / init-native (macos-latest, claude) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, codex) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, copilot) (push) Has been cancelled
Install Native E2E / install-native (macos-latest) (push) Has been cancelled
Wrap Native E2E / wrap-native (macos-latest) (push) Has been cancelled
123 lines
3.6 KiB
Python
123 lines
3.6 KiB
Python
"""Package version metadata."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import importlib
|
|
import os
|
|
import re
|
|
from importlib.metadata import PackageNotFoundError, version
|
|
from pathlib import Path
|
|
|
|
UNKNOWN_VERSION = "unknown"
|
|
VERSION_ENV_VARS = ("HEADROOM_VERSION", "HEADROOM_BUILD_VERSION")
|
|
RELEASE_VERSION_RE = re.compile(r"^v?\d+\.\d+\.\d+$")
|
|
|
|
|
|
def _clean_version(value: object) -> str | None:
|
|
"""Return a non-empty version string, if one is present."""
|
|
if not isinstance(value, str):
|
|
return None
|
|
stripped = value.strip()
|
|
return stripped or None
|
|
|
|
|
|
def is_release_version(value: object) -> bool:
|
|
"""Return whether a value is a comparable release version."""
|
|
cleaned = _clean_version(value)
|
|
return bool(cleaned and RELEASE_VERSION_RE.fullmatch(cleaned))
|
|
|
|
|
|
def normalize_release_version(value: object) -> str | None:
|
|
"""Return a comparable release version without a display prefix."""
|
|
cleaned = _clean_version(value)
|
|
if cleaned is None or RELEASE_VERSION_RE.fullmatch(cleaned) is None:
|
|
return None
|
|
return cleaned[1:] if cleaned.startswith("v") else cleaned
|
|
|
|
|
|
def format_version_label(value: object) -> str:
|
|
"""Return a user-facing version label without prefixing source labels."""
|
|
cleaned = _clean_version(value) or UNKNOWN_VERSION
|
|
if is_release_version(cleaned) and not cleaned.startswith("v"):
|
|
return f"v{cleaned}"
|
|
return cleaned
|
|
|
|
|
|
def _env_version() -> str | None:
|
|
"""Return an explicit runtime/build version override."""
|
|
for name in VERSION_ENV_VARS:
|
|
value = _clean_version(os.environ.get(name))
|
|
if value:
|
|
return value
|
|
return None
|
|
|
|
|
|
def _packaged_build_version() -> str | None:
|
|
"""Return Docker/image build metadata baked into the installed package."""
|
|
try:
|
|
build_info = importlib.import_module("headroom._build_info")
|
|
except ModuleNotFoundError:
|
|
return None
|
|
return _clean_version(getattr(build_info, "BUILD_VERSION", None))
|
|
|
|
|
|
def _source_root() -> Path | None:
|
|
"""Return the repository root when imported from a git checkout."""
|
|
root = Path(__file__).resolve().parents[1]
|
|
if (root / ".git").exists() and (root / "pyproject.toml").exists():
|
|
return root
|
|
return None
|
|
|
|
|
|
def _source_tree_version(root: Path) -> str | None:
|
|
"""Compute the version release automation would assign to this checkout."""
|
|
try:
|
|
from headroom.release_version import (
|
|
compute_release_version,
|
|
determine_bump_level,
|
|
get_canonical_version,
|
|
list_release_commits,
|
|
list_release_tags,
|
|
)
|
|
|
|
tags = list_release_tags(root)
|
|
previous_tag = compute_release_version(
|
|
canonical_version=get_canonical_version(root),
|
|
level="patch",
|
|
tags=tags,
|
|
).previous_tag
|
|
commits = list_release_commits(root, previous_tag)
|
|
level = determine_bump_level(commits)
|
|
return compute_release_version(
|
|
canonical_version=get_canonical_version(root),
|
|
level=level,
|
|
tags=tags,
|
|
).version
|
|
except Exception:
|
|
return None
|
|
|
|
|
|
def get_version() -> str:
|
|
"""Return Headroom's runtime version."""
|
|
env_version = _env_version()
|
|
if env_version:
|
|
return env_version
|
|
|
|
root = _source_root()
|
|
if root is not None:
|
|
source_version = _source_tree_version(root)
|
|
if source_version:
|
|
return source_version
|
|
|
|
build_version = _packaged_build_version()
|
|
if build_version:
|
|
return build_version
|
|
|
|
try:
|
|
return version("headroom-ai")
|
|
except PackageNotFoundError:
|
|
return UNKNOWN_VERSION
|
|
|
|
|
|
__version__ = get_version()
|