U
    Â½„b(&  ã                	   @   sÎ   d dl mZ d dlmZmZ d dlmZ d dlZdd„ Zdd„ Z	d	d
„ Z
dd„ ZeddddddddgƒZdej_G dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZdS ) é    )Úunicode_literals)ÚOrderedDictÚ
namedtuple)Ústring_typesNc                 C   s(   t | tƒrt| ƒS t | tƒr$t| ƒS | S ©N)Ú
isinstanceÚdictÚObjectÚlistÚArray)Úvalue© r   ú4/tmp/pip-unpacked-wheel-07qh9vnj/coreapi/document.pyÚ_to_immutable   s
    

r   c                 C   s   ddl m} |ƒ  | ¡S )Nr   )ÚPythonCodec)Zcoreapi.codecs.pythonr   Úencode)Únoder   r   r   r   Ú_repr   s    r   c                 C   s   ddl m} |ƒ  | ¡S )Nr   )ÚDisplayCodec)Zcoreapi.codecs.displayr   r   )r   r   r   r   r   Ú_str   s    r   c                 C   sB   | \}}t |tƒr:ddddddœ |jd¡}d|j|ffS d|fS )zˆ
    Document and Object sorting.
    Regular attributes sorted alphabetically.
    Links are sorted based on their URL and action.
    r   é   é   é   é   )ÚgetÚpostÚputÚpatchÚdeleteé   )r   ÚLinkr   ÚactionÚurl)ÚitemÚkeyr   Zaction_priorityr   r   r   Ú_key_sorting   s    
û úr%   ÚFieldÚnameÚrequiredÚlocationZschemaÚdescriptionÚtypeZexample)FÚ NNNNc                       s’   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z‡ fdd„Z	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZ‡  ZS )ÚDocumentzŠ
    The Core API document type.

    Expresses the data that the client may access,
    and the actions that the client may perform.
    Nc                 C   s  |d kri n|}|d k	r*t |tƒs*tdƒ‚|d k	rDt |tƒsDtdƒ‚|d k	r^t |tƒs^tdƒ‚|d k	rxt |tƒsxtdƒ‚t |tƒsŠtdƒ‚tdd„ | ¡ D ƒƒr¨tdƒ‚|d kr´d	n|| _|d krÆd	n|| _|d krØd	n|| _|d krêd	n|| _	d
d„ | 
¡ D ƒ| _d S )Nz'url' must be a string.ú'title' must be a string.z'description' must be a string.z'media_type' must be a string.ú'content' must be a dict.c                 S   s   g | ]}t |tƒ ‘qS r   ©r   r   ©Ú.0r$   r   r   r   Ú
<listcomp>K   s     z%Document.__init__.<locals>.<listcomp>úcontent keys must be strings.r,   c                 S   s   i | ]\}}|t |ƒ“qS r   ©r   ©r2   r$   r   r   r   r   Ú
<dictcomp>R   s      z%Document.__init__.<locals>.<dictcomp>)r   r   Ú	TypeErrorr   ÚanyÚkeysÚ_urlÚ_titleÚ_descriptionÚ_media_typeÚitemsÚ_data)Úselfr"   Útitler*   Ú
media_typeÚcontentr   r   r   Ú__init__>   s$    
zDocument.__init__c                 C   s   |   | j| j| j| j|¡S r   )Ú	__class__r"   rB   r*   rC   )rA   Údatar   r   r   ÚcloneT   s    zDocument.clonec                 C   s$   t | j ¡ td�}tdd„ |D ƒƒS )N©r$   c                 S   s   g | ]\}}|‘qS r   r   r6   r   r   r   r3   Y   s     z%Document.__iter__.<locals>.<listcomp>©Úsortedr@   r?   r%   Úiter©rA   r?   r   r   r   Ú__iter__W   s    zDocument.__iter__c                 C   s   t | ƒS r   ©r   ©rA   r   r   r   Ú__repr__[   s    zDocument.__repr__c                 C   s   t | ƒS r   ©r   rP   r   r   r   Ú__str__^   s    zDocument.__str__c                    s@   | j |j kr0| j|jko.| j|jko.| j|jkS tt| ƒ |¡S r   )rF   r"   rB   r@   Úsuperr-   Ú__eq__©rA   Úother©rF   r   r   rU   a   s    
ÿ
ýzDocument.__eq__c                 C   s   | j S r   ©r;   rP   r   r   r   r"   j   s    zDocument.urlc                 C   s   | j S r   ©r<   rP   r   r   r   rB   n   s    zDocument.titlec                 C   s   | j S r   ©r=   rP   r   r   r   r*   r   s    zDocument.descriptionc                 C   s   | j S r   )r>   rP   r   r   r   rC   v   s    zDocument.media_typec                 C   s   t dd„ |  ¡ D ƒƒS )Nc                 S   s"   g | ]\}}t |tƒs||f‘qS r   ©r   r    r6   r   r   r   r3   |   s   
ÿz!Document.data.<locals>.<listcomp>©r   r?   rP   r   r   r   rG   z   s    ÿzDocument.datac                 C   s   t dd„ |  ¡ D ƒƒS )Nc                 S   s"   g | ]\}}t |tƒr||f‘qS r   r\   r6   r   r   r   r3   ƒ   s   
ÿz"Document.links.<locals>.<listcomp>r]   rP   r   r   r   Úlinks�   s    ÿzDocument.links)NNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rE   rH   rN   rQ   rS   rU   Úpropertyr"   rB   r*   rC   rG   r^   Ú__classcell__r   r   rX   r   r-   7   s&   
	




r-   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zed
d„ ƒZ	edd„ ƒZ
dS )r	   z4
    An immutable mapping of strings to values.
    c                 O   s@   t ||Ž}tdd„ | ¡ D ƒƒr(tdƒ‚dd„ | ¡ D ƒ| _d S )Nc                 S   s   g | ]}t |tƒ ‘qS r   r0   r1   r   r   r   r3   �   s     z#Object.__init__.<locals>.<listcomp>zObject keys must be strings.c                 S   s   i | ]\}}|t |ƒ“qS r   r5   r6   r   r   r   r7   ‘   s      z#Object.__init__.<locals>.<dictcomp>)r   r9   r:   r8   r?   r@   )rA   ÚargsÚkwargsrG   r   r   r   rE   �   s    
zObject.__init__c                 C   s$   t | j ¡ td�}tdd„ |D ƒƒS )NrI   c                 S   s   g | ]\}}|‘qS r   r   r6   r   r   r   r3   •   s     z#Object.__iter__.<locals>.<listcomp>rJ   rM   r   r   r   rN   “   s    zObject.__iter__c                 C   s   t | ƒS r   rO   rP   r   r   r   rQ   —   s    zObject.__repr__c                 C   s   t | ƒS r   rR   rP   r   r   r   rS   š   s    zObject.__str__c                 C   s   t dd„ |  ¡ D ƒƒS )Nc                 S   s"   g | ]\}}t |tƒs||f‘qS r   r\   r6   r   r   r   r3   Ÿ   s   
ÿzObject.data.<locals>.<listcomp>r]   rP   r   r   r   rG   �   s    ÿzObject.datac                 C   s   t dd„ |  ¡ D ƒƒS )Nc                 S   s"   g | ]\}}t |tƒr||f‘qS r   r\   r6   r   r   r   r3   ¦   s   
ÿz Object.links.<locals>.<listcomp>r]   rP   r   r   r   r^   ¤   s    ÿzObject.linksN)r_   r`   ra   rb   rE   rN   rQ   rS   rc   rG   r^   r   r   r   r   r	   ‰   s   
r	   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r   z+
    An immutable list type container.
    c                 G   s   dd„ t |Ž D ƒ| _d S )Nc                 S   s   g | ]}t |ƒ‘qS r   r5   )r2   r   r   r   r   r3   ±   s     z"Array.__init__.<locals>.<listcomp>)r
   r@   )rA   re   r   r   r   rE   °   s    zArray.__init__c                 C   s   t | ƒS r   rO   rP   r   r   r   rQ   ³   s    zArray.__repr__c                 C   s   t | ƒS r   rR   rP   r   r   r   rS   ¶   s    zArray.__str__N)r_   r`   ra   rb   rE   rQ   rS   r   r   r   r   r   ¬   s   r   c                   @   s†   e Zd ZdZddd„Zedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ ZdS )r    z@
    Links represent the actions that a client may perform.
    Nc                 C   sv  |d k	rt |tƒstdƒ‚|d k	r4t |tƒs4tdƒ‚|d k	rNt |tƒsNtdƒ‚|d k	rht |tƒshtdƒ‚|d k	r‚t |tƒs‚tdƒ‚|d k	rœt |tƒsœtdƒ‚|d k	rºt |ttfƒsºtdƒ‚|d k	rÜtdd	„ |D ƒƒrÜtd
ƒ‚|d krèdn|| _|d krúdn|| _|d k�rdn|| _|d k�r"dn|| _	|d k�r6dn|| _
|d k�rJdn|| _|d k�r^dntdd	„ |D ƒƒ| _d S )Nz Argument 'url' must be a string.z#Argument 'action' must be a string.z%Argument 'encoding' must be a string.z&Argument 'transform' must be a string.z"Argument 'title' must be a string.z(Argument 'description' must be a string.z!Argument 'fields' must be a list.c                 S   s"   g | ]}t |tƒpt |tƒ ‘qS r   )r   r   r&   ©r2   r#   r   r   r   r3   Í   s   ÿz!Link.__init__.<locals>.<listcomp>z6Argument 'fields' must be a list of strings or fields.r,   r   c                 S   s(   g | ] }t |tƒr|nt|d dd�‘qS )Fr,   )r(   r)   )r   r&   rg   r   r   r   r3   Ù   s   ÿ)r   r   r8   r
   Útupler9   r;   Ú_actionÚ	_encodingÚ
_transformr<   r=   Ú_fields)rA   r"   r!   ÚencodingÚ	transformrB   r*   Úfieldsr   r   r   rE   ¾   s6    þþzLink.__init__c                 C   s   | j S r   rY   rP   r   r   r   r"   Þ   s    zLink.urlc                 C   s   | j S r   )ri   rP   r   r   r   r!   â   s    zLink.actionc                 C   s   | j S r   )rj   rP   r   r   r   rm   æ   s    zLink.encodingc                 C   s   | j S r   )rk   rP   r   r   r   rn   ê   s    zLink.transformc                 C   s   | j S r   rZ   rP   r   r   r   rB   î   s    z
Link.titlec                 C   s   | j S r   r[   rP   r   r   r   r*   ò   s    zLink.descriptionc                 C   s   | j S r   )rl   rP   r   r   r   ro   ö   s    zLink.fieldsc                 C   sj   t |tƒoh| j|jkoh| j|jkoh| j|jkoh| j|jkoh| j|jkoht| jdd„ d�t|jdd„ d�kS )Nc                 S   s   | j S r   )r'   )Úfr   r   r   Ú<lambda>  ó    zLink.__eq__.<locals>.<lambda>rI   )	r   r    r"   r!   rm   rn   r*   rK   ro   rV   r   r   r   rU   ú   s    

ÿ
þ
ý
ü
û"ùzLink.__eq__c                 C   s   t | ƒS r   rO   rP   r   r   r   rQ     s    zLink.__repr__c                 C   s   t | ƒS r   rR   rP   r   r   r   rS     s    zLink.__str__)NNNNNNN)r_   r`   ra   rb   rE   rc   r"   r!   rm   rn   rB   r*   ro   rU   rQ   rS   r   r   r   r   r    º   s&   
 






r    c                   @   sJ   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zedd„ ƒZ	dd„ Z
dS )ÚErrorNc                 C   sŒ   |d kri n|}|d k	r*t |tƒs*tdƒ‚|d k	rDt |tƒsDtdƒ‚tdd„ | ¡ D ƒƒrbtdƒ‚|d krndn|| _dd„ | ¡ D ƒ| _d S )	Nr.   r/   c                 S   s   g | ]}t |tƒ ‘qS r   r0   r1   r   r   r   r3     s     z"Error.__init__.<locals>.<listcomp>r4   r,   c                 S   s   i | ]\}}|t |ƒ“qS r   r5   r6   r   r   r   r7     s      z"Error.__init__.<locals>.<dictcomp>)	r   r   r8   r   r9   r:   r<   r?   r@   )rA   rB   rD   rG   r   r   r   rE     s    zError.__init__c                 C   s$   t | j ¡ td�}tdd„ |D ƒƒS )NrI   c                 S   s   g | ]\}}|‘qS r   r   r6   r   r   r   r3     s     z"Error.__iter__.<locals>.<listcomp>rJ   rM   r   r   r   rN     s    zError.__iter__c                 C   s   t | ƒS r   rO   rP   r   r   r   rQ     s    zError.__repr__c                 C   s   t | ƒS r   rR   rP   r   r   r   rS   !  s    zError.__str__c                 C   s"   t |tƒo | j|jko | j|jkS r   )r   rs   rB   r@   rV   r   r   r   rU   $  s
    

ÿ
ýzError.__eq__c                 C   s   | j S r   rZ   rP   r   r   r   rB   +  s    zError.titlec                 C   s2   g }|   ¡ D ] }t|tƒr|dd„ |D ƒ7 }q|S )Nc                 S   s   g | ]}t |tƒr|‘qS r   r0   rg   r   r   r   r3   3  s    
 z&Error.get_messages.<locals>.<listcomp>)Úvaluesr   r   )rA   Úmessagesr   r   r   r   Úget_messages/  s    
ÿ
zError.get_messages)NN)r_   r`   ra   rE   rN   rQ   rS   rU   rc   rB   rv   r   r   r   r   rs     s   

rs   )Ú
__future__r   Úcollectionsr   r   Zcoreapi.compatr   Zitypesr   r   r   r%   r&   Ú__new__Ú__defaults__ÚDictr-   r	   ÚListr   r    rs   r   r   r   r   Ú<module>   s   R#R