From edd7feaf106fae006a020d17794b73dcbfc39b4b Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Thu, 18 Jan 2024 22:11:02 +0100 Subject: [PATCH] Add task to install all requirements of an integration (#108262) * Add task to install the requirements of an integration * Gather recursive requirements * Move valid_integration to util * Apply suggestions from code review Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com> * Implement suggestions --------- Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com> --- .vscode/tasks.json | 14 ++++++ script/const.py | 4 ++ script/install_integration_requirements.py | 54 ++++++++++++++++++++++ script/scaffold/__main__.py | 13 +----- script/util.py | 15 ++++++ 5 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 script/const.py create mode 100644 script/install_integration_requirements.py create mode 100644 script/util.py diff --git a/.vscode/tasks.json b/.vscode/tasks.json index b8cb8a4e61a..d6657f04557 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -157,6 +157,20 @@ "kind": "build", "isDefault": true } + }, + { + "label": "Install integration requirements", + "detail": "Install all requirements of a given integration.", + "type": "shell", + "command": "${command:python.interpreterPath} -m script.install_integration_requirements ${input:integrationName}", + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "reveal": "always", + "panel": "new" + } } ], "inputs": [ diff --git a/script/const.py b/script/const.py new file mode 100644 index 00000000000..de9b559e634 --- /dev/null +++ b/script/const.py @@ -0,0 +1,4 @@ +"""Script constants.""" +from pathlib import Path + +COMPONENT_DIR = Path("homeassistant/components") diff --git a/script/install_integration_requirements.py b/script/install_integration_requirements.py new file mode 100644 index 00000000000..1a87be04f7e --- /dev/null +++ b/script/install_integration_requirements.py @@ -0,0 +1,54 @@ +"""Install requirements for a given integration.""" + +import argparse +from pathlib import Path +import subprocess +import sys + +from .gen_requirements_all import gather_recursive_requirements +from .util import valid_integration + + +def get_arguments() -> argparse.Namespace: + """Get parsed passed in arguments.""" + parser = argparse.ArgumentParser( + description="Install requirements for a given integration" + ) + parser.add_argument( + "integration", type=valid_integration, help="Integration to target." + ) + + arguments = parser.parse_args() + + return arguments + + +def main() -> int | None: + """Install requirements for a given integration.""" + if not Path("requirements_all.txt").is_file(): + print("Run from project root") + return 1 + + args = get_arguments() + + requirements = gather_recursive_requirements(args.integration) + + cmd = [ + sys.executable, + "-m", + "pip", + "install", + "-c", + "homeassistant/package_constraints.txt", + "-U", + *requirements, + ] + print(" ".join(cmd)) + subprocess.run( + cmd, + check=True, + ) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/script/scaffold/__main__.py b/script/scaffold/__main__.py index ddbd1189e11..c303fc2c247 100644 --- a/script/scaffold/__main__.py +++ b/script/scaffold/__main__.py @@ -4,24 +4,15 @@ from pathlib import Path import subprocess import sys +from script.util import valid_integration + from . import docs, error, gather_info, generate -from .const import COMPONENT_DIR TEMPLATES = [ p.name for p in (Path(__file__).parent / "templates").glob("*") if p.is_dir() ] -def valid_integration(integration): - """Test if it's a valid integration.""" - if not (COMPONENT_DIR / integration).exists(): - raise argparse.ArgumentTypeError( - f"The integration {integration} does not exist." - ) - - return integration - - def get_arguments() -> argparse.Namespace: """Get parsed passed in arguments.""" parser = argparse.ArgumentParser(description="Home Assistant Scaffolder") diff --git a/script/util.py b/script/util.py new file mode 100644 index 00000000000..b7c37c72102 --- /dev/null +++ b/script/util.py @@ -0,0 +1,15 @@ +"""Utility functions for the scaffold script.""" + +import argparse + +from .const import COMPONENT_DIR + + +def valid_integration(integration): + """Test if it's a valid integration.""" + if not (COMPONENT_DIR / integration).exists(): + raise argparse.ArgumentTypeError( + f"The integration {integration} does not exist." + ) + + return integration