U
    ],                     @   sl  d dl Z d dlZ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ejd  dk 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'd(d) Z(d5d*d+Z)d6d,d-Z*d.d Z+i Z,d/d0 Z-d1d2 Z.defd3d4Z/dS )7    N)	CheckedPMapCheckedPSetCheckedPVectorCheckedTypeInvariantException_restore_pickleget_typemaybe_parse_user_typemaybe_parse_many_user_types)optional)wrap_invariant   c                    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   :/usr/lib/python3/dist-packages/pyrsistent/_field_common.py
<listcomp>   s     zset_fields.<locals>.<listcomp>)dictsumr   r   
isinstance_PField)Z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_cls4   s    r=   c                 C   sD   |sdS t | |jsdS tr.dt|jjkS dt|jjkS d S )NFignore_extra)	r=   r0   PY2inspectZ
getargspecfactoryargsZ	signatureZ
parameters)r;   r4   r>   r   r   r   is_field_ignore_extra_complaint=   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__O   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   W   s
    
z_PField.factoryN)r2   
__module____qualname__	__slots__rI   propertyrA   r   r   r   r   r   L   s   r   r   c                 C   s   dS )N)TNr   )_r   r   r   <lambda>b       rS   c                 C   s   | S r!   r   )xr   r   r   rS   c   rT   c                 C   s   |S r!   r   )rR   r,   r   r   r   rS   e   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   h   s      r4   c                    s    j D ],}t|t st|tjstdt |q jtk	rzt jsz j rzt	 fdd j D szt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   sixZstring_types	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   rB   kwargs	__class__r   r   rI      s
    zPTypeError.__init__)r2   rN   rO   __doc__rI   __classcell__r   r   ra   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    rj   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    rn   c                    sX   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 fddZdS )z%_make_seq_field_type.<locals>.TheTypec                    s   t  t| ffS r!   )rj   r   rH   rf   rg   r   r   
__reduce__   s    z0_make_seq_field_type.<locals>.TheType.__reduce__N)r2   rN   rO   Z__type__rq   r   rp   r   r   TheType   s   rr   )re   r   SEQ_FIELD_TYPE_SUFFIXESrn   Z_checked_typesr2   )rf   rg   ri   rr   suffixr   rp   r   _make_seq_field_type   s    ru   c                    sB   t | | |r fdd}n j}t|r0t 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.
    c                    s   | d krd S   | S d S r!   rL   Zargumentrr   r   r   rA      s    z _sequence_field.<locals>.factoryT)r0   rA   rF   rE   )ru   rL   r4   optional_type)rf   rg   r   rE   rA   r   rx   r   _sequence_field   s    
 rz   c                 C   s   t t| ||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.
    )rz   r   rg   r   rE   r   r   r   
pset_field   s    r|   c                 C   s   t t| ||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.
    )rz   r   r{   r   r   r   pvector_field  s    r}   c                 C   s   dS )N)Trk   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_typerh   ri   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   ro   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+   rn   Z_checked_key_typesZ_checked_value_typesr2   )r   r   ri   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!   rv   rw   r   r   r   rA   @  s    zpmap_field.<locals>.factoryT)rF   rE   r0   rA   r#   )r   rL   r4   ry   )r   r   r   r#   rA   r   r   r   
pmap_field1  s    
 r   )Fr   )Fr   )0rZ   sysZpyrsistent._checked_typesr   r   r   r   r   r   r   r	   r
   r   ry   r   r@   version_infor?   r    r'   r)   r7   r=   rC   objectr   ZPFIELD_NO_TYPErV   rK   r\   r(   r4   rX   r[   r3   rs   re   rj   rn   ru   rz   r|   r}   Z_validr   r   r   r   r   r   r   r   <module>   sT   ,		  
$  

