mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 21:06:19 +00:00
Update typing 16 (#48087)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
"""Generate CODEOWNERS."""
|
||||
from typing import Dict
|
||||
from __future__ import annotations
|
||||
|
||||
from .model import Config, Integration
|
||||
|
||||
@@ -33,7 +33,7 @@ homeassistant/components/demo/weather @fabaff
|
||||
"""
|
||||
|
||||
|
||||
def generate_and_validate(integrations: Dict[str, Integration]):
|
||||
def generate_and_validate(integrations: dict[str, Integration]):
|
||||
"""Generate CODEOWNERS."""
|
||||
parts = [BASE]
|
||||
|
||||
@@ -61,7 +61,7 @@ def generate_and_validate(integrations: Dict[str, Integration]):
|
||||
return "\n".join(parts)
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config: Config):
|
||||
def validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Validate CODEOWNERS."""
|
||||
codeowners_path = config.root / "CODEOWNERS"
|
||||
config.cache["codeowners"] = content = generate_and_validate(integrations)
|
||||
@@ -79,7 +79,7 @@ def validate(integrations: Dict[str, Integration], config: Config):
|
||||
return
|
||||
|
||||
|
||||
def generate(integrations: Dict[str, Integration], config: Config):
|
||||
def generate(integrations: dict[str, Integration], config: Config):
|
||||
"""Generate CODEOWNERS."""
|
||||
codeowners_path = config.root / "CODEOWNERS"
|
||||
with open(str(codeowners_path), "w") as fp:
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""Generate config flow file."""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from typing import Dict
|
||||
|
||||
from .model import Config, Integration
|
||||
|
||||
@@ -90,7 +91,7 @@ def validate_integration(config: Config, integration: Integration):
|
||||
)
|
||||
|
||||
|
||||
def generate_and_validate(integrations: Dict[str, Integration], config: Config):
|
||||
def generate_and_validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Validate and generate config flow data."""
|
||||
domains = []
|
||||
|
||||
@@ -117,7 +118,7 @@ def generate_and_validate(integrations: Dict[str, Integration], config: Config):
|
||||
return BASE.format(json.dumps(domains, indent=4))
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config: Config):
|
||||
def validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Validate config flow file."""
|
||||
config_flow_path = config.root / "homeassistant/generated/config_flows.py"
|
||||
config.cache["config_flow"] = content = generate_and_validate(integrations, config)
|
||||
@@ -136,7 +137,7 @@ def validate(integrations: Dict[str, Integration], config: Config):
|
||||
return
|
||||
|
||||
|
||||
def generate(integrations: Dict[str, Integration], config: Config):
|
||||
def generate(integrations: dict[str, Integration], config: Config):
|
||||
"""Generate config flow file."""
|
||||
config_flow_path = config.root / "homeassistant/generated/config_flows.py"
|
||||
with open(str(config_flow_path), "w") as fp:
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""Validate coverage files."""
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Dict
|
||||
|
||||
from .model import Config, Integration
|
||||
|
||||
@@ -69,7 +70,7 @@ ALLOWED_IGNORE_VIOLATIONS = {
|
||||
}
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config: Config):
|
||||
def validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Validate coverage."""
|
||||
coverage_path = config.root / ".coveragerc"
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
"""Validate dependencies."""
|
||||
from __future__ import annotations
|
||||
|
||||
import ast
|
||||
from pathlib import Path
|
||||
from typing import Dict, Set
|
||||
|
||||
from homeassistant.requirements import DISCOVERY_INTEGRATIONS
|
||||
|
||||
@@ -14,7 +15,7 @@ class ImportCollector(ast.NodeVisitor):
|
||||
def __init__(self, integration: Integration):
|
||||
"""Initialize the import collector."""
|
||||
self.integration = integration
|
||||
self.referenced: Dict[Path, Set[str]] = {}
|
||||
self.referenced: dict[Path, set[str]] = {}
|
||||
|
||||
# Current file or dir we're inspecting
|
||||
self._cur_fil_dir = None
|
||||
@@ -156,7 +157,7 @@ IGNORE_VIOLATIONS = {
|
||||
}
|
||||
|
||||
|
||||
def calc_allowed_references(integration: Integration) -> Set[str]:
|
||||
def calc_allowed_references(integration: Integration) -> set[str]:
|
||||
"""Return a set of allowed references."""
|
||||
allowed_references = (
|
||||
ALLOWED_USED_COMPONENTS
|
||||
@@ -173,9 +174,9 @@ def calc_allowed_references(integration: Integration) -> Set[str]:
|
||||
|
||||
|
||||
def find_non_referenced_integrations(
|
||||
integrations: Dict[str, Integration],
|
||||
integrations: dict[str, Integration],
|
||||
integration: Integration,
|
||||
references: Dict[Path, Set[str]],
|
||||
references: dict[Path, set[str]],
|
||||
):
|
||||
"""Find intergrations that are not allowed to be referenced."""
|
||||
allowed_references = calc_allowed_references(integration)
|
||||
@@ -221,7 +222,7 @@ def find_non_referenced_integrations(
|
||||
|
||||
|
||||
def validate_dependencies(
|
||||
integrations: Dict[str, Integration], integration: Integration
|
||||
integrations: dict[str, Integration], integration: Integration
|
||||
):
|
||||
"""Validate all dependencies."""
|
||||
# Some integrations are allowed to have violations.
|
||||
@@ -244,7 +245,7 @@ def validate_dependencies(
|
||||
)
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config):
|
||||
def validate(integrations: dict[str, Integration], config):
|
||||
"""Handle dependencies for integrations."""
|
||||
# check for non-existing dependencies
|
||||
for integration in integrations.values():
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""Generate dhcp file."""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from typing import Dict, List
|
||||
|
||||
from .model import Config, Integration
|
||||
|
||||
@@ -16,7 +17,7 @@ DHCP = {}
|
||||
""".strip()
|
||||
|
||||
|
||||
def generate_and_validate(integrations: List[Dict[str, str]]):
|
||||
def generate_and_validate(integrations: list[dict[str, str]]):
|
||||
"""Validate and generate dhcp data."""
|
||||
match_list = []
|
||||
|
||||
@@ -37,7 +38,7 @@ def generate_and_validate(integrations: List[Dict[str, str]]):
|
||||
return BASE.format(json.dumps(match_list, indent=4))
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config: Config):
|
||||
def validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Validate dhcp file."""
|
||||
dhcp_path = config.root / "homeassistant/generated/dhcp.py"
|
||||
config.cache["dhcp"] = content = generate_and_validate(integrations)
|
||||
@@ -56,7 +57,7 @@ def validate(integrations: Dict[str, Integration], config: Config):
|
||||
return
|
||||
|
||||
|
||||
def generate(integrations: Dict[str, Integration], config: Config):
|
||||
def generate(integrations: dict[str, Integration], config: Config):
|
||||
"""Generate dhcp file."""
|
||||
dhcp_path = config.root / "homeassistant/generated/dhcp.py"
|
||||
with open(str(dhcp_path), "w") as fp:
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""Validate integration JSON files."""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from typing import Dict
|
||||
|
||||
from .model import Integration
|
||||
|
||||
@@ -20,7 +21,7 @@ def validate_json_files(integration: Integration):
|
||||
return
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config):
|
||||
def validate(integrations: dict[str, Integration], config):
|
||||
"""Handle JSON files inside integrations."""
|
||||
if not config.specific_integrations:
|
||||
return
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
"""Manifest validation."""
|
||||
from typing import Dict
|
||||
from __future__ import annotations
|
||||
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import voluptuous as vol
|
||||
@@ -145,7 +146,7 @@ def validate_manifest(integration: Integration):
|
||||
validate_version(integration)
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config):
|
||||
def validate(integrations: dict[str, Integration], config):
|
||||
"""Handle all integrations manifests."""
|
||||
for integration in integrations.values():
|
||||
if integration.manifest:
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
"""Models for manifest validator."""
|
||||
from __future__ import annotations
|
||||
|
||||
import importlib
|
||||
import json
|
||||
import pathlib
|
||||
from typing import Any, Dict, List, Optional
|
||||
from typing import Any
|
||||
|
||||
import attr
|
||||
|
||||
@@ -24,12 +26,12 @@ class Error:
|
||||
class Config:
|
||||
"""Config for the run."""
|
||||
|
||||
specific_integrations: Optional[pathlib.Path] = attr.ib()
|
||||
specific_integrations: pathlib.Path | None = attr.ib()
|
||||
root: pathlib.Path = attr.ib()
|
||||
action: str = attr.ib()
|
||||
requirements: bool = attr.ib()
|
||||
errors: List[Error] = attr.ib(factory=list)
|
||||
cache: Dict[str, Any] = attr.ib(factory=dict)
|
||||
errors: list[Error] = attr.ib(factory=list)
|
||||
cache: dict[str, Any] = attr.ib(factory=dict)
|
||||
|
||||
def add_error(self, *args, **kwargs):
|
||||
"""Add an error."""
|
||||
@@ -65,9 +67,9 @@ class Integration:
|
||||
return integrations
|
||||
|
||||
path: pathlib.Path = attr.ib()
|
||||
manifest: Optional[dict] = attr.ib(default=None)
|
||||
errors: List[Error] = attr.ib(factory=list)
|
||||
warnings: List[Error] = attr.ib(factory=list)
|
||||
manifest: dict | None = attr.ib(default=None)
|
||||
errors: list[Error] = attr.ib(factory=list)
|
||||
warnings: list[Error] = attr.ib(factory=list)
|
||||
|
||||
@property
|
||||
def domain(self) -> str:
|
||||
@@ -80,17 +82,17 @@ class Integration:
|
||||
return self.path.as_posix().startswith("homeassistant/components")
|
||||
|
||||
@property
|
||||
def disabled(self) -> Optional[str]:
|
||||
def disabled(self) -> str | None:
|
||||
"""List of disabled."""
|
||||
return self.manifest.get("disabled")
|
||||
|
||||
@property
|
||||
def requirements(self) -> List[str]:
|
||||
def requirements(self) -> list[str]:
|
||||
"""List of requirements."""
|
||||
return self.manifest.get("requirements", [])
|
||||
|
||||
@property
|
||||
def dependencies(self) -> List[str]:
|
||||
def dependencies(self) -> list[str]:
|
||||
"""List of dependencies."""
|
||||
return self.manifest.get("dependencies", [])
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
"""Generate MQTT file."""
|
||||
from __future__ import annotations
|
||||
|
||||
from collections import defaultdict
|
||||
import json
|
||||
from typing import Dict
|
||||
|
||||
from .model import Config, Integration
|
||||
|
||||
@@ -17,7 +18,7 @@ MQTT = {}
|
||||
""".strip()
|
||||
|
||||
|
||||
def generate_and_validate(integrations: Dict[str, Integration]):
|
||||
def generate_and_validate(integrations: dict[str, Integration]):
|
||||
"""Validate and generate MQTT data."""
|
||||
|
||||
data = defaultdict(list)
|
||||
@@ -39,7 +40,7 @@ def generate_and_validate(integrations: Dict[str, Integration]):
|
||||
return BASE.format(json.dumps(data, indent=4))
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config: Config):
|
||||
def validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Validate MQTT file."""
|
||||
mqtt_path = config.root / "homeassistant/generated/mqtt.py"
|
||||
config.cache["mqtt"] = content = generate_and_validate(integrations)
|
||||
@@ -57,7 +58,7 @@ def validate(integrations: Dict[str, Integration], config: Config):
|
||||
return
|
||||
|
||||
|
||||
def generate(integrations: Dict[str, Integration], config: Config):
|
||||
def generate(integrations: dict[str, Integration], config: Config):
|
||||
"""Generate MQTT file."""
|
||||
mqtt_path = config.root / "homeassistant/generated/mqtt.py"
|
||||
with open(str(mqtt_path), "w") as fp:
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
"""Validate requirements."""
|
||||
from __future__ import annotations
|
||||
|
||||
from collections import deque
|
||||
import json
|
||||
import operator
|
||||
@@ -6,7 +8,6 @@ import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
from typing import Dict, Set
|
||||
|
||||
from stdlib_list import stdlib_list
|
||||
from tqdm import tqdm
|
||||
@@ -58,7 +59,7 @@ def normalize_package_name(requirement: str) -> str:
|
||||
return package
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config: Config):
|
||||
def validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Handle requirements for integrations."""
|
||||
ensure_cache()
|
||||
|
||||
@@ -153,7 +154,7 @@ def ensure_cache():
|
||||
PIPDEPTREE_CACHE = cache
|
||||
|
||||
|
||||
def get_requirements(integration: Integration, packages: Set[str]) -> Set[str]:
|
||||
def get_requirements(integration: Integration, packages: set[str]) -> set[str]:
|
||||
"""Return all (recursively) requirements for an integration."""
|
||||
ensure_cache()
|
||||
|
||||
@@ -184,7 +185,7 @@ def get_requirements(integration: Integration, packages: Set[str]) -> Set[str]:
|
||||
return all_requirements
|
||||
|
||||
|
||||
def install_requirements(integration: Integration, requirements: Set[str]) -> bool:
|
||||
def install_requirements(integration: Integration, requirements: set[str]) -> bool:
|
||||
"""Install integration requirements.
|
||||
|
||||
Return True if successful.
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
"""Validate dependencies."""
|
||||
from __future__ import annotations
|
||||
|
||||
import pathlib
|
||||
import re
|
||||
from typing import Dict
|
||||
|
||||
import voluptuous as vol
|
||||
from voluptuous.humanize import humanize_error
|
||||
@@ -93,7 +94,7 @@ def validate_services(integration: Integration):
|
||||
)
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config):
|
||||
def validate(integrations: dict[str, Integration], config):
|
||||
"""Handle dependencies for integrations."""
|
||||
# check services.yaml is cool
|
||||
for integration in integrations.values():
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
"""Generate ssdp file."""
|
||||
from __future__ import annotations
|
||||
|
||||
from collections import OrderedDict, defaultdict
|
||||
import json
|
||||
from typing import Dict
|
||||
|
||||
from .model import Config, Integration
|
||||
|
||||
@@ -22,7 +23,7 @@ def sort_dict(value):
|
||||
return OrderedDict((key, value[key]) for key in sorted(value))
|
||||
|
||||
|
||||
def generate_and_validate(integrations: Dict[str, Integration]):
|
||||
def generate_and_validate(integrations: dict[str, Integration]):
|
||||
"""Validate and generate ssdp data."""
|
||||
|
||||
data = defaultdict(list)
|
||||
@@ -44,7 +45,7 @@ def generate_and_validate(integrations: Dict[str, Integration]):
|
||||
return BASE.format(json.dumps(data, indent=4))
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config: Config):
|
||||
def validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Validate ssdp file."""
|
||||
ssdp_path = config.root / "homeassistant/generated/ssdp.py"
|
||||
config.cache["ssdp"] = content = generate_and_validate(integrations)
|
||||
@@ -62,7 +63,7 @@ def validate(integrations: Dict[str, Integration], config: Config):
|
||||
return
|
||||
|
||||
|
||||
def generate(integrations: Dict[str, Integration], config: Config):
|
||||
def generate(integrations: dict[str, Integration], config: Config):
|
||||
"""Generate ssdp file."""
|
||||
ssdp_path = config.root / "homeassistant/generated/ssdp.py"
|
||||
with open(str(ssdp_path), "w") as fp:
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
"""Validate integration translation files."""
|
||||
from __future__ import annotations
|
||||
|
||||
from functools import partial
|
||||
from itertools import chain
|
||||
import json
|
||||
import re
|
||||
from typing import Dict
|
||||
|
||||
import voluptuous as vol
|
||||
from voluptuous.humanize import humanize_error
|
||||
@@ -295,7 +296,7 @@ def validate_translation_file(config: Config, integration: Integration, all_stri
|
||||
)
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config: Config):
|
||||
def validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Handle JSON files inside integrations."""
|
||||
if config.specific_integrations:
|
||||
all_strings = None
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
"""Generate zeroconf file."""
|
||||
from __future__ import annotations
|
||||
|
||||
from collections import OrderedDict, defaultdict
|
||||
import json
|
||||
from typing import Dict
|
||||
|
||||
from .model import Config, Integration
|
||||
|
||||
@@ -19,7 +20,7 @@ HOMEKIT = {}
|
||||
""".strip()
|
||||
|
||||
|
||||
def generate_and_validate(integrations: Dict[str, Integration]):
|
||||
def generate_and_validate(integrations: dict[str, Integration]):
|
||||
"""Validate and generate zeroconf data."""
|
||||
service_type_dict = defaultdict(list)
|
||||
homekit_dict = {}
|
||||
@@ -89,7 +90,7 @@ def generate_and_validate(integrations: Dict[str, Integration]):
|
||||
return BASE.format(json.dumps(zeroconf, indent=4), json.dumps(homekit, indent=4))
|
||||
|
||||
|
||||
def validate(integrations: Dict[str, Integration], config: Config):
|
||||
def validate(integrations: dict[str, Integration], config: Config):
|
||||
"""Validate zeroconf file."""
|
||||
zeroconf_path = config.root / "homeassistant/generated/zeroconf.py"
|
||||
config.cache["zeroconf"] = content = generate_and_validate(integrations)
|
||||
@@ -108,7 +109,7 @@ def validate(integrations: Dict[str, Integration], config: Config):
|
||||
return
|
||||
|
||||
|
||||
def generate(integrations: Dict[str, Integration], config: Config):
|
||||
def generate(integrations: dict[str, Integration], config: Config):
|
||||
"""Generate zeroconf file."""
|
||||
zeroconf_path = config.root / "homeassistant/generated/zeroconf.py"
|
||||
with open(str(zeroconf_path), "w") as fp:
|
||||
|
||||
Reference in New Issue
Block a user