From 78b6466b14981da8d54d818f2d869856bfb380d7 Mon Sep 17 00:00:00 2001 From: TheNoxium Date: Thu, 11 Sep 2025 17:30:17 +0500 Subject: [PATCH] fix: node registry --- __init__.py | 37 --------------- core/__init__.py | 3 ++ {utils => core}/link_name_generator.py | 0 core/vork_node_link.py | 13 +++--- core/vork_node_registry.py | 63 ++++++++++++++++---------- model_nodes/__init__.py | 16 +++++++ pyproject.toml | 1 - utils/__init__.py | 7 --- 8 files changed, 65 insertions(+), 75 deletions(-) delete mode 100644 __init__.py rename {utils => core}/link_name_generator.py (100%) delete mode 100644 utils/__init__.py diff --git a/__init__.py b/__init__.py deleted file mode 100644 index edfae70..0000000 --- a/__init__.py +++ /dev/null @@ -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", -] diff --git a/core/__init__.py b/core/__init__.py index d2de8fc..073ab2e 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -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", ] diff --git a/utils/link_name_generator.py b/core/link_name_generator.py similarity index 100% rename from utils/link_name_generator.py rename to core/link_name_generator.py diff --git a/core/vork_node_link.py b/core/vork_node_link.py index 71f512d..c023cfa 100644 --- a/core/vork_node_link.py +++ b/core/vork_node_link.py @@ -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) diff --git a/core/vork_node_registry.py b/core/vork_node_registry.py index d4d4611..43a27d6 100644 --- a/core/vork_node_registry.py +++ b/core/vork_node_registry.py @@ -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() diff --git a/model_nodes/__init__.py b/model_nodes/__init__.py index 52312e6..92f4ea6 100644 --- a/model_nodes/__init__.py +++ b/model_nodes/__init__.py @@ -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" diff --git a/pyproject.toml b/pyproject.toml index c98942d..a093d66 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,6 @@ packages = [ { include = "core" }, { include = "nodes" }, { include = "model_nodes" }, - { include = "utils" }, { include = "orm" } ] diff --git a/utils/__init__.py b/utils/__init__.py deleted file mode 100644 index 67cc224..0000000 --- a/utils/__init__.py +++ /dev/null @@ -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" -]