o
    tf                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZ er>d dlZd dlZd dlmZ d dlmZ G dd deZeedee
e ZG d	d
 d
ZdZee d dlmZ W d   n1 sow   Y  dZee d dlmZ W d   n1 sw   Y  G dd dZed7ddZed8ddZd8ddZed9ddZ ed:ddZ d;d dZ ed<d"d#Z!ed=d%d#Z!d=d&d#Z!ed>d(d)Z"ed?d+d)Z"d?d,d)Z"d@d/d0Z#	1dAdBd5d6Z$dS )C    )annotationsN)TYPE_CHECKINGAnyIteratorListProtocolcastoverload)	BaseModel)	TypeGuardc                   @  s>   e Zd ZU ded< ded< ded< ded< ded< ded< dS )	_DataclassParamsboolinitrepreqorderunsafe_hashfrozenN__name__
__module____qualname____annotations__ r   r   a/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/psygnal/_dataclass_utils.pyr      s   
 r   GenericAliasc                   @  s   e Zd ZU ded< dS )	AttrsTypeztuple[attrs.Attribute, ...]__attrs_attrs__Nr   r   r   r   r   r      s   
 r   __dataclass_params__)_DATACLASS_PARAMS__dataclass_fields__)_DATACLASS_FIELDSc                   @  s   e Zd ZU ded< ded< dS )DataClassTyper   r   zdict[str, dataclasses.Field]r    Nr   r   r   r   r   r"   (   s   
 r"   objtypereturnTypeGuard[type[DataClassType]]c                 C     d S Nr   r#   r   r   r   is_dataclass-      r*   objectTypeGuard[DataClassType]c                 C  r'   r(   r   r)   r   r   r   r*   1   r+   c                 C  s*   t | trt | ts| nt| }t|tS )z)Return True if the object is a dataclass.)
isinstancer$   r   hasattrr!   )r#   clsr   r   r   r*   5   s   
TypeGuard[type[AttrsType]]c                 C  r'   r(   r   r)   r   r   r   is_attrs_class?   r+   r2   TypeGuard[AttrsType]c                 C  r'   r(   r   r)   r   r   r   r2   C   r+   c                 C  s:   t jdd}t| tr| nt| }|dur||S dS )z+Return True if the class is an attrs class.attrNF)sysmodulesgetr.   r$   has)r#   r4   r0   r   r   r   r2   G   s   TypeGuard[type[BaseModel]]c                 C  r'   r(   r   r)   r   r   r   is_pydantic_modelN   r+   r:   TypeGuard[BaseModel]c                 C  r'   r(   r   r)   r   r   r   r:   R   r+   c                 C  8   t jdd}t| tr| nt| }|duot||jS )z1Return True if the class is a pydantic BaseModel.pydanticN)r5   r6   r7   r.   r$   
issubclassr
   )r#   r=   r0   r   r   r   r:   V      TypeGuard[type[msgspec.Struct]]c                 C  r'   r(   r   r)   r   r   r   is_msgspec_struct]   r+   rA   TypeGuard[msgspec.Struct]c                 C  r'   r(   r   r)   r   r   r   rA   a   r+   c                 C  r<   )z/Return True if the class is a `msgspec.Struct`.msgspecN)r5   r6   r7   r.   r$   r>   Struct)r#   rC   r0   r   r   r   rA   e   r?   r   r   c                 C  s   t | tr| nt| }tdt|td}|dur|jS t|dd}|dur/t|dddu r/dS t|dd}|dur@|dr@dS t|jd	dd
krKdS t|dd}|dur]tt|ddS dS )z$Return True if the object is frozen.z_DataclassParams | NoneNZ
__config__allow_mutationFTZmodel_configr   r   _frozen_setattrsZ__struct_config__)	r.   r$   r   getattrr   r   r7   __setattr__r   )r#   r0   paramscfgr   r   r   	is_frozenl   s    rK   Tr0   exclude_frozen!Iterator[tuple[str, type | None]]c           
      c  s   t | dd }dur!| D ]}|jtju r|j|jfV  qdS t| rXt| drA| j	
 D ]\}}|jr8|s>||jfV  q/dS | j D ]}|jjsN|sU|j|jfV  qFdS t | dd }durp|D ]	}|j|jfV  qddS t| r| jD ]}| j|d}	||	fV  qwdS dS )a  Iterate over all fields in the class, including inherited fields.

    This function recognizes dataclasses, attrs classes, msgspec Structs, and pydantic
    models.

    Parameters
    ----------
    cls : type
        The class to iterate over.
    exclude_frozen : bool, optional
        If True, frozen fields will be excluded. By default True.

    Yields
    ------
    tuple[str, type | None]
        The name and type of each field.
    r    Nmodel_fieldsr   )rG   values_field_typedataclasses_FIELDnamer$   r:   r/   rN   itemsr   
annotationZ
__fields__Z
field_inforE   Zouter_type_rA   Z__struct_fields__r   r7   )
r0   rL   Zdclass_fieldsZd_field
field_nameZp_fieldZattrs_fieldsZa_fieldZm_fieldtype_r   r   r   iter_fields   s:   


rX   )r#   r$   r%   r&   )r#   r,   r%   r-   )r#   r$   r%   r1   )r#   r,   r%   r3   )r#   r,   r%   r1   )r#   r$   r%   r9   )r#   r,   r%   r;   )r#   r$   r%   r@   )r#   r,   r%   rB   )r#   r   r%   r   )T)r0   r$   rL   r   r%   rM   )%
__future__r   
contextlibrQ   r5   typestypingr   r   r   r   r   r   r	   attrsrC   r=   r
   Ztyping_extensionsr   r   rG   r$   intr   r   r   suppressImportErrorr!   r"   r*   r2   r:   rA   rK   rX   r   r   r   r   <module>   s\    $	





 