From 3bc40d6250439ec6f1f91a0331495ce36e397462 Mon Sep 17 00:00:00 2001 From: "Lex Darlog (DRL)" <3897975+Lex-DRL@users.noreply.github.com> Date: Sat, 20 Sep 2025 01:31:05 +0500 Subject: [PATCH] `enums`: v3 + validators --- _io_enum.py | 28 ++++++++++++++++++++++++++++ enums.py | 30 ++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 _io_enum.py diff --git a/_io_enum.py b/_io_enum.py new file mode 100644 index 0000000..1505f68 --- /dev/null +++ b/_io_enum.py @@ -0,0 +1,28 @@ +# encoding: utf-8 +""" +Pre-defined combo-inputs for Node-v3, shared between nodes. +""" + +from comfy_api.latest import io as _io + +from .enums import * +from .docstring_formatter import format_object_docstring as _format_object_docstring + + +res_priority_in = _io.Combo.Input( + 'priority', options=RoundingPriority.all_values(), + default=RoundingPriority.ORIGINAL, + tooltip=_format_object_docstring(RoundingPriority), +) +res_priority_out = _io.Combo.Output( + # In v3 schema, IDs must be unique between BOTH lists: inputs and outputs, so uppercase ID + `display_name`: + 'PRIORITY', display_name='priority', options=RoundingPriority.all_values(), +) + +crop_pad_strategy_in = _io.Combo.Input( + 'strategy', options=UpscaledCropPadStrategy.all_values(), + default=UpscaledCropPadStrategy.PAD, tooltip=_format_object_docstring(UpscaledCropPadStrategy) +) +crop_pad_strategy_out = _io.Combo.Output( + 'STRATEGY', display_name='strategy', options=UpscaledCropPadStrategy.all_values(), +) diff --git a/enums.py b/enums.py index da1422a..24f0ac7 100644 --- a/enums.py +++ b/enums.py @@ -1,10 +1,8 @@ # encoding: utf-8 """ -Internal enums. +Internal enums: option choices, shared between nodes. """ -import typing as _t - try: from enum import StrEnum as _StrEnum except ImportError: @@ -13,9 +11,13 @@ except ImportError: class __BaseEnum(_StrEnum): @classmethod - def all_values(cls) -> _t.Tuple[str, ...]: + def all_values(cls) -> tuple[str, ...]: return tuple(x.value for x in cls) + @classmethod + def validate(cls, value) -> str: + raise NotImplementedError + class RoundingPriority(__BaseEnum): """ @@ -35,6 +37,16 @@ class RoundingPriority(__BaseEnum): ORIGINAL = 'original' UPSCALED = 'upscaled' + @classmethod + def validate(cls, value) -> str: + if value not in _res_priority_values_set: + raise ValueError(f"Invalid value for resolution priority: {value!r}\nExpected one of: {_res_priority_values!r}") + return str(value) + + +_res_priority_values = RoundingPriority.all_values() +_res_priority_values_set = set(RoundingPriority.all_values()) + class UpscaledCropPadStrategy(__BaseEnum): """ @@ -55,3 +67,13 @@ class UpscaledCropPadStrategy(__BaseEnum): CROP = 'crop only' NEAREST = 'nearest' EXACT_UPSCALE = 'exact-upscale' + + @classmethod + def validate(cls, value) -> str: + if value not in _up_strategy_values_set: + raise ValueError(f"Invalid value for upscale strategy: {value!r}\nExpected one of: {_up_strategy_values!r}") + return str(value) + + +_up_strategy_values = UpscaledCropPadStrategy.all_values() +_up_strategy_values_set = set(UpscaledCropPadStrategy.all_values())