| import os | |
| import importlib | |
| import pkgutil | |
| def discover_injectors(): | |
| injectors = {} | |
| package_dir = os.path.dirname(__file__) | |
| for _, module_name, is_pkg in pkgutil.iter_modules([package_dir]): | |
| if is_pkg or module_name.startswith('_'): | |
| continue | |
| full_module_name = f"chain_injectors.{module_name}" | |
| try: | |
| module = importlib.import_module(full_module_name) | |
| if hasattr(module, 'inject') and callable(module.inject): | |
| feature_name = getattr(module, 'FEATURE_NAME', None) | |
| if not feature_name: | |
| feature_name = module_name[:-9] if module_name.endswith('_injector') else module_name | |
| chain_type = getattr(module, 'CHAIN_TYPE', None) | |
| if not chain_type: | |
| chain_type = f"dynamic_{feature_name}_chains" | |
| injectors[chain_type] = module.inject | |
| else: | |
| print(f"Warning: Module '{full_module_name}' does not have a callable 'inject' function.") | |
| except Exception as e: | |
| print(f"Error importing injector module '{full_module_name}': {e}") | |
| return injectors | |
| def get_registered_features(): | |
| features = {} | |
| package_dir = os.path.dirname(__file__) | |
| for _, module_name, is_pkg in pkgutil.iter_modules([package_dir]): | |
| if is_pkg or module_name.startswith('_'): | |
| continue | |
| feature_name = module_name[:-9] if module_name.endswith('_injector') else module_name | |
| full_module_name = f"chain_injectors.{module_name}" | |
| chain_type = f"dynamic_{feature_name}_chains" | |
| features[feature_name] = { | |
| 'module': full_module_name, | |
| 'chain_type': chain_type | |
| } | |
| return features | |