a
    ΝGd                     @   s   d dl mZmZmZ d dlmZ d dlmZmZ d dl	m
Z
mZ d dlZd dlZedddgZd	d
 Zdd Zdd ZdddZG dd dejZdS )    )codecs
exceptions
transports)string_types)DocumentLink)determine_transportget_installed_codecsNLinkAncestordocumentkeysc           	      C   s"  t |ttfsd}t|tdd |D r4td| }t| g dg}t|D ]\}}z|| }W nL tttfy   d	dd |D }d}t
||t|d	f Y n0 t |trNt||d
|d  d}|| qNt |tsd	dd |D }d}t
||t|jf ||fS )zp
    Validates that keys looking up a link are correct.

    Returns a two-tuple of (link, link_ancestors).
    z)'keys' must be a list of strings or ints.c                 S   s$   g | ]}t |t ot |t qS  )
isinstancer   int.0keyr   r   J/var/www/html/django/DPS/env/lib/python3.9/site-packages/coreapi/client.py
<listcomp>   s   z _lookup_link.<locals>.<listcomp>)r   r    c                 s   s    | ]}d t |d V  qdS z[%s]uNreprstripr   r   r   r   	<genexpr>$       z_lookup_link.<locals>.<genexpr>z8Index %s did not reference a link. Key %s was not found.r   N   c                 s   s    | ]}d t |d V  qdS r   r   r   r   r   r   r   -   r   z>Can only call 'action' on a Link. Index %s returned type '%s'.)r   listtuple	TypeErroranyr
   	enumerateKeyError
IndexErrorjoinr   ZLinkLookupErrorr   r   r   appendr   type__name__)	r   r   msgnodelink_ancestorsidxr   Zindex_stringZancestorr   r   r   _lookup_link   s4    "
r-   c           	      C   s   t | }t dd | jD }t dd | jD }i }|| }|D ]}d||< qD|||B  }|D ]}d||< qb|r~t|dS )z
    Ensure that parameters passed to the link are correct.
    Raises a `ParameterError` if any parameters do not validate.
    c                 S   s   g | ]}|j r|jqS r   requirednamer   fieldr   r   r   r   <   s   z(_validate_parameters.<locals>.<listcomp>c                 S   s   g | ]}|j s|jqS r   r.   r1   r   r   r   r   ?   s   zThis parameter is required.zUnknown parameter.N)setr   fieldsr   ZParameterError)	link
parametersprovidedr/   optionalerrorsmissingitemZ
unexpectedr   r   r   _validate_parameters6   s     

r<   c                   C   s   t  t  t  t  gS N)r   ZCoreJSONCodecZ	JSONCodecZ	TextCodecZDownloadCodecr   r   r   r   get_default_decodersS   s
    r>   c                 C   s   t j| |dgS )Nauthsession)r   ZHTTPTransportr?   r   r   r   get_default_transports\   s    rB   c                   @   sL   e Zd ZdddZedd Zedd Zdd	d
ZdddZdddZ	dS )ClientNc                 C   sT   |d u s|d u sJ d|d u r&t  }|d u r8t|d}t|| _t|| _d S )NzCannot specify both 'auth' and 'transports'. When specifying transport instances explicitly you should set the authentication directly on the transport.)r@   )r>   rB   itypesList	_decoders_transports)selfdecodersr   r@   rA   r   r   r   __init__c   s    
zClient.__init__c                 C   s   | j S r=   )rF   rH   r   r   r   rI   p   s    zClient.decodersc                 C   s   | j S r=   )rG   rK   r   r   r   r   t   s    zClient.transportsFc                    sv   t |dd}| j} rXd} fdd| jD }|sXt } |v rL|  g}ntd  t| j|j}|j|||dS )Nget)actionTc                    s   g | ]}|j  kr|qS r   format)r   decoderrN   r   r   r   ~   r   zClient.get.<locals>.<listcomp>z%No decoder available with format='%s')force_codec)r   rI   r	   
ValueErrorr   r   url
transition)rH   rS   rO   rQ   r5   rI   Zinstalled_codecs	transportr   rN   r   rL   x   s    z
Client.getc                 C   s   | j |j||dS )N)rO   rQ   )rL   rS   )rH   r   rO   rQ   r   r   r   reload   s    zClient.reloadTc	                 C   s
  |d us|d us|d urT|d u r$i }|d ur4||d< |d urD||d< |d urT||d< t |trd|g}|d u rpi }t||\}	}
|rt|	| |r|d|	j}|d|	j}|d|	j}|d|	j}|d|	j	}t
|||||d}	t| j|	j}|j|	| j||
dS )NrM   encoding	transformrS   r4   )rM   rW   rX   r4   )paramsr+   )r   r   r-   r<   rL   rS   rM   rW   rX   r4   r   r   r   rT   rI   )rH   r   r   rY   validateZ	overridesrM   rW   rX   r5   r+   rS   r4   rU   r   r   r   rM      s2    

zClient.action)NNNN)NF)NF)NTNNNN)
r(   
__module____qualname__rJ   propertyrI   r   rL   rV   rM   r   r   r   r   rC   b   s   




  rC   )NN)Zcoreapir   r   r   Zcoreapi.compatr   Zcoreapi.documentr   r   Zcoreapi.utilsr   r	   collectionsrD   
namedtupler
   r-   r<   r>   rB   ZObjectrC   r   r   r   r   <module>   s   *	
