1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-26 14:08:21 +00:00

Load requirements and dependencies from manifests. Fallback to current REQUIREMENTS and DEPENDENCIES (#22717)

* Load dependencies from manifests. Fallback to current DEPENDENCIES

* Fix typing

* Ignore typing correctly

* Split out dependency processing to a new method

* Fix tests

* Only pull from manifest if dependencies is non empty

* Inline temporary function

* Fix light tests [skip ci]

* Fix tests/common

* Fix some mqtt tests [skip ci]

* Fix tests and component manifests which have only one platform

* Fix rflink tests

* Fix more tests and manifests

* Readability over shorthand format

* Fix demo/notify tests

* Load dependencies from manifests. Fallback to current DEPENDENCIES

* Load requirements from manifests. Fallback to current REQUIREMENTS

* Fix typing

* Ignore typing correctly

* Split out dependency processing to a new method

* Only pull from manifest if dependencies is non empty

* Inline temporary function

* Fix tests and component manifests which have only one platform

* Fix rflink tests

* Readability over shorthand format

* Clean up requirements

* Use integration to resolve deps/reqs

* Lint

* Lint

* revert a change

* Revert a test change

* Fix types

* Fix types

* Add back cache for load component

* Fix test_component_not_found

* Move light.test and device_tracker.test into test package instead with manifest to fix tests

* Fix broken device_tracker tests

* Add docstrings to __init__

* Fix all of the light tests that I broke earlier

* Embed the test.switch platform to fix other tests

* Embed and fix the test.imagimage_processing platform

* Fix tests for nx584

* Add dependencies from platform file's DEPENDENCIES

* Try to setup component when entity_platform is setting up

Fix tests in helpers folder

* Rewrite test_setup

* Simplify

* Lint

* Disable demo component if running in test

Temp workaround to unblock CI tests

* Skip demo tests

* Fix config entry test

* Fix repeat test

* Clarify doc

* One extra guard

* Fix import

* Lint

* Workaround google tts
This commit is contained in:
Rohan Kapoor
2019-04-11 01:26:36 -07:00
committed by Jason Hu
parent 8a81286abb
commit 6ba9ccf052
66 changed files with 391 additions and 233 deletions

View File

@@ -52,11 +52,11 @@ LOOKUP_PATHS = [PACKAGE_CUSTOM_COMPONENTS, PACKAGE_BUILTIN]
_UNDEF = object()
def manifest_from_legacy_module(module: Any) -> Dict:
def manifest_from_legacy_module(module: ModuleType) -> Dict:
"""Generate a manifest from a legacy module."""
return {
'domain': module.DOMAIN,
'name': module.DOMAIN,
'domain': module.DOMAIN, # type: ignore
'name': module.DOMAIN, # type: ignore
'documentation': None,
'requirements': getattr(module, 'REQUIREMENTS', []),
'dependencies': getattr(module, 'DEPENDENCIES', []),
@@ -68,10 +68,10 @@ class Integration:
"""An integration in Home Assistant."""
@classmethod
def resolve_from_root(cls, hass: 'HomeAssistant', root_module: Any,
def resolve_from_root(cls, hass: 'HomeAssistant', root_module: ModuleType,
domain: str) -> 'Optional[Integration]':
"""Resolve an integration from a root module."""
for base in root_module.__path__:
for base in root_module.__path__: # type: ignore
manifest_path = (
pathlib.Path(base) / domain / 'manifest.json'
)
@@ -117,15 +117,22 @@ class Integration:
self.dependencies = manifest['dependencies'] # type: List[str]
self.requirements = manifest['requirements'] # type: List[str]
def get_component(self) -> Any:
def get_component(self) -> ModuleType:
"""Return the component."""
return importlib.import_module(self.pkg_path)
cache = self.hass.data.setdefault(DATA_KEY, {})
if self.domain not in cache:
cache[self.domain] = importlib.import_module(self.pkg_path)
return cache[self.domain] # type: ignore
def get_platform(self, platform_name: str) -> Any:
def get_platform(self, platform_name: str) -> ModuleType:
"""Return a platform for an integration."""
return importlib.import_module(
"{}.{}".format(self.pkg_path, platform_name)
)
cache = self.hass.data.setdefault(DATA_KEY, {})
full_name = "{}.{}".format(self.domain, platform_name)
if full_name not in cache:
cache[full_name] = importlib.import_module(
"{}.{}".format(self.pkg_path, platform_name)
)
return cache[full_name] # type: ignore
async def async_get_integration(hass: 'HomeAssistant', domain: str)\