
    R1i03                         d dl Z d dlZd dlmZmZ d dlmZmZ d dlm	Z	 d dlm
Z d dlmZ d dlmZmZ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mZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z%  G d de      Z
 G d de	      Z&y)    N)
URLPatternURLResolver)viewsviewsets)BaseSchemaGenerator)EndpointEnumerator)api_settings)add_trace_messageerrorget_overridereset_generator_statswarn)OpenApiViewExtension)
AutoSchema)ComponentRegistryalpha_operation_sorterbuild_root_objectcamelize_operation	get_classis_versioning_supportedmodify_for_versioningnormalize_result_objectoperation_matches_versionprocess_webhookssanitize_result_object)spectacular_settingsc                   2     e Zd ZddZ fdZd Zd Z xZS )r   c                    | j                  ||      }t        j                  D ]  } ||      } i }|D ]  \  }}}}	||f|vs||||	f|||f<    t        |j	                               }t        t        j                        rt        |t        j                        S t        j                  rt        |t              S |S )N)	endpoints)key)	_get_api_endpointsr   PREPROCESSING_HOOKSlistvaluescallableSORT_OPERATIONSsortedr   )
selfpatternsprefixapi_endpointshookapi_endpoints_deduplicatedpath
path_regexmethodcallbacks
             ^/home/cursorai/projects/iching/venv/lib/python3.12/site-packages/drf_spectacular/generators.pyget_api_endpointsz$EndpointEnumerator.get_api_endpoints   s    //&A(<<D =9M = &("2?.D*fhf~%??<@*fV^;_*4<8 3@ 7>>@A(889--A-Q-QRR!11--CDD      c                 J    t         |   |      }|j                  dd      }|S )Nz\..)superget_path_from_regexreplace)r(   r/   r.   	__class__s      r2   r8   z&EndpointEnumerator.get_path_from_regex,   s'    w*:6||E3'r4   c                    || j                   }g }|D ]  }|t        |j                        z   }t        |t              r^| j                  |      }|j                  }| j                  ||      s[| j                  |      D ]  }||||f}	|j                  |	        t        |t              s| j                  |j                  |      }
|j                  |
        |S )z
        Return a list of all available API endpoints by inspecting the URL conf.
        Only modification the DRF version is passing through the path_regex.
        )r)   r*   )r)   strpattern
isinstancer   r8   r1   should_include_endpointget_allowed_methodsappendr   r!   url_patternsextend)r(   r)   r*   r+   r=   r/   r.   r1   r0   endpointnested_endpointss              r2   r!   z%EndpointEnumerator._get_api_endpoints2   s    
 }}HG#goo"66J':.//
;"++//h?"&":":8"D$(*fh#G%,,X6 #E G[1#'#:#:$11% $; $  $$%56  " r4   c                    t        |d      r|t        |j                        }d|j                  v rt        |j                  d         }nt        |j                  j
                        }||z  D cg c]  }|j                          }}n>i }d|j                  v r|j                  d   |d<    |j                  di |j                  }|D cg c]  }|dvr|
 c}S c c}w c c}w )Nactionshttp_method_names)OPTIONSHEADTRACECONNECT )hasattrsetrG   
initkwargsclsrH   upperallowed_methods)r(   r1   rG   rH   r0   methodskwargss          r2   r@   z&EndpointEnumerator.get_allowed_methodsO   s    8Y'(**+G"h&9&99$'(;(;<O(P$Q!$'(F(F$G!4;>O4OP4O&v||~4OGP F"h&9&99.6.A.ABU.V*+"hll,V,<<G ")
!(vDD 
 	
 Q
s   /CC )N )__name__
__module____qualname__r3   r8   r!   r@   __classcell__r:   s   @r2   r   r      s    !(:
r4   r   c                   R     e Zd ZeZ fdZ fdZd fd	Zd Zd Z	d Z
d	dZ xZS )
SchemaGeneratorc                 ~    t               | _        |j                  dd       | _        d | _        t        |   |i | y )Napi_version)r   registrypopr_   	inspectorr7   __init__)r(   argsrU   r:   s      r2   rc   zSchemaGenerator.__init__i   s9    )+!::mT:$)&)r4   c                 z    t         |   |||      }t        j                  rt	        j
                  dd|      }|S )zv
        Customized coerce_path which also considers the `_pk` suffix in URL paths
        of nested routers.
        z
{(\w+)_pk}z{\1_id})r=   replstring)r7   coerce_pathr   SCHEMA_COERCE_PATH_PK_SUFFIXresub)r(   r.   r0   viewr:   s       r2   rh   zSchemaGenerator.coerce_patho   s8    
 w"46<<66-jNDr4   c                    t        j                  |j                        }|r!|j                  }|j                         |_        t        |   ||d      }d|_        |r|_        t        |t        j                        rt        ||j                        }nBt        |t        j                        rt        ||j                               }nt        d       |S t        |di       j!                  dd      }|s|S t#        |      }	t#        |j                  j$                        }
t'        |	|
      s6t)        d |	j*                  D              |
j*                  z   }t-        d|i       }	 |	       |_        |S )a  
        customized create_view which is called when all routes are traversed. part of this
        is instantiating views with default params. in case of custom routes (@action) the
        custom AutoSchema is injected properly through 'initkwargs' on view. However, when
        decorating plain views like retrieve, this initialization logic is not running.
        Therefore forcefully set the schema if @extend_schema decorator was used.
        NTzUsing not supported View class. Class must be derived from APIView or any of its subclasses like GenericApiView, GenericViewSet.rU   schemac              3   X   K   | ]"  }|t         j                  j                  vr| $ y wN)r	   DEFAULT_SCHEMA_CLASS__mro__).0rQ   s     r2   	<genexpr>z.SchemaGenerator.create_view.<locals>.<genexpr>   s,      :l??GGG :s   (*ExtendedRearrangedSchema)r   	get_matchrQ   view_replacementr7   create_viewswagger_fake_viewr>   r   ViewSetMixingetattractionr   APIViewlowerr   getr   rn   
issubclasstuplerr   type)r(   r1   r0   requestoverride_vieworiginal_clsrl   r|   action_schemaaction_schema_classview_schema_classmror:   s               r2   rx   zSchemaGenerator.create_viewy   sV    -66x||D#<<L(99;HL w"8VT: "& 'HLdH112T4;;/Femm,T6<<>2FP K"599(DIK (6%hll&9&9:-/@A  2::  "))*C #''A3"K)+r4   c                     | j                   K| j                  | j                  | j                        | _        | j                  j                         | _         y y rp   )r   endpoint_inspector_clsr)   urlconfrb   r3   )r(   s    r2   _initialise_endpointsz%SchemaGenerator._initialise_endpoints   sA    >>!!88UDN!^^==?DN "r4   c                     g }| j                   D ]A  \  }}}}| j                  ||      }| j                  |||      }|j                  ||||f       C |S )zY
        Generate (path, method, view) given (path, method, callback) for paths.
        )r   rx   rh   rA   )r(   view_endpointsr.   r/   r0   r1   rl   s          r2   _get_paths_and_endpointsz(SchemaGenerator._get_paths_and_endpoints   sf     26...D*fh##Hf5D##D&$7D!!4VT"BC 3A
 r4   c                    i }| j                          | j                         }t        j                  t	        t        |D cg c]  \  }}}}|j                   c}}            dkD  }|rJt        j                  j                  |D cg c]	  \  }}}}| c}}      }	t        j                  |	      }	nd}	nt        j                  }	|	j                  d      sd|	z   }	|D ]F  \  }}
}}t        |dg       D ]  }t        |        t        |dg       D ]  }t        |        t        j                   ||||      |_        |s| j%                  |||      sv|j&                  r/t)        |j&                        st        d|j&                   d       nd|j&                  rX| j*                  xs |j&                  j,                  }|st/        | j0                  j2                  ||||      }t5        ||      st7        |j8                  t:              sJ d	|j                   d
       t=        t?        |d|            5  |j8                  jA                  ||
|	|| jB                        }ddd       st        jD                  r't        jF                  |	d|t        jH                        }t        jJ                  rt        jJ                  |z   }|j                  d      sd|z   }t        jL                  rtO        ||      \  }}|jQ                  |i        |||   |jS                         <   I |S c c}}w c c}}w # 1 sw Y   xY w)z: Iterate endpoints generating per method path operations. N   /^warningserrorsz$using unsupported versioning class "z.". view will be processed as unversioned view.z%Incompatible AutoSchema used on View z. Is DRF's DEFAULT_SCHEMA_CLASS pointing to "drf_spectacular.openapi.AutoSchema" or any other drf-spectacular compatible AutoSchema?r:   rV   )r=   rf   rg   flags)*r   r   r   SCHEMA_PATH_PREFIXlenrO   r:   osr.   
commonpathrj   escape
startswithr   r   r   GET_MOCK_REQUESTr   has_view_permissionsversioning_classr   r_   default_versionr   rb   r)   r   r>   rn   r   r
   r{   get_operationr`   SCHEMA_PATH_PREFIX_TRIMrk   
IGNORECASESCHEMA_PATH_PREFIX_INSERTCAMELIZE_NAMESr   
setdefaultr~   )r(   input_requestpublicresultr   _rl   non_trivial_prefixr.   path_prefixr/   r0   weversion	operations                   r2   parsezSchemaGenerator.parse   s   ""$113	22: "%Si)Xi]Q1d$..i)X%Y!Z]^!^! gg00I1VI=4Aq$I1VW ii4!.AAK%%c*+K.7*D*fd!$
B7Q 8!$"5a 6 0@@tUbcDLd77fdK$$-DTEZEZ-[:4;P;P:Q R5 6 &&$$ =,,<<  ,T^^-D-DfdTXZab0w?dkk:6 77G HF G6
 #74d#CD KK55*k64==	 E #;;vvk4r}}]#==+EEL??3'Tz#22"4T9"EidB'+4F4L(o /8r I *Y1VT EDs   L,	L2
:*L88M	c           
         t                t        | j                  ||      | j                  j	                  t
        j                        t        t
        j                  | j                        | j                  xs t        |dd            }t
        j                  D ]  } ||| ||      } t        t        |            S )z Generate a OpenAPI schema. r   N)paths
componentswebhooksr   )r   	generatorr   r   )r   r   r   r`   buildr   APPEND_COMPONENTSr   WEBHOOKSr_   r{   POSTPROCESSING_HOOKSr   r   )r(   r   r   r   r,   s        r2   
get_schemazSchemaGenerator.get_schema  s    "**Wf-}}**+?+Q+QR%&:&C&CT]]S$$ID(I	
 )==D4QWXF > &&=f&EFFr4   rp   )NF)rW   rX   rY   r   r   rc   rh   rx   r   r   r   r   rZ   r[   s   @r2   r]   r]   f   s1    /*>@@

M^Gr4   r]   )'r   rj   django.urlsr   r   rest_frameworkr   r   !rest_framework.schemas.generatorsr   r   BaseEndpointEnumeratorrest_framework.settingsr	   drf_spectacular.drainager
   r   r   r   r   drf_spectacular.extensionsr   drf_spectacular.openapir   drf_spectacular.plumbingr   r   r   r   r   r   r   r   r   r   r   drf_spectacular.settingsr   r]   rM   r4   r2   <module>r      sf    	 	 / * A Z 0  < .   
 :L
/ L
^G) Gr4   