B ���[�$�@s�ddlZddlmZmZmZmZddlmZmZm Z m Z m Z ddl m Z dd�ZGdd�de�Ze�Zd d �Ze�e�Gd d �d e��ZGd d�de�ZdS)�N)�InvariantException� CheckedType�_restore_pickle�store_invariants)� set_fields� check_type�PFIELD_NO_INITIAL� serialize�check_global_invariants)� transformcCst|�dko|dtkS)N�r)�lenr)�bases�r�E/opt/alt/python37/lib64/python3.7/site-packages/pyrsistent/_pclass.py� _is_pclasssrcseZdZ�fdd�Z�ZS)� PClassMetacsht||dd�t||dd�dtdd�|dD��|d<t|�rR|dd 7<tt|��||||�S) N�_pclass_fields)�name�_pclass_invariantsZ __invariant__)�_pclass_frozencss|] }|VqdS)Nr)�.0�keyrrr� sz%PClassMeta.__new__..� __slots__)� __weakref__)rr�tupler�superr�__new__)Zmcsrr�dct)� __class__rrr s zPClassMeta.__new__)�__name__� __module__� __qualname__r� __classcell__rr)r rr srcCs<t||||�|�|�\}}|s,|�|�n t|||�dS)N)rZ invariant�append�setattr)�cls�fieldr�value�result�invariant_errorsZis_okZ error_coderrr�_check_and_set_attrs  r,cs�eZdZdZ�fdd�Zdd�Zed"dd ��Zd#d d �Zd d �Z dd�Z dd�Z dd�Z �fdd�Z dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Z�ZS)$�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  s&tt|��|�}|�dd�}g}g}x�|j��D]�\}}||kr�|dksP||kr`|�||�}n||}t||||||�||=q0|jt k r�t |j�r�|��n|j} t|||| ||�q0|j r0|� d� |j|��q0W|s�|r�tt|�t|�d��|�rtd� d�|�|j���t||j�d|_|S)N�_factory_fieldsz{0}.{1}zField invariant failedz0'{0}' are not among the specified fields for {1}z, T)rr-r�popr�items�factoryr,�initialr�callable� mandatoryr%�formatr!rr�AttributeError�joinr rr) r'�kwargsr*�factory_fieldsZmissing_fieldsr+rr(r)r2)r rrr.s2   zPClass.__new__cOsd|r|d||d<t|�}x2|jD](}||kr$t||t�}|tk r$|||<q$W|jfd|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 rr.)�setr�getattr�_MISSING_VALUEr )�self�argsr8r9rr)rrrr:Ns   z PClass.setNFcs8t�|�r�S|r&�fdd�|jD��|fd|i���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. csi|]}|�kr�||�qSrr)r�k)r8rr� {sz!PClass.create..r.)� isinstancer)r'r8r.Z ignore_extrar)r8r�createns z PClass.createcCsDi}x:|jD]0}t||t�}|tk r t|j|j||�||<q W|S)z� Serialize the current PClass using custom serializer functions for fields where such have been supplied. )rr;r<r Z serializer)r=r5r*rr)rrrr s   zPClass.serializecGs 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 )r=Ztransformationsrrrr �szPClass.transformcCs@t||j�r.)�hashrr)r=r)r=r�__hash__�szPClass.__hash__cs2t|dd�rtd�||���tt|��||�dS)NrFz'Can't set attribute, key={0}, value={1})r;r6r5rr-� __setattr__)r=rr))r rrrI�s zPClass.__setattr__cCstd�|���dS)Nz-Can't delete attribute, key={0}, use remove())r6r5)r=rrrr� __delattr__�szPClass.__delattr__cCs4i}x*|jD] }t||t�}|tk r |||<q W|S)N)rr;r<)r=r*rr)rrr�_to_dict�s    zPClass._to_dictcCs(d�|jjd�dd�|����D���S)Nz{0}({1})z, css"|]\}}d�|t|��VqdS)z{0}={1}N)r5�repr)rr?�vrrrr�sz"PClass.__repr__..)r5r r!r7rKr0)r=rrr�__repr__�s zPClass.__repr__cs&t�fdd��jD��}t�j|ffS)Nc3s&|]}t�|�r|t�|�fVqdS)N)�hasattrr;)rr)r=rrr�sz$PClass.__reduce__..)�dictrrr )r=�datar)r=r� __reduce__�szPClass.__reduce__cCst||���S)z5 Returns an evolver for this object. )�_PClassEvolverrK)r=rrr�evolver�szPClass.evolvercCs|��}||=|��S)z� Remove attribute given by name from the current instance. Raises AttributeError if the attribute doesn't exist. )rT� persistent)r=rrTrrr�remove�sz PClass.remove)NF)N)r!r"r#�__doc__rr:� classmethodrBr r rErFrHrIrJrKrNrRrTrVr$rr)r rr-$s"         r-cs`eZdZdZdd�Zdd�Zdd�Zdd �Zd d �Zd d �Z dd�Z �fdd�Z dd�Z �Z S)rS)�_pclass_evolver_original�_pclass_evolver_data�_pclass_evolver_data_is_dirtyr.cCs||_||_d|_t�|_dS)NF)rYrZr[r:r.)r=�originalZ initial_dictrrr�__init__�sz_PClassEvolver.__init__cCs |j|S)N)rZ)r=�itemrrr� __getitem__�sz_PClassEvolver.__getitem__cCs2|j�|t�|k r.||j|<|j�|�d|_|S)NT)rZ�getr<r.�addr[)r=rr)rrrr:�s   z_PClassEvolver.setcCs|�||�dS)N)r:)r=rr)rrr� __setitem__�sz_PClassEvolver.__setitem__cCs4||jkr(|j|=|j�|�d|_|St|��dS)NT)rZr.�discardr[r6)r=r^rrrrV�s   z_PClassEvolver.removecCs|�|�dS)N)rV)r=r^rrr� __delitem__�sz_PClassEvolver.__delitem__cCs&|jr |jjfd|ji|j��S|jS)Nr.)r[rYr r.rZ)r=rrrrU�s z_PClassEvolver.persistentcs.||jkr|�||�ntt|��||�dS)N)rr:rrSrI)r=rr))r rrrI�s z_PClassEvolver.__setattr__cCs||S)Nr)r=r^rrr� __getattr__sz_PClassEvolver.__getattr__)r!r"r#rr]r_r:rbrVrdrUrIrer$rr)r rrS�s  rS)�sixZpyrsistent._checked_typesrrrrZpyrsistent._field_commonrrrr r Zpyrsistent._transformationsr r�typer�objectr<r,Z add_metaclassr-rSrrrr�s   -