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_link import VorkNodeLink
 | 
			
		||||
from .vork_node_start import VorkNodeStart
 | 
			
		||||
from .link_name_generator import edge_title_generator, edge_title_to_number
 | 
			
		||||
 | 
			
		||||
__version__ = "0.1.0"
 | 
			
		||||
__author__ = "Your Name"
 | 
			
		||||
@@ -11,4 +12,6 @@ __all__ = [
 | 
			
		||||
    "VorkNodeRegistry",
 | 
			
		||||
    "VorkNodeLink",
 | 
			
		||||
    "VorkNodeStart",
 | 
			
		||||
    "edge_title_generator",
 | 
			
		||||
    "edge_title_to_number",
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ from typing import Dict, Any
 | 
			
		||||
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:
 | 
			
		||||
@@ -57,12 +57,9 @@ class VorkNodeLink:
 | 
			
		||||
                # Перевалидируем данные
 | 
			
		||||
                validated_data = self.validate_data()
 | 
			
		||||
            else:
 | 
			
		||||
                last_link_number =  self.get_link_number(validated_data.last_link_name)
 | 
			
		||||
                new_link_name = self.generate_link_name(last_link_number+1)
 | 
			
		||||
                # Обновляем данные с новым именем
 | 
			
		||||
                self.data['last_link_name'] = new_link_name
 | 
			
		||||
                # Перевалидируем данные
 | 
			
		||||
                validated_data = self.validate_data()
 | 
			
		||||
                # Если имя уже указано, оставляем его как есть
 | 
			
		||||
                # (не пытаемся преобразовать произвольные имена в номера)
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
            # Создаем схему с валидированными данными
 | 
			
		||||
            return VorkNodeLinkSchema(
 | 
			
		||||
@@ -80,5 +77,7 @@ class VorkNodeLink:
 | 
			
		||||
        """
 | 
			
		||||
        Валидирует данные связи
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            VorkNodeLinkData: Валидированные данные
 | 
			
		||||
        """
 | 
			
		||||
        return VorkNodeLinkData(**self.data)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
import importlib
 | 
			
		||||
import inspect
 | 
			
		||||
import os
 | 
			
		||||
from typing import Dict, Type, Optional
 | 
			
		||||
import pkgutil
 | 
			
		||||
from typing import Dict, Type, Optional, List
 | 
			
		||||
from .vork_node import VorkNode
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +9,8 @@ class VorkNodeRegistry:
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self.registry: Dict[str, Type[VorkNode]] = {}
 | 
			
		||||
        # Автоматически сканируем пакет 'nodes' при создании
 | 
			
		||||
        self._auto_discover_nodes()
 | 
			
		||||
 | 
			
		||||
    def get_all(self) -> Dict[str, Type[VorkNode]]:
 | 
			
		||||
        return self.registry.copy()
 | 
			
		||||
@@ -16,27 +18,6 @@ class VorkNodeRegistry:
 | 
			
		||||
    def get(self, node_type: str) -> Optional[Type[VorkNode]]:
 | 
			
		||||
        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:
 | 
			
		||||
        for name, obj in inspect.getmembers(module):
 | 
			
		||||
@@ -51,5 +32,41 @@ class VorkNodeRegistry:
 | 
			
		||||
                except Exception as 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:
 | 
			
		||||
        """
 | 
			
		||||
        Очищает реестр и повторно сканирует пакет 'nodes'
 | 
			
		||||
        """
 | 
			
		||||
        self.registry.clear()
 | 
			
		||||
        self._auto_discover_nodes()
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,15 @@ from .node_if_models import (
 | 
			
		||||
    IfNodeDescriptor
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# Экспорты для моделей узла start
 | 
			
		||||
from .node_start_models import (
 | 
			
		||||
    StartNodeData,
 | 
			
		||||
    StartNodeLinks,
 | 
			
		||||
    StartNodeCoreSchema,
 | 
			
		||||
    StartNodeCoreSchemaData,
 | 
			
		||||
    StartNodeDescriptor
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# Экспорты для моделей связей между узлами
 | 
			
		||||
from .node_link_models import (
 | 
			
		||||
    VorkNodeLinkData,
 | 
			
		||||
@@ -35,6 +44,13 @@ __all__ = [
 | 
			
		||||
    "IfNodeCoreSchemaData",
 | 
			
		||||
    "IfNodeDescriptor",
 | 
			
		||||
 | 
			
		||||
    # Start node models
 | 
			
		||||
    "StartNodeData",
 | 
			
		||||
    "StartNodeLinks",
 | 
			
		||||
    "StartNodeCoreSchema",
 | 
			
		||||
    "StartNodeCoreSchemaData",
 | 
			
		||||
    "StartNodeDescriptor",
 | 
			
		||||
 | 
			
		||||
    # Node link models
 | 
			
		||||
    "VorkNodeLinkData",
 | 
			
		||||
    "VorkNodeLinkSchema"
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ packages = [
 | 
			
		||||
    { include = "core" },
 | 
			
		||||
    { include = "nodes" },
 | 
			
		||||
    { include = "model_nodes" },
 | 
			
		||||
    { include = "utils" },
 | 
			
		||||
    { 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