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