Fail closed on definition references and sticky mappings

This commit is contained in:
2026-07-02 19:04:25 +02:00
parent 39b991800a
commit 1b56798018
2 changed files with 170 additions and 3 deletions
@@ -1169,6 +1169,52 @@ NODE_CLASS_MAPPINGS = {
self.assertEqual({}, result["nodes"])
self.assertEqual("no_static_nodes", result["pack"]["status"])
def test_input_types_default_referencing_return_types_skips_node(self):
source = '''
class DefaultReferencesReturnTypesInputNode:
RETURN_TYPES = ("IMAGE",)
@classmethod
def INPUT_TYPES(cls, value=RETURN_TYPES):
return {
"required": {
"image": ("IMAGE",),
},
}
NODE_CLASS_MAPPINGS = {
"DefaultReferencesReturnTypesInputNode": DefaultReferencesReturnTypesInputNode,
}
'''
result = self._extract_source(source, "default-references-return-types-input-pack")
self.assertEqual({}, result["nodes"])
self.assertEqual("no_static_nodes", result["pack"]["status"])
def test_input_types_return_annotation_referencing_input_types_skips_node(self):
source = '''
class AnnotationReferencesInputTypesNode:
RETURN_TYPES = ("IMAGE",)
@classmethod
def INPUT_TYPES(cls) -> INPUT_TYPES:
return {
"required": {
"image": ("IMAGE",),
},
}
NODE_CLASS_MAPPINGS = {
"AnnotationReferencesInputTypesNode": AnnotationReferencesInputTypesNode,
}
'''
result = self._extract_source(source, "annotation-references-input-types-pack")
self.assertEqual({}, result["nodes"])
self.assertEqual("no_static_nodes", result["pack"]["status"])
def test_decorated_input_types_skips_node(self):
source = '''
def replace(fn):
@@ -2163,6 +2209,37 @@ NODE_CLASS_MAPPINGS = build_mappings()
self.assertEqual({}, result["nodes"])
self.assertEqual("no_static_nodes", result["pack"]["status"])
def test_dynamic_node_class_mapping_assignment_stays_invalid_after_static_reassignment(self):
source = '''
def build_mappings():
return {"StickyDynamicMappingNode": StickyDynamicMappingNode}
class StickyDynamicMappingNode:
RETURN_TYPES = ("IMAGE",)
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"image": ("IMAGE",),
},
}
NODE_CLASS_MAPPINGS = {
"StickyDynamicMappingNode": StickyDynamicMappingNode,
}
NODE_CLASS_MAPPINGS = build_mappings()
NODE_CLASS_MAPPINGS = {
"StickyDynamicMappingNode": StickyDynamicMappingNode,
}
'''
result = self._extract_source(source, "sticky-dynamic-mapping-pack")
self.assertEqual({}, result["nodes"])
self.assertEqual("no_static_nodes", result["pack"]["status"])
def test_rebound_node_class_name_skips_static_mapping(self):
source = '''
def build_node():
@@ -3719,6 +3796,40 @@ NODE_DISPLAY_NAME_MAPPINGS = build_displays()
self.assertEqual({}, result["nodes"])
self.assertEqual("no_static_nodes", result["pack"]["status"])
def test_dynamic_display_mapping_assignment_stays_invalid_after_static_reassignment(self):
source = '''
def build_displays():
return {"StickyDisplayInvalidatedNode": "Dynamic Display"}
class StickyDisplayInvalidatedNode:
RETURN_TYPES = ("IMAGE",)
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"image": ("IMAGE",),
},
}
NODE_CLASS_MAPPINGS = {
"StickyDisplayInvalidatedNode": StickyDisplayInvalidatedNode,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"StickyDisplayInvalidatedNode": "Stale Display",
}
NODE_DISPLAY_NAME_MAPPINGS = build_displays()
NODE_DISPLAY_NAME_MAPPINGS = {
"StickyDisplayInvalidatedNode": "Recovered Display",
}
'''
result = self._extract_source(source, "sticky-display-invalidated-pack")
self.assertEqual({}, result["nodes"])
self.assertEqual("no_static_nodes", result["pack"]["status"])
def test_non_string_display_mapping_value_skips_node(self):
source = '''
class NonStringDisplayValueNode: