91 lines
2.2 KiB
Python
91 lines
2.2 KiB
Python
"""Validate manifests."""
|
|
import argparse
|
|
from pathlib import Path
|
|
import subprocess
|
|
import sys
|
|
|
|
from . import gather_info, generate, error, docs
|
|
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")
|
|
parser.add_argument("template", type=str, choices=TEMPLATES)
|
|
parser.add_argument(
|
|
"--develop", action="store_true", help="Automatically fill in info"
|
|
)
|
|
parser.add_argument(
|
|
"--integration", type=valid_integration, help="Integration to target."
|
|
)
|
|
|
|
arguments = parser.parse_args()
|
|
|
|
return arguments
|
|
|
|
|
|
def main():
|
|
"""Scaffold an integration."""
|
|
if not Path("requirements_all.txt").is_file():
|
|
print("Run from project root")
|
|
return 1
|
|
|
|
args = get_arguments()
|
|
|
|
info = gather_info.gather_info(args)
|
|
|
|
generate.generate(args.template, info)
|
|
|
|
# If creating new integration, create config flow too
|
|
if args.template == "integration":
|
|
if info.authentication or not info.discoverable:
|
|
template = "config_flow"
|
|
else:
|
|
template = "config_flow_discovery"
|
|
|
|
generate.generate(template, info)
|
|
|
|
print("Running hassfest to pick up new information.")
|
|
subprocess.run("python -m script.hassfest", shell=True)
|
|
print()
|
|
|
|
print("Running tests")
|
|
print(f"$ pytest -v tests/components/{info.domain}")
|
|
if (
|
|
subprocess.run(
|
|
f"pytest -v tests/components/{info.domain}", shell=True
|
|
).returncode
|
|
!= 0
|
|
):
|
|
return 1
|
|
print()
|
|
|
|
print(f"Done!")
|
|
|
|
docs.print_relevant_docs(args.template, info)
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
sys.exit(main())
|
|
except error.ExitApp as err:
|
|
print()
|
|
print(f"Fatal Error: {err.reason}")
|
|
sys.exit(err.exit_code)
|