U
    ½b                     @   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 nN tttfk
r   d	dd |D }d}t
||t|d	f Y nX 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   2/tmp/pip-unpacked-wheel-07qh9vnj/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>$   s     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   -   s     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-   r0   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    rA   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 ks|d kst d|d kr&t }|d k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?   )AssertionErrorr=   rA   itypesList	_decoders_transports)selfdecodersr   r?   r@   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 } |k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   ~   s     
 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   r4   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 k	s|d k	s|d k	rT|d kr$i }|d k	r4||d< |d k	rD||d< |d k	rT||d< t |trd|g}|d k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   r3   )rM   rW   rX   r3   )paramsr*   )r   r   r,   r;   rL   rS   rM   rW   rX   r3   r   r   r   rT   rI   )rH   r   r   rY   validateZ	overridesrM   rW   rX   r4   r*   rS   r3   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   rB   b   s   




      rB   )NN)Zcoreapir   r   r   Zcoreapi.compatr   Zcoreapi.documentr   r   Zcoreapi.utilsr   r	   collectionsrD   
namedtupler
   r,   r;   r=   rA   ZObjectrB   r   r   r   r   <module>   s   *	
