o
    "“iÏ  ã                   @  s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZ dd	lmZmZmZ d
dlmZmZmZmZmZmZmZ d
dl m!Z! er`d
dl"m#Z# ddgZ$d/dd„Z%dddœd0d d„Z&e&Z'd1d&d'„Z(d2d,d-„Z)d.S )3z.Utilities for union (sum type) disambiguation.é    )Úannotations)Údefaultdict)ÚMapping)ÚMISSING)Úreduce)Úor_)ÚTYPE_CHECKINGÚAnyÚCallableÚLiteralÚUnionÚ
get_origin)ÚNOTHINGÚ	AttributeÚAttrsInstanceé   )ÚNoneTypeÚadapted_fieldsÚfields_dictÚget_argsÚhasÚ
is_literalÚis_union_type)ÚAttributeOverride)ÚBaseConverterÚcreate_default_dis_funcÚis_supported_unionÚtypr	   ÚreturnÚboolc                 C  s   t | ƒotdd„ | jD ƒƒS )z<Whether the type is a union of attrs classes or dataclasses.c                 s  s(   � | ]}|t u ptt|ƒp|ƒV  qd S ©N)r   r   r   )Ú.0Úe© r#   úU/var/www/html/premium_crap/venv/lib/python3.10/site-packages/cattrs/disambiguators.pyÚ	<genexpr>!   s   € 
ÿz%is_supported_union.<locals>.<genexpr>)r   ÚallÚ__args__)r   r#   r#   r$   r      s   ÿTÚfrom_converter)Úuse_literalsÚ	overridesÚ	converterr   Úclassesútype[AttrsInstance]r)   r*   ú8dict[str, AttributeOverride] | Literal['from_converter']ú/Callable[[Mapping[Any, Any]], type[Any] | None]c                  sF  t |ƒdk r
tdƒ‚ˆdkr‡fdd„|D ƒ‰n	‡fdd„|D ƒ‰|r¤dd„ |D ƒ}|d }|D ]}||M }q0d	}d	‰ |D ]@}ttƒ}	|D ]‰tttˆƒpNˆƒ| jƒD ]	}
|	|
  ˆ¡ qTqE|d	u syt	d
d„ |	 
¡ D ƒƒt	d
d„ | 
¡ D ƒƒkr}|	}|‰ q=|r¤ˆ r¤t	dd„ | 
¡ D ƒƒt |ƒkr¤dd„ | ¡ D ƒ‰d ‡ ‡fdd„}|S dd„ t|ˆƒD ƒ}i ‰|jdd„ dd� d	‰|D ]M\‰}}‡‡fdd„|D ƒ}ttdd„ |D ƒtƒ ƒ}|| }ttˆƒpâˆƒ}|D ]}|| }|| jttfv r÷ nqæˆd	u rÿˆ‰q½tˆ› d�ƒ‚ˆˆ|< q½ˆd	u �rd!‡fdd„}|S d!‡‡fdd„}|S )"a~  Given attrs classes or dataclasses, generate a disambiguation function.

    The function is based on unique fields without defaults or unique values.

    :param use_literals: Whether to try using fields annotated as literals for
        disambiguation.
    :param overrides: Attribute overrides to apply.

    .. versionchanged:: 24.1.0
        Dataclasses are now supported.
    é   zAt least two classes required.r(   c                   s   g | ]}t ˆ  |¡d i ƒ‘qS ©r*   )ÚgetattrÚget_structure_hook)r!   Úc)r+   r#   r$   Ú
<listcomp>=   s    ÿz+create_default_dis_func.<locals>.<listcomp>c                   s   g | ]}ˆ ‘qS r#   r#   )r!   Ú_r1   r#   r$   r5   A   s    c                 S  s&   g | ]}d d„ t t|ƒp|ƒD ƒ‘qS )c                 S  s   h | ]
}t |jƒr|j’qS r#   )r   ÚtypeÚname)r!   Úatr#   r#   r$   Ú	<setcomp>I   s    ýÿz5create_default_dis_func.<locals>.<listcomp>.<setcomp>)r   r   )r!   Úclr#   r#   r$   r5   H   s    ûþÿr   Nc                 s  ó   � | ]}t |ƒV  qd S r    ©Úlen©r!   Úvr#   r#   r$   r%   b   ó   € z*create_default_dis_func.<locals>.<genexpr>c                 s  r<   r    r=   r?   r#   r#   r$   r%   k   rA   c                 S  s2   i | ]\}}|t |ƒd kr|d ntt|ƒ “qS )r   r   )r>   r   Útuple)r!   Úkr@   r#   r#   r$   Ú
<dictcomp>m   s     ÿÿz+create_default_dis_func.<locals>.<dictcomp>ÚdataúMapping[Any, Any]r   útype | Nonec                   s   t | tƒs	tdƒ‚ˆ| ˆ   S )Nz"Only input mappings are supported.)Ú
isinstancer   Ú
ValueError)rE   )Úbest_discriminatorÚfinal_mappingr#   r$   Údis_funcr   s   
z)create_default_dis_func.<locals>.dis_funcc                 S  s"   g | ]\}}|gt ||ƒ¢R ‘qS r#   )Ú_usable_attribute_names)r!   r;   Úoverrider#   r#   r$   r5   }   s    ÿÿc                 S  s   t | d ƒS )Nr   r=   )Úc_ar#   r#   r$   Ú<lambda>†   s    z)create_default_dis_func.<locals>.<lambda>T)ÚkeyÚreversec                   s,   g | ]}|d  ˆ ur|d  ˆ  ¡ vr|‘qS )r   )Úvalues)r!   Úc_and_a)r;   Úuniq_attrs_dictr#   r$   r5   �   s
    þc                 s  s   � | ]}|d  V  qdS )r   Nr#   )r!   rO   r#   r#   r$   r%   ’   rA   z% has no usable non-default attributesútype[AttrsInstance] | Nonec                   s<   t | tƒs	tdƒ‚ˆ  ¡ D ]\}}|| v r|  S qtdƒ‚)Nú!Only input mappings are supportedzCouldn't disambiguate©rH   r   rI   Úitems©rE   rC   r@   )rU   r#   r$   rL   ¤   s   
ÿc                   s8   t | tƒs	tdƒ‚ˆ ¡ D ]\}}|| v r|  S qˆ S )NrW   rX   rZ   )ÚfallbackrU   r#   r$   rL   ®   s   
ÿ)rE   rF   r   rG   )rE   rF   r   rV   )r>   rI   r   Úlistr   r   r   r7   ÚappendÚmaxrS   rY   ÚzipÚsortr   r   ÚsetÚdefaultr   r   Ú	TypeError)r+   r)   r*   r,   Úcls_candidatesÚdiscriminatorsÚpossible_discriminatorsÚbest_resultÚdiscriminatorÚmappingrQ   rL   Úcls_and_attrsÚcl_reqsÚback_mapÚother_classesÚ
other_reqsÚuniqÚ	cl_fieldsÚmaybe_renamed_attr_nameÚ	orig_namer#   )rJ   r;   r+   r[   rK   r*   rU   r$   r   &   sˆ   
ÿú

ÿý$
ÿ€ÿþþþþÿ

ør9   r   rN   úAttributeOverride | NoneÚstrc                 C  s   |d u s	|j d u r| jS |j S r    )Úrenamer8   )r9   rN   r#   r#   r$   Ú_overriden_name¼   s   rv   r;   ú	type[Any]údict[str, AttributeOverride]útuple[set[str], dict[str, str]]c                 C  sN   t ƒ }i }tt| ƒp| ƒD ]}| t|| |j¡ƒ }¡ |j||< q||fS )z<Return renamed fields and a mapping to original field names.)ra   r   r   Úaddrv   Úgetr8   )r;   r*   Úresri   r9   Únr#   r#   r$   rM   Â   s   rM   N)r   r	   r   r   )
r+   r   r,   r-   r)   r   r*   r.   r   r/   )r9   r   rN   rs   r   rt   )r;   rw   r*   rx   r   ry   )*Ú__doc__Ú
__future__r   Úcollectionsr   Úcollections.abcr   Údataclassesr   Ú	functoolsr   Úoperatorr   Útypingr   r	   r
   r   r   r   Úattrsr   r   r   Ú_compatr   r   r   r   r   r   r   Úgenr   Ú
convertersr   Ú__all__r   r   Úcreate_uniq_field_dis_funcrv   rM   r#   r#   r#   r$   Ú<module>   s,     $	

ú 
