fix: node registry
This commit is contained in:
		
							
								
								
									
										37
									
								
								__init__.py
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								__init__.py
									
									
									
									
									
								
							@@ -1,37 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
# Core components
 | 
					 | 
				
			||||||
from core.vork_node import VorkNode
 | 
					 | 
				
			||||||
from core.vork_node_link import VorkNodeLink
 | 
					 | 
				
			||||||
from core.vork_node_start import VorkNodeStart
 | 
					 | 
				
			||||||
from core.vork_node_registry import VorkNodeRegistry
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Node implementations
 | 
					 | 
				
			||||||
from nodes.vork_node_if import VorkNodeIf
 | 
					 | 
				
			||||||
from nodes.vork_node_switch import VorkNodeSwitch
 | 
					 | 
				
			||||||
from nodes.vork_node_set import VorkNodeSet
 | 
					 | 
				
			||||||
from nodes.vork_node_wait import VorkNodeWait
 | 
					 | 
				
			||||||
from nodes.vork_node_listen import VorkNodeListen
 | 
					 | 
				
			||||||
from nodes.vork_node_trigger import VorkNodeTrigger
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Utility functions
 | 
					 | 
				
			||||||
from utils.link_name_generator import edge_title_generator, edge_title_to_number
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
__all__ = [
 | 
					 | 
				
			||||||
    # Core
 | 
					 | 
				
			||||||
    "VorkNode",
 | 
					 | 
				
			||||||
    "VorkNodeLink",
 | 
					 | 
				
			||||||
    "VorkNodeStart",
 | 
					 | 
				
			||||||
    "VorkNodeRegistry",
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Nodes
 | 
					 | 
				
			||||||
    "VorkNodeIf",
 | 
					 | 
				
			||||||
    "VorkNodeSwitch",
 | 
					 | 
				
			||||||
    "VorkNodeSet",
 | 
					 | 
				
			||||||
    "VorkNodeWait",
 | 
					 | 
				
			||||||
    "VorkNodeListen",
 | 
					 | 
				
			||||||
    "VorkNodeTrigger",
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Utils
 | 
					 | 
				
			||||||
    "edge_title_generator",
 | 
					 | 
				
			||||||
    "edge_title_to_number",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
@@ -2,6 +2,7 @@ from .vork_node import VorkNode
 | 
				
			|||||||
from .vork_node_registry import VorkNodeRegistry
 | 
					from .vork_node_registry import VorkNodeRegistry
 | 
				
			||||||
from .vork_node_link import VorkNodeLink
 | 
					from .vork_node_link import VorkNodeLink
 | 
				
			||||||
from .vork_node_start import VorkNodeStart
 | 
					from .vork_node_start import VorkNodeStart
 | 
				
			||||||
 | 
					from .link_name_generator import edge_title_generator, edge_title_to_number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__version__ = "0.1.0"
 | 
					__version__ = "0.1.0"
 | 
				
			||||||
__author__ = "Your Name"
 | 
					__author__ = "Your Name"
 | 
				
			||||||
@@ -11,4 +12,6 @@ __all__ = [
 | 
				
			|||||||
    "VorkNodeRegistry",
 | 
					    "VorkNodeRegistry",
 | 
				
			||||||
    "VorkNodeLink",
 | 
					    "VorkNodeLink",
 | 
				
			||||||
    "VorkNodeStart",
 | 
					    "VorkNodeStart",
 | 
				
			||||||
 | 
					    "edge_title_generator",
 | 
				
			||||||
 | 
					    "edge_title_to_number",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@ from typing import Dict, Any
 | 
				
			|||||||
from model_nodes import VorkNodeLinkData, VorkNodeLinkSchema
 | 
					from model_nodes import VorkNodeLinkData, VorkNodeLinkSchema
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from utils.link_name_generator import edge_title_generator, edge_title_to_number
 | 
					from .link_name_generator import edge_title_generator, edge_title_to_number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VorkNodeLink:
 | 
					class VorkNodeLink:
 | 
				
			||||||
@@ -57,12 +57,9 @@ class VorkNodeLink:
 | 
				
			|||||||
                # Перевалидируем данные
 | 
					                # Перевалидируем данные
 | 
				
			||||||
                validated_data = self.validate_data()
 | 
					                validated_data = self.validate_data()
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                last_link_number =  self.get_link_number(validated_data.last_link_name)
 | 
					                # Если имя уже указано, оставляем его как есть
 | 
				
			||||||
                new_link_name = self.generate_link_name(last_link_number+1)
 | 
					                # (не пытаемся преобразовать произвольные имена в номера)
 | 
				
			||||||
                # Обновляем данные с новым именем
 | 
					                pass
 | 
				
			||||||
                self.data['last_link_name'] = new_link_name
 | 
					 | 
				
			||||||
                # Перевалидируем данные
 | 
					 | 
				
			||||||
                validated_data = self.validate_data()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Создаем схему с валидированными данными
 | 
					            # Создаем схему с валидированными данными
 | 
				
			||||||
            return VorkNodeLinkSchema(
 | 
					            return VorkNodeLinkSchema(
 | 
				
			||||||
@@ -80,5 +77,7 @@ class VorkNodeLink:
 | 
				
			|||||||
        """
 | 
					        """
 | 
				
			||||||
        Валидирует данные связи
 | 
					        Валидирует данные связи
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Returns:
 | 
				
			||||||
 | 
					            VorkNodeLinkData: Валидированные данные
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        return VorkNodeLinkData(**self.data)
 | 
					        return VorkNodeLinkData(**self.data)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import importlib
 | 
					import importlib
 | 
				
			||||||
import inspect
 | 
					import inspect
 | 
				
			||||||
import os
 | 
					import pkgutil
 | 
				
			||||||
from typing import Dict, Type, Optional
 | 
					from typing import Dict, Type, Optional, List
 | 
				
			||||||
from .vork_node import VorkNode
 | 
					from .vork_node import VorkNode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -9,6 +9,8 @@ class VorkNodeRegistry:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self):
 | 
				
			||||||
        self.registry: Dict[str, Type[VorkNode]] = {}
 | 
					        self.registry: Dict[str, Type[VorkNode]] = {}
 | 
				
			||||||
 | 
					        # Автоматически сканируем пакет 'nodes' при создании
 | 
				
			||||||
 | 
					        self._auto_discover_nodes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_all(self) -> Dict[str, Type[VorkNode]]:
 | 
					    def get_all(self) -> Dict[str, Type[VorkNode]]:
 | 
				
			||||||
        return self.registry.copy()
 | 
					        return self.registry.copy()
 | 
				
			||||||
@@ -16,27 +18,6 @@ class VorkNodeRegistry:
 | 
				
			|||||||
    def get(self, node_type: str) -> Optional[Type[VorkNode]]:
 | 
					    def get(self, node_type: str) -> Optional[Type[VorkNode]]:
 | 
				
			||||||
        return self.registry.get(node_type)
 | 
					        return self.registry.get(node_type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def auto_discover_from_directory(self, directory_path: str, package_name: str = None) -> None:
 | 
					 | 
				
			||||||
        if not os.path.exists(directory_path):
 | 
					 | 
				
			||||||
            print(f"Директория {directory_path} не существует")
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for filename in os.listdir(directory_path):
 | 
					 | 
				
			||||||
            if filename.endswith('.py') and not filename.startswith('__'):
 | 
					 | 
				
			||||||
                module_name = filename[:-3]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if package_name:
 | 
					 | 
				
			||||||
                    full_module_name = f"{package_name}.{module_name}"
 | 
					 | 
				
			||||||
                else:
 | 
					 | 
				
			||||||
                    full_module_name = module_name
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                try:
 | 
					 | 
				
			||||||
                    module = importlib.import_module(full_module_name)
 | 
					 | 
				
			||||||
                    self._discover_in_module(module)
 | 
					 | 
				
			||||||
                except ImportError as e:
 | 
					 | 
				
			||||||
                    print(f"Ошибка импорта модуля {full_module_name}: {e}")
 | 
					 | 
				
			||||||
                except Exception as e:
 | 
					 | 
				
			||||||
                    print(f"Ошибка при сканировании модуля {full_module_name}: {e}")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _discover_in_module(self, module) -> None:
 | 
					    def _discover_in_module(self, module) -> None:
 | 
				
			||||||
        for name, obj in inspect.getmembers(module):
 | 
					        for name, obj in inspect.getmembers(module):
 | 
				
			||||||
@@ -51,5 +32,41 @@ class VorkNodeRegistry:
 | 
				
			|||||||
                except Exception as e:
 | 
					                except Exception as e:
 | 
				
			||||||
                    print(f"Ошибка при получении ID для {obj.__name__}: {e}")
 | 
					                    print(f"Ошибка при получении ID для {obj.__name__}: {e}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _auto_discover_nodes(self) -> None:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Автоматически обнаруживает все VorkNode классы в пакете 'nodes'
 | 
				
			||||||
 | 
					        Вызывается автоматически при создании реестра
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            package = importlib.import_module('nodes')
 | 
				
			||||||
 | 
					            package_path = getattr(package, '__path__', None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if package_path:
 | 
				
			||||||
 | 
					                # Сканируем все модули в пакете nodes
 | 
				
			||||||
 | 
					                for importer, modname, ispkg in pkgutil.iter_modules(package_path, "nodes."):
 | 
				
			||||||
 | 
					                    try:
 | 
				
			||||||
 | 
					                        module = importlib.import_module(modname)
 | 
				
			||||||
 | 
					                        self._discover_in_module(module)
 | 
				
			||||||
 | 
					                    except Exception as e:
 | 
				
			||||||
 | 
					                        print(f"Ошибка при сканировании модуля {modname}: {e}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        except ImportError as e:
 | 
				
			||||||
 | 
					            print(f"Ошибка импорта пакета 'nodes': {e}")
 | 
				
			||||||
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            print(f"Ошибка при сканировании пакета 'nodes': {e}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_available_node_types(self) -> List[str]:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Возвращает список всех доступных типов узлов
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Returns:
 | 
				
			||||||
 | 
					            List[str]: Список типов узлов
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return list(self.registry.keys())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def clear(self) -> None:
 | 
					    def clear(self) -> None:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Очищает реестр и повторно сканирует пакет 'nodes'
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
        self.registry.clear()
 | 
					        self.registry.clear()
 | 
				
			||||||
 | 
					        self._auto_discover_nodes()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,15 @@ from .node_if_models import (
 | 
				
			|||||||
    IfNodeDescriptor
 | 
					    IfNodeDescriptor
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Экспорты для моделей узла start
 | 
				
			||||||
 | 
					from .node_start_models import (
 | 
				
			||||||
 | 
					    StartNodeData,
 | 
				
			||||||
 | 
					    StartNodeLinks,
 | 
				
			||||||
 | 
					    StartNodeCoreSchema,
 | 
				
			||||||
 | 
					    StartNodeCoreSchemaData,
 | 
				
			||||||
 | 
					    StartNodeDescriptor
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Экспорты для моделей связей между узлами
 | 
					# Экспорты для моделей связей между узлами
 | 
				
			||||||
from .node_link_models import (
 | 
					from .node_link_models import (
 | 
				
			||||||
    VorkNodeLinkData,
 | 
					    VorkNodeLinkData,
 | 
				
			||||||
@@ -35,6 +44,13 @@ __all__ = [
 | 
				
			|||||||
    "IfNodeCoreSchemaData",
 | 
					    "IfNodeCoreSchemaData",
 | 
				
			||||||
    "IfNodeDescriptor",
 | 
					    "IfNodeDescriptor",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Start node models
 | 
				
			||||||
 | 
					    "StartNodeData",
 | 
				
			||||||
 | 
					    "StartNodeLinks",
 | 
				
			||||||
 | 
					    "StartNodeCoreSchema",
 | 
				
			||||||
 | 
					    "StartNodeCoreSchemaData",
 | 
				
			||||||
 | 
					    "StartNodeDescriptor",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Node link models
 | 
					    # Node link models
 | 
				
			||||||
    "VorkNodeLinkData",
 | 
					    "VorkNodeLinkData",
 | 
				
			||||||
    "VorkNodeLinkSchema"
 | 
					    "VorkNodeLinkSchema"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,6 @@ packages = [
 | 
				
			|||||||
    { include = "core" },
 | 
					    { include = "core" },
 | 
				
			||||||
    { include = "nodes" },
 | 
					    { include = "nodes" },
 | 
				
			||||||
    { include = "model_nodes" },
 | 
					    { include = "model_nodes" },
 | 
				
			||||||
    { include = "utils" },
 | 
					 | 
				
			||||||
    { include = "orm" }
 | 
					    { include = "orm" }
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +0,0 @@
 | 
				
			|||||||
# Utils package initialization
 | 
					 | 
				
			||||||
from .link_name_generator import edge_title_generator, edge_title_to_number
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
__all__ = [
 | 
					 | 
				
			||||||
    "edge_title_generator",
 | 
					 | 
				
			||||||
    "edge_title_to_number"
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user