85 lines
2.2 KiB
Python
85 lines
2.2 KiB
Python
"""Validate manifests."""
|
|
import pathlib
|
|
import sys
|
|
|
|
from .model import Integration, Config
|
|
from . import dependencies, manifest, codeowners
|
|
|
|
PLUGINS = [
|
|
manifest,
|
|
dependencies,
|
|
codeowners,
|
|
]
|
|
|
|
|
|
def get_config() -> Config:
|
|
"""Return config."""
|
|
if not pathlib.Path('requirements_all.txt').is_file():
|
|
raise RuntimeError("Run from project root")
|
|
|
|
return Config(
|
|
root=pathlib.Path('.').absolute(),
|
|
action='validate' if sys.argv[-1] == 'validate' else 'generate',
|
|
)
|
|
|
|
|
|
def main():
|
|
"""Validate manifests."""
|
|
try:
|
|
config = get_config()
|
|
except RuntimeError as err:
|
|
print(err)
|
|
return 1
|
|
|
|
integrations = Integration.load_dir(
|
|
pathlib.Path('homeassistant/components')
|
|
)
|
|
manifest.validate(integrations, config)
|
|
dependencies.validate(integrations, config)
|
|
codeowners.validate(integrations, config)
|
|
|
|
# When we generate, all errors that are fixable will be ignored,
|
|
# as generating them will be fixed.
|
|
if config.action == 'generate':
|
|
general_errors = [err for err in config.errors if not err.fixable]
|
|
invalid_itg = [
|
|
itg for itg in integrations.values()
|
|
if any(
|
|
not error.fixable for error in itg.errors
|
|
)
|
|
]
|
|
else:
|
|
# action == validate
|
|
general_errors = config.errors
|
|
invalid_itg = [itg for itg in integrations.values() if itg.errors]
|
|
|
|
print("Integrations:", len(integrations))
|
|
print("Invalid integrations:", len(invalid_itg))
|
|
|
|
if not invalid_itg and not general_errors:
|
|
codeowners.generate(integrations, config)
|
|
return 0
|
|
|
|
print()
|
|
if config.action == 'generate':
|
|
print("Found errors. Generating files canceled.")
|
|
print()
|
|
|
|
if general_errors:
|
|
print("General errors:")
|
|
for error in general_errors:
|
|
print("*", error)
|
|
print()
|
|
|
|
for integration in sorted(invalid_itg, key=lambda itg: itg.domain):
|
|
print("Integration {}:".format(integration.domain))
|
|
for error in integration.errors:
|
|
print("*", error)
|
|
print()
|
|
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|