factory.py
1 """ 2 Pipeline factory module 3 """ 4 5 import inspect 6 import sys 7 import types 8 9 from ..util import Resolver 10 11 from .base import Pipeline 12 13 14 class PipelineFactory: 15 """ 16 Pipeline factory. Creates new Pipeline instances. 17 """ 18 19 @staticmethod 20 def get(pipeline): 21 """ 22 Gets a new instance of pipeline class. 23 24 Args: 25 pclass: Pipeline instance class 26 27 Returns: 28 Pipeline class 29 """ 30 31 # Local pipeline if no package 32 if "." not in pipeline: 33 return PipelineFactory.list()[pipeline] 34 35 # Attempt to load custom pipeline 36 return Resolver()(pipeline) 37 38 @staticmethod 39 def create(config, pipeline): 40 """ 41 Creates a new Pipeline instance. 42 43 Args: 44 config: Pipeline configuration 45 pipeline: Pipeline instance class 46 47 Returns: 48 Pipeline 49 """ 50 51 # Resolve pipeline 52 pipeline = PipelineFactory.get(pipeline) 53 54 # Return functions directly, otherwise create pipeline instance 55 return pipeline if isinstance(pipeline, types.FunctionType) else pipeline(**config) 56 57 @staticmethod 58 def list(): 59 """ 60 Lists callable pipelines. 61 62 Returns: 63 {short name: pipeline class} 64 """ 65 66 pipelines = {} 67 68 # Get handle to pipeline module 69 pipeline = sys.modules[".".join(__name__.split(".")[:-1])] 70 71 # Get list of callable pipelines 72 for x in inspect.getmembers(pipeline, inspect.isclass): 73 if issubclass(x[1], Pipeline) and [y for y, _ in inspect.getmembers(x[1], inspect.isfunction) if y == "__call__"]: 74 # short name: pipeline class 75 pipelines[x[0].lower()] = x[1] 76 77 return pipelines