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