o
    yAf;                     @   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mZmZmZmZ ddlmZ 		dd	d	d	d	d	d
dd
dd	ddd
d	dd
d	d	d	d
dddZeZeed
d	dZed	d
d	d
d	d	d	d	dd	d	d	d	dddZd
d	d	dddZd
d	dddZd	S )z]
These are keyword-only APIs that call `attr.s` and `attr.ib` with different
default values.
    )partial   )setters)asdict)astuple)NOTHING_frozen_setattrs_ng_default_on_setattrattribattrs)UnannotatedAttributeErrorNTF)thesereprunsafe_hashhashinitslotsfrozenweakref_slotstrauto_attribskw_only
cache_hashauto_exceqorderauto_detectgetstate_setstate
on_setattrfield_transformer
match_argsc                   sV   	
fdd fdd}| du r'|S || S )a  
    Define an *attrs* class.

    Differences to the classic `attr.s` that it uses underneath:

    - Automatically detect whether or not *auto_attribs* should be `True` (c.f.
      *auto_attribs* parameter).
    - Converters and validators run when attributes are set by default -- if
      *frozen* is `False`.
    - *slots=True*

      .. caution::

         Usually this has only upsides and few visible effects in everyday
         programming. But it *can* lead to some surprising behaviors, so please
         make sure to read :term:`slotted classes`.
    - *auto_exc=True*
    - *auto_detect=True*
    - *order=False*
    - Some options that were only relevant on Python 2 or were kept around for
      backwards-compatibility have been removed.

    Please note that these are all defaults and you can change them as you
    wish.

    :param Optional[bool] auto_attribs: If set to `True` or `False`, it behaves
       exactly like `attr.s`. If left `None`, `attr.s` will try to guess:

       1. If any attributes are annotated and no unannotated `attrs.fields`\ s
          are found, it assumes *auto_attribs=True*.
       2. Otherwise it assumes *auto_attribs=False* and tries to collect
          `attrs.fields`\ s.

    For now, please refer to `attr.s` for the rest of the parameters.

    .. versionadded:: 20.1.0
    .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``.
    .. versionadded:: 22.2.0
       *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance).
    c                    s   t di d| dddddddd	d
d|d	ddddd dddddd
S )N	maybe_clsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zcollect_by_mroTr   r   r   r     )r   )clsr   )r   r   r   r   r   r   r   r   r   r   r    r   r   r   r   r   r   r   r   r"   3/usr/lib/python3.10/site-packages/attr/_next_gen.pydo_itY   sZ   	
zdefine.<locals>.do_itc                    s   dt jfv}du rdu rt| jD ]}|jtu r(|r#d}t|t j nq dur2|  S z| dW S  tyF   | d Y S w )z
        Making this a wrapper ensures this code runs during class creation.

        We also ensure that frozen-ness of classes is inherited.
        NFz@Frozen classes can't use on_setattr (frozen-ness was inherited).T)r   ZNO_OPr	   	__bases____setattr__r   
ValueErrorr   )r#   Zhad_on_setattrZbase_clsmsg)r   r%   r   r   r"   r$   wraps   s$   


zdefine.<locals>.wrapNr"   )r!   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r*   r"   )r   r   r   r   r%   r   r   r   r   r   r   r   r    r   r   r   r   r   r   r   r   r$   define   s
   0A#r+   )r   r   default	validatorr   r   r   metadatatype	converterfactoryr   r   r   r   aliasc                 C   s$   t | |||||||||	|
|||dS )a  
    Identical to `attr.ib`, except keyword-only and with some arguments
    removed.

    .. versionadded:: 23.1.0
       The *type* parameter has been re-added; mostly for `attrs.make_class`.
       Please note that type checkers ignore this metadata.
    .. versionadded:: 20.1.0
    r,   )r
   r,   r"   r"   r$   field   s    r4   )recursefiltervalue_serializerc                C   s   t | |||ddS )z
    Same as `attr.asdict`, except that collections types are always retained
    and dict is always used as *dict_factory*.

    .. versionadded:: 21.3.0
    T)instr5   r6   r7   retain_collection_types)_asdict)r8   r5   r6   r7   r"   r"   r$   r      s   r   )r5   r6   c                C   s   t | ||ddS )z
    Same as `attr.astuple`, except that collections types are always retained
    and `tuple` is always used as the *tuple_factory*.

    .. versionadded:: 21.3.0
    T)r8   r5   r6   r9   )_astuple)r8   r5   r6   r"   r"   r$   r      s   r   )N)__doc__	functoolsr    r   Z_funcsr   r:   r   r;   _maker   r   r	   r
   r   
exceptionsr   r+   Zmutabler   r4   r"   r"   r"   r$   <module>   sd    ,