Bump the manifest to 0.2.2 and add CHANGELOG.md with upgrade, reset and rollback notes covering all reliability work since 0.2.1. The README drops its accumulated "Unreleased" sections in favor of the changelog and gains a Diagnostics section explaining the Status attributes and how to choose freshness limits. The package check now fails if the manifest version has no changelog entry. ROADMAP marks the Milestone 0 items now backed by tests and resets the next-session backlog; AUDIT.md records this round's findings. Still observation-only. Tested in the HA Core harness with HA 2025.12.0 and 2026.2.3; not on HAOS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
32 lines
1.5 KiB
Python
32 lines
1.5 KiB
Python
"""Small local packaging and translation checks; not a replacement for hassfest."""
|
|
import json
|
|
from pathlib import Path
|
|
import subprocess
|
|
|
|
root = Path(__file__).resolve().parents[1]
|
|
component = root / "custom_components" / "heating_mpc"
|
|
manifest = json.loads((component / "manifest.json").read_text())
|
|
assert manifest["domain"] == "heating_mpc"
|
|
assert manifest["config_flow"] is True
|
|
assert manifest["iot_class"] == "local_polling"
|
|
assert not manifest["requirements"], "Model inference should remain dependency-free"
|
|
json.loads((root / "hacs.json").read_text())
|
|
# A version bump needs release notes (AGENTS.md: no version without documentation).
|
|
assert f"## {manifest['version']} " in (root / "CHANGELOG.md").read_text(), \
|
|
f"CHANGELOG.md has no entry for {manifest['version']}"
|
|
|
|
|
|
def keys(value, prefix=()):
|
|
if not isinstance(value, dict):
|
|
return {prefix}
|
|
return set().union(*(keys(child, (*prefix, key)) for key, child in value.items()))
|
|
|
|
|
|
strings = json.loads((component / "strings.json").read_text())
|
|
for language in ("en", "ro"):
|
|
translated = json.loads((component / "translations" / f"{language}.json").read_text())
|
|
assert keys(strings) == keys(translated), f"Translation keys differ: {language}"
|
|
tracked = subprocess.check_output(["git", "ls-files", "custom_components"], cwd=root, text=True).splitlines()
|
|
assert not any("__pycache__" in path or path.endswith((".pyc", ".pyo")) for path in tracked)
|
|
print("Package metadata, translations and tracked component files passed")
|