69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
from abc import ABC, abstractmethod
|
|
from typing import Dict, Type
|
|
|
|
from .argument import Argument
|
|
|
|
|
|
class Component(ABC):
|
|
"""
|
|
Abstract interface for all the application components exposed through the
|
|
`inspect` plugin.
|
|
|
|
It includes integrations (plugins and backends) and messages (events and
|
|
responses).
|
|
"""
|
|
|
|
@staticmethod
|
|
def _merge_params(params: Dict[str, Argument], new_params: Dict[str, Argument]):
|
|
"""
|
|
Utility function to merge a new mapping of parameters into an existing one.
|
|
"""
|
|
for param_name, param in new_params.items():
|
|
# Set the parameter if it doesn't exist
|
|
if param_name not in params:
|
|
params[param_name] = param
|
|
|
|
# Set the parameter documentation if it's not set
|
|
if param.doc and not params[param_name].doc:
|
|
params[param_name].doc = param.doc
|
|
|
|
# If the new parameter has required=False,
|
|
# then that should also be the value for the current ones
|
|
if param.required is False:
|
|
params[param_name].required = False
|
|
|
|
# If the new parameter has a default value, and the current
|
|
# one doesn't, then the default value should be set as the new one.
|
|
if param.default is not None and params[param_name].default is None:
|
|
params[param_name].default = param.default
|
|
|
|
@classmethod
|
|
@abstractmethod
|
|
def by_name(cls, name: str) -> "Component":
|
|
"""
|
|
:param name: Component type name.
|
|
:return: A parsed component class given its name/type name.
|
|
"""
|
|
|
|
@classmethod
|
|
@abstractmethod
|
|
def by_type(cls, type: Type) -> "Component":
|
|
"""
|
|
:param type: Component type.
|
|
:return: A parsed component class given its type.
|
|
"""
|
|
|
|
@property
|
|
@abstractmethod
|
|
def cls(self) -> Type:
|
|
"""
|
|
:return: The class of a component.
|
|
"""
|
|
|
|
@property
|
|
@abstractmethod
|
|
def doc_url(self) -> str:
|
|
"""
|
|
:return: The URL of the documentation of the component.
|
|
"""
|