
    ~h                         d Z ddlmZ ddlZddl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 ddlmZ ddlmZ ddlmZmZ ddZddZ G d de      Z G d de      Zy)z Resource template functionality.    )annotationsN)Callable)Any)unquote)ResourceTemplate)Fieldfield_validatorvalidate_call)Resource)get_context)FastMCPComponent)compress_schema)find_kwarg_by_typeget_cached_typeadapterc                D   t        j                  d|       }d}|D ]k  }|j                  d      r@|j                  d      r/|dd }|j                  d      r|d d }|d| d	z  }J|d| d
z  }T|t        j                  |      z  }m t        j
                  d| d      S )Nz(\{[^}]+\}) {}   *z(?P<z>.+)z>[^/]+)^$)resplit
startswithendswithescapecompile)templatepartspatternpartnames        V/opt/mcp/mcp-sentiment/venv/lib/python3.12/site-packages/fastmcp/resources/template.pybuild_regexr&      s    HH^X.EG 	'??3DMM#$6":D}}S!CRyT$t,,T$w//ryy&G	' ::'!n%%    c                    t        |      }|j                  |       }|r;|j                         j                         D ci c]  \  }}|t	        |       c}}S y c c}}w N)r&   match	groupdictitemsr   )uriuri_templateregexr*   kvs         r%   match_uri_templater2   ,   sS    %EKKE*///*;*A*A*CD$!Q71:DD Es    Ac                      e Zd ZU dZ ed      Zded<    edd      Zded	<    ed
      Zded<   e		 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z
 ed	d      edd              ZddZddZddZddZy)r   .A template for dynamically creating resources.z<URI template with parameters (e.g. weather://{city}/current))descriptionstrr.   
text/plainz!MIME type of the resource content)defaultr5   	mime_typez#JSON schema for function parametersdict[str, Any]
parametersNc           	     :    t         j                  | ||||||      S )Nfnr.   r$   r5   r9   tagsenabled)FunctionResourceTemplatefrom_functionr=   s          r%   rB   zResourceTemplate.from_functionA   s1     (55%# 6 
 	
r'   before)modec                    |r|S y)z&Set default MIME type if not provided.r7    )clsr9   s     r%   set_default_mime_typez&ResourceTemplate.set_default_mime_typeU   s     r'   c                .    t        || j                        S )z5Check if URI matches template and extract parameters.)r2   r.   )selfr-   s     r%   matcheszResourceTemplate.matches]   s    !#t'8'899r'   c                    K   t        d      w)Read the resource content.z>Subclasses must implement read() or override create_resource())NotImplementedError)rJ   	argumentss     r%   readzResourceTemplate.reada   s     !L
 	
s   c           	         K   d fd}t        j                  || j                   j                   j                   j
                   j                        S w)z>Create a resource from the template with the given parameters.c                 H   K   j                         d {   } | S 7 w)N)rO   )rP   )resultparamsrJ   s    r%   resource_read_fnz:ResourceTemplate.create_resource.<locals>.resource_read_fnj   s$     99v966FM 7s   " ")r>   r-   r$   r5   r9   r?   r@   )returnstr | bytes)r   rB   r$   r5   r9   r?   r@   )rJ   r-   rT   rU   s   ` ` r%   create_resourcez ResourceTemplate.create_resourceg   sL     	
 %%((nnLL
 	
s   AAc                |    | j                   | j                  | j                  | j                  d}t	        di ||z  S )z8Convert the resource template to an MCPResourceTemplate.)uriTemplater$   r5   mimeTyperF   )r.   r$   r5   r9   MCPResourceTemplate)rJ   	overrideskwargss      r%   to_mcp_templatez ResourceTemplate.to_mcp_templatey   s@      ,,II++	
 #8Vi%788r'   NNNNNr>   Callable[..., Any]r.   r6   r$   
str | Noner5   rc   r9   rc   r?   zset[str] | Noner@   zbool | NonerV   rA   )r9   rc   rV   r6   )r-   r6   rV   zdict[str, Any] | NonerO   r:   rV   rW   )r-   r6   rT   r:   rV   r   )r]   r   rV   r\   )__name__
__module____qualname____doc__r   r.   __annotations__r9   r;   staticmethodrB   r	   classmethodrH   rK   rP   rX   r_   rF   r'   r%   r   r   4   s    8RL#  *MIs  "'9"J    "& $ $#


 
  	

 
 
 
 
"
 
& [x0  1:

$9r'   r   c                  `    e Zd ZU dZded<   ddZe	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	d       Zy)
rA   r4   rb   r>   c                   K   ddl m} |j                         }t        | j                  |      }|r||vrt               ||<    | j                  di |}t        j                  |      r
| d{   }|S 7 w)rM   r   Context
kwarg_typeNrF   )fastmcp.server.contextro   copyr   r>   r   inspectiscoroutine)rJ   rO   ro   r^   context_kwargrS   s         r%   rP   zFunctionResourceTemplate.read   so     2 !*477wG]&8$/MF=!"6"v&!\F "s   A-A8/A60A8Nc           
     f   ddl m} |xs% t        |dd      xs |j                  j                  }	|	dk(  rt        d      t        j                  |      }
|
j                  j                         D ]4  }|j                  t        j                  j                  k(  s+t        d       t        ||      }t        t        j                   d	|            }|st        d
      t        |
j                  j#                               }|r|j%                  |       |D ch c]p  }|
j                  |   j&                  t        j                  j(                  u r;|
j                  |   j                  t        j                  j*                  k7  r||k7  r|r }}|j-                  |      st        d| d|       t/        d |
j                  j                         D              s"|j-                  |      st        d| d|       |xs |j0                  }t        j2                  |      s|j4                  }t7        |t8              r|j:                  }t=        |      }|j?                         }|r|gnd}tA        ||      }tC        |      } | ||	||xs d|||xs
 t               ||      S d      S c c}w )z"Create a template from a function.r   rn   re   Nz<lambda>z,You must provide a name for lambda functionsz<Functions with *args are not supported as resource templatesrp   z{(\w+)(?:\*)?}z0URI template must contain at least one parameterzRequired function arguments z( must be a subset of the URI parameters c              3  j   K   | ]+  }|j                   t        j                  j                  k(   - y wr)   )kindrt   	ParameterVAR_KEYWORD).0params     r%   	<genexpr>z9FunctionResourceTemplate.from_function.<locals>.<genexpr>   s-      
 JJ'++777
s   13zURI parameters z- must be a subset of the function arguments: )prune_paramsr7   T)r.   r$   r5   r9   r>   r;   r?   r@   )"rr   ro   getattr	__class__re   
ValueErrorrt   	signaturer;   valuesry   rz   VAR_POSITIONALr   setr   findallkeysdiscardr8   emptyr{   issubsetanyrh   	isroutine__call__
isinstancerj   __func__r   json_schemar   r
   )rG   r>   r.   r$   r5   r9   r?   r@   ro   	func_namesigr}   rv   
uri_paramsfunc_paramsprequired_paramstype_adapterr;   r   s                       r%   rB   z&FunctionResourceTemplate.from_function   s    	3RGB
D9RR\\=R=R	
"KLL #^^**, 	EzzW..=== R 	 +2'B $5|DE
OPP#..--/0.
 !
~~a ((G,=,=,C,CCq!&&'*;*;*G*GG]"	 
 
 ''
3..??ghrgst 
  
..0
 
 &&{3 %j\1^_j^kl  "/RZZ   $Bb,'B-b1!--/
 +8T$ZlK
 2%#/<!&2G	
 		
 9=	
 		
W
s   A5J.rd   r`   ra   )re   rf   rg   rh   ri   rP   rk   rB   rF   r'   r%   rA   rA      s    8 
  "& $ $#\
\
 \
 	\

  \
 \
 \
 \
 
"\
 \
r'   rA   )r    r6   rV   z
re.Pattern)r-   r6   r.   r6   rV   zdict[str, str] | None) rh   
__future__r   rt   r   collections.abcr   typingr   urllib.parser   	mcp.typesr   r\   pydanticr   r	   r
   fastmcp.resources.typesr   fastmcp.server.dependenciesr   fastmcp.utilities.componentsr   fastmcp.utilities.json_schemar   fastmcp.utilities.typesr   r   r&   r2   rA   rF   r'   r%   <module>r      sc    & "  	 $    =  - 3 9 9& M9' M9`q
/ q
r'   