about summary refs log tree commit diff
path: root/nixpkgs/pkgs/servers/home-assistant/build-custom-component/check_manifest.py
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/servers/home-assistant/build-custom-component/check_manifest.py')
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/build-custom-component/check_manifest.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/servers/home-assistant/build-custom-component/check_manifest.py b/nixpkgs/pkgs/servers/home-assistant/build-custom-component/check_manifest.py
new file mode 100644
index 000000000000..463a7579763d
--- /dev/null
+++ b/nixpkgs/pkgs/servers/home-assistant/build-custom-component/check_manifest.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+
+import json
+import os
+import sys
+
+import importlib_metadata
+from packaging.requirements import Requirement
+
+
+def error(msg: str) -> None:
+    print(f"  - {msg}", file=sys.stderr)
+    return False
+
+
+def check_requirement(req: str):
+    # https://packaging.pypa.io/en/stable/requirements.html
+    requirement = Requirement(req)
+    try:
+        version = importlib_metadata.distribution(requirement.name).version
+    except importlib_metadata.PackageNotFoundError:
+        return error(f"{requirement.name}{requirement.specifier} not present")
+
+    # https://packaging.pypa.io/en/stable/specifiers.html
+    if version not in requirement.specifier:
+        return error(
+            f"{requirement.name}{requirement.specifier} expected, but got {version}"
+        )
+
+    return True
+
+
+def check_manifest(manifest_file: str):
+    with open(manifest_file) as fd:
+        manifest = json.load(fd)
+
+    ok = True
+
+    derivation_domain = os.environ.get("domain")
+    manifest_domain = manifest["domain"]
+    if derivation_domain != manifest_domain:
+        ok = False
+        error(
+            f"Derivation attribute domain ({derivation_domain}) must match manifest domain ({manifest_domain})"
+        )
+
+    if "requirements" in manifest:
+        for requirement in manifest["requirements"]:
+            ok &= check_requirement(requirement)
+
+    if not ok:
+        error("Manifest check failed.")
+        sys.exit(1)
+
+
+if __name__ == "__main__":
+    if len(sys.argv) < 2:
+        raise RuntimeError(f"Usage {sys.argv[0]} <manifest>")
+    manifest_file = sys.argv[1]
+    check_manifest(manifest_file)