o
    Ci                     @   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
mZ zd dlZW n ey5   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Host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   i/var/www/html/fyndo/python/python_agents/rag_suite/venv/lib/python3.10/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                   @   s2   e Zd ZU eed< eed< ejdejf ed< dS )EndpointInfopathhttp_method.funcN)r   r   r   str__annotations__r   Callabler   r   r   r   r   r      s   
 r   c                   @   s   e Zd Zdeje dejeejf 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jf dejeejf 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tfr2|jpg }t |tr| |j nd  fdd| |D }|| qt |tr:|j	s;qt
|jsGt
|jrh| |j |jpRdgD ]}|dkrZqS|t | |j qSq| |j dD ]}t|j|syqpt|j|}|t | | qpq|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   ).0sub_endpointr   r   r   
<listcomp><   s    z5BaseSchemaGenerator.get_endpoints.<locals>.<listcomp>GETHEAD)getpostputpatchdeleteoptions)r   r   r   r$   _remove_converterr   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   r7   &   s<   


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   r6   [   s   z%BaseSchemaGenerator._remove_converterfunc_or_method.c                 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   rJ   	docstringparsedr   r   r   parse_docstringd   s   

z#BaseSchemaGenerator.parse_docstringrequestc                 C   s   |j j}| j|d}t|S )N)r$   )appr$   r'   r   )r   rR   r$   schemar   r   r   r   ~   s   z#BaseSchemaGenerator.OpenAPIResponseN)r   r   r   r   Listr   Dictr    r   r'   r   r7   r6   r"   rQ   r   r   r   r   r   r   r   r#       s$    

5	
r#   c                   @   sN   e Zd Zdejeejf ddfddZdeje	 dejeejf fddZ
dS )	SchemaGeneratorbase_schemar
   Nc                 C   s
   || _ d S r%   )rX   )r   rX   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   rX   
setdefaultr7   rQ   r   r   r   )r   r$   rT   rC   r<   rP   r   r   r   r'      s   

zSchemaGenerator.get_schema)r   r   r   r   rV   r    r   rY   rU   r   r'   r   r   r   r   rW      s    rW   )r:   rH   r   starlette.requestsr   starlette.responsesr   starlette.routingr   r   r   r   r   ModuleNotFoundErrorr   
NamedTupler   r#   rW   r   r   r   r   <module>   s    d