
    ~hP                     D   d dl Z d dlZd dlmZmZmZmZ d dlmZm	Z	m
Z
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 d dlmZ d dl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 d dlmZ d dlm Z   ejB                  e"      Z#ed   Z$ed   Z%e&e'ef   Z( G d de       Z) G d de       Z* G d de       Z+ G d de       Z,g dZ- edee      Z. edee      Z/ edee      Z0 ede
e      Z1 edee      Z2 edee      Z3 ed e	e      Z4 ed!ee      Z5d"e&e'ef   d#e6e,   fd$Z7 G d% d&ee.e0e/e1e2e3e4e5f         Z8d'e(dz  d#e(dz  fd(Z9d'e(dz  d#efd)Z:d7d*ed+e;d#e'fd,Z<	 	 d8d-e'd.e&e'ef   d/e6e)   dz  d0e*dz  d#e'f
d1Z=	 d9d2e&e'ef   d3e'dz  d#e&e'ef   fd4Z>d5e,d#e&e'ef   fd6Z?y):    N)AnyGenericLiteralTypeVar)OpenAPI	Operation	ParameterPathItem	ReferenceRequestBodyResponseSchema)r   )r   )r	   )r
   )r   )r   )r   )r   )	BaseModelFieldValidationError)compress_schema)FastMCPBaseModel)GETPOSTPUTDELETEPATCHOPTIONSHEADTRACEpathqueryheadercookiec                   f    e Zd ZU dZeed<   eed<   dZeed<    e	dd      Z
eed	<   d
Zed
z  ed<   y
)ParameterInfoz>Represents a single parameter for an HTTP operation in our IR.namelocationFrequired.schema)aliasschema_Ndescription)__name__
__module____qualname____doc__str__annotations__ParameterLocationr%   boolr   r(   
JsonSchemar)        U/opt/mcp/mcp-sentiment/venv/lib/python3.12/site-packages/fastmcp/utilities/openapi.pyr"   r"   *   s9    H
IHd84GZ4"Kt"r4   r"   c                   Z    e Zd ZU dZdZeed<    ee      Z	ee
ef   ed<   dZe
dz  ed<   y)RequestBodyInfoz<Represents the request body for an HTTP operation in our IR.Fr%   default_factorycontent_schemaNr)   )r*   r+   r,   r-   r%   r1   r/   r   dictr:   r.   r2   r)   r3   r4   r5   r7   r7   4   s<    FHd,1-NDj)  #Kt"r4   r7   c                   L    e Zd ZU dZdZedz  ed<    ee      Z	eee
f   ed<   y)ResponseInfoz*Represents response information in our IR.Nr)   r8   r:   )r*   r+   r,   r-   r)   r.   r/   r   r;   r:   r2   r3   r4   r5   r=   r=   >   s+    4"Kt",1$,GNDj)Gr4   r=   c                      e Zd ZU dZeed<   eed<   dZedz  ed<   dZedz  ed<   dZ	edz  ed<    e
e      Zee   ed	<    e
e      Zee   ed
<   dZedz  ed<    e
e      Zeeef   ed<    e
e      Zeeef   ed<   y)	HTTPRoutez;Intermediate Representation for a single OpenAPI operation.r   methodNoperation_idsummaryr)   r8   tags
parametersrequest_body	responsesschema_definitions)r*   r+   r,   r-   r.   r/   
HttpMethodrA   rB   r)   r   listrC   rD   r"   rE   r7   r;   rF   r=   rG   r2   r3   r4   r5   r?   r?   F   s    E
I#L#*#GS4Z"Kt"D1D$s)1&+D&AJ]#A+/L/D(/).*ItC%&  161S*_- r4   r?   )r?   r"   r7   r=   rH   r0   r2   parse_openapi_to_http_routesTOpenAPITSchema
TReference
TParameterTRequestBody	TResponse
TOperation	TPathItemopenapi_dictreturnc           
         | j                  dd      }	 |j                  d      rut        j                  |       }t        j                  d|j                          t        |t        t        t        t        t        t        t              }|j                         S t!        j                  |       }t        j                  d|j                          t        |t"        t$        t&        t(        t*        t,        t.              }|j                         S # t0        $ rT}t        j3                  d|        |j5                         }t        j3                  d|        t7        d|       |d	}~ww xY w)
z
    Parses an OpenAPI schema dictionary into a list of HTTPRoute objects
    using the openapi-pydantic library.

    Supports both OpenAPI 3.0.x and 3.1.x versions.
    openapi z3.0z0Successfully parsed OpenAPI 3.0 schema version: z0Successfully parsed OpenAPI 3.1 schema version: z"OpenAPI schema validation failed: zValidation errors: zInvalid OpenAPI schema: N)get
startswith
OpenAPI_30model_validateloggerinforV   OpenAPIParserReference_30	Schema_30Parameter_30RequestBody_30Response_30Operation_30PathItem_30parser   r   r   r	   r   r   r   r
   r   errorerrors
ValueError)rS   openapi_version
openapi_30parser
openapi_31eerror_detailss          r5   rJ   rJ   p   sD    #&&y"5O'L%%e,#22<@JKKB:CUCUBVW #	F <<>! !//=JKKB:CUCUBVW #	F <<>! L9!=>
*=/:;3M?CD!K	Ls    BD A4D 	E,AE''E,c                      e Zd ZdZdedee   dee   dee   dee	   dee
   dee   d	ee   fd
ZdedefdZdedefdZdedefdZ	 	 ddee   dz  dee   dz  dee   fdZdededz  fdZdeeef   dz  deeef   fdZdee   fdZy)r^   z[Unified parser for OpenAPI schemas with generic type parameters to handle both 3.0 and 3.1.rV   reference_cls
schema_clsparameter_clsrequest_body_clsresponse_clsoperation_clspath_item_clsc	                 t    || _         || _        || _        || _        || _        || _        || _        || _        y)z?Initialize the parser with the OpenAPI schema and type classes.N)rV   rq   rr   rs   rt   ru   rv   rw   )	selfrV   rq   rr   rs   rt   ru   rv   rw   s	            r5   __init__zOpenAPIParser.__init__   sB     *$* 0(**r4   param_inrT   c                 B    |dv r|S t         j                  d| d       y)z@Convert string parameter location to our ParameterLocation type.r   zUnknown parameter location: z, defaulting to 'query'r   )r\   warning)ry   r{   s     r5   _convert_to_parameter_locationz,OpenAPIParser._convert_to_parameter_location   s*    <<O5hZ?VWXr4   itemc                    t        || j                        r|j                  }	 |j                  d      st	        d|       |j                  d      j                  d      }| j                  }|D ]  }|j                         rt        |t              r|t        |         }nt        |t              r||j                  j                  v rt        ||d      }n|j                  r||j                  v r|j                  |   }no|dk(  rt!        |d      rt        |d      }nQt!        ||      rt        ||d      }n7d}n4t        |t"              r|j%                  |      }nt	        d| d| d      |t	        d	| d
| d       t        || j                        r| j'                  |      S |S |S # t(        t*        t,        t.        t        f$ r}t	        d| d|       |d}~ww xY w)z.Resolves a reference to its target definition.z#/z/External or non-local reference not supported: /N
componentszCannot traverse part 'z' in reference ''zReference part 'z' not found in path 'zFailed to resolve reference '': )
isinstancerq   refrY   ri   stripsplitrV   isdigitrI   intr   	__class__model_fieldsgetattrmodel_extrahasattrr;   rX   _resolve_refAttributeErrorKeyError
IndexError	TypeError)ry   r   ref_strpartstargetpartrn   s          r5   r   zOpenAPIParser._resolve_ref   s   dD../hhG,Y))$/$I'S   d+11#6! D||~*VT*B!'D	!2#FI66#3#3#@#@@%,VT4%@F#//DF<N<N4N%+%7%7%=F  $|38U)0)F!(!6)0t)D)-#FD1!'D!1(4TF:J7)STU  ~(.tf4I'RST 3< fd&8&89,,V44  #Hj)ZP Y #@	QC!PQWXXYs$   EF6 89F6 2F6 6G+G&&G+
schema_objc                 J   	 | j                  |      }t        || j                        r|j                  ddd      S t        |t              r|S t
        j                  dt        |       d       i S # t        $ r&}t
        j                  d| d       i cY d	}~S d	}~ww xY w)
z1Resolves a schema and returns it as a dictionary.jsonT)modeby_aliasexclude_nonez%Expected Schema after resolving, got z. Returning empty dict.z"Failed to extract schema as dict: Fexc_infoN)
r   r   rr   
model_dumpr;   r\   r}   type	Exceptionrg   )ry   r   resolved_schemarn   s       r5   _extract_schema_as_dictz%OpenAPIParser._extract_schema_as_dict  s    	"//
;O/DOO=&11$T 2   OT2&&;D<Q;RRij 	 	LL=aSAELRI	s(   :A3 A3 #A3 3	B"<BB"B"Noperation_paramspath_item_paramsc                    g }i }|xs g |xs g z   }|D ]  }	 | j                  |      }t        || j                        s#t        j	                  dt        |       d       O|j                  }| j                  |      }	|j                  }
|j                  |f}||v rd||<   i }|
r`| j                  |
      }| j                  |
      }t        || j                        st        |d      r|j                  |j                  |d<   nt        |d      r|j                  rt        t!        |j                  j#                               d      }|rt        |d      rw|j$                  rk|j$                  }| j                  |      }| j                  |      }t        || j                        s't        |d      r|j                  |j                  |d<   t'        |j                  |	|j(                  ||j*                        }|j-                  |        |S # t.        $ r@}t1        |d	t1        |d
d            }t        j3                  d| d| d       Y d}~Fd}~ww xY w)z<Extract and resolve parameters from operation and path item.z(Expected Parameter after resolving, got . Skipping.TdefaultNcontentmedia_type_schema)r#   r$   r%   r&   r)   r#   r   unknownzFailed to extract parameter 'r   Fr   )r   r   rs   r\   r}   r   r{   r~   param_schemar#   r   rq   r   r   r   nextitervaluesr   r"   r%   r)   appendr   r   rg   )ry   r   r   extracted_paramsseen_params
all_paramsparam_or_ref	parameterr{   param_locationparam_schema_obj	param_keyparam_schema_dictr   first_media_typemedia_schemaresolved_media_schema
param_inforn   
param_names                       r5   _extract_parametersz!OpenAPIParser._extract_parameters  s    13  	 ',"1A1GRH
& G	LF --l;	!)T-?-?@NNB4	?BSS^_  %--!%!D!DX!N#,#9#9  '^^X6	+)-I& %'!#(,(D(DEU(V% '+&7&78H&IO&8J8JK#OY?+33?7F7N7N))4Y	2y7H7H'+D1B1B1I1I1K,Ld'S$(#$46IJ,>>'7'I'I,0,H,H,V) 150A0A,0O- *+@$BTBT U '(=y I 5 = = I;P;X;X-i8 +"+&//, ) 5 5
 !''
3AG	R    $ &',y*Q
 3J<s1#FQV   	s%   A	H#;HE2H	I5IIrequest_body_or_refc                    |sy	 | j                  |      }t        || j                        s#t        j	                  dt        |       d       yt        |j                  |j                        }t        |d      rv|j                  rj|j                  j                         D ]M  \  }}|s	t        |d      s|j                  s#	 | j                  |j                        }||j                  |<   O |S # t        $ r%}t        j!                  d| d|        Y d}~{d}~ww xY w# t        $ r4}t#        |d	d
      }t        j!                  d| d| d       Y d}~yd}~ww xY w)z-Extract and resolve request body information.Nz*Expected RequestBody after resolving, got z. Returning None.)r%   r)   r   r   )Failed to extract schema for media type 'r   r   r   z Failed to extract request body 'Fr   )r   r   rt   r\   r}   r   r7   r%   r)   r   r   itemsr   r   r:   r   rg   r   )	ry   r   rE   request_body_infomedia_type_strmedia_type_objschema_dictrn   ref_names	            r5   _extract_request_bodyz#OpenAPIParser._extract_request_bodyn  sy   ")	,,-@ALlD,A,AB@lAS@TTef  !0%..(44! |Y/L4H4H6B6J6J6P6P6R 2NN&#N4GH*<<
*.*F*F . @ @+K !, .<<^L$ %$  ) "LL"KNK[[^_`^a b   	2E9EHLL28*CsCe   	sU   A	D% AD% +D% 8D% *C40D% 4	D"=DD% D""D% %	E".*EE"operation_responsesc                    i }|s|S |j                         D ]  \  }}	 | j                  |      }t        || j                        s&t        j                  d| dt        |       d       Tt        |j                        }t        |d      rv|j                  rj|j                  j                         D ]M  \  }}|s	t        |d      s|j                  s#	 | j                  |j                        }	|	|j                  |<   O ||t!        |      <    |S # t        $ r(}
t        j                  d| d| d	|
        Y d
}
~
d
}
~
ww xY w# t        $ r8}
t#        |dd      }t        j                  d| d| d|
 d       Y d
}
~
nd
}
~
ww xY w)z)Extract and resolve response information.z2Expected Response after resolving for status code z, got r   )r)   r   r   r   z' in response : Nr   r   z+Failed to extract response for status code z from reference 'r   Fr   )r   r   r   ru   r\   r}   r   r=   r)   r   r   r   r   r:   r   rg   r.   r   )ry   r   extracted_responsesstatus_coderesp_or_refresponse	resp_infor   r   r   rn   r   s               r5   _extract_responsesz OpenAPIParser._extract_responses  s    8:"&&(;(A(A(C (	$K',,[9!(D,=,=>NNL[M Z#H~.k;  )X5I5IJ	 8Y/H4D4D:B:J:J:P:P:R "6* '8K L . @ @	".2.J.J$2$D$D/" LW	 8 8 H"" 9B#C$45C(	T #" $- " &&OP^O_ `33>-r!%F!" !""  ";yAA+ O''/jA38"   sU   AE	+AE	<E		E	*DE		EE<E	EE			F
-FF
c                    g }t        | j                  d      r| j                  j                  st        j	                  d       g S i }t        | j                  d      r| j                  j
                  r| j                  j
                  }t        |d      r|j                  rs|j                  j                         D ]V  \  }}	 t        || j                        r&| j                  |      }| j                  |      ||<   n| j                  |      ||<   X | j                  j                  j                         D ]g  \  }}	t        |	| j                        s&t        j	                  d| d	t        |	       d
       Ct        |	d      r|	j                  nd}
g d}|D ]  }t!        |	|d      }|st        || j"                        s+|j%                         }	 | j'                  t!        |dd      |
      }| j)                  t!        |dd            }| j+                  t!        |dd            }t-        ||t!        |dd      t!        |dd      t!        |dd      t!        |dg       xs g ||||
      }|j/                  |       t        j1                  d| d|         j t        j1                  dt5        |       d       |S # t        $ r&}t        j	                  d| d|        Y d}~6d}~ww xY w# t        $ r;}t!        |dd      }t        j3                  d| d| d| d| d       Y d}~d}~ww xY w)z*Parse the OpenAPI schema into HTTP routes.pathsz$OpenAPI schema has no paths defined.r   schemasz%Failed to extract schema definition 'r   Nz%Skipping invalid path item for path 'z	' (type: )rD   )rX   putpostdeleteoptionsheadpatchtracerequestBodyrF   operationIdrB   r)   rC   )
r   r@   rA   rB   r)   rC   rD   rE   rF   rG   zSuccessfully extracted route:  r   zFailed to process operation z (ID: z): Tr   zFinished parsing. Extracted z HTTP routes.)r   rV   r   r\   r}   r   r   r   r   rq   r   r   r   rw   r   rD   r   rv   upperr   r   r   r?   r   r]   rg   len)ry   routesrG   r   r#   r&   r   rn   path_strpath_item_objpath_level_paramshttp_methodsmethod_lower	operationmethod_upperrD   r   rF   routeop_errorop_ids                        r5   rf   zOpenAPIParser.parse  sM   "$t||W-T\\5G5GNNABI  4<<.4<<3J3J00Jz9-*2D2D$.$6$6$<$<$> LD&%fd.@.@A.2.?.?.GO7;7S7S /8.t4 8<7S7S &8.t4" (,||'9'9'?'?'A A	#HmmT-?-?@;H:YtTaObNccde  =,7 (( 	L !- )#M<F	It7I7I!J#/#5#5#7L"%)%=%=#I|TBDU&
 -1,F,F#I}dC-) %)$;$;#I{DA%	 !*!)#/)0M4)P$+Iy$$G(/	=$(O!(FB!?!E2'1):&//A! e,<\N!H:VC)1A	F 	23v;-}MNU % CD6QCP D %  '	=) L:<.(SYZ_Y``cdlcmn%) %  s2   AKCK:	K7K22K7:	L>0L99L>NN)r*   r+   r,   r-   rK   r   rM   rL   rN   rO   rP   rQ   rR   rz   r.   r0   r~   r   r   r2   r   rI   r"   r   r7   r   r;   r=   r   r?   rf   r3   r4   r5   r^   r^      sT    f++ J'+ M	+
 J'+ |,+ 9o+ J'+ I+*s ?P 2 2 2h# * . .2-1U s)d*U  s)d*U  
m		U n. .SWAW .`3##'S>D#83#	c<	 3#jbtI br4   r^   r&   c                    | rt        | t              s| S | j                         }g d}|D ]  }||v s|j                  |        d|v rI|d   j	                         D ci c]  \  }}|t        |       c}}|d<   |d   s|j                  d       d|v r't        |d         |d<   |d   s|j                  d       d|v r.t        |d   t              rt        |d         |d<   y|d   du ryyyc c}}w )zW
    Clean up a schema dictionary for display by removing internal/complex fields.
    )allOfanyOfoneOfnotnullablediscriminatorreadOnly	writeOnly
deprecatedxmlexternalDocs
propertiesr   additionalPropertiesTN)r   r;   copypopr   clean_schema_for_display)r&   cleanedfields_to_removefieldkvs         r5   r  r  8  s)    FD1 kkmG& " GKK
 w7>|7L7R7R7T!
/3q!A'**!
 |$KK%'3GG4DEwKK (g45t<.F.//G*+ +,4 5 )!
s    C1c                 ^   | rt        | t              syd| v r| d   S d| v r t        | d   t              r| d   r| d   d   S d| v r t        | d   t              r| d   r| d   d   S d| v r| d   S | j                  d      }|dk(  ri }| j                  d	i       }t        |t              rvt	        | j                  d
g             }t        |j                               dd }|D ]  }||v st        ||         ||<    |D ]  }||vs||v st        ||         ||<    |r|S ddiS |dk(  r6| j                  d      }t        |t              rt        |      }	|	|	gS g S dgS |dk(  r0| j                  d      }
|
dk(  ry|
dk(  ry|
dk(  ry|
dk(  ry|
dk(  ryy|dk(  ry|d k(  ry!|d"k(  ry#|d$k(  ryy%)&zy
    Generate a simple example value from a JSON schema dictionary.
    Very basic implementation focusing on types.
    r   r   enumr   examplesexampler   objectr   r%   N   keyvaluearrayr   example_itemstringformatz	date-timez2024-01-01T12:00:00Zdatez
2024-01-01emailzuser@example.comuuidz$123e4567-e89b-12d3-a456-426614174000bytezZXhhbXBsZQ==integer   numberg      ?booleanTnullunknown_type)r   r;   rI   rX   setkeysgenerate_example_from_schema)r&   schema_typeresultr   required_propsprops_to_include	prop_namereq_propitems_schemaitem_exampleformat_types              r5   r  r  t  s=   
 FD1 Fi  Jvf~t<f~a   	fvj)40:j!!$$Fi  **V$KhZZb1
j$' J!;<N#JOO$56  . 	
*(D"9-)F9% + 6)h*.D'C"8,(F8$
  v5eW%55		zz'*lD)7EL%1%=L>E2E		 jj*+%)& '!%& 9& !			!		 			!		 r4   dataindentc                 h    	 t        j                  | |      }d| dS # t        $ r	 d|  dcY S w xY w)z8Formats Python data as a JSON string block for markdown.r*  z```json
z
```z!```
Could not serialize to JSON: )r   dumpsr   )r)  r*  json_strs      r5   format_json_for_descriptionr/    sG    @::d628*E** @3D6??@s    11base_descriptionrF   rD   rE   c           
      0	   | g}|r|D cg c]  }|j                   dk(  s| }}|r^d}|j                  |       |D ]F  }|j                  rdnd}	d|j                   d|	 d|j                  xs d }
|j                  |
       H |D cg c]  }|j                   d	k(  s| }}|r^d
}|j                  |       |D ]F  }|j                  rdnd}	d|j                   d|	 d|j                  xs d }
|j                  |
       H |r6|j                  r)d}|j                  |       |j                  rdnd}	|j                  d|j                   |	        |j
                  rd|j
                  v rdnt        t        |j
                        d      }|r|j
                  j                  |i       }t        |t              r}d|v ry|j                  d       |d   j                         D ]R  \  }}t        |t              sd|v s||j                  dg       v }|rdnd}|j                  d| d| d|d           T r<d}d}h d}t        fd|D        d      }j                         }t        |      D ]   \  }}|s|j                  |       d}||k(  rdnd}|j                  d| d| d|j                  xs d        |j
                  sZd|j
                  v rdnt        t        |j
                        d      }|s|j
                  j                  |      }|j                  d| d       t        |t              r|j                  d      dk(  rzd|v rv|d   }t        |t              rd|v r|j                  d       |d   j                         D ]5  \  }}t        |t              sd|v s|j                  d| d |d           7 n`d|v r\|j                  d!       |d   j                         D ]5  \  }}t        |t              sd|v s|j                  d| d |d           7 |st        |      }|d"k7  s||j                  d#       |j                  t        |d$%              dj                  |      S c c}w c c}w )&aX  
    Formats the base description string with response, parameter, and request body information.

    Args:
        base_description (str): The initial description to be formatted.
        responses (dict[str, Any]): A dictionary of response information, keyed by status code.
        parameters (list[ParameterInfo] | None, optional): A list of parameter information,
            including path and query parameters. Each parameter includes details such as name,
            location, whether it is required, and a description.
        request_body (RequestBodyInfo | None, optional): Information about the request body,
            including its description, whether it is required, and its content schema.

    Returns:
        str: The formatted description string with additional details about responses, parameters,
        and the request body.
    r   z

**Path Parameters:**z (Required)rW   z
- **z**r   zNo description.r   z

**Query Parameters:**z

**Request Body:**
zapplication/jsonNr   z

**Request Properties:**r)   r%   z

**Responses:**F>   200201202204c              3   ,   K   | ]  }|v s|  y wNr3   ).0srF   s     r5   	<genexpr>z4format_description_with_responses.<locals>.<genexpr>$  s     JQ1	>qJs   	Tz
 (Success)z  - Content-Type: ``r   r  r   z"
  - **Response Item Properties:**z	
    - **z**: z
  - **Response Properties:**r  z
  - **Example:**   r,  )r$   r   r%   r#   r)   r:   r   r   rX   r   r;   r   sortedr  r/  join)r0  rF   rD   rE   
desc_partsppath_paramsparam_sectionparamrequired_marker
param_descquery_paramsreq_body_section
media_typer&   r$  prop_schemar%   req_markresponse_sectionadded_response_sectionsuccess_codessuccess_statusresponses_to_processr   r   status_markerr&  r
  s    `                           r5   !format_description_with_responsesrR    s   0 ##J ",EQ

f0DqEE6Mm,$ .38>>-r%ejj\O3DBuGXGXGm\mFno
!!*-. $.Gaw1FGG7Mm,% .38>>-r%ejj\O3DBuGXGXGm\mFno
!!*-. 002*++7+@+@-bB|7788IJK && &)D)DD #$|::;TB 
 %4488RHfd+0F%%&CD282F2L2L2N 	.	;&{D9 - <'0FJJz24N'NH8@}bH&--"(2hZr+mB\A] ^	 /!& 5J-JDQ  )0&,-A&B >	"K)!!"23)-&,7>,ILrMRb9N9N9cRc8de
 '' *Y-E-EE 'd9#;#;<dC  &5599*EF%%(;J<q&IJ "&$/!::f-8W=N+1'?L *< >$0L$@ * 1 12W X>J$0?""'%'	!*$:I{ )3;(E,9[,H(2(9(9.84TaHbGc,d)*	!* *V3&--.NO:@:N:T:T:V & 6	;$.{D$A(5(D$.$5$5*4YKtKP]D^C_(`%&& ">v"F"n49L&--.BC&-- ;GA Ny>	@ 99Z  y F Hs   RR
RRr]   r)   c                 j   | j                         }|j                  d      x}r.|j                  d      r|j                  d      d   }d| |d<   nx|j                  d      x}rDd|v rt	        |      |d<   nR|j                         D ci c]  \  }}|t	        |       c}}|d<   n!|j                  d      x}rt	        |      |d<   dD ]6  }	t        |j                  |	g             D ]  \  }
}t	        |      ||	   |
<    8 | j                  d	|      r|j                  d	      s||d	<   |S c c}}w )
a  
    Replace openapi $ref with jsonschema $defs

    Examples:
    - {"type": "object", "properties": {"$ref": "#/components/schemas/..."}}
    - {"$ref": "#/components/schemas/..."}
    - {"items": {"$ref": "#/components/schemas/..."}}
    - {"anyOf": [{"$ref": "#/components/schemas/..."}]}
    - {"allOf": [{"$ref": "#/components/schemas/..."}]}
    - {"oneOf": [{"$ref": "#/components/schemas/..."}]}

    Args:
        info: dict[str, Any]
        description: str | None

    Returns:
        dict[str, Any]
    z$refz#/components/schemas/r   z#/$defs/r   r   )r   r   r   r)   )r   rX   rY   r   _replace_ref_with_defsr   	enumerate)r]   r)   r&   ref_pathschema_namer   r$  rJ  item_schemasectionir   s               r5   rU  rU  l  sO   * YY[F::f%%x%67"..-b1K'}5F6Nzz,/	/	/Z#9*#EF<  /9.>.>.@$*I{ 1+>>$F<  

7+	+	+0=w. > GR!89 	>GAt!7!=F7OA	>> xx{+FJJ}4M +}M$s   D/r   c                 6   i }g }| j                   D ]d  }|j                  r|j                  |j                         t	        |j
                  j                         |j                        ||j                  <   f | j                  r| j                  j                  rt        t        | j                  j                              }t	        | j                  j                  |   j                         | j                  j                        }|j                  di       }|j                         D ]
  \  }}|||<    | j                  j                  r!|j                  |j                  dg              d||d}	| j                  r| j                  |	d<   t!        |	      }	|	S )z
    Combines parameter and request body schemas into a single schema.

    Args:
        route: HTTPRoute object

    Returns:
        Combined schema dictionary
    r   r%   r  )r   r   r%   z$defs)rD   r%   r   r#   rU  r(   r   r)   rE   r:   r   r   rX   r   extendrG   r   )
r   r   r%   rD  content_typebody_schema
body_propsr$  rJ  r!  s
             r5   _combine_schemasra    sq    JH !! 
>>OOEJJ'!7MM %"3"3"

5::
 e00??D!3!3!B!BCD,--l;@@B**
 !__\26
 '1&6&6&8 	0"I{$/Jy!	0 &&OOKOOJ;<  F 22w V$FMr4   )r=  r   r8  )@r   loggingtypingr   r   r   r   openapi_pydanticr   r   r	   r
   r   r   r   r   openapi_pydantic.v3.v3_0rZ   rd   ra   re   r_   rb   rc   r`   pydanticr   r   r   fastmcp.utilities.json_schemar   fastmcp.utilities.typesr   	getLoggerr*   r\   rH   r0   r;   r.   r2   r"   r7   r=   r?   __all__rK   rL   rM   rN   rO   rP   rQ   rR   rI   rJ   r^   r  r  r   r/  rR  rU  ra  r3   r4   r5   <module>rk     s     1 1	 	 	 ; > > < > B < 8 6 6 9 4			8	$
 G
 ?@ #s(^
#$ ##& #H# H  (	 :w
3
)VY
/\9l;
\9l;
~{NCK;7	\9l;
K;7	1LtCH~ 1L$y/ 1LhQ		Qh9Z$%6 9:;L 9xPd): Ps Pf@c @3 @s @ .2+/Y!Y!SY!
 ]#d*Y! "D(Y! 	Y!z 59)
sCx.)'*Tz)	#s(^)X2I 2$sCx. 2r4   