#!/usr/bin/env python3 """Generate esphome/component_aliases.py from component ALIASES declarations. Run without arguments to regenerate the registry; ``--check`` (run in CI) verifies it is up to date. """ import argparse from pathlib import Path import sys # The root directory of the repo root = Path(__file__).parent.parent # Make the repo's esphome package win over any installed copy sys.path.insert(0, str(root)) from esphome.helpers import write_file_if_changed # noqa: E402 from esphome.loader import _build_alias_map # noqa: E402 parser = argparse.ArgumentParser() parser.add_argument( "--check", help="Check if the alias registry is up to date.", action="store_true", ) args = parser.parse_args() registry_file = root / "esphome" / "component_aliases.py" HEADER = '''"""Component alias registry. Generated by script/build_alias_registry.py - do not edit manually. See the component-alias section of esphome/loader.py. """ # alias -> (canonical component, removal version or None) COMPONENT_ALIASES: dict[str, tuple[str, str | None]] = { ''' # _build_alias_map scans the real component tree and already rejects # duplicate and shadowing aliases with an EsphomeError. _, alias_meta = _build_alias_map() lines = [HEADER] for alias, meta in sorted(alias_meta.items()): removal = f'"{meta.removal_version}"' if meta.removal_version else "None" lines.append(f' "{alias}": ("{meta.canonical}", {removal}),\n') lines.append("}\n") content = "".join(lines) if args.check: if registry_file.read_text(encoding="utf-8") != content: print("Component alias registry is not up to date.") print("Please run `script/build_alias_registry.py`") sys.exit(1) print("Component alias registry is up to date") else: write_file_if_changed(registry_file, content) print(f"Wrote {registry_file}")