about summary refs log tree commit diff
path: root/nixpkgs/pkgs/servers/home-assistant/parse-requirements.py
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/servers/home-assistant/parse-requirements.py')
-rwxr-xr-xnixpkgs/pkgs/servers/home-assistant/parse-requirements.py32
1 files changed, 30 insertions, 2 deletions
diff --git a/nixpkgs/pkgs/servers/home-assistant/parse-requirements.py b/nixpkgs/pkgs/servers/home-assistant/parse-requirements.py
index 55e58d7a017f..eeb117a984e4 100755
--- a/nixpkgs/pkgs/servers/home-assistant/parse-requirements.py
+++ b/nixpkgs/pkgs/servers/home-assistant/parse-requirements.py
@@ -1,5 +1,5 @@
 #! /usr/bin/env nix-shell
-#! nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ mypy attrs ])
+#! nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ mypy attrs packaging rich ])
 #
 # This script downloads Home Assistant's source tarball.
 # Inside the homeassistant/components directory, each integration has an associated manifest.json,
@@ -26,6 +26,9 @@ import tempfile
 from io import BytesIO
 from typing import Dict, Optional, Set, Any
 from urllib.request import urlopen
+from packaging import version as Version
+from rich.console import Console
+from rich.table import Table
 
 COMPONENT_PREFIX = "homeassistant.components"
 PKG_SET = "python3Packages"
@@ -142,12 +145,20 @@ def name_to_attr_path(req: str, packages: Dict[str, Dict[str, str]]) -> Optional
         return None
 
 
+def get_pkg_version(package: str, packages: Dict[str, Dict[str, str]]) -> Optional[str]:
+    pkg = packages.get(f"{PKG_SET}.{package}", None)
+    if not pkg:
+        return None
+    return pkg["version"]
+
+
 def main() -> None:
     packages = dump_packages()
     version = get_version()
     print("Generating component-packages.nix for version {}".format(version))
     components = parse_components(version=version)
     build_inputs = {}
+    outdated = {}
     for component in sorted(components.keys()):
         attr_paths = []
         missing_reqs = []
@@ -156,8 +167,14 @@ def main() -> None:
             # Some requirements are specified by url, e.g. https://example.org/foobar#xyz==1.0.0
             # Therefore, if there's a "#" in the line, only take the part after it
             req = req[req.find("#") + 1 :]
-            name = req.split("==")[0]
+            name, required_version = req.split("==", maxsplit=1)
             attr_path = name_to_attr_path(name, packages)
+            if our_version := get_pkg_version(name, packages):
+                if Version.parse(our_version) < Version.parse(required_version):
+                    outdated[name] = {
+                      'wanted': required_version,
+                      'current': our_version
+                    }
             if attr_path is not None:
                 # Add attribute path without "python3Packages." prefix
                 attr_paths.append(attr_path[len(PKG_SET + ".") :])
@@ -189,6 +206,17 @@ def main() -> None:
         f.write("  };\n")
         f.write("}\n")
 
+    if outdated:
+        table = Table(title="Outdated dependencies")
+        table.add_column("Package")
+        table.add_column("Current")
+        table.add_column("Wanted")
+        for package, version in sorted(outdated.items()):
+            table.add_row(package, version['current'], version['wanted'])
+
+        console = Console()
+        console.print(table)
+
 
 if __name__ == "__main__":
     run_mypy()