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 )Nz˜Cannot 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||ƒ\}	}
|rŒt|	|ƒ |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   *	
