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stdtdd | D rtd|d krd	n|| _|d krd	n|| _|d krd	n|| _|d krd	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	rt |tstd|d k	rt |tstd|d k	rt |ttfstd|d k	rtdd	 |D rtd
|d krdn|| _|d krd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