
    Ki3                        d Z ddlZddlZddlmZ ddlmZmZ ddlZddl	m
Z
 ddlmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ erddlmZ  ee      Z G d de      Z G d de      Z  G d de      Z!g dZ"y)zPOpenAPI component implementations: Tool, Resource, and ResourceTemplate classes.    N)Callable)TYPE_CHECKINGAny)ToolAnnotations)AnyUrl)ResourceResourceTemplate)get_http_headers)Tool
ToolResult)
get_logger)	HTTPRoute)RequestDirector)Contextc                        e Zd ZdZ	 	 	 	 	 ddej
                  dedededede	ee
f   d	e	ee
f   dz  d
ee   dz  dedz  dedz  dee
gef   dz  f fdZdefdZde	ee
f   defdZ xZS )OpenAPIToolz*Tool implementation for OpenAPI endpoints.Nclientroutedirectornamedescription
parametersoutput_schematagstimeoutannotations
serializerc           	          t         |   |||||xs
 t               |
|       || _        || _        || _        |	| _        y )N)r   r   r   r   r   r   r   )super__init__set_client_route	_director_timeout)selfr   r   r   r   r   r   r   r   r   r   r   	__class__s               m/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fastmcp/server/openapi/components.pyr    zOpenAPITool.__init__   sP     	#!'#! 	 	
 !    returnc                 ~    d| j                   d| j                  j                   d| j                  j                   dS )@Custom representation to prevent recursion errors when printing.zOpenAPITool(name=z	, method=, path=))r   r#   methodpathr&   s    r(   __repr__zOpenAPITool.__repr__:   s;    "499-y9K9K8LGTXT_T_TdTdSeefggr)   	argumentsc                   K   	 t        | j                  d      rt        | j                  j                        ndxs d}t        | j                  d      r,| j                  j                  r| j                  j                  ni }| j
                  j                  | j                  ||      }|rj|j                  r7|j                         D ]#  \  }}||j                  vs||j                  |<   % n'|j                         D ]  \  }}||j                  |<    t               }|rO|j                  r|j                  j                  |       n'|j                         D ]  \  }}||j                  |<    t        j                  d|j                          | j                  j                  |       d{   }|j                          	 |j                         }	d}
| j                   #| j                   j#                  d      rd|	i}
n|	}
nt%        |	t&              sd|	i}
n|	}
t)        |
	      S 7 y# t        j*                  $ r t)        |j,                  
      cY S w xY w# t.        j0                  $ r}d|j2                  j4                   d|j2                  j6                   }	 |j2                  j                         }|d| z  }nQ# t        j*                  t8        f$ r5 |j2                  j,                  r|d|j2                  j,                   z  }Y nw xY wt9        |      |d}~wt.        j:                  $ r}t9        d|      |d}~ww xY ww)zQExecute the HTTP request using RequestDirector for simplified parameter handling.base_url zhttp://localhostheadersz run - sending request; headers: Nzx-fastmcp-wrap-resultresult)structured_content)contentHTTP error :  - Request error: )hasattrr"   strr5   r7   r$   buildr#   itemsr
   updateloggerdebugsendraise_for_statusjsonr   get
isinstancedictr   JSONDecodeErrortexthttpxHTTPStatusErrorresponsestatus_codereason_phrase
ValueErrorRequestError)r&   r3   r5   cli_headersrequestkeyvaluemcp_headersrP   r8   structured_outputeerror_message
error_datas                 r(   runzOpenAPITool.run>   s    X	= /6dllJ.ODLL))*UW$#  4<<38L8L $$  nn**4;;	8LG ??&1&7&7&9 9
Ugoo538GOOC09
 '2&7&7&9 5
U/4,5 +,K??OO**;7 '2&7&7&9 5
U/4,5 LL;GOO;LMN
 "\\..w77H %%'9! %)!%%1))--.EF-5v,>),2)#FD1)16(:%(.%!5FGG/ 80 '' 9!(--889 $$ 	3 ajj445R

8P8P7QR =ZZ__.
3zl!33((*5 =::??!s1::??*;%<<M= ]+2!! 	=qe451<	=s   MCI CI 1H+2I A#H- *M+I -)II MII M
/0L  "KL ALL LL  M
6MM

M)NNNNN)__name__
__module____qualname____doc__rN   AsyncClientr   r   r@   rK   r   r!   floatr   r   r    r2   r   r^   __classcell__r'   s   @r(   r   r      s    4 04 $ $.226 !!    "	 
     cN  CH~,  #ho    %t+  cUCZ(4/ 8h# hZ=4S> Z=j Z=r)   r   c                        e Zd ZdZ	 	 	 ddej
                  dededededed	ed
e	e   dz  de
dz  f fdZdefdZdeez  fdZ xZS )OpenAPIResourcez.Resource implementation for OpenAPI endpoints.Nr   r   r   urir   r   	mime_typer   r   c
                     |
t               }t        
| 	  t        |      ||||       || _        || _        || _        |	| _        y )N)ri   r   r   rj   r   )r!   r   r    r   r"   r#   r$   r%   )r&   r   r   r   ri   r   r   rj   r   r   r'   s             r(   r    zOpenAPIResource.__init__   sT     <5Ds# 	 	
 !r)   r*   c                 j    d| j                   d| j                  d| j                  j                   dS )r,   zOpenAPIResource(name=z, uri=r-   r.   )r   ri   r#   r0   r1   s    r(   r2   zOpenAPIResource.__repr__   s1    &tyym6$((WT[[M]M]L^^_``r)   c                 D  K   	 | j                   j                  }t        | j                        }d|v rd|v r|j	                  d      }t        |      dkD  ri }t        j                  d|      }|rF|j                  d       t        |      dz
  }t        |      D ]  \  }}||k  s|d|z
     }	|	||<    |j                         D ]$  \  }}	|j                  d| dt        |	            }& i }
| j                   j                  D ]]  }|j                  d	k(  st        | d
|j                         s-t!        | d
|j                         }|I|dk7  sO||
|j                  <   _ i }t        | j"                  d      r,| j"                  j$                  r| j"                  j$                  ni }|j'                  |       t)               }|j'                  |       | j"                  j+                  | j                   j,                  ||
|| j.                         d{   }|j1                          |j$                  j3                  dd      j5                         dv r%|j7                         }t7        j8                  |      S t;        fddD              r|j<                  S |j>                  S 7 # t@        jB                  $ r}d|jD                  jF                   d|jD                  jH                   }	 |jD                  j7                         }|d| z  }nQ# t6        jJ                  tL        f$ r5 |jD                  j<                  r|d|jD                  j<                   z  }Y nw xY wtM        |      |d}~wt@        jN                  $ r}tM        d|      |d}~ww xY ww)z2Fetch the resource data by making an HTTP request.{}/   z\{([^}]+)\}T)reversequery_Nr6   r7   )r/   urlparamsr7   r   zcontent-typeapplication/jsonc              3   &   K   | ]  }|v  
 y wN ).0ctcontent_types     r(   	<genexpr>z'OpenAPIResource.read.<locals>.<genexpr>  s     OBR<'Os   )ztext/zapplication/xmlr;   r<   r=   r>   )(r#   r0   r@   ri   splitlenrefindallsort	enumeraterB   replacer   locationr?   r   getattrr"   r7   rC   r
   rV   r/   r%   rG   rI   lowerrH   dumpsanyrM   r:   rN   rO   rP   rQ   rR   rL   rS   rT   )r&   r0   resource_uripartspath_paramsparam_matchesexpected_param_counti
param_nameparam_valuequery_paramsparamrX   r7   rU   rY   rP   r8   r[   r\   r]   r~   s                        @r(   readzOpenAPIResource.read   sj    ^	=;;##Dtxx=L d{sd{$**3/u:>"$K %'JJ~t$DM$%**4*8/25zA~, .7}-E FMAz #77.3BFm:EJ 7F 4?3D3D3F S/
K#||bB,?[AQRS L// 9>>W,5::,?O1P#DAejj\*:;E(Ub[38UZZ0	9 G 4<<38L8L $$ 
 NN;' +,KNN;'!\\11{{))# 2  H %%' $++//CIIKL!\1!zz&))O2NOO}}$'''), $$ 	3 ajj445R

8P8P7QR =ZZ__.
3zl!33((*5 =::??!s1::??*;%<<M= ]+2!! 	=qe451<	=s   N B"J/ (A0J/ J/ 3J/ J/ CJ/ J-A&J/  N J/  N !J/ ,N -J/ /N0M33"LM3AM$!M3#M$$M33N	NNN )rx   NN)r_   r`   ra   rb   rN   rc   r   r   r@   r!   rd   r    r2   bytesr   re   rf   s   @r(   rh   rh      s    8 , $ $ !!    "	 
         #ho   4a# a`=C%K `=r)   rh   c                        e Zd ZdZ	 	 ddej
                  dededededed	e	ee
f   d
ee   dz  dedz  f fdZdefdZ	 ddede	ee
f   dddefdZ xZS )OpenAPIResourceTemplatez7Resource template implementation for OpenAPI endpoints.Nr   r   r   uri_templater   r   r   r   r   c
                 ~    |
t               }t        
| 	  |||||       || _        || _        || _        |	| _        y )N)r   r   r   r   r   )r!   r   r    r"   r#   r$   r%   )r&   r   r   r   r   r   r   r   r   r   r'   s             r(   r    z OpenAPIResourceTemplate.__init__"  sP     <5D%#! 	 	
 !r)   r*   c                 j    d| j                   d| j                  d| j                  j                   dS )r,   zOpenAPIResourceTemplate(name=z, uri_template=r-   r.   )r   r   r#   r0   r1   s    r(   r2   z OpenAPIResourceTemplate.__repr__<  s8    .tyym?4K\K\J__fgkgrgrgwgwfxxyzzr)   ri   rw   contextzContext | Nonec                   K   g }|j                         D ]  \  }}|j                  | d|         t        | j                  | j                  | j
                  || j                   ddj                  |       | j                  xs d| j                  j                   dt        | j                  j                  xs g       | j                  	      S w)z,Create a resource with the given parameters.=-zResource for rx   )	r   r   r   ri   r   r   rj   r   r   )rB   appendrh   r"   r#   r$   r   joinr   r0   r!   r   r%   )r&   ri   rw   r   	uri_partsrW   rX   s          r(   create_resourcez'OpenAPIResourceTemplate.create_resource@  s      	 ,,. 	/JCuAeW-.	/ <<++^^II;a 345((NmDKK<L<L;M,N(T[[%%+,MM

 
	
s   CC)NNrz   )r_   r`   ra   rb   rN   rc   r   r   r@   rK   r   r!   rd   r    r2   r   r   re   rf   s   @r(   r   r     s    A !% $ !!    "	 
       cN  #ho   4{# { %)	

 S#X
 "	

 

r)   r   )rh   r   r   )#rb   rH   r   collections.abcr   typingr   r   rN   	mcp.typesr   pydantic.networksr   fastmcp.resourcesr   r	   fastmcp.server.dependenciesr
   fastmcp.tools.toolr   r   fastmcp.utilities.loggingr   fastmcp.utilities.openapir   "fastmcp.utilities.openapi.directorr   fastmcp.serverr   r_   rD   r   rh   r   __all__r{   r)   r(   <module>r      st    V  	 $ %  % $ 8 8 / 0 0 >&	H	}=$ }=@A=h A=H8
. 8
xr)   