
    vh                       d dl mZ d dlZd dlZd dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZ 	 d dlZ G d de      Z G d	 d
e      Z ej*                  d      Z G d d      Z G d de      Zy# e$ r dZY Gw xY w)    )annotationsN)AnyCallable
NamedTuple)Request)Response)	BaseRouteHostMountRoutec                      e Zd ZdZddZy)OpenAPIResponsezapplication/vnd.oai.openapic                    t         J d       t        |t              sJ d       t        j                  |d      j	                  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)selfcontents     I/var/www/html/luna/venv/lib/python3.12/site-packages/starlette/schemas.pyrenderzOpenAPIResponse.render   sF    U!UU'4(h*hh(yyU;BB7KK    N)r   r   returnbytes)__name__
__module____qualname__
media_typer    r   r   r   r      s    .JLr   r   c                  ,    e Zd ZU ded<   ded<   ded<   y)EndpointInfostrpathhttp_methodCallable[..., Any]funcN)r   r   r   __annotations__r!   r   r   r#   r#      s    
I
r   r#   z:\w+}c                  4    e Zd ZddZddZd	dZd
dZddZy)BaseSchemaGeneratorc                    t               N)NotImplementedError)r   routess     r   
get_schemazBaseSchemaGenerator.get_schema$   s    !##r   c           
     &   g }|D ]  }t        |t        t        f      r|j                  xs g }t        |t              r| j	                  |j
                        }nd}| j                  |      D cg c]?  }t        dj                  ||j
                  f      |j                  |j                        A }}|j                  |       t        |t              r|j                  st        j                  |j                         st        j"                  |j                         rm| j	                  |j
                        }|j$                  xs dgD ]<  }|dk(  r	|j'                  t        ||j)                         |j                                > | j	                  |j
                        }dD ]Y  }t+        |j                   |      st-        |j                   |      }|j'                  t        ||j)                         |             [  |S c c}w )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
         )r%   r&   r(   GETHEAD)getpostputpatchdeleteoptions)r   r   r
   r/   _remove_converterr%   get_endpointsr#   joinr&   r(   extendr   include_in_schemainspect
isfunctionendpointismethodmethodsappendlowerhasattrgetattr)	r   r/   endpoints_inforouter%   sub_endpointsub_endpointsmethodr(   s	            r   r<   z!BaseSchemaGenerator.get_endpoints'   s    .0  	TE%%/+eU+11%**=DD )-(:(:6(B! % !WWdL,=,=%>?$0$<$<)..! ! %%m4u-U5L5L##ENN3w7G7G7W--ejj9#mm6w ^F' ")),tV\\^U^^*\]^
 --ejj9R TF"5>>6: "5>>6:D")),tV\\^T*RS	T9 	TD 7!s   0AHc                .    t         j                  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%   s     r   r;   z%BaseSchemaGenerator._remove_converterX   s     ),,S$77r   c                    |j                   }|si S t        J d       |j                  d      d   }t        j                  |      }t	        |t
              si S |S )z`
        Given a function, parse the docstring as YAML and return a dictionary of info.
        z2`pyyaml` must be installed to use parse_docstring.z---)__doc__r   split	safe_loadr   r   )r   func_or_method	docstringparseds       r   parse_docstringz#BaseSchemaGenerator.parse_docstringa   sb     #**	IU!UU
 OOE*2.		*&$' Ir   c                h    |j                   j                  }| j                  |      }t        |      S )N)r/   )appr/   r0   r   )r   requestr/   schemas       r   r   z#BaseSchemaGenerator.OpenAPIResponsey   s,    ##/v&&r   Nr/   list[BaseRoute]r   dict[str, Any])r/   r`   r   zlist[EndpointInfo])r%   r$   r   r$   )rW   r'   r   ra   )r]   r   r   r   )r   r   r   r0   r<   r;   rZ   r   r!   r   r   r+   r+   #   s    $/b80'r   r+   c                      e Zd ZddZddZy)SchemaGeneratorc                    || _         y r-   )base_schema)r   re   s     r   __init__zSchemaGenerator.__init__   s
    &r   c                D   t        | j                        }|j                  di        | j                  |      }|D ]b  }| j	                  |j
                        }|s!|j                  |d   vri |d   |j                  <   ||d   |j                     |j                  <   d |S )Npaths)r   re   
setdefaultr<   rZ   r(   r%   r&   )r   r/   r^   rI   rB   rY   s         r   r0   zSchemaGenerator.get_schema   s    d&&''2&++F3& 		JH))(--8F}}F7O313w.CIF7OHMM*8+?+?@		J r   N)re   ra   r   Noner_   )r   r   r   rf   r0   r!   r   r   rc   rc      s    'r   rc   )
__future__r   r@   retypingr   r   r   starlette.requestsr   starlette.responsesr   starlette.routingr	   r
   r   r   r   ModuleNotFoundErrorr   r#   compilerP   r+   rc   r!   r   r   <module>rs      s    "  	 , , & ( ; ;
Lh L:  'BJJx0 Y' Y'x) e  Ds   A4 4A>=A>