This is an automated email from the ASF dual-hosted git repository. tvb pushed a commit to branch tristan/mirror-plugins in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit 44049f4192ca7c30c0df09866b24ed836b49e085 Author: Tristan van Berkom <[email protected]> AuthorDate: Mon Oct 2 14:21:18 2023 +0900 _pluginfactory: Additional type checking This also fixes an incorrect type signature in the element constructor --- src/buildstream/_pluginfactory/elementfactory.py | 16 ++++++++++++---- src/buildstream/_pluginfactory/pluginfactory.py | 8 ++++---- src/buildstream/_pluginfactory/sourcefactory.py | 18 ++++++++++++++---- src/buildstream/element.py | 6 +++--- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/buildstream/_pluginfactory/elementfactory.py b/src/buildstream/_pluginfactory/elementfactory.py index b85b177e9..cc95273b0 100644 --- a/src/buildstream/_pluginfactory/elementfactory.py +++ b/src/buildstream/_pluginfactory/elementfactory.py @@ -14,8 +14,16 @@ # Authors: # Tristan Van Berkom <[email protected]> +from typing import TYPE_CHECKING, Type, cast + from .pluginfactory import PluginFactory from .pluginorigin import PluginType +from .._loader import LoadElement +from ..element import Element + +if TYPE_CHECKING: + from .._context import Context + from .._project import Project # A ElementFactory creates Element instances @@ -30,8 +38,7 @@ class ElementFactory(PluginFactory): # create(): # - # Create an Element object, the pipeline uses this to create Element - # objects on demand for a given pipeline. + # Create an Element object. # # Args: # context (object): The Context object for processing @@ -44,7 +51,8 @@ class ElementFactory(PluginFactory): # PluginError (if the kind lookup failed) # LoadError (if the element itself took issue with the config) # - def create(self, context, project, load_element): - element_type, default_config = self.lookup(context.messenger, load_element.kind, load_element.node) + def create(self, context: "Context", project: "Project", load_element: LoadElement) -> Element: + plugin_type, default_config = self.lookup(context.messenger, load_element.kind, load_element.node) + element_type = cast(Type[Element], plugin_type) element = element_type(context, project, load_element, default_config) return element diff --git a/src/buildstream/_pluginfactory/pluginfactory.py b/src/buildstream/_pluginfactory/pluginfactory.py index 23de60936..fbcf544cc 100644 --- a/src/buildstream/_pluginfactory/pluginfactory.py +++ b/src/buildstream/_pluginfactory/pluginfactory.py @@ -15,7 +15,7 @@ # Tristan Van Berkom <[email protected]> import os -from typing import Tuple, Type, Iterator +from typing import Tuple, Type, Iterator, Optional from pluginbase import PluginSource from .. import utils @@ -127,7 +127,7 @@ class PluginFactory: # # Raises: PluginError # - def lookup(self, messenger: Messenger, kind: str, provenance_node: Node) -> Tuple[Type[Plugin], str]: + def lookup(self, messenger: Messenger, kind: str, provenance_node: Node) -> Tuple[Type[Plugin], Optional[str]]: plugin_type, defaults = self._ensure_plugin(kind, provenance_node) # We can be called with None for the messenger here in the @@ -180,7 +180,7 @@ class PluginFactory: # the plugin's preferred defaults. # (str): The explanatory display string describing how this plugin was loaded # - def get_plugin_paths(self, kind: str): + def get_plugin_paths(self, kind: str) -> Tuple[Optional[str], Optional[str], Optional[str]]: try: origin = self._origins[kind] except KeyError: @@ -208,7 +208,7 @@ class PluginFactory: # Raises: # (PluginError): In case something went wrong loading the plugin # - def _ensure_plugin(self, kind: str, provenance_node: Node) -> Tuple[Type[Plugin], str]: + def _ensure_plugin(self, kind: str, provenance_node: Node) -> Tuple[Type[Plugin], Optional[str]]: if kind not in self._types: diff --git a/src/buildstream/_pluginfactory/sourcefactory.py b/src/buildstream/_pluginfactory/sourcefactory.py index 4d3722ad6..f27b5a843 100644 --- a/src/buildstream/_pluginfactory/sourcefactory.py +++ b/src/buildstream/_pluginfactory/sourcefactory.py @@ -14,8 +14,18 @@ # Authors: # Tristan Van Berkom <[email protected]> +from typing import TYPE_CHECKING, Type, cast + from .pluginfactory import PluginFactory from .pluginorigin import PluginType +from ..source import Source +from .._loader import MetaSource +from .._variables import Variables + +if TYPE_CHECKING: + from .._context import Context + from .._project import Project + # A SourceFactory creates Source instances # in the context of a given factory @@ -29,8 +39,7 @@ class SourceFactory(PluginFactory): # create(): # - # Create a Source object, the pipeline uses this to create Source - # objects on demand for a given pipeline. + # Create a Source object. # # Args: # context (object): The Context object for processing @@ -45,7 +54,8 @@ class SourceFactory(PluginFactory): # PluginError (if the kind lookup failed) # LoadError (if the source itself took issue with the config) # - def create(self, context, project, meta, variables): - source_type, _ = self.lookup(context.messenger, meta.kind, meta.config) + def create(self, context: "Context", project: "Project", meta: MetaSource, variables: Variables) -> Source: + plugin_type, _ = self.lookup(context.messenger, meta.kind, meta.config) + source_type = cast(Type[Source], plugin_type) source = source_type(context, project, meta, variables) return source diff --git a/src/buildstream/element.py b/src/buildstream/element.py index 656e94f79..f70a3fcb9 100644 --- a/src/buildstream/element.py +++ b/src/buildstream/element.py @@ -71,7 +71,7 @@ from contextlib import contextmanager, suppress from functools import partial from itertools import chain import string -from typing import cast, TYPE_CHECKING, Any, Dict, Iterator, Iterable, List, Optional, Set, Sequence +from typing import cast, TYPE_CHECKING, Dict, Iterator, Iterable, List, Optional, Set, Sequence from pyroaring import BitMap # pylint: disable=no-name-in-module @@ -210,7 +210,7 @@ class Element(Plugin): context: "Context", project: "Project", load_element: "LoadElement", - plugin_conf: Dict[str, Any], + plugin_conf: Optional[str], *, artifact_key: str = None, ): @@ -2857,7 +2857,7 @@ class Element(Plugin): # # Normal element initialization procedure. # - def __initialize_from_yaml(self, load_element: "LoadElement", plugin_conf: Dict[str, Any]): + def __initialize_from_yaml(self, load_element: "LoadElement", plugin_conf: Optional[str]): context = self._get_context() project = self._get_project()
