68 lines
2.6 KiB
Python
68 lines
2.6 KiB
Python
# utils/script_registry.py
|
|
from typing import Dict, Callable, List, Optional
|
|
import importlib
|
|
import inspect
|
|
import os
|
|
from pathlib import Path
|
|
from config.profile_manager import Profile, ProfileManager
|
|
|
|
class ScriptRegistry:
|
|
"""Registry for script operations"""
|
|
|
|
def __init__(self):
|
|
self.operations: Dict[str, Callable] = {}
|
|
self.descriptions: Dict[str, str] = {}
|
|
|
|
def register(self, name: str, operation: Callable, description: str = ""):
|
|
"""Register a new operation"""
|
|
self.operations[name] = operation
|
|
self.descriptions[name] = description
|
|
|
|
def auto_discover(self, scripts_dir: str = "scripts"):
|
|
"""Auto-discover scripts in the scripts directory"""
|
|
scripts_path = Path(__file__).parent.parent / scripts_dir
|
|
|
|
for file in scripts_path.glob("script_*.py"):
|
|
module_name = f"{scripts_dir}.{file.stem}"
|
|
try:
|
|
module = importlib.import_module(module_name)
|
|
|
|
# Look for main function and docstring
|
|
if hasattr(module, 'main'):
|
|
name = file.stem.replace('script_', '')
|
|
description = module.__doc__ or ""
|
|
self.register(name, module.main, description)
|
|
|
|
except Exception as e:
|
|
print(f"Error loading script {file}: {e}")
|
|
|
|
def get_operations(self) -> List[tuple]:
|
|
"""Get list of available operations"""
|
|
return [(name, self.descriptions[name]) for name in self.operations]
|
|
|
|
def run_operation(self, name: str, profile: Optional[Profile] = None, **kwargs):
|
|
"""
|
|
Run a registered operation
|
|
|
|
Args:
|
|
name: Name of the operation to run
|
|
profile: Current profile instance (optional)
|
|
**kwargs: Additional arguments for the operation
|
|
"""
|
|
if name in self.operations:
|
|
# Prepare arguments
|
|
operation = self.operations[name]
|
|
sig = inspect.signature(operation)
|
|
|
|
# Check if operation accepts profile parameter
|
|
call_args = {}
|
|
if 'profile' in sig.parameters:
|
|
call_args['profile'] = profile
|
|
|
|
# Add other kwargs that match the signature
|
|
for param_name in sig.parameters:
|
|
if param_name in kwargs:
|
|
call_args[param_name] = kwargs[param_name]
|
|
|
|
return operation(**call_args)
|
|
raise ValueError(f"Unknown operation: {name}") |