44import pkgutil
55
66# import inspect
7- from .core .base import PIPELINE_REGISTRY , ProcessPipeline , ProcessResult
7+ from .core .base import (
8+ PIPELINE_REGISTRY ,
9+ MissingPipeline ,
10+ PipelineDescriptor ,
11+ ProcessPipeline ,
12+ ProcessResult ,
13+ )
814from .core .utils import write_combined_results_h5 , write_result_h5
915
1016
11- class MissingPipeline (ProcessPipeline ):
12- """Placeholder for pipelines whose dependencies are missing."""
13-
14- available = False
15- missing_deps : list [str ]
16- requires : list [str ]
17-
18- def __init__ (
19- self , name : str , description : str , missing_deps : list [str ], requires : list [str ]
20- ) -> None :
21- super ().__init__ ()
22- self .name = name
23- self .description = description or "Pipeline unavailable (missing dependencies)."
24- self .missing_deps = missing_deps
25- self .requires = requires
26-
27- def run (self , h5file ):
28- missing = ", " .join (
29- self .missing_deps or self .requires or ["unknown dependency" ]
30- )
31- raise ImportError (
32- f"Pipeline '{ self .name } ' unavailable. Missing dependencies: { missing } "
33- )
34-
35-
3617def _module_docstring (module_name : str ) -> str :
3718 spec = importlib .util .find_spec (module_name )
3819 if not spec or not spec .origin :
@@ -96,9 +77,9 @@ def _missing_requirements(requires: list[str]) -> list[str]:
9677 return missing
9778
9879
99- def _discover_pipelines () -> tuple [list [ProcessPipeline ], list [MissingPipeline ]]:
100- available : list [ProcessPipeline ] = []
101- missing : list [MissingPipeline ] = []
80+ def _discover_pipelines () -> tuple [list [PipelineDescriptor ], list [PipelineDescriptor ]]:
81+ available : list [PipelineDescriptor ] = []
82+ missing : list [PipelineDescriptor ] = []
10283 # seen_classes = set()
10384
10485 for module_info in pkgutil .iter_modules (__path__ ):
@@ -124,28 +105,32 @@ def _discover_pipelines() -> tuple[list[ProcessPipeline], list[MissingPipeline]]
124105 except Exception as e :
125106 # Fallback for unknown failures (SyntaxError, etc.)
126107 missing .append (
127- MissingPipeline (
128- module_info .name , f"Error: { e } " , ["Unknown" ], ["Unknown" ]
108+ PipelineDescriptor (
109+ name = module_info .name ,
110+ description = f"Import Error: { e } " ,
111+ available = False ,
112+ error_msg = str (e ),
129113 )
130114 )
131115
132116 for _name , cls in PIPELINE_REGISTRY .items ():
117+ desc = PipelineDescriptor (
118+ name = cls .name ,
119+ description = cls .description ,
120+ available = cls .available ,
121+ requires = cls .requires ,
122+ missing_deps = cls .missing_deps ,
123+ pipeline_cls = cls ,
124+ )
133125 if getattr (cls , "is_available" , True ):
134- inst = cls ()
126+ # inst = cls()
135127 # The GUI needs thoses values
136- inst .name = cls .name
137- inst .available = True
138- inst .requires = cls .required_deps
139- available .append (inst )
128+ # inst.name = cls.name
129+ # inst.available = True
130+ # inst.requires = cls.required_deps
131+ available .append (desc )
140132 else :
141- missing .append (
142- MissingPipeline (
143- name = getattr (cls , "name" , cls .__name__ ),
144- description = getattr (cls , "description" , "" ),
145- missing_deps = getattr (cls , "missing_deps" , []),
146- requires = getattr (cls , "required_deps" , []),
147- )
148- )
133+ missing .append (desc )
149134
150135 # except ImportError as exc:
151136 # # Capture missing dependency if ModuleNotFoundError has a name.
@@ -192,15 +177,23 @@ def _discover_pipelines() -> tuple[list[ProcessPipeline], list[MissingPipeline]]
192177 return available , missing
193178
194179
195- def load_all_pipelines (include_missing : bool = False ) -> list [ProcessPipeline ]:
196- """
197- Discover and instantiate pipelines. Optionally include placeholders for missing deps.
198- """
199- available , missing = _discover_pipelines ()
200- return available + missing if include_missing else available
180+ # def load_all_pipelines(
181+ # include_missing: bool = False,
182+ # ) -> list[type[ProcessPipeline] | MissingPipeline]:
183+ # """
184+ # Discover pipelines. Optionally include placeholders for missing deps.
185+ # """
186+ # available, missing = _discover_pipelines()
187+ # # Cast to a common list type for the type checker
188+ # combined: list[type[ProcessPipeline] | MissingPipeline] = list(available)
189+ # if include_missing:
190+ # combined.extend(missing)
191+ # return combined
201192
202193
203- def load_pipeline_catalog () -> tuple [list [ProcessPipeline ], list [MissingPipeline ]]:
194+ def load_pipeline_catalog () -> tuple [
195+ list [PipelineDescriptor ], list [PipelineDescriptor ]
196+ ]:
204197 """Return (available, missing) pipelines for UI/CLI surfaces."""
205198 return _discover_pipelines ()
206199
@@ -216,7 +209,7 @@ def load_pipeline_catalog() -> tuple[list[ProcessPipeline], list[MissingPipeline
216209 "ProcessResult" ,
217210 "write_result_h5" ,
218211 "write_combined_results_h5" ,
219- "load_all_pipelines" ,
212+ # "load_all_pipelines",
220213 "load_pipeline_catalog" ,
221214 "MissingPipeline" ,
222215 * [_cls .__name__ for _cls in (p .__class__ for p in _AVAILABLE )],
0 commit comments