U
    &%e_                     @   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k
rh   dZY nX 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ejedddZdS )OpenAPIResponsezapplication/vnd.oai.openapi)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   P/var/www/html/Darija-Ai-API/env/lib/python3.8/site-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                   @   sp   e Zd Zeje edddZeje eje dddZ	e
e
dddZejed	d
dZeedddZdS )BaseSchemaGeneratorroutesr	   c                 C   s
   t  d S N)NotImplementedError)r   r$   r   r   r   
get_schema!   s    zBaseSchemaGenerator.get_schemac                    s
  g }|D ]}t |trP| |j |jp*g } fdd| |D }|| qt |tr|jsdqqt	
|js|t	|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   joinr   r   r   ).0Z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   Zinclude_in_schemainspect
isfunctionendpointismethodmethodsappendr   lowerhasattrgetattr)r   r$   endpoints_infoZrouteZsub_endpointsmethodr   r   r+   r   r6   $   s4    


z!BaseSchemaGenerator.get_endpoints)r   r	   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_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   rF   Z	docstringparsedr   r   r   parse_docstring_   s    

z#BaseSchemaGenerator.parse_docstring)requestr	   c                 C   s   |j j}| j|d}t|S )N)r$   )Zappr$   r'   r   )r   rL   r$   schemar   r   r   r   w   s    z#BaseSchemaGenerator.OpenAPIResponseN)r   r   r   r   Listr   r   r'   r   r6   r   r5   r!   rK   r   r   r   r   r   r   r   r"       s   2	r"   c                   @   s2   e Zd ZeddddZeje edddZdS )SchemaGeneratorN)base_schemar	   c                 C   s
   || _ d S r%   )rP   )r   rP   r   r   r   __init__~   s    zSchemaGenerator.__init__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   rP   
setdefaultr6   rK   r   r   r   )r   r$   rM   rA   r:   rJ   r   r   r   r'      s    

zSchemaGenerator.get_schema)	r   r   r   r   rQ   r   rN   r   r'   r   r   r   r   rO   }   s   rO   )r8   rD   r   Zstarlette.requestsr   Zstarlette.responsesr   Zstarlette.routingr   r   r   r
   ModuleNotFoundErrorr   
NamedTupler   r"   rO   r   r   r   r   <module>   s   
]