o
    ni+                     @  sF  d Z ddl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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/m0Z0 dd
l1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZF ddlGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQ ddlRmSZS ddlTmUZU ddlVmWZX ddlYmZZZ ddl[m\Z\ dZ]dZ^dZ_dZ`dZadZbdZcdZdd Zed!Zfh d"Zgegd#h Zhe\eXZid$Zjd%ZWdyd*d+ZkG d,d- d-e8ZlG d.d/ d/Zmdzd3d4ZnG d5d6 d6ZoG d7d8 d8ZpG d9d: d:ZqG d;d< d<eDZrG d=d> d>Zsd{dBdCZtedDdEdFZuedGdHdFZvedIdJdFZwedKdLdFZxedMdNdFZyedMdOdFZzedMdPdFZ{d|dWdXZ|d}d[d\Z}d~d]d^Z~ddadbZd~dcddZddedfZ			gdddsdtZddwdxZdS )z^This module includes classes and functions designed specifically for use with the mypy plugin.    )annotationsN)Iterator)ConfigParser)AnyCallable)	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DynamicClassDefContextMethodContextPluginReportConfigContextSemanticAnalyzerPluginInterface)deserialize_and_fixup_type)set_callable_name)make_wildcard_trigger)state)TypeTranslator)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.main.create_modelz#pydantic_settings.main.BaseSettingszpydantic.root_model.RootModelz5pydantic._internal._model_construction.ModelMetaclasszpydantic.fields.Fieldzpydantic.dataclasses.dataclass.pydantic.functional_validators.model_validator>   *pydantic.functional_serializers.serializer.pydantic.deprecated.class_validators.validator.pydantic.functional_validators.field_validator3pydantic.deprecated.class_validators.root_validatorrH   0pydantic.functional_serializers.model_serializerrM   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.
    )PydanticPlugin)rP    rU   M/var/www/html/arapca_proje/venv/lib/python3.10/site-packages/pydantic/mypy.pyplugino   s   rW   c                      sr   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
d'ddZd(d d!Z  ZS ))rT   zThe Pydantic mypy plugin.optionsr*   rR   Nonec                   s&   t || _| j | _t | d S N)PydanticPluginConfigplugin_configto_data_plugin_datasuper__init__)selfrX   	__class__rU   rV   r`      s   
zPydanticPlugin.__init__fullnamerQ   (Callable[[ClassDefContext], None] | Nonec                 C  s0   |  |}|rt|jtr|jtr| jS dS )zUpdate Pydantic model class.N)lookup_fully_qualified
isinstancenoder(   has_baseBASEMODEL_FULLNAME$_pydantic_model_class_maker_callback)ra   rd   symrU   rU   rV   get_base_class_hook   s
   
z"PydanticPlugin.get_base_class_hookc                 C     |t kr| jS dS )z,Update Pydantic `ModelMetaclass` definition.N)MODEL_METACLASS_FULLNAME)_pydantic_model_metaclass_marker_callbackra   rd   rU   rU   rV   get_metaclass_hook      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   rU   rU   rV   get_method_hook   s   
zPydanticPlugin.get_method_hook/Callable[[DynamicClassDefContext], None] | Nonec                 C  rn   )zARecognize `create_model()` calls as dynamic BaseModel subclasses.N)CREATE_MODEL_FULLNAME_pydantic_create_model_callbackrq   rU   rU   rV   get_dynamic_class_hook   rs   z%PydanticPlugin.get_dynamic_class_hookctxr0   dict[str, Any]c                 C  s   | j S )zjReturn all plugin config data.

        Used by mypy to determine if cache needs to be discarded.
        )r^   )ra   r|   rU   rU   rV   report_config_data   s   z!PydanticPlugin.report_config_datar,   c                 C  s"   t |j|j|j| j}|  d S rZ   )PydanticModelTransformerclsreasonapir\   	transform)ra   r|   transformerrU   rU   rV   rk      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)r\   debug_dataclass_transformr   infodeclared_metaclassgetattrtyper   )ra   r|   info_metaclassrU   rU   rV   rp      s   
z8PydanticPlugin._pydantic_model_metaclass_marker_callbackr-   c           	      C  s  t }t|jj|jjD ]0\}}|dkr;t|tr;|jdur;t|jtr(|jj	}qt|jt
r;t|jjtr;|jjjj	}q|j|}|du sLt|jts^|jt }|du s\t|jts^dS |j}t|}t|tslJ |j|j||jj}|j|_|j|jtt| dS )zFMake variables assigned from `create_model()` usable as types by mypy.__base__N)rj   zipcall	arg_namesargsrg   r"   rh   r(   rd   r)   r   r:   r   lookup_fully_qualified_or_nonerB   basic_new_typeinfonamelinemetaclass_typeadd_symbol_table_noder%   r   )	ra   r|   base_fullnamearg_namearg_exprbase_sym	base_infobase_instancer   rU   rU   rV   rz      s&   
z.PydanticPlugin._pydantic_create_model_callbackrX   r*   rR   rY   )rd   rQ   rR   re   )rd   rQ   rR   rt   )rd   rQ   rR   rx   )r|   r0   rR   r}   )r|   r,   rR   rY   )r|   r-   rR   rY   )__name__
__module____qualname____doc__r`   rm   rr   rw   r{   r~   rk   rp   rz   __classcell__rU   rU   rb   rV   rT   ~   s    

	




rT   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 )r[   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   rX   r*   rR   rY   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 )NtoolrG   Fz/Configuration value must be a boolean for key: )fallback)config_file
parse_tomlget	__slots__rg   r   
ValueErrorsetattrr   read
getbooleanCONFIGFILE_KEY)ra   rX   toml_configconfigkeysettingr\   rU   rU   rV   r`      s"   




zPydanticPluginConfig.__init__r}   c                   s    fdd j D S )z/Returns a dict of config names to their values.c                   s   i | ]}|t  |qS rU   )r   ).0r   ra   rU   rV   
<dictcomp>       z0PydanticPluginConfig.to_data.<locals>.<dictcomp>)r   r   rU   r   rV   r]         zPydanticPluginConfig.to_dataNr   rR   r}   )r   r   r   r   r   __annotations__r`   r]   rU   rU   rU   rV   r[      s   
 

r[   r|   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 |j tsO| jS |di d}|durft|j j| j
| j | jS )z1Raise an error if from_attributes is not enabled.z
ctx.type: z
 (of type )Nr   from_attributesT)r   rg   r>   itemr9   ret_typer:   rc   r   error_unexpected_behaviorr   contextdefault_return_typemetadatar   METADATA_KEYri   rj   error_from_attributesr   )r|   ctx_type
model_typedetailpydantic_metadatar   rU   rU   rV   rv     s&   

rv   c                   @  sd   e Zd ZdZd4ddZd5d d!Z	"	"d6d7d$d%Z	"d8d9d'd(Zd:d*d+Ze	d;d-d.Z
d<d1d2Zd3S )=PydanticModelFieldz5Based on mypy.plugins.dataclasses.DataclassAttribute.r   rQ   alias
str | None	is_frozenr   has_dynamic_aliashas_defaultstrictbool | Noner   intcolumnr   Type | Noner   r(   c                 C  s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S rZ   )
r   r   r   r   r   r   r   r   r   r   )ra   r   r   r   r   r   r   r   r   r   r   rU   rU   rV   r`      s   
zPydanticModelField.__init__current_infotypedmodel_strictforce_optional	use_aliasr   r1   force_typevars_invariantis_root_model_rootrR   r   c	                 C  sv   |  ||||}	| jdu r|n| j}
|s|
r| j||dd}nttj}t|	|d|r.tdS |s3| jr7t	dS t
dS )zABased on mypy.plugins.dataclasses.DataclassAttribute.to_argument.NT)include_root_type)variabletype_annotationinitializerkind)to_varr   r   r8   r=   explicitr   r   r   r   r
   )ra   r   r   r   r   r   r   r   r   r   r   r   rU   rU   rV   to_argument8  s    
zPydanticModelField.to_argumentFr   c                 C  s  |rt | jtr| j }t|_|| _| jdur| jjdurt	|j
jZ t|}t |ts1J |rA|jD ]
}t |tr@t|_q6t| j| jjj|i}|rvt |trvt|jrv|jd j}	|	du rk|W  d   S t|	|}
t||
g}|W  d   S 1 sw   Y  | jS )zABased on mypy.plugins.dataclasses.DataclassAttribute.expand_type.Nroot)rg   r   r?   copy_modifiedr   variancer   	self_typer5   strict_optional_setrX   strict_optionalrB   r:   r   r   idis_root_modelr	   r@   )ra   r   r   r   r   modified_typefilled_with_typevarsargexpanded_type	root_typeexpanded_root_typerU   rU   rV   r   U  s2   



 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   )ra   r   r   r   r   r   rU   rU   rV   r     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   )
r   r   r   r   r   r   r   r   r   	serializer   rU   rU   rV   r     s   
zPydanticModelField.serializedatac                 C  s,   |  }t|d|}| d||d|S )ABased on mypy.plugins.dataclasses.DataclassAttribute.deserialize.r   )r   r   NrU   )copyr2   pop)r   r   r   r   typrU   rU   rV   deserialize  s   zPydanticModelField.deserializesub_typerY   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   r5   r   rX   r   r7   r   )ra   r   r   rU   rU   rV   expand_typevar_from_subtype  s
   
"z.PydanticModelField.expand_typevar_from_subtypeN)r   rQ   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   r1   r   r   r   r   rR   r   )FF)
r   r(   r   r1   r   r   r   r   rR   r   F)
r   r(   r   r1   r   r   r   r   rR   r)   rR   r   )r   r(   r   r   r   r1   rR   r   )r   r(   r   r1   rR   rY   )r   r   r   r   r`   r   r   r   r   classmethodr   r   rU   rU   rU   rV   r     s    

!2
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 rZ   r   )ra   r   rU   rU   rV   r`     s   
zPydanticModelClassVar.__init__r   r   rR   c                 C  s   |  }| di |S )r   NrU   )r   )r   r   rU   rU   rV   r     s   z!PydanticModelClassVar.deserializec                 C  s
   d| j iS )r   r   r  r   rU   rU   rV   r     s   zPydanticModelClassVar.serializeN)r   r   rR   r   r   )r   r   r   r   r`   r   r   r   rU   rU   rU   rV   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 )sr   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.
    >   extrafrozenr   alias_generatorr   populate_by_namevalidate_by_namevalidate_by_aliaszset[str]tracked_config_fieldsr   r   r   Expression | Statementr   r1   r\   r[   rR   rY   c                 C  s   || _ || _|| _|| _d S rZ   )_cls_reason_apir\   )ra   r   r   r   r\   rU   rU   rV   r`     s   
z!PydanticModelTransformer.__init__r   c                 C  s   | j j}t|}|  }| ||\}}|du s|du rdS |D ]
}|jdu r* dS q |t}| |||| | 	|||| | 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
        NFT)r  c                 S     i | ]}|j | qS rU   r   r   r   fieldrU   rU   rV   r     r   z6PydanticModelTransformer.transform.<locals>.<dictcomp>c                 S  r  rU   r  )r   	class_varrU   rU   rV   r     r   )fields
class_varsr   )r
  r   r   collect_configcollect_fields_and_class_varsr   ri   BASESETTINGS_FULLNAMEadd_initializeradd_model_construct_method
set_frozenr  r  adjust_decorator_signaturesget_values_dictr   r   )ra   r   is_a_root_modelr   r  r  r  is_settingsrU   rU   rV   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)r   rg   r$   value)r   ir   	first_decrU   rV   	<genexpr>  s
     
zGPydanticModelTransformer.adjust_decorator_signatures.<locals>.<genexpr>TN)r
  r   namesvaluesrg   rh   r   original_decoratorsr   calleer   rd   (IMPLICIT_CLASSMETHOD_DECORATOR_FULLNAMESMODEL_VALIDATOR_FULLNAMEany	enumerater   funcis_class)ra   rl   rU   r"  rV   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rmt|jj|jjD ]\}
}|
du r`qW|| j|
|dd qWnNt|jtr|jjD ]\}}t|tsqw|| |j| qwn.t|t
r|jdkrq)|jjD ]}t|t	sq|jd }	t|	tsq|| |	j|j q|r| jd|  nd}q)|s|r|r|jr|js|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_extraConfigzYSpecifying config in two places is ambiguous, use either Config attribute or class kwargs   r   )&r
  r/  keywordsitemsget_config_updateupdatedefsbodyrg   r   r   lvaluesr   r   rvaluer   r   r   r   r   r$   r   r  failhas_alias_generatorr  r  r\   r   error_required_dynamic_aliasesr   mror   r   add_plugin_dependencyr4   rd   
setdefault)ra   r   r   has_config_kwargshas_config_from_namespacer   exprconfig_datastmtlhsr   r   key_expr
value_exprsubstmtr   r   rU   rU   rV   r  '  s   









z'PydanticModelTransformer.collect_configr0  r   Jtuple[list[PydanticModelField] | None, list[PydanticModelClassVar] | None]c                 C  s  | j }i }i }t|jjdd D ]d}t|jvrq| jt|j	 |jt d 
 D ]4\}}t||| j}	|	|j| j |	||< |jj|}
|
r_|
jr_t|
jttfs_| jd|
j q+|jt d 
 D ]\}}t|||< qiq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.r3  r  z7BaseModel field may only be overridden by another fieldr  Nr   r   )!r
  reversedr   r?  r   r   r  r@  r4   rd   r5  r   r   r   r%  r   rh   rg   r)   r!   r<  r   set%_get_assignment_statements_from_blockr8  $collect_field_or_class_var_from_stmtr:  r   r    error_extra_fields_on_root_modeladdlistr&  )ra   r0  r   r   found_fieldsfound_class_varsr   r   r   r  sym_nodecurrent_field_namescurrent_class_vars_namesrF  maybe_fieldrG  rU   rU   rV   r  s  sN   




z6PydanticModelTransformer.collect_fields_and_class_varsrF  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 rZ   )r9  is_unreachablerO  	else_body)ra   rF  r9  rU   rU   rV   ,_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 rZ   )r9  rg   r   r   r]  )ra   r^  rF  rU   rU   rV   rO    s   


z>PydanticModelTransformer._get_assignment_statements_from_blockr   r   dict[str, PydanticModelClassVar]1PydanticModelField | PydanticModelClassVar | Nonec                 C  sN  | 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#|_|jr|	rt|jS | $|\}}|r|j%s|j&s| j'j(rt)| 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   r0  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:  rg   r   rE   is_valid_field_namer   
new_syntaxr;  r   r(  rd   DECORATOR_FULLNAMESerror_untyped_fieldsr  r   r%  r   rh   r!   r'   r<  r)   is_classvarr   rA   r   r:   get_has_default
get_strictra  is_inferredanalyze_simple_literal_typer8   r=   
from_errorget_alias_infor  r  r\   r   r>  is_field_frozen_infer_dataclass_attr_init_typer   r   r   )ra   rF  r0  r  r   rG  rl   rh   	node_typer   r   r   r   r   r   	init_typerU   rU   rV   rP    s   
 













z=PydanticModelTransformer.collect_field_or_class_var_from_stmtrl   r%   r   rQ   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__rO   z(Unsupported signature for "__set__" in ""zUnsupported "__set__" in ")r   implicitrA   rg   r:   r   rh   r   get_containing_type_infor7   r8   r=   unannotatedr9   	arg_kindsr   r	   	arg_typesr  r<  r   )	ra   rl   r   r   defaulttsetter
super_infosetter_typerU   rU   rV   rn  N  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p|j	 o%|j
du}t|jo-|j }| j|||||||dd}	|r| jtj}
t|
tsLJ d|
jv r|
jd j}t|ts^J |dur|jdur|j}t|tsqJ t|jD ];\}}|du s|ds|dsqv| j|j| }|dur|dv r|ttj}t||}|	 t!||dt" qv| #||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.
        r`   NFT)r   r   requires_dynamic_aliasesr   r  r   r   ___)_cli_settings_source_build_sourceskwargs)r   return_type))r
  r   r%  plugin_generatedr\   r   r   r   r  r  r  r=  get_field_argumentsr  rf   r  rh   rg   r(   r   r   r9   r,  r   
startswith	anal_typerw  acceptChangeExplicitTypeOfAnyr=   from_omitted_genericsr)   appendr   r   should_init_forbid_extrar8   r   r   
add_methodr;   )ra   r  r   r  r   r   r   r   r~  r   base_settings_nodebase_settings_init_node	func_typearg_idxr   analyzed_variable_typer   varrU   rU   rV   r  t  sN   


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.str_fields_setNTF)r   r   r~  r   r  r   r  model_construct)r   r  is_classmethod)r  
named_typeBUILTINS_NAMEr@   r;   r   r)   r   r5   r   rX   r   r  r   r   r  r  r8   r=   r   r   r  r
  rB   r   )
ra   r  r   r  r   set_stroptional_set_strfields_set_argumentr   r  rU   rU   rV   r    s4   $


z3PydanticModelTransformer.add_model_construct_methodr  c                 C  s   | j j}|D ]K}|j|j}|dur1|j}t|tr"|p|j|_	qt|t
r0| jjs0| 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.
        NF)r   .)r
  r   r%  r   r   rh   rg   r)   r   is_propertyr!   r  final_iterationdeferr   rd   	_fullnamer%   r   )ra   r  r   r  r   r  rV  r  rU   rU   rV   r    s    

z#PydanticModelTransformer.set_frozenFr   r   r1  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  forbid)forbid_extrar  Tbuiltins.NoneF)r=  )builtins.Truebuiltins.Falser  rU   )r  rg   r$   r   r   r   error_invalid_config_valuer  r/  r   rd   )ra   r   r   r1  r  r=  rU   rU   rV   r6    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.FNrx  default_factoryr  )r;  rg   r&   r   r(  r"   rd   FIELD_FULLNAMEr   r   r   rc   r   r   rF  rD  r   r   rU   rU   rV   rg    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   r  Tr  FN)r;  rg   r   r(  r"   rd   r  r   r   r   r   r  rU   rU   rV   rh  '  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 d|jv r,|j	|j
d }nd|jv r;|j	|j
d }ndS t|trG|jdf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.
        )NFvalidation_aliasr   F)NT)r;  rg   r&   r   r(  r"   rd   r  r   r   indexr$   r   )rF  rD  r   rU   rU   rV   rl  7  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  r  )r;  rg   r&   r   r(  r"   rd   r  r,  r   r   r   )rF  rD  r!  r   r   rU   rU   rV   rm  U  s   


z(PydanticModelTransformer.is_field_frozenr   r   r   r~  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   r~  ra   r   r   rU   rV   
<listcomp>~  s"    z@PydanticModelTransformer.get_field_arguments.<locals>.<listcomp>)r
  r   )
ra   r  r   r   r   r~  r  r   r   	argumentsrU   r  rV   r  n  s
   z,PydanticModelTransformer.get_field_argumentsc                 C  s4   |j 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).
        FT)r  r  is_dynamic_alias_presentr   r=  r  r\   r   )ra   r  r   rU   rU   rV   r    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  rU   rU   rV   r    s   
z1PydanticModelTransformer.is_dynamic_alias_presentN)
r   r   r   r	  r   r1   r\   r[   rR   rY   )rR   r   )rR   rY   )rR   r/  )r0  r/  r   r   rR   rK  )rF  r   rR   rZ  )r^  r   rR   rZ  )rF  r   r0  r/  r  r_  rR   r`  )rl   r%   r   rQ   r   r   rR   r   )
r  r}  r   r/  r  r   r   r   rR   rY   )r  r}  r   r1   r  r   rR   rY   r   )r   rQ   r   r   r1  r   rR   r  )rF  r   rR   r   )rF  r   rR   r   )rF  r   rR   r  )r  r}  r   r   r   r   r   r   r~  r   r  r   r   r   r   r   rR   r  )r  r}  r   r/  rR   r   )r  r}  r=  r   rR   r   )r   r   r   r   r  r   r`   r   r  r  r  r]  rO  rP  rn  r  r  r  r6  staticmethodrg  rh  rl  rm  r  r  r  rU   rU   rU   rV   r     s<   
 


$

L
D

 


&
9
(#!
 r   c                      s,   e Zd ZdZd fddZdddZ  ZS )r  z<A type translator used to change type of Any's, if explicit.type_of_anyr   rR   rY   c                   s   || _ t   d S rZ   )_type_of_anyr_   r`   )ra   r  rb   rU   rV   r`     s   z ChangeExplicitTypeOfAny.__init__ry  r8   r<   c                 C  s   |j tjkr|j| jdS |S )N)r  )r  r=   r   r   r  )ra   ry  rU   rU   rV   	visit_any  s   z!ChangeExplicitTypeOfAny.visit_any)r  r   rR   rY   )ry  r8   rR   r<   )r   r   r   r   r`   r  r   rU   rU   rb   rV   r    s    r  c                   @  sJ   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.Nr  r   r  r   r  r  r  r=  r   c	           	      C  s4   || _ || _|| _|| _|| _|| _|| _|| _d S rZ   )r  r  r   r  r  r  r=  r   )	ra   r  r  r   r  r  r  r=  r   rU   rU   rV   r`     s   
zModelConfigData.__init__rR   r}   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 rZ   rU   )r   kvrU   rU   rV   r     s    z3ModelConfigData.get_values_dict.<locals>.<dictcomp>)__dict__r5  r   rU   rU   rV   r       zModelConfigData.get_values_dictr   r  rY   c                 C  s2   |du rdS |   D ]
\}}t| || qdS )z$Update Pydantic model config values.N)r  r5  r   )ra   r   r  r  rU   rU   rV   r7    s
   zModelConfigData.updater   rQ   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   )ra   r   r   rU   rU   rV   rA    s   zModelConfigData.setdefault)NNNNNNNN)r  r   r  r   r   r   r  r   r  r   r  r   r=  r   r   r   r   )r   r  rR   rY   )r   rQ   r   r   rR   rY   )r   r   r   r   r`   r  r7  rA  rU   rU   rU   rV   r/    s    

r/  r   r(   r   c                 C  s
   |  tS )zXReturn whether the type info is a root model subclass (or the `RootModel` class itself).)ri   ROOT_MODEL_FULLNAME)r   rU   rU   rV   r     s   
r   zpydantic-ormzInvalid from_attributes call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   rY   c                 C     |j d|  d|td dS )zCEmits an error when the model does not have `from_attributes=True`.rr  z$" does not have from_attributes=TruecodeN)r<  	ERROR_ORM)r  r   r   rU   rU   rV   r        r   r   r1   c                 C  r  )z0Emits an error when the config value is invalid.zInvalid value for "Config.rr  r  N)r<  ERROR_CONFIG)r   r   r   rU   rU   rV   r    r  r  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 disallowedr  N)r<  ERROR_ALIASr   r   rU   rU   rV   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!r  N)r<  ERROR_UNEXPECTED)r   r   r   linkfull_messagerU   rU   rV   r     s   r   c                 C  r  )z;Emits an error when there is an untyped field in the model.zUntyped fields disallowedr  N)r<  ERROR_UNTYPEDr  rU   rU   rV   re    r   re  c                 C  r  )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`r  N)r<  ERROR_EXTRA_FIELD_ROOT_MODELr  rU   rU   rV   rQ    r   rQ  F8SemanticAnalyzerPluginInterface | CheckerPluginInterfacer   r   r   r  r  r   r   tvar_defTypeVarType | Noner  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ndd}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
  NT__pydantic_self__z"All arguments must be fully typed.)	variablesr  r   )'r   r%  r  rg   rh   r   r8  r9  remover1   r  named_generic_typer>   rB   r   r)   r   r   r  r   r   r   r9   r   r    r3   r   r.  rd   r  r   rC   is_decoratedr  r   r   r%   r   defn)r   r   r   r   r  r   r  r  r   rl   function_typefirstrw  r   rv  r   	signaturer-  r_namer  decrU   rU   rV   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}|jddd Y dS w t| d}|	|W  d   S 1 sBw   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`.rO   )
stacklevelrb)
ru   sysversion_infotomllibtomliImportErrorwarningswarnopenload)r   toml_r  rfrU   rU   rV   r   p  s   


$r   )rP   rQ   rR   rS   )r|   r.   rR   r<   )r   r(   rR   r   )r  rQ   r   r+   r   r   rR   rY   )r   rQ   r   r1   r   r   rR   rY   )r   r1   r   r   rR   rY   )r   rQ   r   r  r   r   rR   rY   )r   r+   r   r   rR   rY   )NNF)r   r  r   r   r   rQ   r   r  r  r<   r   r   r  r  r  r   rR   rY   )r   rQ   rR   r  )r   
__future__r   r  collections.abcr   configparserr   typingr   r   mypy.errorcodesr   mypy.expandtyper   r	   
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)   mypy.optionsr*   mypy.pluginr+   r,   r-   r.   r/   r0   r1   mypy.plugins.commonr2   mypy.semanalr3   mypy.server.triggerr4   
mypy.stater5   mypy.type_visitorr6   mypy.typeopsr7   
mypy.typesr8   r9   r:   r;   r<   r=   r>   r?   r@   rA   mypy.typevarsrB   	mypy.utilrC   mypy.versionrD   mypy_versionpydantic._internalrE   pydantic.versionrF   r   r   rj   ry   r  r  ro   r  DATACLASS_FULLNAMEr*  rd  r)  MYPY_VERSION_TUPLEr  rW   rT   r[   rv   r   r   r   r  r/  r   r  r  r  r  r  ERROR_FIELD_DEFAULTSr  r   r  r>  r   re  rQ  r  r   rU   rU   rU   rV   <module>   s    "$	0

W
.      f
+





X