mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-05 06:08:59 +00:00
ci: pin the HA harness and stop tests from editing sys.path
Два независимых хвоста из разбора #389, оба про то, что «зелёный» значит не то, что читается. #392. Оба места, где поднимается HA-харнесс, ставили зависимости без единой версии. Python при этом закреплён на 3.13, а pytest-homeassistant-custom- component с 0.13.348 требует 3.14 — резолвер молча уезжал на 0.13.316, а та тянет homeassistant 2026.2.3. Интеграция полгода проверялась против февральского HA, и состав окружения мог измениться без нашего коммита. Версии закреплены в tests_backend/requirements.txt ровно те, что резолвились 30.08; шаг печатает установленное в лог. Это остановка дрейфа, а не обновление: переход на 3.14 и свежий phcc — отдельная задача с отдельным измерением. #393. test_trails.py клал каталог пакета в sys.path при коллекции — на всю сессию, включая HA-харнесс. Модули интеграции становились импортируемыми ещё и как модули верхнего уровня, то есть один файл мог оказаться в sys.modules дважды. Вставка при этом не работала ни на что: TrailBook берётся чтением текста и exec среза, а не импортом. Убрана вместе с мёртвым spec. Гейт статический, по исходникам: он ловит намерение, а рантайм поймал бы последствие и только при сегодняшнем порядке тестов. Issue: #392 User-Visible: no
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
# Зависимости HA-харнесса, закреплённые точно (issue #392).
|
||||
#
|
||||
# Было так: `pip install pytest voluptuous pytest-homeassistant-custom-component
|
||||
# home-assistant-frontend` без единой версии. Резолвер молча выбирал набор сам,
|
||||
# и выбор зависел не от нашего коммита, а от того, что в этот день лежит на
|
||||
# PyPI. По SHA нельзя было сказать, чем его проверяли.
|
||||
#
|
||||
# Что здесь записано — ровно то, что резолвилось на 30.08.2026, снятое из лога
|
||||
# шага `pip install`. Цель этого файла не «взять новое», а «перестать дрейфовать».
|
||||
#
|
||||
# Знать про эти версии нужно две вещи.
|
||||
#
|
||||
# 1. `pytest-homeassistant-custom-component` начиная с 0.13.348 (25.07.2026)
|
||||
# требует Python >= 3.14, а job стоит на 3.13. Поэтому резолвер и уезжал на
|
||||
# 0.13.316 — последнюю, которая ставится на 3.13.
|
||||
# 2. Она тянет `homeassistant==2026.2.3`, то есть февральский. Харнесс проверяет
|
||||
# интеграцию против HA, которого у пользователей давно нет. Это известный
|
||||
# долг, а не оплошность: снимать его надо переходом на 3.14 и свежий phcc,
|
||||
# и это отдельная задача с отдельным измерением.
|
||||
#
|
||||
# Менять версии здесь можно, но только вместе с прогоном полного набора: это
|
||||
# не косметика, а смена того, что означает зелёный backend.
|
||||
pytest==9.0.0
|
||||
voluptuous==0.15.2
|
||||
pytest-homeassistant-custom-component==0.13.316
|
||||
home-assistant-frontend==20260128.6
|
||||
# Ставится транзитивно из phcc; закреплён явно, чтобы версия была видна тому,
|
||||
# кто читает этот файл, а не только тому, кто читает лог.
|
||||
homeassistant==2026.2.3
|
||||
@@ -1,13 +1,11 @@
|
||||
"""TrailBook: the pure part of the server-side vacuum trails."""
|
||||
import math
|
||||
import sys, pathlib
|
||||
sys.path.insert(0, str(pathlib.Path(__file__).parent.parent / "custom_components" / "houseplan"))
|
||||
import importlib.util
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
"trailbook_pure",
|
||||
pathlib.Path(__file__).parent.parent / "custom_components" / "houseplan" / "trails.py",
|
||||
)
|
||||
# import only TrailBook without HA deps: read the source and exec the class
|
||||
import pathlib
|
||||
# TrailBook берётся без импорта: из trails.py читается текст и исполняется срез
|
||||
# до класса TrailRecorder — только он тянет Home Assistant. Ни sys.path, ни
|
||||
# sys.modules при этом не трогаются намеренно (#393): правка импорт-машины
|
||||
# переживает свой тест и достаётся всей сессии, а чем это кончается, показал
|
||||
# #389 — 85 тестов харнесса падали с голым `assert False`.
|
||||
src = (pathlib.Path(__file__).parent.parent / "custom_components" / "houseplan" / "trails.py").read_text(encoding="utf-8")
|
||||
ns = {"Any": object, "annotations": None, "math": math}
|
||||
exec(src[src.index("TRAIL_CAP"):src.index("class TrailRecorder")], ns)
|
||||
|
||||
Reference in New Issue
Block a user