U
    EZh.                     @  sd  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Zaddd d!d"d#hZbeXeTZcd$Zdd%ZSd&d'd(d)d*ZeG d+d, d,e6ZfG d-d. d.Zgd/d0d1d2d3ZhG d4d5 d5ZiG d6d7 d7ZjG d8d9 d9ZkG d:d; d;Zled<d=d>Zmed?d@d>ZnedAdBd>ZoedCdDd>ZpedEdFd>ZqedEdGd>ZredEdHd>Zsd&dIdJdKdLdMdNZtd&dOdJdKdPdQdRZudOdJdKdSdTdUZvd&dVdJdKdWdXdYZwdOdJdKdSdZd[ZxdIdJdKdSd\d]Zydld_d`d&dad0dbdcdddKde	dfdgZzd&dhdidjdkZ{dS )mz^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.dataclassz.pydantic.functional_validators.model_validatorz.pydantic.functional_validators.field_validatorz*pydantic.functional_serializers.serializerz0pydantic.functional_serializers.model_serializerz.pydantic.deprecated.class_validators.validatorz3pydantic.deprecated.class_validators.root_validatorbuiltins   strztype[Plugin])versionreturnc                 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)rI    rL   T/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/pydantic/mypy.pypluginj   s    rN   c                      s   e Zd ZdZddd fddZddd	d
dZddd	ddZddd	ddZdddddZdddddZ	dddddZ
  ZS )rK   zThe Pydantic mypy plugin.r*   NoneoptionsrJ   c                   s&   t || _| j | _t | d S N)PydanticPluginConfigplugin_configto_data_plugin_datasuper__init__)selfrQ   	__class__rL   rM   rX   |   s    
zPydanticPlugin.__init__rH   z(Callable[[ClassDefContext], None] | None)fullnamerJ   c                 C  s:   |  |}|r6t|jtr6tdd |jjD r6| jS dS )zUpdate Pydantic model class.c                 s  s   | ]}|j tkV  qd S rR   r\   BASEMODEL_FULLNAME.0baserL   rL   rM   	<genexpr>   s     z5PydanticPlugin.get_base_class_hook.<locals>.<genexpr>N)lookup_fully_qualified
isinstancenoder(   anymro$_pydantic_model_class_maker_callback)rY   r\   symrL   rL   rM   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rY   r\   rL   rL   rM   get_metaclass_hook   s    z!PydanticPlugin.get_metaclass_hookz&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_callbackrm   rL   rL   rM   get_method_hook   s    
zPydanticPlugin.get_method_hookr/   dict[str, Any]ctxrJ   c                 C  s   | j S )zjReturn all plugin config data.

        Used by mypy to determine if cache needs to be discarded.
        )rV   )rY   rt   rL   rL   rM   report_config_data   s    z!PydanticPlugin.report_config_datar,   c                 C  s"   t |j|j|j| j}|  d S rR   )PydanticModelTransformerclsreasonapirT   	transform)rY   rt   ZtransformerrL   rL   rM   rh      s    z3PydanticPlugin._pydantic_model_class_maker_callbackc                 C  s<   | j jrdS |jjj}|s"tdt|jddr8d|j_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)	rT   debug_dataclass_transformrw   infoZdeclared_metaclassAssertionErrorgetattrtyper{   )rY   rt   Zinfo_metaclassrL   rL   rM   rl      s    
z8PydanticPlugin._pydantic_model_metaclass_marker_callback)__name__
__module____qualname____doc__rX   rj   rn   rq   ru   rh   rl   __classcell__rL   rL   rZ   rM   rK   y   s   	rK   c                   @  sT   e Zd ZU dZdZded< ded< ded< ded< dd	d
ddZddddZdS )rS   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|   r*   rO   rP   c                 C  s   |j d krd S t|j }|d k	rr|di di }| jD ]4}||d}t|tsbtd| t| || q:n:t }|	|j  | jD ] }|j
t|dd}t| || qd S )NZtoolrE   Fz/Configuration value must be a boolean for key: )fallback)config_file
parse_tomlget	__slots__rd   r   
ValueErrorsetattrr   read
getbooleanCONFIGFILE_KEY)rY   rQ   Ztoml_configconfigkeyZsettingrT   rL   rL   rM   rX      s    




zPydanticPluginConfig.__init__rr   rJ   c                   s    fdd j D S )z/Returns a dict of config names to their values.c                   s   i | ]}|t  |qS rL   )r   )r`   r   rY   rL   rM   
<dictcomp>   s      z0PydanticPluginConfig.to_data.<locals>.<dictcomp>)r   r   rL   r   rM   rU      s    zPydanticPluginConfig.to_dataN)r   r   r   r   r   __annotations__rX   rU   rL   rL   rL   rM   rS      s   

rS   r-   r:   rs   c                 C  s   | j }t|tr|j}t|tr4t|jtr4|j}n<t|trD|}n,d| d|jj d}t	|| j
| j | jS |j jt}|dkr| jS tdd |j jD s| jS |di d}|d	k	rt|j j| j
| j | jS )
z1Raise an error if from_attributes is not enabled.z
ctx.type: 
 (of type )Nc                 s  s   | ]}|j tkV  qd S rR   r]   r_   rL   rL   rM   rb      s     z+from_attributes_callback.<locals>.<genexpr>r   from_attributesT)r   rd   r<   itemr7   Zret_typer8   r[   r   error_unexpected_behaviorry   contextZdefault_return_typemetadatar   METADATA_KEYrf   rg   error_from_attributesname)rt   Zctx_typeZ
model_typedetailZpydantic_metadatar   rL   rL   rM   rp      s&    

rp   c                   @  s   e Zd ZdZddddddddddd	
d
dZdddddddddd	ddZd%dddddddZd&ddddddddZddddZe	dddd dddZ
ddd d!d"d#Zd$S )'PydanticModelFieldz5Based on mypy.plugins.dataclasses.DataclassAttribute.rH   z
str | Noner   bool | NoneintType | Noner(   
r   alias	is_frozenhas_dynamic_aliashas_defaultstrictlinecolumnr   r}   c                 C  s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S rR   r   )rY   r   r   r   r   r   r   r   r   r   r}   rL   rL   rM   rX      s    zPydanticModelField.__init__r0   r   )	current_infotypedmodel_strictforce_optional	use_aliasry   force_typevars_invariantis_root_model_rootrJ   c	                 C  sj   |  ||||}	| jdkr|n| j}
|s,|
r:| ||}n
ttj}t|	|d|rTtn|s^| jrbt	n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
   )rY   r   r   r   r   r   ry   r   r   r   r   r   rL   rL   rM   to_argument  s    
zPydanticModelField.to_argumentF)r   ry   r   rJ   c              
   C  s   |r&t | jtr&| j }t|_|| _| jdk	r| jjdk	rt	|j
jZ t|}t |tsbt|r|jD ]}t |trlt|_qlt| j| jjj|iW  5 Q R  S Q R X | jS )zABased on mypy.plugins.dataclasses.DataclassAttribute.expand_type.N)rd   r   r=   Zcopy_modifiedr   Zvariancer}   	self_typer4   strict_optional_setrQ   strict_optionalr@   r8   r~   argsr   id)rY   r   ry   r   Zmodified_typeZfilled_with_typevarsargrL   rL   rM   r   /  s    


(zPydanticModelField.expand_typer)   )r   ry   r   r   rJ   c                 C  s0   |r| j dk	r| j }n| j}t|| |||S )z<Based on mypy.plugins.dataclasses.DataclassAttribute.to_var.N)r   r   r)   r   )rY   r   ry   r   r   r   rL   rL   rM   r   M  s    zPydanticModelField.to_varr   r   c              
   C  s8   | j s
t| 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   r   	serializer   rL   rL   rM   r   \  s    
zPydanticModelField.serialize)r}   datary   rJ   c                 C  s,   |  }t|d|}| f ||d|S )ABased on mypy.plugins.dataclasses.DataclassAttribute.deserialize.r   )r   r}   )copyr1   pop)rw   r}   r   ry   typrL   rL   rM   deserializek  s    zPydanticModelField.deserializerO   )sub_typery   rJ   c              	   C  s:   | j dk	r6t|jj t| j || j| _ W 5 Q R X 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}   )rY   r   ry   rL   rL   rM   expand_typevar_from_subtyper  s    
z.PydanticModelField.expand_typevar_from_subtypeN)F)F)r   r   r   r   rX   r   r   r   r   classmethodr   r   rL   rL   rL   rM   r      s     # r   c                   @  s:   e Zd ZdZdd Zedd dddZd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 rR   r   )rY   r   rL   rL   rM   rX     s    zPydanticModelClassVar.__init__r   )r   rJ   c                 C  s   |  }| f |S )r   )r   )rw   r   rL   rL   rM   r     s    z!PydanticModelClassVar.deserializer   c                 C  s
   d| j iS )r   r   r   r   rL   rL   rM   r     s     zPydanticModelClassVar.serializeN)r   r   r   r   rX   r   r   r   rL   rL   rL   rM   r   {  s
   r   c                   @  s  e Zd ZU dZddddddhZded	< d
dddddddZddddZddddZddddZ	ddddddZ
dd d!d"d#Zd$d d%d&d'Zd(dd)d*d+d,d-Zd.d/d0d1d2d3d4Zd5ddddd6d7d8Zd5ddddd6d9d:Zd5dddd;d<d=ZdYd/d?dd@dAdBdCZed(dd!dDdEZed(dFd!dGdHZed(dId!dJdKZed(dd!dLdMZdZd5ddddddddNdO	dPdQZd5dddRdSdTZed5dddUdVdWZdXS )[rv   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   populate_by_namealias_generatorr   zset[str]tracked_config_fieldsr   zExpression | Statementr0   rS   rO   )rw   rx   ry   rT   rJ   c                 C  s   || _ || _|| _|| _d S rR   )_clsZ_reason_apirT   )rY   rw   rx   ry   rT   rL   rL   rM   rX     s    z!PydanticModelTransformer.__init__r   r   c                 C  s   | j j}tdd |jdd D }|  }| ||\}}|dksL|dkrPdS |D ]}|jdkrT dS qTtdd |jdd D }| |||| | |||| | j	|| j
|jdk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kV  qd S rR   )ROOT_MODEL_FULLNAMEr\   r_   rL   rL   rM   rb     s     z5PydanticModelTransformer.transform.<locals>.<genexpr>NFc                 s  s   | ]}|j tkV  qd S rR   )r\   BASESETTINGS_FULLNAMEr_   rL   rL   rM   rb     s     T)r   c                 S  s   i | ]}|j | qS rL   r   r   r`   fieldrL   rL   rM   r     s      z6PydanticModelTransformer.transform.<locals>.<dictcomp>c                 S  s   i | ]}|j | qS rL   r   )r`   Z	class_varrL   rL   rM   r     s      )fields
class_varsr   )r   r}   rf   rg   collect_configcollect_fields_and_class_varsr   add_initializeradd_model_construct_method
set_frozenr   r   adjust_decorator_signaturesget_values_dictr   r   )rY   r}   is_root_modelr   r   r   r   is_settingsrL   rL   rM   rz     s&    

z"PydanticModelTransformer.transformc                   s   | j jj D ]p}t|jtr|jjd  t trt j	t
r j	jtkr j	jtkrtt 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  s4   | ],\}} j | d ko*t|to*|jdkV  qdS )modeafterN)	arg_namesrd   r$   value)r`   ir   Z	first_decrL   rM   rb     s   zGPydanticModelTransformer.adjust_decorator_signatures.<locals>.<genexpr>TN)r   r}   namesvaluesrd   re   r   Zoriginal_decoratorsr   calleer   r\   DECORATOR_FULLNAMESMODEL_VALIDATOR_FULLNAMErf   	enumerater   funcis_class)rY   ri   rL   r   rM   r     s     


z4PydanticModelTransformer.adjust_decorator_signaturesModelConfigDatac              	   C  sL  | j }t }d}d}|j D ]&\}}| ||}|rd}|| qd}|jjD ]V}t|t	t
fshqRt|t	r"|jd }	t|	trR|	jdkrqRt|jtrt|jj|jjD ](\}
}|
dkrq|| j|
|dd qnBt|jtr|jjD ]*\}}t|ts
q|| |j| qnjt|t
r|jdkr<qR|jjD ]F}t|t	sXqD|jd }	t|	tsrqD|| |	j|j qD|r| jd|  qd}qR|s|r|r|jr|js| jjrt| j| |jjd	d D ]R}t|j krq| 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bodyrd   r   r   lvaluesr   r   rvaluer   zipr   r   r   r$   r   r   failhas_alias_generatorr   rT   r   error_required_dynamic_aliasesr}   rg   r   r   add_plugin_dependencyr3   r\   
setdefault)rY   rw   r   Zhas_config_kwargsZhas_config_from_namespacer   exprZconfig_datastmtlhsarg_namer   Zkey_exprZ
value_exprZsubstmtr}   r   rL   rL   rM   r     sz    

z'PydanticModelTransformer.collect_configzJtuple[list[PydanticModelField] | None, list[PydanticModelClassVar] | None])r   r   rJ   c                 C  s  | j }i }i }t|jjdd D ]}t|jkr2q"| jt|j	 |jt d 
 D ]d\}}t||| j}	|	|j| j |	||< |jj|}
|
rV|
jrVt|
jtsV| jd|
j qV|jt d 
 D ]\}}t|||< qq"t }t }| |jD ]}| |||}|dkr q |jd }t|ts:tt|tr~|rf|jdkrft| j| n||j |||j< n"t|tr ||j |||j< q t|  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}   rg   r   r   r   r  r3   r\   r   r   r   r   r   r   re   rd   r)   r  r   set%_get_assignment_statements_from_blockr   $collect_field_or_class_var_from_stmtr  r   r~   r    error_extra_fields_on_root_modeladdlistr   )rY   r   r   rw   Zfound_fieldsZfound_class_varsr}   r   r   r   sym_nodeZcurrent_field_namesZcurrent_class_vars_namesr
  Zmaybe_fieldr  rL   rL   rM   r   <  sH    


z6PydanticModelTransformer.collect_fields_and_class_varsr   zIterator[AssignmentStmt])r
  rJ   c                 c  sJ   |j D ]}|js| |E d H  q|jd k	rF|jjsF| |jE d H  d S rR   )r   Zis_unreachabler  Z	else_body)rY   r
  r   rL   rL   rM   ,_get_assignment_statements_from_if_statement  s
    
zEPydanticModelTransformer._get_assignment_statements_from_if_statementr   )blockrJ   c                 c  s<   |j D ]0}t|tr|V  qt|tr| |E d H  qd S rR   )r   rd   r   r   r  )rY   r  r
  rL   rL   rM   r    s
    


z>PydanticModelTransformer._get_assignment_statements_from_blockr   z dict[str, PydanticModelClassVar]z1PydanticModelField | PydanticModelClassVar | None)r
  r   r   rJ   c                 C  sD  | j }|jd }t|tr0t|jr0|jdkr4dS |jst|jt	rxt|jj
t	rxt|jj
j
trx|jj
j
jtkrxdS |j|krdS t| j| dS |jd }t|tsdS t|jr|jdkrdS |jj|j}|dkrdS |j}t|trdS t|tr| jd| dS t|ts&dS |jr8t|jS t|j}t|trj|jjdkrj| jd| | |}	| |}
|jdkr|jr|jr| jj |jdd}|r||_n| jd	| t!t"j#|_| $|\}}|r|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   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  rd   r   rC   Zis_valid_field_namer   Z
new_syntaxr  r   r   r\   r   error_untyped_fieldsr   r}   r   r   re   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   rT   r   r  is_field_frozen_infer_dataclass_attr_init_typer   r   r   )rY   r
  r   r   rw   r  ri   re   Z	node_typer   r   r   r   r   r   Z	init_typerL   rL   rM   r    s    
 
	








z=PydanticModelTransformer.collect_field_or_class_var_from_stmtr%   rH   r   r   )ri   r   r   rJ   c           	      C  s   |j }|jr|S t|j }t|ts(|S |j d}|rt|jtr|j d}|sXt	|j rttt
|j |j |}n
ttjS t|tr|jtttgkrt|jd |S | jd|j j d| n| jd|j j d| |S )zvInfer __init__ argument type for an attribute.

        In particular, possibly use the signature of __set__.
        __set__rG   z(Unsupported signature for "__set__" in ""zUnsupported "__set__" in ")r   Zimplicitr?   rd   r8   r   re   r   Zget_containing_type_infor~   r5   r6   r;   Zunannotatedr7   	arg_kindsr   r	   	arg_typesr   r  r   )	rY   ri   r   r   defaulttsetterZ
super_infoZsetter_typerL   rL   rM   r    s.    


z8PydanticModelTransformer._infer_dataclass_attr_init_typezlist[PydanticModelField])r   r   r   r   rJ   c              
   C  s  d| j jjkr"| j jjd js"dS | jj}t|j}|jdk	}t|j	oL|j }| j
|||||||dd}	|r@| jtj}
t|
tstd|
jkr@|
jd j}t|tst|dk	r@|jdk	r@|j}t|tstt|jD ]X\}}|dks|ds|dsq| j|j| }t||}|	t||dt q| ||spt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.
        rX   NT)r   r   requires_dynamic_aliasesr   r   r   r   ___kwargs)r   return_type)%r   r}   r   plugin_generatedrT   r   r   r   r   r  get_field_argumentsr   rc   r   re   rd   r(   r~   r   r   r7   r   r   
startswithZ	anal_typer"  r)   appendr   r   should_init_forbid_extrar6   r;   r   r   
add_methodr9   )rY   r   r   r   r   r   r   r   r&  r   Zbase_settings_nodeZbase_settings_init_nodeZ	func_typeZarg_idxr  Zanalyzed_variable_typer   varrL   rL   rM   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 5 Q R X | ||std}	|t|	ttjdt |r||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   r&  r   r   r   r)  Zmodel_construct)r   r*  is_classmethod)r   
named_typeBUILTINS_NAMEr>   r9   r   r)   r   r4   r   rQ   r   r,  r   r   r/  r.  r6   r;   r   r   r0  r   r@   r}   )
rY   r   r   r   r   Zset_strZoptional_set_strZfields_set_argumentr   r1  rL   rL   rM   r   d  s2    $	
z3PydanticModelTransformer.add_model_construct_method)r   ry   r   rJ   c           
   	   C  s   | j j}|D ]}|j|j}|dk	r|j}t|trD|p>|j|_	qt|t
rb| jjsb| j  qzt|}W n tk
r   t|}Y nX 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   re   rd   r)   r   Zis_propertyr!   r   Zfinal_iterationZdeferrH   	TypeErrorreprr[   r   r   r\   	_fullnamer%   r   )
rY   r   ry   r   r}   r   r  r1  Zvar_strr   rL   rL   rM   r     s(    
z#PydanticModelTransformer.set_frozenFr   ModelConfigData | None)r   r   r   rJ   c                 C  s   || j krdS |dkrbt|tr,|jdk}n,t|trB|jdk}n|sTt|| j| dS t|dS |dkrd}t|t	r|j
dkrd}t|d	S t|t	r|j
d
krtf ||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.Falser<  )r   rd   r$   r   r   r   error_invalid_config_valuer   r   r   r\   )rY   r   r   r   r:  r  rL   rL   rM   r     s(    


	

z*PydanticModelTransformer.get_config_updatec                 C  s   | j }t|trdS t|trt|jtr|jjtkrt|j	|j
D ]H\}}|dks\|dkrj|jtk	  S |dkrDt|to|jdk   S qDdS t|t S )zUReturns a boolean indicating whether the field defined in `stmt` is a required field.FNr#  default_factoryr;  )r  rd   r&   r   r   r"   r\   FIELD_FULLNAMEr  r   r   r[   r   r   r
  r	  r   r   rL   rL   rM   r    s    
"z(PydanticModelTransformer.get_has_defaultr   c                 C  s|   | j }t|trxt|jtrx|jjtkrxt|j|j	D ]@\}}|dkrHq6t|t
rr|jdkrb dS |jdkrr dS  dS dS )zEReturns a the `strict` value of a field if defined, otherwise `None`.r   r<  Tr=  FN)r  rd   r   r   r"   r\   r@  r  r   r   r   rA  rL   rL   rM   r    s    "


z#PydanticModelTransformer.get_strictztuple[str | None, bool]c                 C  s   | j }t|trdS t|tr6t|jtr6|jjtks:dS t|j	D ]:\}}|dkrVqD|j
| }t|trx|jdf  S  dS qDd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)NT)r  rd   r&   r   r   r"   r\   r@  r   r   r   r$   r   r
  r	  r   r  r   rL   rL   rM   r    s$    




z'PydanticModelTransformer.get_alias_infoc                 C  s|   | j }t|trdS t|tr6t|jtr6|jjtks:dS t|j	D ]2\}}|dkrD|j
| }t|top|jdk  S qDd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  rd   r&   r   r   r"   r\   r@  r   r   r   r   rB  rL   rL   rM   r    s    



z(PydanticModelTransformer.is_field_frozenlist[Argument])	r   r   r   r   r&  r   r   r   rJ   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 | ]8}r|j s|jp"j o6|jd kdqS )r  )r   r   r   r   ry   r   r   )r   r   r   r   r   	r   r}   r   r   r   r&  rY   r   r   rL   rM   
<listcomp>9  s    z@PydanticModelTransformer.get_field_arguments.<locals>.<listcomp>)r   r}   )
rY   r   r   r   r   r&  r   r   r   	argumentsrL   rD  rM   r,  )  s
    z,PydanticModelTransformer.get_field_arguments)r   r   rJ   c                 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).
        FT)r   is_dynamic_alias_presentr   r  r:  rT   r   )rY   r   r   rL   rL   rM   r/  I  s    z1PydanticModelTransformer.should_init_forbid_extra)r   r  rJ   c                 C  s8   | D ]}|j r dS q|r4| D ]}|jdk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   rL   rL   rM   rG  V  s    
z1PydanticModelTransformer.is_dynamic_alias_presentN)F)F)r   r   r   r   r   r   rX   rz   r   r   r   r  r  r  r  r   r   r   r   staticmethodr  r  r  r  r,  r/  rG  rL   rL   rL   rM   rv     sF   
	$LD &/(#!   rv   c                   @  sZ   e Zd ZdZddddddddddZddd	d
ZdddddZddddddZdS )r   z(Pydantic mypy plugin model config class.Nr   r:  r   r   r   r  r   c                 C  s(   || _ || _|| _|| _|| _|| _d S rR   rI  )rY   r:  r   r   r   r  r   rL   rL   rM   rX   h  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 k	r||qS rR   rL   )r`   kvrL   rL   rM   r   }  s       z3ModelConfigData.get_values_dict.<locals>.<dictcomp>)__dict__r   r   rL   rL   rM   r   x  s    zModelConfigData.get_values_dictr9  rO   )r   rJ   c                 C  s2   |dkrdS |   D ]\}}t| || qdS )z$Update Pydantic model config values.N)r   r   r   )rY   r   rJ  rK  rL   rL   rM   r     s    zModelConfigData.updaterH   r   )r   r   rJ   c                 C  s   t | |dkrt| || dS )zFSet default value for Pydantic model config if config value is `None`.N)r   r   )rY   r   r   rL   rL   rM   r    s    zModelConfigData.setdefault)NNNNNN)r   r   r   r   rX   r   r   r  rL   rL   rL   rM   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 subclassr+   r   rO   )
model_namery   r   rJ   c                 C  s   |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)rM  ry   r   rL   rL   rM   r     s    r   r0   )r   ry   r   rJ   c                 C  s   |j d|  d|td dS )z0Emits an error when the config value is invalid.zInvalid value for "Config.r   rN  N)r  ERROR_CONFIG)r   ry   r   rL   rL   rM   r>    s    r>  )ry   r   rJ   c                 C  s   | 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 disallowedrN  N)r  ERROR_ALIASry   r   rL   rL   rM   r    s    r  z8CheckerPluginInterface | SemanticAnalyzerPluginInterface)r   ry   r   rJ   c                 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!rN  N)r  ERROR_UNEXPECTED)r   ry   r   linkZfull_messagerL   rL   rM   r     s    r   c                 C  s   | j d|td dS )z;Emits an error when there is an untyped field in the model.zUntyped fields disallowedrN  N)r  ERROR_UNTYPEDrS  rL   rL   rM   r    s    r  c                 C  s   | j d|td dS )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`rN  N)r  ERROR_EXTRA_FIELD_ROOT_MODELrS  rL   rL   rM   r    s    r  Fz8SemanticAnalyzerPluginInterface | CheckerPluginInterfacer   rC  r   zTypeVarType | Noner   )	ry   rw   r   r   r*  r   tvar_defr2  rJ   c                 C  s
  |j }||jkr<|j| }	|	jr<t|	jtr<|jj|	j t| t	rR| 
d}
n| dg }
|r|pptt|}ttd|dtdg}n |pt|}ttd|dtg}|| }g g g   }}}|D ]8}|jstd||j ||jj ||j qt|||||
}|r|g|_t||tt g}||_ t|||_||_|jd | |_|j |_ ||jk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.r5  r   ))r}   r   r+  rd   re   r   r   r   remover0   r3  Znamed_generic_typer<   r@   r   r)   r   r   r~   r.  r   r   r   r7   	variablesr   r    r2   r   r   r\   r8  r   rA   Zis_decoratedr2  r   r   r%   r   Zdefn)ry   rw   r   r   r*  r   rY  r2  r}   ri   Zfunction_typefirstr"  r   r!  r   	signaturer   Zr_namerK  decrL   rL   rM   r0    sZ    




r0  zdict[str, Any] | None)r   rJ   c              
   C  s   |  dsdS tjdkr"ddl}n6zddl}W n( tk
rV   ddl}|d Y dS X t| d}|	|W  5 Q R  S Q R X 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)
ro   sysversion_infotomllibtomliImportErrorwarningswarnopenload)r   Ztoml_rg  rfrL   rL   rM   r     s    



r   )NNF)|r   
__future__r   rb  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   r^   r   r   rk   r@  ZDATACLASS_FULLNAMEr   r   ZMYPY_VERSION_TUPLEr4  rN   rK   rS   rp   r   r   rv   r   rP  rQ  rR  rU  rW  ZERROR_FIELD_DEFAULTSrX  r   r>  r  r   r  r  r0  r   rL   rL   rL   rM   <module>   s   " 0
6.      V'    X