U
    Rh=                     @  s   d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZ zd dlZW n ek
rx   dZY nX G dd deZG dd	 d	ejZed
ZG dd dZG dd deZdS )    )annotationsN)Request)Response)	BaseRouteHostMountRoutec                   @  s    e Zd ZdZdddddZdS )OpenAPIResponsezapplication/vnd.oai.openapiz
typing.Anybytes)contentreturnc                 C  s6   t d k	stdt|ts"tdt j|dddS )Nz2`pyyaml` must be installed to use OpenAPIResponse.z<The schema passed to OpenAPIResponse should be a dictionary.F)Zdefault_flow_stylezutf-8)yamlAssertionError
isinstancedictdumpencode)selfr    r   7./venv/lib/python3.8/site-packages/starlette/schemas.pyrender   s    zOpenAPIResponse.renderN)__name__
__module____qualname__Z
media_typer   r   r   r   r   r	      s   r	   c                   @  s&   e Zd ZU ded< ded< ded< dS )EndpointInfostrpathhttp_method typing.Callable[..., typing.Any]funcN)r   r   r   __annotations__r   r   r   r   r      s   
r   z:\w+}c                   @  s\   e Zd ZdddddZdddddZd	d	d
ddZdddddZdddddZdS )BaseSchemaGeneratorlist[BaseRoute]dict[str, typing.Any]routesr   c                 C  s
   t  d S N)NotImplementedError)r   r%   r   r   r   
get_schema$   s    zBaseSchemaGenerator.get_schemazlist[EndpointInfo]c                   s   g }|D ]}t |ttfrf|jp$g }t |tr>| |j nd  fdd| |D }|| qt |tr|j	szqqt
|jst
|jr| |j |jpdgD ]&}|dkrq|t | |j qq| |j dD ]4}t|j|sqt|j|}|t | | qq|S )a
  
        Given the routes, yields the following information:

        - path
            eg: /users/
        - http_method
            one of 'get', 'post', 'put', 'patch', 'delete', 'options'
        - func
            method ready to extract the docstring
         c                   s*   g | ]"}t d  |jf|j|jdqS )r)   )r   r   r   )r   joinr   r   r   ).0Zsub_endpointr   r   r   
<listcomp>;   s   z5BaseSchemaGenerator.get_endpoints.<locals>.<listcomp>ZGETZHEAD)getZpostZputZpatchdeleteoptions)r   r   r   r%   _remove_converterr   get_endpointsextendr   Zinclude_in_schemainspectZ
isfunctionendpointZismethodmethodsappendr   lowerhasattrgetattr)r   r%   endpoints_infoZrouteZsub_endpointsmethodr   r   r,   r   r2   '   s4    



z!BaseSchemaGenerator.get_endpointsr   )r   r   c                 C  s   t d|S )z
        Remove the converter from the path.
        For example, a route like this:
            Route("/users/{id:int}", endpoint=get_user, methods=["GET"])
        Should be represented as `/users/{id}` in the OpenAPI schema.
        })_remove_converter_patternsub)r   r   r   r   r   r1   X   s    z%BaseSchemaGenerator._remove_converterr   )func_or_methodr   c                 C  sH   |j }|si S tdk	std|dd }t|}t|tsDi S |S )z`
        Given a function, parse the docstring as YAML and return a dictionary of info.
        Nz2`pyyaml` must be installed to use parse_docstring.z---)__doc__r   r   splitZ	safe_loadr   r   )r   r@   Z	docstringparsedr   r   r   parse_docstringa   s    

z#BaseSchemaGenerator.parse_docstringr   r   )requestr   c                 C  s   |j j}| j|d}t|S )N)r%   )Zappr%   r(   r	   )r   rF   r%   schemar   r   r   r	   y   s    z#BaseSchemaGenerator.OpenAPIResponseN)r   r   r   r(   r2   r1   rE   r	   r   r   r   r   r!   #   s
   1	r!   c                   @  s,   e Zd ZdddddZddddd	Zd
S )SchemaGeneratorr#   None)base_schemar   c                 C  s
   || _ d S r&   )rJ   )r   rJ   r   r   r   __init__   s    zSchemaGenerator.__init__r"   r$   c                 C  sp   t | j}|di  | |}|D ]F}| |j}|s:q$|j|d krVi |d |j< ||d |j |j< q$|S )Npaths)r   rJ   
setdefaultr2   rE   r   r   r   )r   r%   rG   r;   r5   rD   r   r   r   r(      s    

zSchemaGenerator.get_schemaN)r   r   r   rK   r(   r   r   r   r   rH      s   rH   )Z
__future__r   r4   retypingZstarlette.requestsr   Zstarlette.responsesr   Zstarlette.routingr   r   r   r   r   ModuleNotFoundErrorr	   Z
NamedTupler   compiler>   r!   rH   r   r   r   r   <module>   s   
	
\