
    d%                         d dl mZmZmZmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZ d Z G d de          Z e            Zd Z G d d	ee
          Z G d de          ZdS )    )InvariantExceptionCheckedType_restore_picklestore_invariants)
set_fields
check_typeis_field_ignore_extra_complaintPFIELD_NO_INITIAL	serializecheck_global_invariants	transformc                 J    t          |           dk    o| d         t          k    S )N   r   )lenr   )basess    V/home/feoh/.local/pipx/venvs/poetry/lib/python3.11/site-packages/pyrsistent/_pclass.py
_is_pclassr      s     u::?6uQx;66    c                        e Zd Z fdZ xZS )
PClassMetac                 *   t          ||d           t          ||dd           dt          d |d         D                       z   |d<   t          |          r|dxx         dz  cc<   t	          t
          |                               | |||          S )	N_pclass_fields)name_pclass_invariants__invariant__)_pclass_frozenc              3      K   | ]}|V  d S N ).0keys     r   	<genexpr>z%PClassMeta.__new__.<locals>.<genexpr>   s"      6\6\ss6\6\6\6\6\6\r   	__slots__)__weakref__)r   r   tupler   superr   __new__)mcsr   r   dct	__class__s       r   r(   zPClassMeta.__new__   s    3$45555e%9?KKK.6\6\cJZF[6\6\6\1\1\\K e 	1 00Z%%--c4DDDr   )__name__
__module____qualname__r(   __classcell__r+   s   @r   r   r      sA        
E 
E 
E 
E 
E 
E 
E 
E 
Er   r   c                     t          | |||           |                    |          \  }}|s|                    |           d S t          |||           d S r   )r   	invariantappendsetattr)clsfieldr   valueresultinvariant_errorsis_ok
error_codes           r   _check_and_set_attrr<      sf    sE4'''..E: %
+++++e$$$$$r   c                        e Zd ZdZ fdZd Zedd            ZddZd Z	d	 Z
d
 Zd Z fdZd Zd Zd Zd Zd Zd Z xZS )PClassa  
    A PClass is a python class with a fixed set of specified fields. PClasses are declared as python classes inheriting
    from PClass. It is defined the same way that PRecords are and behaves like a PRecord in all aspects except that it
    is not a PMap and hence not a collection but rather a plain Python object.


    More documentation and examples of PClass usage is available at https://github.com/tobgu/pyrsistent
    c           	         t          t          |                               |           }|                    dd           }|                    dd           }g }g }| j                                        D ]\  }}||v rv|||v rPt          t          ||          r|                    ||         |          }	n$|                    ||                   }	n||         }	t          | |||	||           ||= |j	        t          urDt          |j	                  r|	                                n|j	        }
t          | |||
||           |j        r.|                    d                    | j        |                     	|s|r+t!          t#          |          t#          |          d          |r;t%          d                    d                    |          | j                            t)          || j                   d|_        |S )	N_factory_fieldsignore_extra)rA   z{0}.{1}zField invariant failedz0'{0}' are not among the specified fields for {1}, T)r'   r>   r(   popr   itemsr	   factoryr<   initialr
   callable	mandatoryr3   formatr,   r   r&   AttributeErrorjoinr   r   r   )r5   kwargsr8   factory_fieldsrA   missing_fieldsr9   r   r6   r7   rF   r+   s              r   r(   zPClass.__new__.   s"   vs##++C00$5t<<zz.$77-3355 	L 	LKD%v~~!)T^-C-C6vulSS < %fTl V V %fTl ; ;"4LE#CeVEUVVV4LL&777-5em-D-DW%--///%-#gv7GI I I I L%%i&6&6s|T&J&JKKK 	o~ 	o$U+;%<%<eN>S>SUmnnn 	2 !S!Z!Z		&!!3<"1 "1 2 2 2 	 (>??? $r   c                     |r|d         ||d         <   t          |          }| j        D ]*}||vr$t          | |t                    }|t          ur|||<   + | j        dd|i|S )a  
        Set a field in the instance. Returns a new instance with the updated value. The original instance remains
        unmodified. Accepts key-value pairs or single string representing the field name and a value.

        >>> from pyrsistent import PClass, field
        >>> class AClass(PClass):
        ...     x = field()
        ...
        >>> a = AClass(x=1)
        >>> a2 = a.set(x=2)
        >>> a3 = a.set('x', 3)
        >>> a
        AClass(x=1)
        >>> a2
        AClass(x=2)
        >>> a3
        AClass(x=3)
        r   r   r@   r    )setr   getattr_MISSING_VALUEr+   )selfargsrL   rM   r"   r7   s         r   rP   z
PClass.setR   s    &  	&"1gF47OV& 	( 	(C&  c>::.."'F3Kt~GGnGGGGr   NFc                 h    t          |           rS |rfd| j        D              | d||dS )a:  
        Factory method. Will create a new PClass of the current type and assign the values
        specified in kwargs.

        :param ignore_extra: A boolean which when set to True will ignore any keys which appear in kwargs that are not
                             in the set of fields on the PClass.
        c                 *    i | ]}|v ||         S r    r    )r!   krL   s     r   
<dictcomp>z!PClass.create.<locals>.<dictcomp>   s$    NNNq!v++a+++r   )r@   rA   r    )
isinstancer   )r5   rL   r@   rA   s    `  r   createzPClass.creater   s_     fc"" 	M 	ONNNNC,>NNNFsX?XXQWXXXr   c                     i }| j         D ]E}t          | |t                    }|t          ur$t          | j         |         j        ||          ||<   F|S )z
        Serialize the current PClass using custom serializer functions for fields where
        such have been supplied.
        )r   rQ   rR   r   
serializer)rS   rI   r8   r   r7   s        r   r   zPClass.serialize   s`    
 ' 	^ 	^DD$77EN**()<T)B)MvW\]]tr   c                 "    t          | |          S )aT  
        Apply transformations to the currency PClass. For more details on transformations see
        the documentation for PMap. Transformations on PClasses do not support key matching
        since the PClass is not a collection. Apart from that the transformations available
        for other persistent types work as expected.
        r   )rS   transformationss     r   r   zPClass.transform   s     ///r   c                     t          || j                  r=| j        D ]3}t          | |t                    t          ||t                    k    r dS 4dS t
          S )NFT)rY   r+   r   rQ   rR   NotImplemented)rS   otherr   s      r   __eq__zPClass.__eq__   se    eT^,, 	+ ! !4~66'%~:^:^^^ 55 _ 4r   c                     | |k     S r   r    )rS   ra   s     r   __ne__zPClass.__ne__   s    5=  r   c                 ^     t          t           fd j        D                                 S )Nc              3   H   K   | ]}|t          |t                    fV  d S r   )rQ   rR   r!   r"   rS   s     r   r#   z"PClass.__hash__.<locals>.<genexpr>   s4      cc3c> B BCccccccr   )hashr&   r   rS   s   `r   __hash__zPClass.__hash__   s1    EcccctObcccccdddr   c                     t          | dd          r#t          d                    ||                    t          t          |                               ||           d S )Nr   Fz'Can't set attribute, key={0}, value={1})rQ   rJ   rI   r'   r>   __setattr__rS   r"   r7   r+   s      r   rl   zPClass.__setattr__   s`    4)511 	_ !J!Q!QRUW\!]!]^^^fd''U33333r   c                 F    t          d                    |                    )Nz-Can't delete attribute, key={0}, use remove())rJ   rI   )rS   r"   s     r   __delattr__zPClass.__delattr__   s      !P!W!WX[!\!\]]]r   c                 f    i }| j         D ]&}t          | |t                    }|t          ur|||<   '|S r   )r   rQ   rR   )rS   r8   r"   r7   s       r   _to_dictzPClass._to_dict   sD    & 	$ 	$CD#~66EN**#sr   c                     d                     | j        j        d                    d |                                                                 D                                 S )Nz{0}({1})rB   c              3   b   K   | ]*\  }}d                      |t          |                    V  +dS )z{0}={1}N)rI   repr)r!   rW   vs      r   r#   z"PClass.__repr__.<locals>.<genexpr>   s<      *l*lDAq9+;+;AtAww+G+G*l*l*l*l*l*lr   )rI   r+   r,   rK   rq   rD   ri   s    r   __repr__zPClass.__repr__   s[      !8!%*l*lTXTaTaTcTcTiTiTkTk*l*l*l!l!ln n 	nr   c                 d     t           fd j        D                       }t           j        |ffS )Nc              3   \   K   | ]&}t          |          |t          |          fV  'd S r   )hasattrrQ   rg   s     r   r#   z$PClass.__reduce__.<locals>.<genexpr>   sD      cc#PWX\^aPbPbcS'$,,-ccccccr   )dictr   r   r+   )rS   datas   ` r   
__reduce__zPClass.__reduce__   s:    cccc9Lccccc 777r   c                 F    t          | |                                           S )z5
        Returns an evolver for this object.
        )_PClassEvolverrq   ri   s    r   evolverzPClass.evolver   s     dDMMOO444r   c                 X    |                                  }||= |                                S )z
        Remove attribute given by name from the current instance. Raises AttributeError if the
        attribute doesn't exist.
        )r   
persistent)rS   r   r   s      r   removezPClass.remove   s*    
 ,,..DM!!###r   NFr   )r,   r-   r.   __doc__r(   rP   classmethodrZ   r   r   rb   rd   rj   rl   ro   rq   rv   r|   r   r   r/   r0   s   @r   r>   r>   %   sF        " " " " "HH H H@ Y Y Y [Y    0 0 0  ! ! !e e e4 4 4 4 4^ ^ ^  n n n8 8 8
5 5 5$ $ $ $ $ $ $r   r>   )	metaclassc                   R     e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
 fd	Zd
 Z xZS )r~   )_pclass_evolver_original_pclass_evolver_data_pclass_evolver_data_is_dirtyr@   c                 V    || _         || _        d| _        t                      | _        d S r   )r   r   r   rP   r@   )rS   originalinitial_dicts      r   __init__z_PClassEvolver.__init__   s,    (0%$0!-2*"uur   c                     | j         |         S r   )r   rS   items     r   __getitem__z_PClassEvolver.__getitem__   s    (..r   c                     | j                             |t                    |ur+|| j         |<   | j                            |           d| _        | S NT)r   getrR   r@   addr   rS   r"   r7   s      r   rP   z_PClassEvolver.set   sQ    $((n==UJJ-2D%c* $$S)))15D.r   c                 2    |                      ||           d S r   )rP   r   s      r   __setitem__z_PClassEvolver.__setitem__   s    er   c                     || j         v r+| j         |= | j                            |           d| _        | S t	          |          r   )r   r@   discardr   rJ   r   s     r   r   z_PClassEvolver.remove   sM    4,,,)$/ ((...15D.KT"""r   c                 0    |                      |           d S r   )r   r   s     r   __delitem__z_PClassEvolver.__delitem__   s    Dr   c                 Z    | j         r | j        j        dd| j        i| j        S | j        S )Nr@   r    )r   r   r+   r@   r   ri   s    r   r   z_PClassEvolver.persistent   sS    - 	X:40: X X4K_ X=A=VX X X ,,r   c                     || j         vr|                     ||           d S t          t          |                               ||           d S r   )r$   rP   r'   r~   rl   rm   s      r   rl   z_PClassEvolver.__setattr__   sP    dn$$HHS%     .$''33C?????r   c                     | |         S r   r    r   s     r   __getattr__z_PClassEvolver.__getattr__  s    Dzr   )r,   r-   r.   r$   r   r   rP   r   r   r   r   rl   r   r/   r0   s   @r   r~   r~      s        xI% % %/ / /    # # #  - - -@ @ @ @ @      r   r~   N)pyrsistent._checked_typesr   r   r   r   pyrsistent._field_commonr   r   r	   r
   r   r   pyrsistent._transformationsr   r   typer   objectrR   r<   r>   r~   r    r   r   <module>r      sY   j j j j j j j j j j j j                2 1 1 1 1 17 7 7E E E E E E E E % % %m$ m$ m$ m$ m$[J m$ m$ m$ m$`1 1 1 1 1V 1 1 1 1 1r   