U
    [e.                     @   sd  d dl mZmZmZmZmZmZmZmZm	Z	 d dl m
Z d dl mZ d dlZdd Zdd Zd	d
 Zdd Zdd Zdd ZG dd deZdZdd Zdd Ze Zdd ZeeedeefddZdd ZG dd deZeded iZi Z d!d" Z!d#d$ Z"d%d& Z#eefd'd(Z$ddeefd)d*Z%ddeefd+d,Z&d-d Z'i Z(d.d/ Z)d0d1 Z*defd2d3Z+dS )4    )	CheckedPMapCheckedPSetCheckedPVectorCheckedTypeInvariantException_restore_pickleget_typemaybe_parse_user_typemaybe_parse_many_user_types)optional)wrap_invariantNc                    sV   t t fdd|D g |  < t|  D ]$\}}t|tr,||   |< | |= q,d S )Nc                    s"   g | ]}t |j i  qS  )list__dict__getitems).0bnamer   Z/var/www/html/services/stratfitenv/lib/python3.8/site-packages/pyrsistent/_field_common.py
<listcomp>   s     zset_fields.<locals>.<listcomp>)dictsumr   r   
isinstance_PField)dctbasesr   kvr   r   r   
set_fields   s
     
r    c                    s4   t dd  fdd|D D }|r0t|ddd S )Nc                 s   s   | ]\}}|s|V  qd S Nr   )r   Zis_okZ
error_coder   r   r   	<genexpr>   s    z*check_global_invariants.<locals>.<genexpr>c                 3   s   | ]}| V  qd S r!   r   )r   	invariantsubjectr   r   r"      s     r   zGlobal invariant failed)tupler   )r%   Z
invariantsZerror_codesr   r$   r   check_global_invariants   s
    r'   c                 C   s&   t |tr| tkr||S | ||S r!   )r   r   PFIELD_NO_SERIALIZER	serialize)
serializerformatvaluer   r   r   r)   !   s    
r)   c                    sN   |j rJt fdd|j D sJt  }d| j||j}t| ||j ||d S )Nc                 3   s   | ]}t  t|V  qd S r!   )r   r   r   tr,   r   r   r"   )   s     zcheck_type.<locals>.<genexpr>z'Invalid type for field {0}.{1}, was {2})typeanyr+   __name__
PTypeError)Zdestination_clsfieldr   r,   actual_typemessager   r/   r   
check_type(   s    r7   c                 C   s:   t |tkrdS t|}t|dkr(dS tt|d | S )NTr   F)r0   setr&   len
issubclassr   )type_clsZ
field_typetypesr   r   r   is_type_cls/   s    r=   c                 C   s*   |sdS t | |jsdS dt|jjkS )NFignore_extra)r=   r0   inspect	signaturefactory
parameters)r;   r4   r>   r   r   r   is_field_ignore_extra_complaint8   s
    rC   c                   @   s$   e Zd ZdZdd Zedd ZdS )r   r0   r#   initial	mandatory_factoryr*   c                 C   s(   || _ || _|| _|| _|| _|| _d S r!   rD   )selfr0   r#   rE   rF   rA   r*   r   r   r   __init__G   s    z_PField.__init__c                 C   s@   | j tkr:t| jdkr:tt| jd }t|tr:|jS | j S )N   r   )	rG   PFIELD_NO_FACTORYr9   r0   r   r&   r:   r   create)rH   typr   r   r   rA   O   s
    
z_PField.factoryN)r2   
__module____qualname__	__slots__rI   propertyrA   r   r   r   r   r   D   s   r   r   c                 C   s   dS )N)TNr   )_r   r   r   <lambda>Z       rS   c                 C   s   | S r!   r   )xr   r   r   rS   [   rT   c                 C   s   |S r!   r   )rR   r,   r   r   r   rS   ]   rT   Fc           	      C   sf   t | tttfrtt| }ntt| }|tkrBt|rBt|n|}t	||||||d}t
| |S )a  
    Field specification factory for :py:class:`PRecord`.

    :param type: a type or iterable with types that are allowed for this field
    :param invariant: a function specifying an invariant that must hold for the field
    :param initial: value of field if not specified when instantiating the record
    :param mandatory: boolean specifying if the field is mandatory or not
    :param factory: function called when field is set.
    :param serializer: function that returns a serialized version of the field
    )r0   r#   rE   rF   rA   r*   )r   r   r8   r&   r
   r	   PFIELD_NO_INVARIANTcallabler   r   _check_field_parameters)	r0   r#   rE   rF   rA   r*   r<   Zinvariant_functionr4   r   r   r   r4   `   s      r4   c                    s    j D ]*}t|t st|tstdt |q jtk	rxt jsx j rxt fdd j D sxtdt  jt j	stdt j
stdt jstdd S )Nz Type parameter expected, not {0}c                 3   s   | ]}t  j|V  qd S r!   )r   rE   r-   r4   r   r   r"      s     z*_check_field_parameters.<locals>.<genexpr>zInitial has invalid type {0}zInvariant must be callablezFactory must be callablezSerializer must be callable)r0   r   str	TypeErrorr+   rE   PFIELD_NO_INITIALrW   r1   r#   rA   r*   )r4   r.   r   rY   r   rX      s"    




rX   c                       s    e Zd ZdZ fddZ  ZS )r3   a  
    Raised when trying to assign a value with a type that doesn't match the declared type.

    Attributes:
    source_class -- The class of the record
    field -- Field name
    expected_types  -- Types allowed for the field
    actual_type -- The non matching type
    c                    s.   t t| j|| || _|| _|| _|| _d S r!   )superr3   rI   source_classr4   expected_typesr5   )rH   r^   r4   r_   r5   argskwargs	__class__r   r   rI      s
    zPTypeError.__init__)r2   rN   rO   __doc__rI   __classcell__r   r   rb   r   r3      s   	r3   ZPVectorZPSetc                 C   s   t | |f }t||S )z=Unpickling function for auto-generated PVec/PSet field types.)_seq_field_typesr   )checked_class	item_typedatatype_r   r   r   _restore_seq_field_pickle   s    rk   c                 C   s   d dd | D S )z4Convert a tuple of types to a human-readable string. c                 s   s   | ]}t |j V  qd S r!   )r   r2   
capitalize)r   rM   r   r   r   r"      s     z"_types_to_names.<locals>.<genexpr>)join)r<   r   r   r   _types_to_names   s    ro   c                    sZ   t  f}|dk	r|S G  fddd }t  }t|j| |_|t  f< |S )zFCreate a subclass of the given checked class with the given item type.Nc                       s"   e Zd ZZZ fddZdS )z%_make_seq_field_type.<locals>.TheTypec                    s   t  t| ffS r!   )rk   r   rH   )rg   rh   r   r   
__reduce__   s    z0_make_seq_field_type.<locals>.TheType.__reduce__N)r2   rN   rO   Z__type__Z__invariant__rq   r   rg   item_invariantrh   r   r   TheType   s   rt   )rf   r   SEQ_FIELD_TYPE_SUFFIXESro   Z_checked_typesr2   )rg   rh   rs   rj   rt   suffixr   rr   r   _make_seq_field_type   s    rw   c                    sH   t | || |r d fdd	}n j}t|r4t n |d|||dS )a  
    Create checked field for either ``PSet`` or ``PVector``.

    :param checked_class: ``CheckedPSet`` or ``CheckedPVector``.
    :param item_type: The required type for the items in the set.
    :param optional: If true, ``None`` can be used as a value for
        this field.
    :param initial: Initial value to pass to factory.

    :return: A ``field`` containing a checked class.
    NFc                    s    | d krd S  j | ||dS d S )N)_factory_fieldsr>   rL   )argumentrx   r>   rt   r   r   rA      s    z _sequence_field.<locals>.factoryT)r0   rA   rF   r#   rE   )NF)rw   rL   r4   optional_type)rg   rh   r   rE   r#   rs   rA   r   r{   r   _sequence_field   s     r}   c                 C   s   t t| ||||dS )al  
    Create checked ``PSet`` field.

    :param item_type: The required type for the items in the set.
    :param optional: If true, ``None`` can be used as a value for
        this field.
    :param initial: Initial value to pass to factory if no value is given
        for the field.

    :return: A ``field`` containing a ``CheckedPSet`` of the given type.
    r#   rs   )r}   r   rh   r   rE   r#   rs   r   r   r   
pset_field   s    
r   c                 C   s   t t| ||||dS )au  
    Create checked ``PVector`` field.

    :param item_type: The required type for the items in the vector.
    :param optional: If true, ``None`` can be used as a value for
        this field.
    :param initial: Initial value to pass to factory if no value is given
        for the field.

    :return: A ``field`` containing a ``CheckedPVector`` of the given type.
    r~   )r}   r   r   r   r   r   pvector_field   s    
r   c                 C   s   dS )N)Trl   r   )itemr   r   r   rS     rT   c                 C   s   t | |f }t||S )z8Unpickling function for auto-generated PMap field types.)_pmap_field_typesr   )key_type
value_typeri   rj   r   r   r   _restore_pmap_field_pickle  s    r   c                    sZ   t  f}|dk	r|S G  fdddt}dt|jt|j|_|t  f< |S )zDCreate a subclass of CheckedPMap with the given key and value types.Nc                       s   e Zd Z ZZdd ZdS )z%_make_pmap_field_type.<locals>.TheMapc                 S   s   t | j| jt| ffS r!   )r   __key_type____value_type__r   rp   r   r   r   rq   (  s    z0_make_pmap_field_type.<locals>.TheMap.__reduce__N)r2   rN   rO   r   r   rq   r   r   r   r   r   TheMap$  s   r   z{0}To{1}PMap)r   r   r   r+   ro   Z_checked_key_typesZ_checked_value_typesr2   )r   r   rj   r   r   r   r   _make_pmap_field_type  s    r   c                    sB   t | | |r fdd}n j}td  |r6t n ||dS )ad  
    Create a checked ``PMap`` field.

    :param key: The required type for the keys of the map.
    :param value: The required type for the values of the map.
    :param optional: If true, ``None`` can be used as a value for
        this field.
    :param invariant: Pass-through to ``field``.

    :return: A ``field`` containing a ``CheckedPMap``.
    c                    s   | d krd S   | S d S r!   ry   )rz   r   r   r   rA   B  s    zpmap_field.<locals>.factoryT)rF   rE   r0   rA   r#   )r   rL   r4   r|   )r   r   r   r#   rA   r   r   r   
pmap_field3  s    
 r   ),Zpyrsistent._checked_typesr   r   r   r   r   r   r   r	   r
   r   r|   r   r?   r    r'   r)   r7   r=   rC   objectr   ZPFIELD_NO_TYPErV   rK   r\   r(   r4   rX   r[   r3   ru   rf   rk   ro   rw   r}   r   r   _validr   r   r   r   r   r   r   r   <module>   s^   ,		  
$  


