/ src / python / txtai / pipeline / factory.py
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