
    +j1              
           d dl mZmZmZmZ ddlZddlmZ ddlm	Z	m
Z
 dddeded	ed
e
e	         fdZ G d d          Z G d d          Zd ZdefdZd Zded
efdZ G d de          ZddZd Zd ZdS )   )ComfyAPIBaseComfyAPIWithVersionregister_versionsget_all_versions    N)asdict)CallableOptional)baseclsnamer   returnc                J   |3t          | d          st          d          |                                 }t          ||d          }|dS |j        }|                                 D ]<}||u r n5||j        v r+t          ||          j        }||urt          | |          c S =dS )zReturn the *callable* override of `name` visible on `cls`, or None if every
    implementation up to (and including) `base` is the placeholder defined on `base`.

    If base is not provided, it will assume cls has a GET_BASE_CLASS
    NGET_BASE_CLASSz[base is required if cls does not have a GET_BASE_CLASS; is this a valid ComfyNode subclass?)hasattr
ValueErrorr   getattr__func__mro__dict__)r   r   r   	base_attr	base_funccfuncs          ;/home/wildlama/comfy/ComfyUI/comfy_api/internal/__init__.pyfirst_real_overrider      s     |s,-- 	|z{{{!!##dD))It"IWWYY * *99E1:1d##,D9$$sD)))))4    c                   (    e Zd ZdZed             ZdS )_ComfyNodeInternalzClass that all V3-based APIs inherit from for ComfyNode.

    This is intended to only be referenced within execution.py, as it has to handle all V3 APIs going forward.c                     d S N )r   s    r   GET_NODE_INFO_V1z#_ComfyNodeInternal.GET_NODE_INFO_V1*   s    r   N)__name__
__module____qualname____doc__classmethodr#   r"   r   r   r   r   &   s;        r r   [  r   r   c                       e Zd ZdZdS )_NodeOutputInternalzClass that all V3-based APIs inherit from for NodeOutput.

    This is intended to only be referenced within execution.py, as it has to handle all V3 APIs going forward.N)r$   r%   r&   r'   r"   r   r   r*   r*   /   s        r r Cr   r*   c                 :    t          t          |                     S )z8Return dict of dataclass object with pruned None values.)
prune_dictr   )dataclass_objs    r   as_pruned_dictr.   6   s    f]++,,,r   dc                 >    d |                                  D             S )Nc                     i | ]
\  }}|||S r!   r"   .0kvs      r   
<dictcomp>zprune_dict.<locals>.<dictcomp>;   s    777SQqAqr   )items)r/   s    r   r,   r,   :   s    77AGGII7777r   c                 ,    t          | t                    S )zT
    Returns True if is a class type.
    Returns False if is a class instance.
    )
isinstancetype)objs    r   is_classr<   >   s    
 c4   r   c                     | dS d | j                                         D             }t          | j        | f|          }| j        |_        | j        |_        |S )z*
    Copy a class and its attributes.
    Nc                 "    i | ]\  }}|d v	||S ))r   __weakref__r%   r'   r"   r2   s      r   r6   zcopy_class.<locals>.<dictcomp>L   s4     
 
 
QLLL qLLLr   )r   r7   r:   r$   r%   r'   )r   cls_dictnew_clss      r   
copy_classrB   F   sr     {t
 
 \//11
 
 
H
 	 G GkGONr   c                       e Zd Zd Zd ZdS )classpropertyc                     || _         d S r!   f)selfrG   s     r   __init__zclassproperty.__init__]   s    r   c                 ,    |                      |          S r!   rF   )rH   r;   owners      r   __get__zclassproperty.__get___   s    vve}}r   N)r$   r%   r&   rI   rL   r"   r   r   rD   rD   \   s2              r   rD   c                 v    |p	| j          d}| f| j        z   }t          ||t          | j                            S )zG
    Shallow clone a class while preserving super() functionality.
    Clone)r$   	__bases__r:   dictr   )r   new_name	new_basess      r   shallow_clone_classrS   d   sC     1cl111H&I)T#,%7%7888r   c                     d } G d dt          |                     }t          | j                  }||d<    || j        | j        |          S )zJ
    Lock a class so that its top-levelattributes cannot be modified.
    c                 P    t          d| dt          |           j                   )NzCannot set attribute 'z' on immutable instance of )AttributeErrorr:   r$   )rH   r   values      r   locked_instance_setattrz+lock_class.<locals>.locked_instance_setattrs   s0    [T[[d4jjFY[[
 
 	
r   c                       e Zd Zd ZdS )lock_class.<locals>.LockedMetac                 8    t          d| d| j         d          )NzCannot modify class attribute 'z' on locked class '')rV   r$   )cls_r   rW   s      r   __setattr__z*lock_class.<locals>.LockedMeta.__setattr__y   s,     [$[[4=[[[  r   N)r$   r%   r&   r^   r"   r   r   
LockedMetarZ   x   s#        	 	 	 	 	r   r_   r^   )r:   rP   r   r$   rO   )r   rX   r_   locked_dicts       r   
lock_classra   n   st    

 
 

    T#YY    s|$$K!8K:clCM;???r   c                     t          |          t          | |          j        t          j                  rfd}|S fd}|S )z
    Returns a function that, when called with **inputs, will execute:
    getattr(type_obj, func).__func__(lock_class(class_clone), **inputs)

    Supports both synchronous and asynchronous methods.
    c                  &   K    fi |  d {V S r!   r"   inputslocked_classmethods    r   wrapped_async_funcz3make_locked_method_func.<locals>.wrapped_async_func   s1      77777777777r   c                       fi | S r!   r"   rd   s    r   wrapped_funcz-make_locked_method_func.<locals>.wrapped_func   s    6,11&111r   )ra   r   r   asyncioiscoroutinefunction)type_objr   class_clonerh   rj   rf   rg   s        @@r   make_locked_method_funcro      s     k**LXt$$-F "6** 	8 	8 	8 	8 	8 	8!!	2 	2 	2 	2 	2 	2r   r!   )api_registryr   r   r   r   rk   dataclassesr   typingr	   r
   r:   strr   r   r*   r.   rP   r,   r<   rB   objectrD   rS   ra   ro   r"   r   r   <module>ru      s                     % % % % % % % % =A   T  t XhEW    0              - - -8$ 8 8 8 8! ! !D T    ,    F   9 9 9 9@ @ @,    r   