
    n9e%                         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y)    )InvariantExceptionCheckedType_restore_picklestore_invariants)
set_fields
check_typeis_field_ignore_extra_complaintPFIELD_NO_INITIAL	serializecheck_global_invariants	transformc                 :    t        |       dk(  xr | d   t        k(  S )N   r   )lenr   )basess    4/usr/lib/python3/dist-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   | ]  }|  y wN ).0keys     r   	<genexpr>z%PClassMeta.__new__.<locals>.<genexpr>   s     6\ss6\s   	__slots__)__weakref__)r   r   tupler   superr   __new__)mcsr   r   dct	__class__s       r   r(   zPClassMeta.__new__   sr    3$45e%9?K.6\cJZF[6\1\\K e 00Z-c4DDr   )__name__
__module____qualname__r(   __classcell__r+   s   @r   r   r      s    
E 
Er   r   c                     t        | |||       |j                  |      \  }}|s|j                  |       y t        |||       y r   )r   	invariantappendsetattr)clsfieldr   valueresultinvariant_errorsis_ok
error_codes           r   _check_and_set_attrr<      s@    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        |   |       }|j                  dd       }|j                  dd       }g }g }| j                  j                         D ]  \  }}||v r\|||v r=t        t        ||      r|j                  ||   |      }	n|j                  ||         }	n||   }	t        | |||	||       ||= f|j                  t        urBt        |j                        r|j                         n|j                  }
t        | |||
||       |j                  s|j                  dj                  | j                  |              |s|rt!        t#        |      t#        |      d      |r4t%        dj                  dj'                  |      | 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$5t<zz.$7--335 	LKD%v~!)T^-C6vulS %fTl V %fTl ;"4LE#CeVEUV4L&77-5emm-D%--/%--#gv7GI%%i&6&6s||T&JK!	L$ ~$U+;%<eN>SUmnn !S!Z!Z		&!3<<"1 2 2 	 (>(>? $r   c                     |r|d   ||d   <   t        |      }| j                  D ]&  }||vst        | |t              }|t        us"|||<   (  | 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   sx    & "1gF47OV&& 	(C& c>:."'F3K		( t~~GnGGGr   c                     t        ||       r|S |r"| j                  D ci c]  }||v s|||    }} | d||d|S c c}w )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.
        )r@   rA   r    )
isinstancer   )r5   rL   r@   rA   ks        r   createzPClass.creater   sY     fc"M,/,>,>Nq!v+alNFNX?XQWXX Os   	>>c                     i }| j                   D ]C  }t        | |t              }|t        ust        | j                   |   j                  ||      ||<   E |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   sa    
 '' 	^DD$7EN*()<)<T)B)M)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                        r7| j                  D ]'  }t        | |t              t        ||t              k7  s' y yt
        S )NFT)rV   r+   r   rQ   rR   NotImplemented)rS   otherr   s      r   __eq__zPClass.__eq__   sM    eT^^,++ !4~6'%~:^^ ! r   c                     | |k(   S r   r    )rS   r_   s     r   __ne__zPClass.__ne__   s    5=  r   c                 R     t        t         fd j                  D                    S )Nc              3   D   K   | ]  }|t        |t              f  y wr   )rQ   rR   r!   r"   rS   s     r   r#   z"PClass.__hash__.<locals>.<genexpr>   s     c3c> BCcs    )hashr&   r   rS   s   `r   __hash__zPClass.__hash__   s    EctObObccddr   c                 ~    t        | dd      rt        dj                  ||            t        t        |   ||       y )Nr   Fz'Can't set attribute, key={0}, value={1})rQ   rJ   rI   r'   r>   __setattr__rS   r"   r7   r+   s      r   rj   zPClass.__setattr__   s<    4)51 !J!Q!QRUW\!]^^fd'U3r   c                 6    t        dj                  |            )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                 j    i }| j                   D ]!  }t        | |t              }|t        us|||<   # |S r   )r   rQ   rR   )rS   r8   r"   r7   s       r   _to_dictzPClass._to_dict   sB    && 	$CD#~6EN*#s	$
 r   c                     dj                  | j                  j                  dj                  d | j	                         j                         D                    S )Nz{0}({1})rB   c              3   X   K   | ]"  \  }}d j                  |t        |             $ yw)z{0}={1}N)rI   repr)r!   rW   vs      r   r#   z"PClass.__repr__.<locals>.<genexpr>   s%     *lDAq9+;+;AtAw+G*ls   (*)rI   r+   r,   rK   ro   rD   rg   s    r   __repr__zPClass.__repr__   sH      !8!8!%*lTXTaTaTcTiTiTk*l!ln 	nr   c                 h     t         fd j                  D              }t         j                  |ffS )Nc              3   T   K   | ]  }t        |      s|t        |      f ! y wr   )hasattrrQ   re   s     r   r#   z$PClass.__reduce__.<locals>.<genexpr>   s)     c#PWX\^aPbS'$,-cs   (()dictr   r   r+   )rS   datas   ` r   
__reduce__zPClass.__reduce__   s-    c9L9Lcc 777r   c                 6    t        | | j                               S )z5
        Returns an evolver for this object.
        )_PClassEvolverro   rg   s    r   evolverzPClass.evolver   s     dDMMO44r   c                 H    | j                         }||= |j                         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   classmethodrX   r   r   r`   rb   rh   rj   rm   ro   rt   rz   r}   r   r/   r0   s   @r   r>   r>   %   sj    "HH@ Y Y 0!e4^n8
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                 L    || _         || _        d| _        t               | _        y r   )r   r   r   rP   r@   )rS   originalinitial_dicts      r   __init__z_PClassEvolver.__init__   s$    (0%$0!-2*"ur   c                      | j                   |   S r   )r   rS   items     r   __getitem__z_PClassEvolver.__getitem__   s    ((..r   c                     | j                   j                  |t              |ur1|| j                   |<   | j                  j	                  |       d| _        | S NT)r   getrR   r@   addr   rS   r"   r7   s      r   rP   z_PClassEvolver.set   sN    $$((n=UJ-2D%%c*  $$S)15D.r   c                 (    | j                  ||       y r   )rP   r   s      r   __setitem__z_PClassEvolver.__setitem__   s    er   c                     || j                   v r1| j                   |= | j                  j                  |       d| _        | S t	        |      r   )r   r@   discardr   rJ   r   s     r   r   z_PClassEvolver.remove   sJ    4,,,))$/  ((.15D.KT""r   c                 &    | j                  |       y r   )r   r   s     r   __delitem__z_PClassEvolver.__delitem__   s    Dr   c                     | j                   r2 | j                  j                  dd| j                  i| j                  S | j                  S )Nr@   r    )r   r   r+   r@   r   rg   s    r   r   z_PClassEvolver.persistent   sS    --:400:: X4K_K_ X=A=V=VX X ,,,r   c                 p    || j                   vr| j                  ||       y t        t        |   ||       y r   )r$   rP   r'   r|   rj   rk   s      r   rj   z_PClassEvolver.__setattr__   s.    dnn$HHS% .$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   rj   r   r/   r0   s   @r   r|   r|      s6    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      sX    j j  27E E %m$[J m$`1V 1r   