Files
Creepybits-ComfyUI-Creepy_n…/assets/nodes/CustomNodeManager.py
T

72 lines
2.8 KiB
Python

import os
import ast
import importlib.util
import sys
import json
import inspect #Needed
class CustomNodeManager:
def __init__(self):
self.custom_nodes_dir = os.path.dirname(os.path.abspath(__file__))
@classmethod
def INPUT_TYPES(s):
return {"required": { "scan_mode": (["Validate Python", "Check Libraries"],),
"directory": ("STRING", {"default": ""}),
"scan": ("BOOLEAN", {"default": True})}}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("node_info",)
FUNCTION = "get_node_info"
CATEGORY = "Creepybits/Utilities"
def get_node_info(self, scan_mode, directory, scan):
if directory:
directory_to_scan = directory
else:
directory_to_scan = self.custom_nodes_dir
node_info = {}
for filename in os.listdir(directory_to_scan):
if filename.endswith(".py") and filename != "__init__.py":
try:
filepath = os.path.join(directory_to_scan, filename)
module_name = os.path.splitext(filename)[0]
spec = importlib.util.spec_from_file_location(module_name, filepath)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
valid = False
if scan_mode == "Validate Python":
valid_py = hasattr(module, "NODE_CLASS_MAPPINGS")
if valid_py:
node_info[filename] = f"Name {filename} is valid!"
else:
node_info[filename] = f"Name {filename} invalid. Missing attribute mappings"
elif scan_mode == "Check Libraries":
source_code = inspect.getsource(module)
tree = ast.parse(source_code)
imported_modules = []
for node in ast.walk(tree):
if isinstance(node, (ast.Import, ast.ImportFrom)):
for alias in node.names:
imported_modules.append(alias.name)
if imported_modules:
node_info[filename] = f"File {filename} imports {imported_modules}"
except Exception as e:
node_info[filename] = f"Error processing {filename}: {e}"
output_string = json.dumps(node_info, indent=4)
return (output_string,)
NODE_CLASS_MAPPINGS = {
"CustomNodeManager": CustomNodeManager
}
NODE_DISPLAY_NAME_MAPPINGS = {
"CustomNodeManager": "Custom Node Manager (Creepybits)"
}