- major: diagnostics больше не содержит полный lanip_key (esp_home — маска, entry_data redacted); ключ для ESPHome — через reconfigure/CLI; план §3 синхронизирован; дамп при незагруженной записи не падает - reconfigure: сохраняет listen_port/keepalive_ms и текущие overrides/ temp_step; превью-дефолты подхватывают значения записи - repair fix-flow: подтверждение перезагружает запись (issue снимается только когда сессия вышла из key_error; иначе создаётся заново) - key_issue_id helper, использование async_remove_issue (мёртвый код), CONF_EMAIL/PASSWORD в TO_REDACT, placeholders в fix_flow, тест плейсхолдеров ru - тесты обновлены (47 components)
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
"""Согласованность strings.json / translations en/ru."""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import pathlib
|
|
import re
|
|
|
|
ROOT = pathlib.Path(__file__).resolve().parents[3]
|
|
COMPONENT = ROOT / "custom_components" / "fglair"
|
|
|
|
|
|
def _keys(node, prefix: str = "") -> set[str]:
|
|
keys: set[str] = set()
|
|
if isinstance(node, dict):
|
|
for key, value in node.items():
|
|
keys.add(prefix + key)
|
|
keys |= _keys(value, prefix + key + ".")
|
|
return keys
|
|
|
|
|
|
def test_en_matches_strings():
|
|
strings = json.loads((COMPONENT / "strings.json").read_text())
|
|
english = json.loads((COMPONENT / "translations" / "en.json").read_text())
|
|
assert strings == english
|
|
|
|
|
|
def test_ru_covers_all_keys():
|
|
strings = json.loads((COMPONENT / "strings.json").read_text())
|
|
russian = json.loads((COMPONENT / "translations" / "ru.json").read_text())
|
|
assert _keys(strings) == _keys(russian)
|
|
|
|
|
|
def _placeholders(node, prefix: str = "") -> dict[str, set[str]]:
|
|
out: dict[str, set[str]] = {}
|
|
if isinstance(node, dict):
|
|
for key, value in node.items():
|
|
out.update(_placeholders(value, prefix + key + "."))
|
|
elif isinstance(node, str):
|
|
out[prefix] = set(re.findall(r"{(\w+)}", node))
|
|
return out
|
|
|
|
|
|
def test_ru_placeholders_match():
|
|
strings = json.loads((COMPONENT / "strings.json").read_text())
|
|
russian = json.loads((COMPONENT / "translations" / "ru.json").read_text())
|
|
assert _placeholders(strings) == _placeholders(russian)
|