U
    ƽb"                     @   s   d dl mZmZmZ d dlmZmZ d dlmZ d dl	Z	dddZ
d ddZd!d
dZdd Zdd Zdd Zd"ddZi dfddZg fddZd#ddZd$ddZdd ZdS )%    )DocumentLinkField)string_typesurlparse)
ParseErrorNc           $   
      s  |}t | |}t| d}t|d}t|d}tt| d}t| d}i }| D ],}	||	d }
t||	}tt|d}| D ]}| }|dkrqt||}d	}d	}g  tt|d|| d
}|D ]}t|d}t|d}t	|d|dkd}|dkrld}t|d| d
}t
|}|d k	r> fdd|D } |7  n,t|d}t|d|tj|dd} | q|dkr~d}d}t|d}t|||tj|dd} | qtt|d|}d}|rt|}n|rt|dd}t|d}t|d}t|
|| ||d}tt|d} t|d}!| rt| d }"|"d  }#|!|#rT|!t|#d  }!|"|krfi ||"< |||" |!< q|||!< qqPt||||d!d"S )#Ninfotitledescriptionconsumespaths/
parameters)getputpostdeleteoptionsheadpatchFdereference_usingnameinrequiredpathdefaultbodyTschemac              	      s@   g | ]8\ }}t  fd dD st d|tj|ddqS )c                    s   g | ]}|j  kqS  )r   ).0field
field_namer    8/tmp/pip-unpacked-wheel-ai6_e3q7/openapi_codec/decode.py
<listcomp>2   s     z._parse_document.<locals>.<listcomp>.<listcomp>formr
   r   locationr   r   )anyr   
coreschemaString)r!   Zis_requiredfield_descriptionfieldsr#   r%   r&   *   s   
z#_parse_document.<locals>.<listcomp>r(   r)   ZformDatar'    )r'   summary)urlactionencodingr0   r	   r
   tagsZoperationIdr   _zapplication/openapi+json)r3   r	   r
   content
media_type)_get_document_base_url	_get_dict_get_stringget_strings	_get_listkeyslstrip	get_dictslower	_get_bool_expand_schemar   r,   r-   append_select_encodingr   
startswithlenr   )$database_urlZ
schema_urlr   r	   r
   r   r   r8   r   r3   specZdefault_parametersr4   Z	operationZhas_bodyZhas_formr   Z	parameterr   r*   r   r   expandedZexpanded_fieldsr.   r"   Zlink_consumesr5   Z
link_titleZlink_descriptionlinkr6   Zoperation_idtagprefixr    r/   r%   _parse_document   s    























rP   c           
      C   s   ddg}|r$t  |}|j}|j}nd}d}t| d|d}t| ddd}d|d }|dd }|sl|S t| d	}|s|p|d
 }	n0||kr|}	n"|D ]}	|	|kr qqtd| d|	||f S )z
    Get the base url to use when constructing absolute paths from the
    relative ones provided in the schema defination.
    httpshttpr1   Nhostr   ZbasePathr   schemesr   z"Unsupported transport schemes "%s"z	%s://%s%s)r   netlocschemer<   r@   rstripr>   r   )
rI   rJ   Zprefered_schemesZurl_componentsZdefault_hostZdefault_schemerS   r   rT   rV   r    r    r%   r:   o   s.    

r:   Fc                 C   sJ   |rdddg}nddddg}| s(|d S |D ]}|| kr,|  S q,| d S )zS
    Given an OpenAPI 'consumes' list, return a single 'encoding' for CoreAPI.
    zmultipart/form-dataz!application/x-www-form-urlencodedzapplication/jsonzapplication/octet-streamr   r    )r   r'   Z
preferencer9   r    r    r%   rF      s     
rF   c                    sP   |  d}t| d t| d|dgks0|dkrL rL fdd  D S dS )z
    When an OpenAPI parameter uses `in="body"`, and the schema type is "object",
    then we expand out the parameters of the object into individual fields.
    typeZ
propertiesr   objectc                    s$   g | ]}||k |  d fqS r(   )r   )r!   keyZschema_propertiesZschema_requiredr    r%   r&      s   z"_expand_schema.<locals>.<listcomp>N)r   r;   r>   r?   )r   Zschema_typer    r[   r%   rD      s    


rD   c                 C   s,   |  dd}|}|D ]}t||}q|S )zL
    Dereference a JSON pointer.
    http://tools.ietf.org/html/rfc6901
    z#/r   )stripsplitr;   )Zlookup_stringstructr?   noderZ   r    r    r%   dereference   s
    r`   c                 C   s   t | tod| kot| dkS )N$ref   )
isinstancedictrH   )valuer    r    r%   is_json_pointer   s    rf   r1   c                 C   s   |  |}t|tr|S |S N)r   rc   r   itemrZ   r   re   r    r    r%   r<      s    
r<   c                 C   s:   |  |}t|tr2|r.t|r.t|d |S |S | S )Nra   )r   rc   rd   rf   r`   copy)ri   rZ   r   r   re   r    r    r%   r;      s    

r;   c                 C   s    |  |}t|tr|S t|S rg   )r   rc   listrh   r    r    r%   r>      s    
r>   c                 C   s   |  |}t|tr|S |S rg   )r   rc   boolrh   r    r    r%   rC      s    
rC   c                    s(   dd | D } r$ fdd|D S |S )Nc                 S   s   g | ]}t |tr|qS r    )rc   rd   r!   re   r    r    r%   r&      s     
 zget_dicts.<locals>.<listcomp>c                    s&   g | ]}t |rt|d   n|qS )ra   )rf   r`   rm   r   r    r%   r&      s   r    )ri   r   retr    r   r%   rA      s    
rA   c                 C   s   dd | D S )Nc                 S   s   g | ]}t |tr|qS r    )rc   r   rm   r    r    r%   r&      s     
 zget_strings.<locals>.<listcomp>r    )ri   r    r    r%   r=      s    r=   )N)N)F)r1   )F)N)Zcoreapir   r   r   Zcoreapi.compatr   r   Zcoreapi.exceptionsr   r,   rP   r:   rF   rD   r`   rf   r<   r;   r>   rC   rA   r=   r    r    r    r%   <module>   s   
h
*

	


