diff --git a/tests/test_generate_popular_node_signatures.py b/tests/test_generate_popular_node_signatures.py index 45842b0..957939d 100644 --- a/tests/test_generate_popular_node_signatures.py +++ b/tests/test_generate_popular_node_signatures.py @@ -1569,9 +1569,13 @@ NODE_CLASS_MAPPINGS = { self.assertEqual({}, result["nodes"]) self.assertEqual("no_static_nodes", result["pack"]["status"]) - def test_direct_literal_input_types_survives_post_class_env_changes(self): + def test_direct_literal_input_types_survives_post_class_literal_env_changes(self): source = ''' -INPUTS = build_inputs() +INPUTS = { + "required": { + "mask": ("MASK",), + }, +} class LiteralInputTypesAfterEnvChangeNode: @@ -1586,7 +1590,11 @@ class LiteralInputTypesAfterEnvChangeNode: } -INPUTS = build_inputs() +INPUTS = { + "required": { + "latent": ("LATENT",), + }, +} NODE_CLASS_MAPPINGS = { "LiteralInputTypesAfterEnvChangeNode": LiteralInputTypesAfterEnvChangeNode, @@ -1739,6 +1747,32 @@ NODE_CLASS_MAPPINGS = { self.assertEqual({}, result["nodes"]) self.assertEqual("no_static_nodes", result["pack"]["status"]) + def test_arbitrary_call_before_classmethod_decorator_skips_node(self): + source = ''' +mutate() + + +class MutatedClassmethodDecoratorNode: + RETURN_TYPES = ("IMAGE",) + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "image": ("IMAGE",), + }, + } + + +NODE_CLASS_MAPPINGS = { + "MutatedClassmethodDecoratorNode": MutatedClassmethodDecoratorNode, +} +''' + result = self._extract_source(source, "mutated-classmethod-decorator-pack") + + self.assertEqual({}, result["nodes"]) + self.assertEqual("no_static_nodes", result["pack"]["status"]) + def test_input_types_with_present_non_dict_sections_skips_node(self): source = ''' class InvalidInputSectionsNode: @@ -4465,6 +4499,31 @@ mutate() self.assertEqual({}, result["nodes"]) self.assertEqual("no_static_nodes", result["pack"]["status"]) + def test_assignment_arbitrary_call_before_node_mapping_skips_node(self): + source = ''' +class AssignmentCallBeforeMappingNode: + RETURN_TYPES = ("IMAGE",) + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "image": ("IMAGE",), + }, + } + + +x = mutate() + +NODE_CLASS_MAPPINGS = { + "AssignmentCallBeforeMappingNode": AssignmentCallBeforeMappingNode, +} +''' + result = self._extract_source(source, "assignment-call-before-mapping-pack") + + self.assertEqual({}, result["nodes"]) + self.assertEqual("no_static_nodes", result["pack"]["status"]) + def test_alias_arbitrary_call_invalidates_static_node_mapping(self): source = ''' class AliasArbitraryCallMappingNode: diff --git a/tools/generate_popular_node_signatures.py b/tools/generate_popular_node_signatures.py index a61757f..6c6d414 100644 --- a/tools/generate_popular_node_signatures.py +++ b/tools/generate_popular_node_signatures.py @@ -1054,9 +1054,8 @@ def _apply_module_stmt_to_env(stmt, env, class_bindings=None): _invalidate_env_name(env, name) if _has_arbitrary_call(stmt): env.clear() - if class_bindings is not None and not isinstance( - stmt, (ast.Assign, ast.AnnAssign, ast.AugAssign, ast.Delete) - ): + _invalidate_env_name(env, "classmethod") + if class_bindings is not None: class_bindings.clear() if isinstance(stmt, ast.ClassDef): if class_bindings is not None: