fix: node registry

This commit is contained in:
TheNoxium
2025-09-11 17:30:17 +05:00
parent d9a67a3d8e
commit 78b6466b14
8 changed files with 65 additions and 75 deletions

View File

@@ -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",
]

View File

@@ -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",
] ]

View File

@@ -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)

View File

@@ -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()

View File

@@ -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"

View File

@@ -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" }
] ]

View File

@@ -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"
]