
    ~h                        d dl Z d dlZd dlmZ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mZmZmZmZ ddlmZmZmZmZmZ  e j4                  e      Z e
de      Zd	Zd
Z G d deee         Z 	 dde	e   dedefdZ!	 	 	 ddedeee	e         de"de"def
dZ#dee$ef   dee$ef   fdZ%dedee	e      fdZ&de e   defdZ'y)    N)	AnyDictGenericListOptionalSetTypeTypeVarcast)	BaseModel)DEFS_KEYPYDANTIC_V2JsonSchemaModemodels_json_schema	v1_schema   )
ComponentsOpenAPI	ReferenceSchemaschema_validatePydanticType)boundz#/components/schemas/z#/components/schemas/{model}c                   "    e Zd ZU dZee   ed<   y)PydanticSchemazBSpecial `Schema` class to indicate a reference from pydantic classschema_classN)__name__
__module____qualname____doc__r	   r   __annotations__     Q/opt/mcp/mcp-sentiment/venv/lib/python3.12/site-packages/openapi_pydantic/util.pyr   r      s    L|$$8r#   r   clsdefaultreturnc                     t        | d      s|S | j                  j                  d|      }|dvrt        d|       t	        t
        |      S )a  Get the JSON schema mode for a model class.

    The mode can be either "validation" or "serialization". In validation mode,
    computed fields are dropped and optional fields remain optional. In
    serialization mode, computed and optional fields are required.
    model_configjson_schema_mode)
validationserializationzinvalid json_schema_mode: )hasattrr)   get
ValueErrorr   r   )r%   r&   modes      r$   get_moder1      sU     3' 2G<D225dV<==%%r#   open_apischema_classes"scan_for_pydantic_schema_referenceby_aliasc                 
   t        | t        rdnd      } |d      }|rt        |      }|rt        h ||      }n|}|s| S |j	                  d        t
        j                  d|       t        r/t        |D cg c]  }|t        |      f c}|t              \  }}	nt        ||t        	      }	|j                  st               |_        |j                  j                  r|j                  j                  D ]7  }
|
|	t           v st
        j!                  d
|
 dt         dt         |
 d       9 |j                  j                  j#                  t%        |	             |S t%        |	      |j                  _        |S c c}w )aJ  
    Construct a new OpenAPI object, utilising pydantic classes to produce JSON schemas.

    :param open_api: the base `OpenAPI` object
    :param schema_classes: Pydantic classes that their schema will be used
                           "#/components/schemas" values
    :param scan_for_pydantic_schema_reference: flag to indicate if scanning for
                                               `PydanticSchemaReference` class
                                               is needed for "#/components/schemas"
                                               value updates
    :param by_alias: construct schema by alias (default is True)
    :return: new OpenAPI object with "#/components/schemas" values updated.
             If there is no update in "#/components/schemas" values, the original
             `open_api` will be returned.
    
model_copycopyT)deepc                     | j                   S )N)r   )xs    r$   <lambda>z6construct_open_api_with_schema_class.<locals>.<lambda>R   s
    ajj r#   )keyzschema_classes: %s)r5   ref_template)r5   
ref_prefix"z" already exists in z. The value of "z" will be overwritten.)getattrr   _handle_pydantic_schemalistsortloggerdebugr   r1   r>   r   r?   
componentsr   schemasr   warningupdate_validate_schemas)r2   r3   r4   r5   	copy_funcnew_open_apiextracted_schema_classesc_key_mapschema_definitionsexisting_keys              r$   $construct_open_api_with_schema_classrS   0   s   * +,6JI%40L)#:<#H !"NN"N5M"NON5N01
LL%~6 '9'56!a!6%(
$$ 'X*
 """,,&&(33;; 	L1(;;~%9* F%%/L>TV	 	''../@AS/TU  +<<N*O'+ 7s   ;F rQ   c                 v    | t            j                         D ci c]  \  }}|t        |       c}}S c c}}w )z9Convert JSON Schema definitions to parsed OpenAPI objects)r   itemsr   )rQ   r=   schema_dicts      r$   rK   rK   p   s@     !38 < B B DC 	_[))  s   5c                 ^    t               dt        ddffd |        t              S )a  
    This function traverses the `OpenAPI` object and

    1. Replaces the `PydanticSchema` object with `Reference` object, with correct ref
       value;
    2. Extracts the involved schema class from `PydanticSchema` object.

    **This function will mutate the input `OpenAPI` object.**

    :param open_api: the `OpenAPI` object to be traversed and mutated
    :return: a list of schema classes extracted from `PydanticSchema` objects
    objr'   Nc                 N   t        | t              rt        | t        rdnd      }|D ]y  }| j	                  |      }t        |t
              rNt        j                  d| |       | j                  |t        |             	j                  |j                         r |       { y t        | t              rnt        |       D ]_  \  }}t        |t
              rBt        j                  d|        t        |      | |<   	j                  |j                         X |       a y t        | t              rs| j                         D ]_  \  }}t        |t
              rBt        j                  d|        t        |      | |<   	j                  |j                         X |       a y y )Nmodel_fields_set__fields_set__zPydanticSchema found in %s: %szPydanticSchema found in list: zPydanticSchema found in dict: )
isinstancer   rA   r   __getattribute__r   rE   rF   __setattr___construct_ref_objaddr   rC   	enumeratedictrU   )
rX   fieldsfield	child_objindexelemr=   value	_traversepydantic_typess
           r$   ri   z*_handle_pydantic_schema.<locals>._traverse   sj   c9%;'<LF   )007	i8LL!A3	ROOE+=i+HI"&&y'='=>i() T"(~ $tdN3LL#A$!HI!3D!9CJ"&&t'8'89dO$ T"!iik %
Ue^4LL#A%!IJ1%8CH"&&u'9'9:e$% #r#   )setr   rC   )r2   ri   rj   s    @@r$   rB   rB   {   s4     ,/5N%s %t %< hr#   pydantic_schemac                     t        j                  dd| j                  j                        j	                  dd      }t        di dt        |z   i}t        j                  d|        |S )a  
    Construct a reference object from the Pydantic schema name

    characters in the schema name that are invalid/problematic
    for JSONschema $ref names will get replaced with underscores.
    Especially needed for Pydantic generic Models with brackets "[]"

    see: https://github.com/pydantic/pydantic/blob/aee6057378ccfec02126bf9c984a9b6d6b411777/pydantic/json_schema.py#L2031
    z[^a-zA-Z0-9.\-_]_.__z$refzref_obj=r"   )	resubr   r   replacer   r?   rE   rF   )rl   ref_nameref_objs      r$   r_   r_      se     vvS/">">"G"Ggc4  :6:#89:G
LL8G9%&Nr#   )r+   )NTT)(loggingrq   typingr   r   r   r   r   r   r	   r
   r   pydanticr   openapi_pydantic.compatr   r   r   r   r    r   r   r   r   r   	getLoggerr   rE   r   r?   r>   r   r1   boolrS   strrK   rB   r_   r"   r#   r$   <module>r~      s2    	 O O O   F E			8	$~Y7$
-9VW\2 9 5A&	i&#1&&& 7;/3	==T$y/23= )-= 	=
 =@$sCx. T#v+=N / g / $tI2G / d|(D  r#   