Source code for tooluniverse.build_optimizer

"""Build optimization utilities for ToolUniverse tools."""

import json
import hashlib
from pathlib import Path
from typing import Dict, Any, Set, Tuple


[docs] def calculate_tool_hash(tool_config: Dict[str, Any]) -> str: """Calculate a hash for tool configuration to detect changes.""" # Create a normalized version of the config for hashing normalized_config = {} for key, value in sorted(tool_config.items()): if key not in ["timestamp", "last_updated", "created_at"]: normalized_config[key] = value config_str = json.dumps(normalized_config, sort_keys=True, separators=(",", ":")) return hashlib.md5(config_str.encode("utf-8")).hexdigest()
[docs] def load_metadata(metadata_file: Path) -> Dict[str, str]: """Load tool metadata from file.""" if not metadata_file.exists(): return {} try: with open(metadata_file, "r", encoding="utf-8") as f: return json.load(f) except (json.JSONDecodeError, IOError): return {}
[docs] def save_metadata(metadata: Dict[str, str], metadata_file: Path) -> None: """Save tool metadata to file.""" metadata_file.parent.mkdir(parents=True, exist_ok=True) with open(metadata_file, "w", encoding="utf-8") as f: json.dump(metadata, f, indent=2, sort_keys=True)
[docs] def cleanup_orphaned_files(tools_dir: Path, current_tool_names: Set[str]) -> int: """Remove files for tools that no longer exist.""" if not tools_dir.exists(): return 0 cleaned_count = 0 keep_files = {"__init__", "_shared_client", "__pycache__"} for file_path in tools_dir.iterdir(): if ( file_path.is_file() and file_path.suffix == ".py" and file_path.stem not in keep_files and file_path.stem not in current_tool_names ): print(f"🗑️ Removing orphaned tool file: {file_path.name}") file_path.unlink() cleaned_count += 1 return cleaned_count
[docs] def get_changed_tools( current_tools: Dict[str, Any], metadata_file: Path ) -> Tuple[list, list, list]: """Get lists of new, changed, and unchanged tools.""" old_metadata = load_metadata(metadata_file) new_metadata = {} new_tools = [] changed_tools = [] unchanged_tools = [] for tool_name, tool_config in current_tools.items(): current_hash = calculate_tool_hash(tool_config) new_metadata[tool_name] = current_hash old_hash = old_metadata.get(tool_name) if old_hash is None: new_tools.append(tool_name) elif old_hash != current_hash: changed_tools.append(tool_name) else: unchanged_tools.append(tool_name) # Save updated metadata save_metadata(new_metadata, metadata_file) return new_tools, changed_tools, unchanged_tools