o
     dX                     @   s   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
 zd dlZW n ey3   dZY nw G dd deZG dd dejZG d	d
 d
ZG dd deZdS )    N)Request)Response)	BaseRouteMountRoutec                   @   s$   e Zd ZdZdejdefddZdS )OpenAPIResponsezapplication/vnd.oai.openapicontentreturnc                 C   s6   t d usJ dt|tsJ 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)default_flow_stylezutf-8)yaml
isinstancedictdumpencode)selfr    r   </usr/local/lib/python3.10/dist-packages/starlette/schemas.pyrender   s   zOpenAPIResponse.renderN)__name__
__module____qualname__
media_typetypingAnybytesr   r   r   r   r   r      s    r   c                   @   s(   e Zd ZU eed< eed< ejed< dS )EndpointInfopathhttp_methodfuncN)r   r   r   str__annotations__r   Callabler   r   r   r   r      s   
 r   c                   @   sz   e Zd Zdeje defddZdeje deje fddZ	de
de
fdd	Zd
ejdefddZdedefddZdS )BaseSchemaGeneratorroutesr	   c                 C   s   t  N)NotImplementedError)r   r#   r   r   r   
get_schema!   s   zBaseSchemaGenerator.get_schemac                    s  g }|D ]}}t |tr(| |j |jpg } fdd| |D }|| qt |tr0|js1qt	
|js=t	|jr^| |j |jpHdgD ]}|dkrPqI|t | |j qIq| |j dD ]}t|j|soqft|j|}|t | | qfq|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   joinr   r   r   ).0sub_endpointr   r   r   
<listcomp>7   s    z5BaseSchemaGenerator.get_endpoints.<locals>.<listcomp>GETHEAD)getpostputpatchdeleteoptions)r   r   _remove_converterr   r#   get_endpointsextendr   include_in_schemainspect
isfunctionendpointismethodmethodsappendr   lowerhasattrgetattr)r   r#   endpoints_inforoutesub_endpointsmethodr   r   r+   r   r6   $   s8   


z!BaseSchemaGenerator.get_endpointsr   c                 C   s   t d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.
        z:\w+}})resub)r   r   r   r   r   r5   V   s   z%BaseSchemaGenerator._remove_converterfunc_or_methodc                 C   sH   |j }|si S tdusJ d|dd }t|}t|ts"i 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   split	safe_loadr   r   )r   rI   	docstringparsedr   r   r   parse_docstring_   s   

z#BaseSchemaGenerator.parse_docstringrequestc                 C   s   |j j}| j|d}t|S )N)r#   )appr#   r&   r   )r   rQ   r#   schemar   r   r   r   w   s   z#BaseSchemaGenerator.OpenAPIResponseN)r   r   r   r   Listr   r   r&   r   r6   r   r5   r!   rP   r   r   r   r   r   r   r   r"       s    
2	r"   c                   @   s6   e Zd ZdeddfddZdeje defddZdS )	SchemaGeneratorbase_schemar	   Nc                 C   s
   || _ d S r$   )rV   )r   rV   r   r   r   __init__~   s   
zSchemaGenerator.__init__r#   c                 C   sp   t | j}|di  | |}|D ]#}| |j}|sq|j|d vr+i |d |j< ||d |j |j< q|S )Npaths)r   rV   
setdefaultr6   rP   r   r   r   )r   r#   rS   rB   r;   rO   r   r   r   r&      s   

zSchemaGenerator.get_schema)	r   r   r   r   rW   r   rT   r   r&   r   r   r   r   rU   }   s    rU   )r9   rG   r   starlette.requestsr   starlette.responsesr   starlette.routingr   r   r   r   ImportErrorr   
NamedTupler   r"   rU   r   r   r   r   <module>   s    ]