feat: add ProjectSource config-only node

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-19 11:30:43 +01:00
parent fb007920ee
commit 628b256981
2 changed files with 58 additions and 0 deletions
+26
View File
@@ -207,11 +207,37 @@ class ProjectLoaderDynamic:
return (total_sequences,) + tuple(results) return (total_sequences,) + tuple(results)
class ProjectSource:
"""Config-only node — holds project connection settings, no outputs."""
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"manager_url": ("STRING", {"default": "http://localhost:8080", "multiline": False}),
"project_name": ("STRING", {"default": "", "multiline": False}),
"file_name": ("STRING", {"default": "", "multiline": False}),
"sequence_number": ("INT", {"default": 1, "min": 1, "max": 9999}),
"label": ("STRING", {"default": "source", "multiline": False}),
},
}
RETURN_TYPES = ()
RETURN_NAMES = ()
FUNCTION = "hold_config"
CATEGORY = "utils/json/project"
OUTPUT_NODE = True
def hold_config(self, manager_url, project_name, file_name, sequence_number, label):
return ()
# --- Mappings --- # --- Mappings ---
PROJECT_NODE_CLASS_MAPPINGS = { PROJECT_NODE_CLASS_MAPPINGS = {
"ProjectLoaderDynamic": ProjectLoaderDynamic, "ProjectLoaderDynamic": ProjectLoaderDynamic,
"ProjectSource": ProjectSource,
} }
PROJECT_NODE_DISPLAY_NAME_MAPPINGS = { PROJECT_NODE_DISPLAY_NAME_MAPPINGS = {
"ProjectLoaderDynamic": "Project Loader (Dynamic)", "ProjectLoaderDynamic": "Project Loader (Dynamic)",
"ProjectSource": "Project Source",
} }
+32
View File
@@ -203,6 +203,38 @@ class TestProjectLoaderDynamic:
assert ProjectLoaderDynamic.CATEGORY == "utils/json/project" assert ProjectLoaderDynamic.CATEGORY == "utils/json/project"
class TestProjectSource:
def test_input_types(self):
from project_loader import ProjectSource
inputs = ProjectSource.INPUT_TYPES()
assert "manager_url" in inputs["required"]
assert "project_name" in inputs["required"]
assert "file_name" in inputs["required"]
assert "sequence_number" in inputs["required"]
assert "label" in inputs["required"]
def test_no_outputs(self):
from project_loader import ProjectSource
assert ProjectSource.RETURN_TYPES == ()
assert ProjectSource.RETURN_NAMES == ()
def test_hold_config_returns_empty(self):
from project_loader import ProjectSource
node = ProjectSource()
result = node.hold_config(
manager_url="http://localhost:8080",
project_name="proj1",
file_name="batch_i2v",
sequence_number=1,
label="my_source"
)
assert result == ()
def test_category(self):
from project_loader import ProjectSource
assert ProjectSource.CATEGORY == "utils/json/project"
class TestNodeMappings: class TestNodeMappings:
def test_mappings_exist(self): def test_mappings_exist(self):
from project_loader import PROJECT_NODE_CLASS_MAPPINGS, PROJECT_NODE_DISPLAY_NAME_MAPPINGS from project_loader import PROJECT_NODE_CLASS_MAPPINGS, PROJECT_NODE_DISPLAY_NAME_MAPPINGS