forked from platypush/platypush
[application
] Added application.install
action.
It can be used to programmatically install extensions.
This commit is contained in:
parent
e2e349a2ad
commit
c05d887551
2 changed files with 42 additions and 4 deletions
|
@ -12,10 +12,9 @@ base_path = os.path.abspath(
|
||||||
|
|
||||||
sys.path.insert(0, base_path)
|
sys.path.insert(0, base_path)
|
||||||
|
|
||||||
from platypush.common.reflection import Integration # noqa
|
from platypush.common.reflection import Integration # noqa: E402
|
||||||
from platypush.utils import get_plugin_name_by_class, import_file # noqa
|
from platypush.utils import get_plugin_name_by_class # noqa: E402
|
||||||
from platypush.utils.mock import auto_mocks # noqa
|
from platypush.utils.mock import auto_mocks # noqa: E402
|
||||||
from platypush.utils.mock.modules import mock_imports # noqa
|
|
||||||
|
|
||||||
|
|
||||||
class IntegrationEnricher:
|
class IntegrationEnricher:
|
||||||
|
|
|
@ -1,7 +1,15 @@
|
||||||
|
import inspect
|
||||||
|
import pathlib
|
||||||
|
import subprocess
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from platypush.commands import CommandStream, RestartCommand, StopCommand
|
from platypush.commands import CommandStream, RestartCommand, StopCommand
|
||||||
|
from platypush.common.db import override_definitions
|
||||||
from platypush.config import Config
|
from platypush.config import Config
|
||||||
from platypush.plugins import Plugin, action
|
from platypush.plugins import Plugin, action
|
||||||
|
from platypush.utils import get_backend_class_by_name, get_plugin_class_by_name
|
||||||
|
from platypush.utils.manifest import Manifest
|
||||||
|
from platypush.utils.mock import auto_mocks
|
||||||
|
|
||||||
|
|
||||||
class ApplicationPlugin(Plugin):
|
class ApplicationPlugin(Plugin):
|
||||||
|
@ -29,3 +37,34 @@ class ApplicationPlugin(Plugin):
|
||||||
Restart the application.
|
Restart the application.
|
||||||
"""
|
"""
|
||||||
CommandStream(self._ctrl_sock).write(RestartCommand())
|
CommandStream(self._ctrl_sock).write(RestartCommand())
|
||||||
|
|
||||||
|
@action
|
||||||
|
def install(self, extension: str):
|
||||||
|
"""
|
||||||
|
Install the dependencies of an extension.
|
||||||
|
|
||||||
|
:param extension: Extension name. For plugins, it will be the plugin
|
||||||
|
name (e.g. ``light.hue`` or ``music.mpd``); for backend, the name will
|
||||||
|
be prefixed by ``backend.`` (e.g. ``backend.http`` or ``backend.tcp``).
|
||||||
|
"""
|
||||||
|
getter = get_plugin_class_by_name
|
||||||
|
if extension.startswith('backend.'):
|
||||||
|
extension = extension[len('backend.') :]
|
||||||
|
getter = get_backend_class_by_name
|
||||||
|
|
||||||
|
with auto_mocks(), override_definitions():
|
||||||
|
ext = getter(extension)
|
||||||
|
|
||||||
|
assert ext, f'Could not find extension {extension}'
|
||||||
|
manifest_file = str(pathlib.Path(inspect.getfile(ext)).parent / 'manifest.yaml')
|
||||||
|
install_cmds = list(
|
||||||
|
Manifest.from_file(manifest_file).install.to_install_commands()
|
||||||
|
)
|
||||||
|
|
||||||
|
if not install_cmds:
|
||||||
|
self.logger.info('No extra requirements found for extension %s', extension)
|
||||||
|
return
|
||||||
|
|
||||||
|
for cmd in install_cmds:
|
||||||
|
self.logger.info('> %s', cmd)
|
||||||
|
subprocess.check_call(cmd, shell=True)
|
||||||
|
|
Loading…
Reference in a new issue