o
    .ѹg.                     @  s  d Z ddlmZ ddl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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mZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ dd	l0m1Z1 dd
l2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM ddlNmOZO ddlPmQZQ ddlRmSZT ddlUmVZV ddlWmXZX dZYdZZdZ[dZ\dZ]dZ^dZ_dZ`dZah dZbeXeTZcd Zdd!ZSdod&d'ZeG d(d) d)e6ZfG d*d+ d+Zgdpd/d0ZhG d1d2 d2ZiG d3d4 d4ZjG d5d6 d6ZkG d7d8 d8Zled9d:d;Zmed<d=d;Zned>d?d;Zoed@dAd;ZpedBdCd;ZqedBdDd;ZredBdEd;ZsdqdLdMZtdrdPdQZudsdRdSZvdtdVdWZwdsdXdYZxdudZd[Zy			\dvdwdidjZzdxdmdnZ{dS )yz^This module includes classes and functions designed specifically for use with the mypy plugin.    )annotationsN)ConfigParser)AnyCallableIterator)	ErrorCode)expand_typeexpand_type_by_instance) 	ARG_NAMEDARG_NAMED_OPTARG_OPTARG_POS	ARG_STAR2	INVARIANTMDEFArgumentAssignmentStmtBlockCallExprClassDefContext	DecoratorDictExprEllipsisExpr
ExpressionFuncDefIfStmtJsonDict
MemberExprNameExprPassStmtPlaceholderNodeRefExpr	StatementStrExprSymbolTableNodeTempNode	TypeAliasTypeInfoVar)Options)CheckerPluginInterfaceClassDefContextMethodContextPluginReportConfigContextSemanticAnalyzerPluginInterface)deserialize_and_fixup_type)set_callable_name)make_wildcard_trigger)state)map_type_from_supertype)
AnyTypeCallableTypeInstanceNoneTypeType	TypeOfAnyTypeTypeTypeVarType	UnionTypeget_proper_type)fill_typevars)get_unique_redefinition_name)__version__)_fields)parse_mypy_versionpydantic-mypyzpydantic-mypy-metadatazpydantic.main.BaseModelz#pydantic_settings.main.BaseSettingszpydantic.root_model.RootModelz5pydantic._internal._model_construction.ModelMetaclasszpydantic.fields.Fieldzpydantic.dataclasses.dataclass.pydantic.functional_validators.model_validator>   z.pydantic.functional_validators.field_validatorz*pydantic.functional_serializers.serializerz0pydantic.functional_serializers.model_serializerz3pydantic.deprecated.class_validators.root_validatorrF   z.pydantic.deprecated.class_validators.validatorbuiltins   versionstrreturntype[Plugin]c                 C  s   t S )a!  `version` is the mypy version string.

    We might want to use this to print a warning if the mypy version being used is
    newer, or especially older, than we expect (or need).

    Args:
        version: The mypy version string.

    Return:
        The Pydantic mypy plugin type.
    N)PydanticPlugin)rI    rN   Q/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/pydantic/mypy.pypluginj   s   rP   c                      s^   e Zd ZdZd fddZdddZdddZdddZdddZd ddZ	d ddZ
  ZS )!rM   zThe Pydantic mypy plugin.optionsr*   rK   Nonec                   s&   t || _| j | _t | d S N)PydanticPluginConfigplugin_configto_data_plugin_datasuper__init__)selfrQ   	__class__rN   rO   rY   |   s   
zPydanticPlugin.__init__fullnamerJ   (Callable[[ClassDefContext], None] | Nonec                 C  s:   |  |}|rt|jtrtdd |jjD r| jS dS )zUpdate Pydantic model class.c                 s      | ]}|j tkV  qd S rS   r]   BASEMODEL_FULLNAME.0baserN   rN   rO   	<genexpr>       z5PydanticPlugin.get_base_class_hook.<locals>.<genexpr>N)lookup_fully_qualified
isinstancenoder(   anymro$_pydantic_model_class_maker_callback)rZ   r]   symrN   rN   rO   get_base_class_hook   s
   
z"PydanticPlugin.get_base_class_hookc                 C  s   |t kr| jS dS )z,Update Pydantic `ModelMetaclass` definition.N)MODEL_METACLASS_FULLNAME)_pydantic_model_metaclass_marker_callbackrZ   r]   rN   rN   rO   get_metaclass_hook   s   z!PydanticPlugin.get_metaclass_hook&Callable[[MethodContext], Type] | Nonec                 C  s   | drtS dS )z-Adjust return type of `from_orm` method call.z	.from_ormN)endswithfrom_attributes_callbackrq   rN   rN   rO   get_method_hook   s   
zPydanticPlugin.get_method_hookctxr/   dict[str, Any]c                 C  s   | j S )zjReturn all plugin config data.

        Used by mypy to determine if cache needs to be discarded.
        N)rW   )rZ   rw   rN   rN   rO   report_config_data   s   z!PydanticPlugin.report_config_datar,   c                 C  s"   t |j|j|j| j}|  d S rS   )PydanticModelTransformerclsreasonapirU   	transform)rZ   rw   ZtransformerrN   rN   rO   rl      s   z3PydanticPlugin._pydantic_model_class_maker_callbackc                 C  s@   | j jrdS |jjj}|sJ dt|jddrd|j_dS dS )zReset dataclass_transform_spec attribute of ModelMetaclass.

        Let the plugin handle it. This behavior can be disabled
        if 'debug_dataclass_transform' is set to True', for testing purposes.
        Nz-callback not passed from 'get_metaclass_hook'dataclass_transform_spec)rU   debug_dataclass_transformr{   infoZdeclared_metaclassgetattrtyper   )rZ   rw   Zinfo_metaclassrN   rN   rO   rp      s   
z8PydanticPlugin._pydantic_model_metaclass_marker_callbackrQ   r*   rK   rR   )r]   rJ   rK   r^   )r]   rJ   rK   rs   )rw   r/   rK   rx   )rw   r,   rK   rR   )__name__
__module____qualname____doc__rY   rn   rr   rv   ry   rl   rp   __classcell__rN   rN   r[   rO   rM   y   s    

	


rM   c                   @  sJ   e Zd ZU dZdZded< ded< ded< ded< dddZdddZdS )rT   a  A Pydantic mypy plugin config holder.

    Attributes:
        init_forbid_extra: Whether to add a `**kwargs` at the end of the generated `__init__` signature.
        init_typed: Whether to annotate fields in the generated `__init__`.
        warn_required_dynamic_aliases: Whether to raise required dynamic aliases error.
        debug_dataclass_transform: Whether to not reset `dataclass_transform_spec` attribute
            of `ModelMetaclass` for testing purposes.
    )init_forbid_extra
init_typedwarn_required_dynamic_aliasesr   boolr   r   r   r   rQ   r*   rK   rR   c                 C  s   |j d u rd S t|j }|d ur:|di di }| jD ]}||d}t|ts1td| t| || qd S t }|	|j  | jD ]}|j
t|dd}t| || qFd S )NZtoolrE   Fz/Configuration value must be a boolean for key: )fallback)config_file
parse_tomlget	__slots__rh   r   
ValueErrorsetattrr   read
getbooleanCONFIGFILE_KEY)rZ   rQ   Ztoml_configconfigkeyZsettingrU   rN   rN   rO   rY      s"   




zPydanticPluginConfig.__init__rx   c                   s    fdd j D S )z/Returns a dict of config names to their values.c                   s   i | ]}|t  |qS rN   )r   )rc   r   rZ   rN   rO   
<dictcomp>       z0PydanticPluginConfig.to_data.<locals>.<dictcomp>N)r   r   rN   r   rO   rV         zPydanticPluginConfig.to_dataNr   rK   rx   )r   r   r   r   r   __annotations__rY   rV   rN   rN   rN   rO   rT      s   
 

rT   rw   r-   r:   c                 C  s   | j }t|tr|j}t|trt|jtr|j}nt|tr"|}nd| d|jj d}t	|| j
| j | jS |j jt}|du rF| jS tdd |j jD sT| jS |di d}|d	urkt|j j| j
| j | jS )
z1Raise an error if from_attributes is not enabled.z
ctx.type: 
 (of type )Nc                 s  r_   rS   r`   rb   rN   rN   rO   re      rf   z+from_attributes_callback.<locals>.<genexpr>r   from_attributesT)r   rh   r<   itemr7   Zret_typer8   r\   r   error_unexpected_behaviorr}   contextZdefault_return_typemetadatar   METADATA_KEYrj   rk   error_from_attributesname)rw   Zctx_typeZ
model_typedetailZpydantic_metadatar   rN   rN   rO   ru      s&   

ru   c                   @  sb   e Zd ZdZd3ddZd4d d!Z	"d5d6d#d$Z	"d5d7d&d'Zd8d)d*Ze	d9d,d-Z
d:d0d1Zd2S );PydanticModelFieldz5Based on mypy.plugins.dataclasses.DataclassAttribute.r   rJ   alias
str | None	is_frozenr   has_dynamic_aliashas_defaultstrictbool | Nonelineintcolumnr   Type | Noner   r(   c                 C  s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S rS   )
r   r   r   r   r   r   r   r   r   r   )rZ   r   r   r   r   r   r   r   r   r   r   rN   rN   rO   rY      s   
zPydanticModelField.__init__current_infotypedmodel_strictforce_optional	use_aliasr}   r0   force_typevars_invariantis_root_model_rootrK   r   c	                 C  sr   |  ||||}	| jdu r|n| j}
|s|
r| ||}nttj}t|	|d|r,tdS |s1| jr5t	dS t
dS )zABased on mypy.plugins.dataclasses.DataclassAttribute.to_argument.N)variabletype_annotationZinitializerkind)to_varr   r   r6   r;   explicitr   r   r   r   r
   )rZ   r   r   r   r   r   r}   r   r   r   r   r   rN   rN   rO   to_argument  s    
zPydanticModelField.to_argumentFc                 C  s   |rt | jtr| j }t|_|| _| jdur[| jjdur[t	|j
j. t|}t |ts1J |rA|jD ]
}t |tr@t|_q6t| j| jjj|iW  d   S 1 sVw   Y  | jS )zABased on mypy.plugins.dataclasses.DataclassAttribute.expand_type.N)rh   r   r=   Zcopy_modifiedr   Zvariancer   	self_typer4   strict_optional_setrQ   strict_optionalr@   r8   argsr   id)rZ   r   r}   r   Zmodified_typeZfilled_with_typevarsargrN   rN   rO   r   /  s"   


 	zPydanticModelField.expand_typer)   c                 C  s0   |r| j dur| j }n| j}t|| |||S )z<Based on mypy.plugins.dataclasses.DataclassAttribute.to_var.N)r   r   r)   r   )rZ   r   r}   r   r   r   rN   rN   rO   r   M  s   zPydanticModelField.to_varr   c              
   C  s8   | j sJ | j| j| j| j| j| j| j| j| j 	 d	S )?Based on mypy.plugins.dataclasses.DataclassAttribute.serialize.)	r   r   r   r   r   r   r   r   r   N)
r   r   r   r   r   r   r   r   r   	serializer   rN   rN   rO   r   \  s   
zPydanticModelField.serializedatac                 C  s,   |  }t|d|}| d||d|S )ABased on mypy.plugins.dataclasses.DataclassAttribute.deserialize.r   )r   r   NrN   )copyr1   pop)r{   r   r   r}   typrN   rN   rO   deserializek  s   zPydanticModelField.deserializesub_typerR   c                 C  sT   | j dur(t|jj t| j || j| _ W d   dS 1 s!w   Y  dS dS )zxExpands type vars in the context of a subtype when an attribute is inherited
        from a generic super type.
        N)r   r4   r   rQ   r   r5   r   )rZ   r   r}   rN   rN   rO   expand_typevar_from_subtyper  s
   
"z.PydanticModelField.expand_typevar_from_subtypeN)r   rJ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   )r   r(   r   r   r   r   r   r   r   r   r}   r0   r   r   r   r   rK   r   F)r   r(   r}   r0   r   r   rK   r   )
r   r(   r}   r0   r   r   r   r   rK   r)   rK   r   )r   r(   r   r   r}   r0   rK   r   )r   r(   r}   r0   rK   rR   )r   r   r   r   rY   r   r   r   r   classmethodr   r   rN   rN   rN   rO   r      s    

#
r   c                   @  s0   e Zd ZdZdd ZedddZdd	d
ZdS )PydanticModelClassVarzBased on mypy.plugins.dataclasses.DataclassAttribute.

    ClassVars are ignored by subclasses.

    Attributes:
        name: the ClassVar name
    c                 C  s
   || _ d S rS   r   )rZ   r   rN   rN   rO   rY     s   
zPydanticModelClassVar.__init__r   r   rK   c                 C  s   |  }| di |S )r   NrN   )r   )r{   r   rN   rN   rO   r     s   z!PydanticModelClassVar.deserializec                 C  s
   d| j iS )r   r   Nr   r   rN   rN   rO   r     s   zPydanticModelClassVar.serializeN)r   r   rK   r   r   )r   r   r   r   rY   r   r   r   rN   rN   rN   rO   r   {  s    r   c                   @  s  e Zd ZU dZh dZded< d`ddZdaddZdbddZdcddZ	ddddZ
ded!d"Zdfd%d&Zdgd+d,Zdhd4d5Zdid:d;Zdid<d=Zdjd?d@ZdkdldFdGZedmdHdIZedndKdLZedodNdOZedmdPdQZ	AdkdpdXdYZdqdZd[Zedrd]d^Zd_S )srz   zTransform the BaseModel subclass according to the plugin settings.

    Attributes:
        tracked_config_fields: A set of field configs that the plugin has to track their value.
    >   populate_by_namefrozenalias_generatorr   r   extrazset[str]tracked_config_fieldsr{   r   r|   Expression | Statementr}   r0   rU   rT   rK   rR   c                 C  s   || _ || _|| _|| _d S rS   )_clsZ_reason_apirU   )rZ   r{   r|   r}   rU   rN   rN   rO   rY     s   
z!PydanticModelTransformer.__init__r   c                 C  s   | j j}tdd |jdd D }|  }| ||\}}|du s&|du r(dS |D ]
}|jdu r4 dS q*tdd |jdd D }| |||| | |||| | j	|| j
|jdu d |   d	d
 |D dd
 |D | d|jt< dS )a  Configures the BaseModel subclass according to the plugin settings.

        In particular:

        * determines the model config and fields,
        * adds a fields-aware signature for the initializer and construct methods
        * freezes the class if frozen = True
        * stores the fields, config, and if the class is settings in the mypy metadata for access by subclasses
        c                 s  s    | ]}t |jv V  qd S rS   )ROOT_MODEL_FULLNAMEr]   rb   rN   rN   rO   re     rf   z5PydanticModelTransformer.transform.<locals>.<genexpr>NFc                 s  r_   rS   )r]   BASESETTINGS_FULLNAMErb   rN   rN   rO   re     rf   T)r   c                 S     i | ]}|j | qS rN   r   r   rc   fieldrN   rN   rO   r     r   z6PydanticModelTransformer.transform.<locals>.<dictcomp>c                 S  r   rN   r   )rc   Z	class_varrN   rN   rO   r     r   )fields
class_varsr   )r   r   rj   rk   collect_configcollect_fields_and_class_varsr   add_initializeradd_model_construct_method
set_frozenr   r   adjust_decorator_signaturesget_values_dictr   r   )rZ   r   is_root_modelr   r   r   r   is_settingsrN   rN   rO   r~     s(   

z"PydanticModelTransformer.transformc                   s   | j jj D ]8}t|jtr?|jjd  t tr?t j	t
r? j	jtv r? j	jtkr:t fddt jD s?d|jj_qdS )a  When we decorate a function `f` with `pydantic.validator(...)`, `pydantic.field_validator`
        or `pydantic.serializer(...)`, mypy sees `f` as a regular method taking a `self` instance,
        even though pydantic internally wraps `f` with `classmethod` if necessary.

        Teach mypy this by marking any function whose outermost decorator is a `validator()`,
        `field_validator()` or `serializer()` call as a `classmethod`.
        r   c                 3  s6    | ]\}} j | d kot|to|jdkV  qdS )modeafterN)	arg_namesrh   r$   value)rc   ir   Z	first_decrN   rO   re     s
     
zGPydanticModelTransformer.adjust_decorator_signatures.<locals>.<genexpr>TN)r   r   namesvaluesrh   ri   r   Zoriginal_decoratorsr   calleer   r]   DECORATOR_FULLNAMESMODEL_VALIDATOR_FULLNAMErj   	enumerater   funcis_class)rZ   rm   rN   r   rO   r     s$   



z4PydanticModelTransformer.adjust_decorator_signaturesModelConfigDatac              	   C  s  | j }t }d}d}|j D ]\}}| ||}|r"d}|| qd}|jjD ]}t|t	t
fs3q)t|t	r|jd }	t|	trG|	jdkrHq)t|jtrlt|jj|jjD ]b\}
}|
du r`qW|| j|
|dd qWt|jtr|jjD ]C\}}t|tsqv|| |j| qvn.t|t
r|jdkrq)|jjD ]}t|t	sq|jd }	t|	tsq|| |	j|j q|r| jd|  qd}q)|s|r|r|jr|js| jjrt| j| |jjd	d D ]&}t|j vrq| j!t"|j# |j t d
  D ]\}}|$|| q q|S )zhCollects the values of the config attributes that are used by the plugin, accounting for parent classes.FTNr   model_config)	lax_extraZConfigzYSpecifying config in two places is ambiguous, use either Config attribute or class kwargs   r   )%r   r  keywordsitemsget_config_updateupdatedefsbodyrh   r   r   lvaluesr   r   rvaluer   zipr   r   r   r$   r   r   failhas_alias_generatorr   rU   r   error_required_dynamic_aliasesr   rk   r   r   add_plugin_dependencyr3   r]   
setdefault)rZ   r{   r   Zhas_config_kwargsZhas_config_from_namespacer   exprZconfig_datastmtlhsarg_namer   Zkey_exprZ
value_exprZsubstmtr   r   rN   rN   rO   r     s   









z'PydanticModelTransformer.collect_configr  r   Jtuple[list[PydanticModelField] | None, list[PydanticModelClassVar] | None]c                 C  s  | j }i }i }t|jjdd D ]b}t|jvrq| jt|j	 |jt d 
 D ]2\}}t||| j}	|	|j| j |	||< |jj|}
|
r]|
jr]t|
jts]| jd|
j q+|jt d 
 D ]\}}t|||< qgqt }t }| |jD ]I}| |||}|du rq|jd }t|tsJ t|tr|r|jdkrt| j| q||j |||j< qt|tr||j |||j< qt| t| fS )	zACollects the fields for the model, accounting for parent classes.r  r   r   z7BaseModel field may only be overridden by another fieldr   Nr   root) r   reversedr   rk   r   r   r   r  r3   r]   r  r   r   r   r   r   ri   rh   r)   r  r   set%_get_assignment_statements_from_blockr	  $collect_field_or_class_var_from_stmtr  r   r    error_extra_fields_on_root_modeladdlistr   )rZ   r  r   r{   Zfound_fieldsZfound_class_varsr   r   r   r   sym_nodeZcurrent_field_namesZcurrent_class_vars_namesr  Zmaybe_fieldr  rN   rN   rO   r   <  sN   




z6PydanticModelTransformer.collect_fields_and_class_varsr  r   Iterator[AssignmentStmt]c                 c  sT    |j D ]}|js| |E d H  q|jd ur&|jjs(| |jE d H  d S d S d S rS   )r
  Zis_unreachabler  Z	else_body)rZ   r  r
  rN   rN   rO   ,_get_assignment_statements_from_if_statement  s   
zEPydanticModelTransformer._get_assignment_statements_from_if_statementblockr   c                 c  s>    |j D ]}t|tr|V  qt|tr| |E d H  qd S rS   )r
  rh   r   r   r"  )rZ   r#  r  rN   rN   rO   r    s   


z>PydanticModelTransformer._get_assignment_statements_from_blockr   r    dict[str, PydanticModelClassVar]1PydanticModelField | PydanticModelClassVar | Nonec                 C  s,  | j }|jd }t|trt|jr|jdkrdS |jsKt|jt	r<t|jj
t	r<t|jj
j
tr<|jj
j
jtv r<dS |j|v rCdS t| j| dS |jd }t|tsWdS t|jrb|jdkrddS |jj|j}|du rrdS |j}t|tr|dS t|tr| jd| dS t|tsdS |jrt|jS t|j}t|tr|jjdkr| jd| | |}	| |}
|jdu r|jr|jr| jj |jdd}|r||_n| jd	| t!t"j#|_| $|\}}|r|j%s| j&j'rt(| j| | )|}| *||j|}t+|j||	|
|||j,|j-||jd

S )a^  Get pydantic model field from statement.

        Args:
            stmt: The statement.
            model_config: Configuration settings for the model.
            class_vars: ClassVars already known to be defined on the model.

        Returns:
            A pydantic model field if it could find the field in statement. Otherwise, `None`.
        r   r  NzFType aliases inside BaseModel definitions are not supported at runtimezdataclasses.InitVarz%InitVar is not supported in BaseModelT)is_finalzGNeed type argument for Final[...] with non-literal default in BaseModel)
r   r   r   r   r   r   r   r   r   r   ).r   r  rh   r   rC   Zis_valid_field_namer   Z
new_syntaxr  r   r   r]   r   error_untyped_fieldsr   r   r   r   ri   r!   r'   r  r)   Zis_classvarr   r?   r   r8   get_has_default
get_strictr&  Zis_inferredZanalyze_simple_literal_typer6   r;   Z
from_errorget_alias_infor   rU   r   r  is_field_frozen_infer_dataclass_attr_init_typer   r   r   )rZ   r  r  r   r{   r  rm   ri   Z	node_typer   r   r   r   r   r   Z	init_typerN   rN   rO   r    s   
 
	










z=PydanticModelTransformer.collect_field_or_class_var_from_stmtrm   r%   r   rJ   r   r   r   c           	      C  s   |j }|jr|S t|j }t|ts|S |j d}|rpt|jtrc|j d}|s,J |j r:tt	|j |j |}nt
tjS t|trT|jtttgkrTt|jd |S | jd|j j d| |S | jd|j j d| |S )zvInfer __init__ argument type for an attribute.

        In particular, possibly use the signature of __set__.
        __set__rH   z(Unsupported signature for "__set__" in ""zUnsupported "__set__" in "N)r   Zimplicitr?   rh   r8   r   ri   r   Zget_containing_type_infor5   r6   r;   Zunannotatedr7   	arg_kindsr   r	   	arg_typesr   r  r   )	rZ   rm   r   r   defaulttsetterZ
super_infoZsetter_typerN   rN   rO   r,    s0   


z8PydanticModelTransformer._infer_dataclass_attr_init_typer   list[PydanticModelField]r   r   c              
   C  s  d| j jjv r| j jjd jsdS | jj}t|j}|jdu}t|j	o&|j }| j
|||||||dd}	|r| jtj}
t|
tsEJ d|
jv r|
jd j}t|tsWJ |dur|jdur|j}t|tsjJ t|jD ]+\}}|du s|ds|dsqo| j|j| }t||}|	t||dt qo| ||std}|	t|ttj dt! t"| j| j d|	t# d dS )	zAdds a fields-aware `__init__` method to the class.

        The added `__init__` will be annotated with types vs. all `Any` depending on the plugin settings.
        rY   NT)r   r   requires_dynamic_aliasesr   r   r   r   ___kwargs)r   return_type)$r   r   r   plugin_generatedrU   r   r   r   r   r  get_field_argumentsr   rg   r   ri   rh   r(   r   r   r7   r   r   
startswithZ	anal_typer0  r)   appendr   r   should_init_forbid_extrar6   r;   r   r   
add_methodr9   )rZ   r   r   r   r   r   r   r   r5  r   Zbase_settings_nodeZbase_settings_init_node	func_typeZarg_idxr  Zanalyzed_variable_typer   varrN   rN   rO   r   5  sF   



z(PydanticModelTransformer.add_initializerc           
   
   C  s   | j t d| j t dg}t|t g}ttd||dt}t	| j j
j | j|dt|jdd||d}W d   n1 sEw   Y  | ||satd}	|t|	ttjdt |rh||g n|g| }t| j | jd	|t| jjdd
 dS )zAdds a fully typed `model_construct` classmethod to the class.

        Similar to the fields-aware __init__ method, but always uses the field names (not aliases),
        and does not treat settings fields as optional.
        z.setz.strZ_fields_setNTF)r   r   r5  r   r   r   r8  Zmodel_construct)r   r9  is_classmethod)r   
named_typeBUILTINS_NAMEr>   r9   r   r)   r   r4   r   rQ   r   r;  r   r   r>  r=  r6   r;   r   r   r?  r   r@   r   )
rZ   r   r   r   r   Zset_strZoptional_set_strZfields_set_argumentr   rA  rN   rN   rO   r   d  s4   $


z3PydanticModelTransformer.add_model_construct_methodr   c           
   	   C  s   | j j}|D ]r}|j|j}|durX|j}t|tr"|p|j|_	qt|t
r1| jjs1| j  qzt|}W n tyD   t|}Y nw d| d|j d}	t|	| j| j  q|j||dd}||_||_	|jd |j |_tt||j|j< qdS )zMarks all fields as properties so that attempts to set them trigger mypy errors.

        This is the same approach used by the attrs and dataclasses plugins.
        Nzsym_node.node: r   r   F)r   .)r   r   r   r   r   ri   rh   r)   r   Zis_propertyr!   r   Zfinal_iterationdeferrJ   	TypeErrorreprr\   r   r   r]   	_fullnamer%   r   )
rZ   r   r}   r   r   r   r   rA  Zvar_strr   rN   rN   rO   r     s,   
z#PydanticModelTransformer.set_frozenFr   r   r  ModelConfigData | Nonec                 C  s   || j vrdS |dkr1t|tr|jdk}nt|tr!|jdk}n|s*t|| j| dS t|dS |dkrHd}t|t	rC|j
dkrCd}t|d	S t|t	r^|j
d
v r^tdi ||j
dkiS t|| j| dS )zDetermines the config update due to a single kwarg in the ConfigDict definition.

        Warns if a tracked config attribute is set to a value the plugin doesn't know how to interpret (e.g., an int)
        Nr   Zforbid)forbid_extrar   Tbuiltins.NoneF)r  )builtins.Truebuiltins.FalserM  rN   )r   rh   r$   r   r   r   error_invalid_config_valuer   r  r   r]   )rZ   r   r   r  rK  r  rN   rN   rO   r    s(   


	

z*PydanticModelTransformer.get_config_updatec                 C  s   | j }t|tr
dS t|trIt|jtrI|jjtkrIt|j	|j
D ]$\}}|du s.|dkr5|jtu  S |dkrFt|toB|jdk   S q"dS t|t S )zUReturns a boolean indicating whether the field defined in `stmt` is a required field.FNr1  default_factoryrL  )r  rh   r&   r   r   r"   r]   FIELD_FULLNAMEr  r   r   r\   r   r   r  r  r   r   rN   rN   rO   r(    s   
"z(PydanticModelTransformer.get_has_defaultr   c                 C  s|   | j }t|tr<t|jtr<|jjtkr<t|j|j	D ] \}}|dkr$qt|t
r9|jdkr1 dS |jdkr9 dS  dS dS )zEReturns a the `strict` value of a field if defined, otherwise `None`.r   rM  TrN  FN)r  rh   r   r   r"   r]   rQ  r  r   r   r   rR  rN   rN   rO   r)    s   "


z#PydanticModelTransformer.get_stricttuple[str | None, bool]c                 C  s   | j }t|tr
dS t|trt|jtr|jjtksdS t|j	D ]\}}|dkr+q"|j
| }t|tr<|jdf  S  dS dS )a  Returns a pair (alias, has_dynamic_alias), extracted from the declaration of the field defined in `stmt`.

        `has_dynamic_alias` is True if and only if an alias is provided, but not as a string literal.
        If `has_dynamic_alias` is True, `alias` will be None.
        )NFr   F)NTN)r  rh   r&   r   r   r"   r]   rQ  r   r   r   r$   r   r  r  r   r  r   rN   rN   rO   r*    s$   




z'PydanticModelTransformer.get_alias_infoc                 C  s|   | j }t|tr
dS t|trt|jtr|jjtksdS t|j	D ]\}}|dkr;|j
| }t|to8|jdk  S q"dS )al  Returns whether the field is frozen, extracted from the declaration of the field defined in `stmt`.

        Note that this is only whether the field was declared to be frozen in a `<field_name> = Field(frozen=True)`
        sense; this does not determine whether the field is frozen because the entire model is frozen; that is
        handled separately.
        Fr   rM  N)r  rh   r&   r   r   r"   r]   rQ  r   r   r   r   rT  rN   rN   rO   r+    s    



z(PydanticModelTransformer.is_field_frozenr   r   r   r5  r   list[Argument]c	           
   	     s.   j j f	dd|D }	|	S )zHelper function used during the construction of the `__init__` and `model_construct` method signatures.

        Returns a list of mypy Argument instances for use in the generated signatures.
        c                   s@   g | ]}r	|j s|jpj o|jd kdqS )r  )r   r   r   r   r}   r   r   )r   r   r   r   r   	r   r   r   r   r   r5  rZ   r   r   rN   rO   
<listcomp>9  s"    z@PydanticModelTransformer.get_field_arguments.<locals>.<listcomp>N)r   r   )
rZ   r   r   r   r   r5  r   r   r   	argumentsrN   rV  rO   r;  )  s
   z,PydanticModelTransformer.get_field_argumentsc                 C  s.   |j s| |t|jrdS |jrdS | jjS )a@  Indicates whether the generated `__init__` should get a `**kwargs` at the end of its signature.

        We disallow arbitrary kwargs if the extra config setting is "forbid", or if the plugin config says to,
        *unless* a required dynamic alias is present (since then we can't determine a valid signature).
        FTN)r   is_dynamic_alias_presentr   r  rK  rU   r   )rZ   r   r   rN   rN   rO   r>  I  s   z1PydanticModelTransformer.should_init_forbid_extrar  c                 C  s8   | D ]}|j r
 dS q|r| D ]
}|jdu r dS qdS )zReturns whether any fields on the model have a "dynamic alias", i.e., an alias that cannot be
        determined during static analysis.
        TNF)r   r   )r   r  r   rN   rN   rO   rY  V  s   
z1PydanticModelTransformer.is_dynamic_alias_presentN)
r{   r   r|   r   r}   r0   rU   rT   rK   rR   )rK   r   )rK   rR   )rK   r  )r  r  r   r   rK   r  )r  r   rK   r!  )r#  r   rK   r!  )r  r   r  r  r   r$  rK   r%  )rm   r%   r   rJ   r   r   rK   r   )
r   r4  r   r  r   r   r   r   rK   rR   )r   r4  r}   r0   r   r   rK   rR   r   )r   rJ   r   r   r  r   rK   rJ  )r  r   rK   r   )r  r   rK   r   )r  r   rK   rS  )r   r4  r   r   r   r   r   r   r5  r   r   r   r   r   r   r   rK   rU  )r   r4  r   r  rK   r   )r   r4  r  r   rK   r   )r   r   r   r   r   r   rY   r~   r   r   r   r"  r  r  r,  r   r   r   r  staticmethodr(  r)  r*  r+  r;  r>  rY  rN   rN   rN   rO   rz     s<   
 
	

$

L
D

 

&
/
(#!
 rz   c                   @  sF   e Zd ZdZ						ddd
dZdddZdddZdddZdS ) r  z(Pydantic mypy plugin model config class.NrK  r   r   r   r   r  r   c                 C  s(   || _ || _|| _|| _|| _|| _d S rS   )rK  r   r   r   r  r   )rZ   rK  r   r   r   r  r   rN   rN   rO   rY   h  s   	
zModelConfigData.__init__rK   rx   c                 C  s   dd | j  D S )zReturns a dict of Pydantic model config names to their values.

        It includes the config if config value is not `None`.
        c                 S  s   i | ]\}}|d ur||qS rS   rN   )rc   kvrN   rN   rO   r   }  s    z3ModelConfigData.get_values_dict.<locals>.<dictcomp>N)__dict__r  r   rN   rN   rO   r   x     zModelConfigData.get_values_dictr   rJ  rR   c                 C  s2   |du rdS |   D ]
\}}t| || qdS )z$Update Pydantic model config values.N)r   r  r   )rZ   r   r[  r\  rN   rN   rO   r    s
   zModelConfigData.updater   rJ   r   r   c                 C  s"   t | |du rt| || dS dS )zFSet default value for Pydantic model config if config value is `None`.N)r   r   )rZ   r   r   rN   rN   rO   r    s   zModelConfigData.setdefault)NNNNNN)rK  r   r   r   r   r   r   r   r  r   r   r   r   )r   rJ  rK   rR   )r   rJ   r   r   rK   rR   )r   r   r   r   rY   r   r  r  rN   rN   rN   rO   r  e  s    

r  zpydantic-ormzInvalid from_attributes callZPydanticzpydantic-configzInvalid config valuezpydantic-aliaszDynamic alias disallowedzpydantic-unexpectedzUnexpected behaviorzpydantic-fieldzUntyped field disallowedzInvalid Field defaultsz!Extra field on RootModel subclass
model_namer}   r+   r   r   rR   c                 C     |j d|  d|td dS )zCEmits an error when the model does not have `from_attributes=True`.r.  z$" does not have from_attributes=TruecodeN)r  	ERROR_ORM)r_  r}   r   rN   rN   rO   r        r   r   r0   c                 C  r`  )z0Emits an error when the config value is invalid.zInvalid value for "Config.r.  ra  N)r  ERROR_CONFIG)r   r}   r   rN   rN   rO   rO    rd  rO  c                 C     | j d|td dS )znEmits required dynamic aliases error.

    This will be called when `warn_required_dynamic_aliases=True`.
    z#Required dynamic aliases disallowedra  N)r  ERROR_ALIASr}   r   rN   rN   rO   r    r^  r  r   8CheckerPluginInterface | SemanticAnalyzerPluginInterfacec                 C  s4   d}d|  d}|d| d7 }|j ||td dS )z Emits unexpected behavior error.z6https://github.com/pydantic/pydantic/issues/new/choosez7The pydantic mypy plugin ran into unexpected behavior: 
z&Please consider reporting this bug at z so we can try to fix it!ra  N)r  ERROR_UNEXPECTED)r   r}   r   linkZfull_messagerN   rN   rO   r     s   r   c                 C  rf  )z;Emits an error when there is an untyped field in the model.zUntyped fields disallowedra  N)r  ERROR_UNTYPEDrh  rN   rN   rO   r'    r   r'  c                 C  rf  )z]Emits an error when there is more than just a root field defined for a subclass of RootModel.z2Only `root` is allowed as a field of a `RootModel`ra  N)r  ERROR_EXTRA_FIELD_ROOT_MODELrh  rN   rN   rO   r    r   r  F8SemanticAnalyzerPluginInterface | CheckerPluginInterfacer{   r   r   rU  r9  r   r   tvar_defTypeVarType | NonerB  r   c                 C  s  |j }||jv r|j| }	|	jrt|	jtr|jj|	j t| t	r)| 
d}
n| dg }
|rE|p8tt|}ttd|dtdg}n|pJt|}ttd|dtg}|| }g g g }}}|D ]}|jslJ d||j ||jj ||j qct|||||
}|r|g|_t||tt g}||_ t|||_||_|jd | |_|j|_||jv rt ||j}|j| |j|< |rd|_!t||j}||_ |j|_d|_"t#|t$dg|}|j|_t%t&|}	nt%t&|}	d|	_|	|j|< |j'jj| dS )	zhVery closely related to `mypy.plugins.common.add_method_to_class`, with a few pydantic-specific changes.zbuiltins.functionr   NTZ__pydantic_self__z"All arguments must be fully typed.rE  r   )(r   r   r:  rh   ri   r   r	  r
  remover0   rC  Znamed_generic_typer<   r@   r   r)   r   r   r=  r   r   r   r7   	variablesr   r    r2   r   r   r]   rI  r   rA   Zis_decoratedrB  r   r   r%   r   Zdefn)r}   r{   r   r   r9  r   rp  rB  r   rm   Zfunction_typefirstr0  r   r/  r   	signaturer   Zr_namer\  decrN   rN   rO   r?    sZ   





r?  r   dict[str, Any] | Nonec                 C  s   |  dsdS tjdkrddl}nzddl}W n ty*   ddl}|d Y dS w t| d}|	|W  d   S 1 s@w   Y  dS )zReturns a dict of config keys to values.

    It reads configs from toml file and returns `None` if the file is not a toml file.
    z.tomlN)      r   zJNo TOML parser installed, cannot read configuration from `pyproject.toml`.rb)
rt   sysversion_infoZtomllibtomliImportErrorwarningswarnopenload)r   Ztoml_r  rfrN   rN   rO   r     s   



$r   )rI   rJ   rK   rL   )rw   r-   rK   r:   )r_  rJ   r}   r+   r   r   rK   rR   )r   rJ   r}   r0   r   r   rK   rR   )r}   r0   r   r   rK   rR   )r   rJ   r}   ri  r   r   rK   rR   )r}   r+   r   r   rK   rR   )NNF)r}   ro  r{   r   r   rJ   r   rU  r9  r:   r   r   rp  rq  rB  r   rK   rR   )r   rJ   rK   rw  )|r   
__future__r   r{  configparserr   typingr   r   r   Zmypy.errorcodesr   Zmypy.expandtyper   r	   Z
mypy.nodesr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Zmypy.optionsr*   Zmypy.pluginr+   r,   r-   r.   r/   r0   Zmypy.plugins.commonr1   Zmypy.semanalr2   Zmypy.server.triggerr3   Z
mypy.stater4   Zmypy.typeopsr5   Z
mypy.typesr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   Zmypy.typevarsr@   Z	mypy.utilrA   Zmypy.versionrB   Zmypy_versionZpydantic._internalrC   Zpydantic.versionrD   r   r   ra   r   r   ro   rQ  ZDATACLASS_FULLNAMEr   r   ZMYPY_VERSION_TUPLErD  rP   rM   rT   ru   r   r   rz   r  rc  re  rg  rk  rm  ZERROR_FIELD_DEFAULTSrn  r   rO  r  r   r'  r  r?  r   rN   rN   rN   rO   <module>   s    " 0

6
.      V'





X