mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2026-02-24 01:46:21 +00:00
fix: Adapt versioning scheme to Home Assistant and switch to uv (#896)
Some checks are pending
Bump Version / Bump Version Workflow (push) Waiting to run
docker-build / platform-excludes (push) Waiting to run
docker-build / build (push) Blocked by required conditions
docker-build / merge (push) Blocked by required conditions
pre-commit / pre-commit (push) Waiting to run
Run Pytest on Pull Request / test (push) Waiting to run
Some checks are pending
Bump Version / Bump Version Workflow (push) Waiting to run
docker-build / platform-excludes (push) Waiting to run
docker-build / build (push) Blocked by required conditions
docker-build / merge (push) Blocked by required conditions
pre-commit / pre-commit (push) Waiting to run
Run Pytest on Pull Request / test (push) Waiting to run
Home Assistant expects versioning always increases numbers. Add a date component to the development version to comply with this expectation. The scheme is now 0.0.0.dev<date><hash>. Use uv for creating and managing the virtual environment for developement. This enourmously speeds up dependency updates. For this change dependency requirements are now solely handled in pyproject.toml. requirements.tx and requirements-dev.txt are deleted. Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
This commit is contained in:
@@ -24,7 +24,7 @@ from xprocess import ProcessStarter, XProcess
|
||||
|
||||
from akkudoktoreos.config.config import ConfigEOS
|
||||
from akkudoktoreos.core.coreabc import get_config, get_prediction, singletons_init
|
||||
from akkudoktoreos.core.version import _version_hash, version
|
||||
from akkudoktoreos.core.version import _version_date_hash, version
|
||||
from akkudoktoreos.server.server import get_default_host
|
||||
|
||||
# -----------------------------------------------
|
||||
@@ -510,26 +510,41 @@ def server_base(
|
||||
if extra_env:
|
||||
env.update(extra_env)
|
||||
|
||||
# assure server to be installed
|
||||
try:
|
||||
project_dir = Path(__file__).parent.parent
|
||||
subprocess.run(
|
||||
[sys.executable, "-c", "import", "akkudoktoreos.server.eos"],
|
||||
check=True,
|
||||
env=env,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
cwd=project_dir,
|
||||
)
|
||||
except subprocess.CalledProcessError:
|
||||
subprocess.run(
|
||||
[sys.executable, "-m", "pip", "install", "-e", str(project_dir)],
|
||||
env=env,
|
||||
check=True,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
cwd=project_dir,
|
||||
)
|
||||
project_dir = Path(__file__).parent.parent
|
||||
|
||||
@staticmethod
|
||||
def _ensure_package(env: dict, project_dir: Path) -> None:
|
||||
"""Ensure 'akkudoktoreos' is importable in this Python environment."""
|
||||
try:
|
||||
subprocess.run(
|
||||
[sys.executable, "-c", "import akkudoktoreos.server.eos"],
|
||||
check=True,
|
||||
env=env,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
cwd=project_dir,
|
||||
)
|
||||
except subprocess.CalledProcessError:
|
||||
# If inside a normal venv or uv-managed environment, install in place
|
||||
uv_root = os.getenv("UV_VENV_ROOT") # set by uv if active
|
||||
venv_active = hasattr(sys, "real_prefix") or sys.prefix != sys.base_prefix
|
||||
if uv_root or venv_active:
|
||||
print("Package not found, installing in current environment...")
|
||||
subprocess.run(
|
||||
[sys.executable, "-m", "pip", "install", "-e", str(project_dir)],
|
||||
check=True,
|
||||
env=env,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
cwd=project_dir,
|
||||
)
|
||||
else:
|
||||
raise RuntimeError(
|
||||
"Cannot import 'akkudoktoreos.server.eos' in the system Python. "
|
||||
"Activate a virtual environment first."
|
||||
)
|
||||
|
||||
_ensure_package(env, project_dir)
|
||||
|
||||
# Set command to start server process
|
||||
args = [
|
||||
@@ -644,7 +659,7 @@ def version_and_hash() -> Generator[dict[str, Optional[str]], None, None]:
|
||||
Runs once per test session.
|
||||
"""
|
||||
info = version()
|
||||
info["hash_current"] = _version_hash()
|
||||
_, info["hash_current"] = _version_date_hash()
|
||||
|
||||
yield info
|
||||
|
||||
|
||||
@@ -14,10 +14,11 @@ from akkudoktoreos.core.version import (
|
||||
EXCLUDED_FILES,
|
||||
HashConfig,
|
||||
_version_calculate,
|
||||
_version_hash,
|
||||
_version_date_hash,
|
||||
collect_files,
|
||||
hash_files,
|
||||
)
|
||||
from akkudoktoreos.utils.datetimeutil import to_datetime
|
||||
|
||||
DIR_PROJECT_ROOT = Path(__file__).parent.parent
|
||||
GET_VERSION_SCRIPT = DIR_PROJECT_ROOT / "scripts" / "get_version.py"
|
||||
@@ -127,7 +128,7 @@ def write_file(path: Path, content: str):
|
||||
|
||||
# -- Test version calculation ---
|
||||
|
||||
def test_version_hash() -> None:
|
||||
def test_version_date_hash() -> None:
|
||||
"""Test which files are used for version hash calculation."""
|
||||
|
||||
watched_paths = [DIR_PACKAGE_ROOT]
|
||||
@@ -196,22 +197,26 @@ def test_version_non_dev(monkeypatch):
|
||||
|
||||
def test_version_dev_precision_8(monkeypatch):
|
||||
"""Test that a dev version appends exactly 8 digits derived from the hash."""
|
||||
fake_hash = "abcdef1234567890" # deterministic fake digest
|
||||
fake_hash = "abcdef1234567890"
|
||||
fake_date = "2025-02-22T09:28:22Z"
|
||||
fake_date_hash = (to_datetime(fake_date), fake_hash) # deterministic fake digest
|
||||
|
||||
monkeypatch.setattr("akkudoktoreos.core.version._version_hash", lambda: fake_hash)
|
||||
monkeypatch.setattr("akkudoktoreos.core.version._version_date_hash", lambda: fake_date_hash)
|
||||
monkeypatch.setattr("akkudoktoreos.core.version.VERSION_BASE", "0.2.0.dev")
|
||||
monkeypatch.setattr("akkudoktoreos.core.version.VERSION_DEV_PRECISION", 8)
|
||||
monkeypatch.setattr("akkudoktoreos.core.version.VERSION_DEV_HASH_PRECISION", 8)
|
||||
|
||||
result = _version_calculate()
|
||||
|
||||
# Compute expected suffix using the same logic as _version_calculate
|
||||
hash_value = int(fake_hash, 16)
|
||||
expected_digits = str(hash_value % (10 ** 8)).zfill(8)
|
||||
expected_hash_digits = str(hash_value % (10 ** 8)).zfill(8)
|
||||
|
||||
expected = f"0.2.0.dev{expected_digits}"
|
||||
expected_date_digits = to_datetime(fake_date, as_string="YYMMDDHH")
|
||||
|
||||
expected = f"0.2.0.dev{expected_date_digits}{expected_hash_digits}"
|
||||
|
||||
assert result == expected
|
||||
assert len(expected_digits) == 8
|
||||
assert len(expected_hash_digits) == 8
|
||||
assert result.startswith("0.2.0.dev")
|
||||
assert result == expected
|
||||
|
||||
@@ -219,21 +224,25 @@ def test_version_dev_precision_8(monkeypatch):
|
||||
def test_version_dev_precision_8_different_hash(monkeypatch):
|
||||
"""A different hash must produce a different 8-digit suffix."""
|
||||
fake_hash = "1234abcd9999ffff"
|
||||
fake_date = "2025-02-22T09:28:22Z"
|
||||
fake_date_hash = (to_datetime(fake_date), fake_hash) # deterministic fake digest
|
||||
|
||||
monkeypatch.setattr("akkudoktoreos.core.version._version_hash", lambda: fake_hash)
|
||||
monkeypatch.setattr("akkudoktoreos.core.version._version_date_hash", lambda: fake_date_hash)
|
||||
monkeypatch.setattr("akkudoktoreos.core.version.VERSION_BASE", "0.2.0.dev")
|
||||
monkeypatch.setattr("akkudoktoreos.core.version.VERSION_DEV_PRECISION", 8)
|
||||
monkeypatch.setattr("akkudoktoreos.core.version.VERSION_DEV_HASH_PRECISION", 8)
|
||||
|
||||
result = _version_calculate()
|
||||
|
||||
# Compute expected suffix using the same logic as _version_calculate
|
||||
hash_value = int(fake_hash, 16)
|
||||
expected_digits = str(hash_value % (10 ** 8)).zfill(8)
|
||||
expected_hash_digits = str(hash_value % (10 ** 8)).zfill(8)
|
||||
|
||||
expected = f"0.2.0.dev{expected_digits}"
|
||||
expected_date_digits = to_datetime(fake_date, as_string="YYMMDDHH")
|
||||
|
||||
expected = f"0.2.0.dev{expected_date_digits}{expected_hash_digits}"
|
||||
|
||||
assert result == expected
|
||||
assert len(expected_digits) == 8
|
||||
assert len(expected_hash_digits) == 8
|
||||
assert result.startswith("0.2.0.dev")
|
||||
assert result == expected
|
||||
|
||||
|
||||
Reference in New Issue
Block a user