# src/haive/core/graph/node/registry.py"""Node registry for managing and accessing nodes.This module provides a registry for node configurations, allowing nodes to beregistered, looked up, and managed throughout the application."""importbuiltinsimportloggingfromhaive.core.graph.node.configimportNodeConfigfromhaive.core.graph.node.typesimportNodeTypefromhaive.core.registry.baseimportAbstractRegistrylogger=logging.getLogger(__name__)
[docs]classNodeRegistry(AbstractRegistry[NodeConfig]):"""Registry for node configurations and types. This registry keeps track of all registered node configurations and implements the AbstractRegistry interface from the Haive framework. It provides methods for: - Registering node configurations - Looking up nodes by ID, name, or type - Listing all nodes or nodes of a specific type - Registering custom node types """_instance=None
[docs]@classmethoddefget_instance(cls)->"NodeRegistry":"""Get the singleton instance of the registry."""ifcls._instanceisNone:cls._instance=cls()returncls._instance
[docs]def__init__(self)->None:"""Initialize the registry with empty storage."""self.nodes_by_id:dict[str,NodeConfig]={}self.nodes_by_type:dict[NodeType,dict[str,NodeConfig]]={node_type:{}fornode_typeinNodeType}self.custom_node_types:dict[str,type[NodeConfig]]={}
[docs]defregister(self,item:NodeConfig)->NodeConfig:"""Register a node configuration. Args: item: Node configuration to register Returns: The registered node configuration """self.nodes_by_id[item.id]=itemself.nodes_by_type[item.node_type][item.name]=itemlogger.debug(f"Registered node config: {item.name} (id: {item.id})")returnitem
[docs]defget(self,item_type:NodeType,name:str)->NodeConfig|None:"""Get a node configuration by type and name. Args: item_type: Node type name: Node name Returns: Node configuration if found, None otherwise """returnself.nodes_by_type[item_type].get(name)
[docs]deffind_by_id(self,id:str)->NodeConfig|None:"""Find a node configuration by ID. Args: id: Node ID Returns: Node configuration if found, None otherwise """returnself.nodes_by_id.get(id)
[docs]deffind_by_name(self,name:str)->NodeConfig|None:"""Find a node configuration by name (searches all types). Args: name: Node name Returns: Node configuration if found, None otherwise """fornode_typeinNodeType:ifnode_config:=self.get(node_type,name):returnnode_configreturnNone
[docs]deflist(self,item_type:NodeType)->list[str]:"""List all node names of a specific type. Args: item_type: Node type Returns: List of node names """returnlist(self.nodes_by_type[item_type].keys())
[docs]defget_all(self,item_type:NodeType)->dict[str,NodeConfig]:"""Get all nodes of a specific type. Args: item_type: Node type Returns: Dictionary mapping node names to configurations """returnself.nodes_by_type[item_type]
[docs]deflist_all_names(self)->builtins.list[str]:"""List all registered node names across all types. Returns: List of all node names """names=[]fornode_typeinNodeType:names.extend(self.list(node_type))returnnames
[docs]defregister_custom_node_type(self,name:str,config_class:type[NodeConfig])->None:"""Register a custom node configuration class. Args: name: Name of the custom node type config_class: Custom NodeConfig class """self.custom_node_types[name]=config_classlogger.debug(f"Registered custom node type: {name}")
[docs]defclear(self)->None:"""Clear all registrations."""self.nodes_by_id={}self.nodes_by_type={node_type:{}fornode_typeinNodeType}self.custom_node_types={}