U
    [e%                     @   s   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d ZG dd deZe Zdd	 ZG d
d deedZG d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                 C   s   t | dko| d tkS )N   r   )lenr   )bases r   T/var/www/html/services/stratfitenv/lib/python3.8/site-packages/pyrsistent/_pclass.py
_is_pclass   s    r   c                       s   e Zd Z fddZ  ZS )
PClassMetac                    sh   t ||dd t||dd dtdd |d D  |d< t|rR|d  d	7  < tt| | |||S )
N_pclass_fields)name_pclass_invariantsZ__invariant__)_pclass_frozenc                 s   s   | ]
}|V  qd S Nr   .0keyr   r   r   	<genexpr>   s     z%PClassMeta.__new__.<locals>.<genexpr>	__slots__)__weakref__)r   r   tupler   superr   __new__)mcsr   r   dct	__class__r   r   r"      s    zPClassMeta.__new__)__name__
__module____qualname__r"   __classcell__r   r   r%   r   r      s   r   c                 C   s<   t | ||| ||\}}|s,|| nt||| d S r   )r   Z	invariantappendsetattr)clsfieldr   valueresultinvariant_errorsZis_okZ
error_coder   r   r   _check_and_set_attr   s
    r2   c                       s   e Zd ZdZ fddZdd Zed"dd	Zd#d
dZdd Z	dd Z
dd Zdd Z fddZdd Zdd Zdd Zdd Zdd Zd d! Z  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                    sR  t t| | }|dd }|dd }g }g }| j D ]\}}||kr|d ksZ||krtt||rz|j|| |d}	q||| }	n|| }	t| |||	|| ||= q:|j	t
k	rt|j	r|	 n|j	}
t| |||
|| q:|jr:|d| j| q:|s
|rtt|t|d|r<tdd|| jt|| j d|_|S )	N_factory_fieldsignore_extra)r5   z{0}.{1}zField invariant failedz0'{0}' are not among the specified fields for {1}, T)r!   r3   r"   popr   itemsr   factoryr2   initialr	   callable	mandatoryr+   formatr'   r   r    AttributeErrorjoinr   r   r   )r-   kwargsr0   factory_fieldsr5   Zmissing_fieldsr1   r   r.   r/   r:   r%   r   r   r"   .   sH    
      zPClass.__new__c                 O   s`   |r|d ||d < t |}| jD ](}||kr"t| |t}|tk	r"|||< q"| jf 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   r4   )setr   getattr_MISSING_VALUEr&   )selfargsr@   rA   r   r/   r   r   r   rB   R   s    

z
PClass.setNFc                    s:   t  | r S |r& fdd| jD  | f ||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                    s   i | ]}| kr| | qS r   r   )r   kr@   r   r   
<dictcomp>   s       z!PClass.create.<locals>.<dictcomp>)r4   r5   )
isinstancer   )r-   r@   r4   r5   r   rH   r   creater   s
    	
zPClass.createc                 C   s@   i }| j D ]0}t| |t}|tk	r
t| j | j||||< q
|S )z
        Serialize the current PClass using custom serializer functions for fields where
        such have been supplied.
        )r   rC   rD   r
   
serializer)rE   r=   r0   r   r/   r   r   r   r
      s    
zPClass.serializec                 G   s
   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   )rE   Ztransformationsr   r   r   r      s    zPClass.transformc                 C   s>   t || jr:| jD ]"}t| |tt||tkr dS qdS tS )NFT)rJ   r&   r   rC   rD   NotImplemented)rE   otherr   r   r   r   __eq__   s    
zPClass.__eq__c                 C   s
   | |k S r   r   )rE   rN   r   r   r   __ne__   s    zPClass.__ne__c                    s   t t fdd jD S )Nc                 3   s   | ]}|t  |tfV  qd S r   )rC   rD   r   rE   r   r   r      s     z"PClass.__hash__.<locals>.<genexpr>)hashr    r   rQ   r   rQ   r   __hash__   s    zPClass.__hash__c                    s2   t | ddrtd||tt| || d S )Nr   Fz'Can't set attribute, key={0}, value={1})rC   r>   r=   r!   r3   __setattr__rE   r   r/   r%   r   r   rT      s    zPClass.__setattr__c                 C   s   t d|d S )Nz-Can't delete attribute, key={0}, use remove())r>   r=   )rE   r   r   r   r   __delattr__   s    zPClass.__delattr__c                 C   s0   i }| j D ] }t| |t}|tk	r
|||< q
|S r   )r   rC   rD   )rE   r0   r   r/   r   r   r   _to_dict   s    

zPClass._to_dictc                 C   s(   d | jjddd |   D S )Nz{0}({1})r6   c                 s   s"   | ]\}}d  |t|V  qdS )z{0}={1}N)r=   repr)r   rG   vr   r   r   r      s     z"PClass.__repr__.<locals>.<genexpr>)r=   r&   r'   r?   rW   r8   rQ   r   r   r   __repr__   s    
zPClass.__repr__c                    s&   t  fdd jD }t j|ffS )Nc                 3   s&   | ]}t  |r|t |fV  qd S r   )hasattrrC   r   rQ   r   r   r      s     
 z$PClass.__reduce__.<locals>.<genexpr>)dictr   r   r&   )rE   datar   rQ   r   
__reduce__   s    zPClass.__reduce__c                 C   s   t | |  S )z5
        Returns an evolver for this object.
        )_PClassEvolverrW   rQ   r   r   r   evolver   s    zPClass.evolverc                 C   s   |   }||= | S )z
        Remove attribute given by name from the current instance. Raises AttributeError if the
        attribute doesn't exist.
        )r`   
persistent)rE   r   r`   r   r   r   remove   s    zPClass.remove)NF)N)r'   r(   r)   __doc__r"   rB   classmethodrK   r
   r   rO   rP   rS   rT   rV   rW   rZ   r^   r`   rb   r*   r   r   r%   r   r3   %   s"   $ 
	
	r3   )	metaclassc                       s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
 fddZdd Z  ZS )r_   )_pclass_evolver_original_pclass_evolver_data_pclass_evolver_data_is_dirtyr4   c                 C   s   || _ || _d| _t | _d S )NF)rf   rg   rh   rB   r4   )rE   originalZinitial_dictr   r   r   __init__   s    z_PClassEvolver.__init__c                 C   s
   | j | S r   )rg   rE   itemr   r   r   __getitem__   s    z_PClassEvolver.__getitem__c                 C   s2   | j |t|k	r.|| j |< | j| d| _| S NT)rg   getrD   r4   addrh   rU   r   r   r   rB      s
    
z_PClassEvolver.setc                 C   s   |  || d S r   )rB   rU   r   r   r   __setitem__   s    z_PClassEvolver.__setitem__c                 C   s4   || j kr(| j |= | j| d| _| S t|d S rn   )rg   r4   discardrh   r>   rk   r   r   r   rb      s    
z_PClassEvolver.removec                 C   s   |  | d S r   )rb   rk   r   r   r   __delitem__   s    z_PClassEvolver.__delitem__c                 C   s&   | j r | jjf d| ji| jS | jS )Nr4   )rh   rf   r&   r4   rg   rQ   r   r   r   ra      s
    z_PClassEvolver.persistentc                    s.   || j kr| || ntt| || d S r   )r   rB   r!   r_   rT   rU   r%   r   r   rT      s    
z_PClassEvolver.__setattr__c                 C   s   | | S r   r   rk   r   r   r   __getattr__  s    z_PClassEvolver.__getattr__)r'   r(   r)   r   rj   rm   rB   rq   rb   rs   ra   rT   rt   r*   r   r   r%   r   r_      s   	r_   N)Zpyrsistent._checked_typesr   r   r   r   Zpyrsistent._field_commonr   r   r   r	   r
   r   Zpyrsistent._transformationsr   r   typer   objectrD   r2   r3   r_   r   r   r   r   <module>   s    	 1