diff --git a/src/basic_data_handling/_dynamic_input.py b/src/basic_data_handling/_dynamic_input.py new file mode 100644 index 0000000..e02d69a --- /dev/null +++ b/src/basic_data_handling/_dynamic_input.py @@ -0,0 +1,32 @@ +class ContainsDynamicDict(dict): + """ + A custom dictionary that dynamically returns values for keys based on a pattern. + - If a key in the passed dictionary has a value with `{"_dynamic": "number"}` in the tuple's second position, + then any other key starting with the same string and ending with a number will return that value. + - For other keys, normal dictionary lookup behavior applies. + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Store prefixes associated with `_dynamic` values for efficient lookup + self._dynamic_prefixes = { + key.rstrip("0123456789"): value + for key, value in self.items() + if isinstance(value, tuple) and len(value) > 1 and value[1].get("_dynamic") == "number" + } + + def __contains__(self, key): + # Check if key matches a dynamically handled prefix or exists normally + return ( + any(key.startswith(prefix) and key[len(prefix):].isdigit() for prefix in self._dynamic_prefixes) + or super().__contains__(key) + ) + + def __getitem__(self, key): + # Dynamically return the value for keys matching a `prefix` pattern + print(f'_ dynamic prefixes: {self._dynamic_prefixes}; get key: {key}') + for prefix, value in self._dynamic_prefixes.items(): + if key.startswith(prefix) and key[len(prefix):].isdigit(): + return value + # Fallback to normal dictionary behavior for other keys + return super().__getitem__(key) diff --git a/src/basic_data_handling/boolean_nodes.py b/src/basic_data_handling/boolean_nodes.py index d7c0587..fa14134 100644 --- a/src/basic_data_handling/boolean_nodes.py +++ b/src/basic_data_handling/boolean_nodes.py @@ -1,4 +1,5 @@ from inspect import cleandoc + try: from comfy.comfy_types.node_typing import IO, ComfyNodeABC except: diff --git a/src/basic_data_handling/casting_nodes.py b/src/basic_data_handling/casting_nodes.py index 15c0b27..c9d76e7 100644 --- a/src/basic_data_handling/casting_nodes.py +++ b/src/basic_data_handling/casting_nodes.py @@ -1,6 +1,17 @@ from typing import Any from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class CastToBoolean(ComfyNodeABC): """ diff --git a/src/basic_data_handling/comparison_nodes.py b/src/basic_data_handling/comparison_nodes.py index e7cef2d..25e1a8b 100644 --- a/src/basic_data_handling/comparison_nodes.py +++ b/src/basic_data_handling/comparison_nodes.py @@ -1,6 +1,17 @@ from typing import Any from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class Equal(ComfyNodeABC): """ diff --git a/src/basic_data_handling/control_flow_nodes.py b/src/basic_data_handling/control_flow_nodes.py index 88f343d..99a931b 100644 --- a/src/basic_data_handling/control_flow_nodes.py +++ b/src/basic_data_handling/control_flow_nodes.py @@ -1,7 +1,19 @@ from typing import Any from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC -from comfy_execution.graph import ExecutionBlocker + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC + from comfy_execution.graph import ExecutionBlocker +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object + ExecutionBlocker = lambda x: x class IfElse(ComfyNodeABC): diff --git a/src/basic_data_handling/data_list_nodes.py b/src/basic_data_handling/data_list_nodes.py index 003461e..e074448 100644 --- a/src/basic_data_handling/data_list_nodes.py +++ b/src/basic_data_handling/data_list_nodes.py @@ -1,6 +1,17 @@ from typing import Any from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object INT_MAX = 2**15-1 # the computer can do more but be nice to the eyes diff --git a/src/basic_data_handling/dict_nodes.py b/src/basic_data_handling/dict_nodes.py index a23a17f..1198dcd 100644 --- a/src/basic_data_handling/dict_nodes.py +++ b/src/basic_data_handling/dict_nodes.py @@ -1,6 +1,17 @@ from typing import Any from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class DictCreate(ComfyNodeABC): diff --git a/src/basic_data_handling/float_nodes.py b/src/basic_data_handling/float_nodes.py index 3241ed8..0529883 100644 --- a/src/basic_data_handling/float_nodes.py +++ b/src/basic_data_handling/float_nodes.py @@ -1,5 +1,16 @@ from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class FloatCreate(ComfyNodeABC): diff --git a/src/basic_data_handling/int_nodes.py b/src/basic_data_handling/int_nodes.py index 9a9c52f..88e4413 100644 --- a/src/basic_data_handling/int_nodes.py +++ b/src/basic_data_handling/int_nodes.py @@ -1,6 +1,17 @@ from inspect import cleandoc from typing import Literal -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class IntCreate(ComfyNodeABC): diff --git a/src/basic_data_handling/list_nodes.py b/src/basic_data_handling/list_nodes.py index c645967..265fe11 100644 --- a/src/basic_data_handling/list_nodes.py +++ b/src/basic_data_handling/list_nodes.py @@ -1,6 +1,19 @@ from typing import Any from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object + +from ._dynamic_input import ContainsDynamicDict INT_MAX = 2**15-1 # the computer can do more but be nice to the eyes @@ -115,9 +128,9 @@ class ListCreateFromString(ComfyNodeABC): @classmethod def INPUT_TYPES(cls): return { - "optional": { + "optional": ContainsDynamicDict({ "item_0": (IO.STRING, {"_dynamic": "number"}), - } + }) } RETURN_TYPES = ("LIST",) diff --git a/src/basic_data_handling/math_formula_node.py b/src/basic_data_handling/math_formula_node.py index 62c4d04..957ffdc 100644 --- a/src/basic_data_handling/math_formula_node.py +++ b/src/basic_data_handling/math_formula_node.py @@ -1,5 +1,16 @@ from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class MathFormula(ComfyNodeABC): """ diff --git a/src/basic_data_handling/math_nodes.py b/src/basic_data_handling/math_nodes.py index 5c6a299..35ea0b6 100644 --- a/src/basic_data_handling/math_nodes.py +++ b/src/basic_data_handling/math_nodes.py @@ -1,7 +1,18 @@ import math from inspect import cleandoc from typing import Literal, Union -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class MathAbs(ComfyNodeABC): """ diff --git a/src/basic_data_handling/path_nodes.py b/src/basic_data_handling/path_nodes.py index f825683..3846f1f 100644 --- a/src/basic_data_handling/path_nodes.py +++ b/src/basic_data_handling/path_nodes.py @@ -1,7 +1,18 @@ from inspect import cleandoc import os import glob -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class PathAbspath(ComfyNodeABC): diff --git a/src/basic_data_handling/regex_nodes.py b/src/basic_data_handling/regex_nodes.py index 267b745..a6cef22 100644 --- a/src/basic_data_handling/regex_nodes.py +++ b/src/basic_data_handling/regex_nodes.py @@ -1,6 +1,17 @@ from inspect import cleandoc import re -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class RegexFindallDataList(ComfyNodeABC): """ diff --git a/src/basic_data_handling/set_nodes.py b/src/basic_data_handling/set_nodes.py index d642d2a..d1a72ed 100644 --- a/src/basic_data_handling/set_nodes.py +++ b/src/basic_data_handling/set_nodes.py @@ -1,6 +1,17 @@ from typing import Any from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class SetCreate(ComfyNodeABC): diff --git a/src/basic_data_handling/string_nodes.py b/src/basic_data_handling/string_nodes.py index 81e3f32..8e59d29 100644 --- a/src/basic_data_handling/string_nodes.py +++ b/src/basic_data_handling/string_nodes.py @@ -1,5 +1,16 @@ from inspect import cleandoc -from comfy.comfy_types.node_typing import IO, ComfyNodeABC + +try: + from comfy.comfy_types.node_typing import IO, ComfyNodeABC +except: + class IO: + BOOLEAN = "BOOLEAN" + INT = "INT" + FLOAT = "FLOAT" + STRING = "STRING" + NUMBER = "FLOAT,INT" + ANY = "*" + ComfyNodeABC = object class StringCapitalize(ComfyNodeABC): """Converts the first character of the input string to uppercase and all other characters to lowercase."""