U
    nËj%˜  ã                   @   sÞ  d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZmZmZmZ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l.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9 d d	l:m;Z; d d
l<m=Z= d dl>m?Z?m@Z@mAZAmBZBmCZCmDZDmZmEZEmFZFmGZGmHZHmIZImJZJ d dlKmLZL d dlMmNZN d dlOmPZQ d dlRmSZS zd dl>mTZT W n" eUk
�rº   d dl>mHZT Y nX dZVdZWeXdd… ZYeY› d�ZZeY› d�Z[eY› d�Z\eY› d�Z]eY› d�Z^e_e
e`df dœdd„ZaeaeQƒZbebdk�r0dnd Zcd!ZPe_d"dœd#d$„ZdG d%d&„ d&e5ƒZeG d'd(„ d(ƒZfe4ed)œd*d+„ZgG d,d-„ d-ƒZhG d.d/„ d/ƒZiG d0d1„ d1ƒZjed2d3d4ƒZked5d6d4ƒZled7d8d4ƒZmed9d:d4ƒZned;d<d4ƒZoed;d=d4ƒZpe_e1edd>œd?d@„Zqe_e7eddAœdBdC„Zre7eddDœdEdF„Zse_ee1e7f eddGœdHdI„Zte7eddDœdJdK„Zue1eddDœdLdM„ZvdZe2e_ee eee eeT ewewddOœ	dPdQ„Zxeee(f e_dRœdSdT„Zyeee(f e_dRœdUdV„Zze_eee_ef  dWœdXdY„Z{dS )[é    N)ÚConfigParser)	ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTupleÚTypeÚUnion)Ú	ErrorCode)Ú	ARG_NAMEDÚARG_NAMED_OPTÚARG_OPTÚARG_POSÚ	ARG_STAR2ÚMDEFÚArgumentÚAssignmentStmtÚBlockÚCallExprÚClassDefÚContextÚ	DecoratorÚEllipsisExprÚFuncBaseÚFuncDefÚJsonDictÚ
MemberExprÚNameExprÚPassStmtÚPlaceholderNodeÚRefExprÚStrExprÚ
SymbolNodeÚSymbolTableNodeÚTempNodeÚTypeInfoÚTypeVarExprÚVar)ÚOptions)ÚCheckerPluginInterfaceÚClassDefContextÚFunctionContextÚMethodContextÚPluginÚReportConfigContextÚSemanticAnalyzerPluginInterface)Údataclasses)Úset_callable_name)Úmake_wildcard_trigger)ÚAnyTypeÚCallableTypeÚInstanceÚNoneTypeÚ
OverloadedÚ
ProperTyper
   Ú	TypeOfAnyÚTypeTypeÚ	TypeVarIdÚTypeVarTypeÚ	UnionTypeÚget_proper_type)Úfill_typevars)Úget_unique_redefinition_name)Ú__version__)Úis_valid_field)Ú
TypeVarDef)r>   úpydantic-mypyzpydantic-mypy-metadataéûÿÿÿz.main.BaseModelz.env_settings.BaseSettingsz.main.ModelMetaclassz.fields.Fieldz.dataclasses.dataclass.)ÚversionÚreturnc                 C   s   t tt|  d¡d  d¡ƒƒS )Nú+r   Ú.)ÚtupleÚmapÚintÚ	partitionÚsplit©rH   © rR   ú4/tmp/pip-unpacked-wheel-zvl9l234/pydantic/v1/mypy.pyÚparse_mypy_versionW   s    rT   )r   i¢  ÚbuiltinsÚ__builtins__é   zTypingType[Plugin]c                 C   s   t S )z¼
    `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).
    )ÚPydanticPluginrQ   rR   rR   rS   Úpluginb   s    rY   c                       sæ   e Zd Zeddœ‡ fdd„Zeddœdd„Zeeee	gdf  dœd	d
„Z
eddœdd„Zeeeegef  dœdd„Zeeee	gdf  dœdd„Zeeeef dœdd„Ze	ddœdd„Ze	ddœdd„Zeddœdd„Z‡  ZS )rX   N©ÚoptionsrI   c                    s&   t |ƒ| _| j ¡ | _tƒ  |¡ d S ©N)ÚPydanticPluginConfigÚplugin_configÚto_dataÚ_plugin_dataÚsuperÚ__init__)Úselfr[   ©Ú	__class__rR   rS   rb   m   s    
zPydanticPlugin.__init__z+Optional[Callable[[ClassDefContext], None]])ÚfullnamerI   c                 C   s:   |   |¡}|r6t|jtƒr6tdd„ |jjD ƒƒr6| jS d S )Nc                 s   s   | ]}t |ƒtkV  qd S r\   )Úget_fullnameÚBASEMODEL_FULLNAME©Ú.0ÚbaserR   rR   rS   Ú	<genexpr>v   s     z5PydanticPlugin.get_base_class_hook.<locals>.<genexpr>)Úlookup_fully_qualifiedÚ
isinstanceÚnoder'   ÚanyÚmroÚ$_pydantic_model_class_maker_callback©rc   rf   ÚsymrR   rR   rS   Úget_base_class_hookr   s
    
z"PydanticPlugin.get_base_class_hookc                 C   s   |t kr| jS d S r\   )ÚMODEL_METACLASS_FULLNAMEÚ)_pydantic_model_metaclass_marker_callback©rc   rf   rR   rR   rS   Úget_metaclass_hookz   s    z!PydanticPlugin.get_metaclass_hookz+Optional[Callable[[FunctionContext], Type]]c                 C   s"   |   |¡}|r|jtkr| jS d S r\   )rm   rf   ÚFIELD_FULLNAMEÚ_pydantic_field_callbackrs   rR   rR   rS   Úget_function_hook   s    
z PydanticPlugin.get_function_hookc                 C   s   |  d¡rtS d S )Nz	.from_orm)ÚendswithÚfrom_orm_callbackrx   rR   rR   rS   Úget_method_hook…   s    
zPydanticPlugin.get_method_hookc                 C   s   |t krtdk rtjS dS )z€Mark pydantic.dataclasses as dataclass.

        Mypy version 1.1.1 added support for `@dataclass_transform` decorator.
        )é   r€   N)ÚDATACLASS_FULLNAMEÚMYPY_VERSION_TUPLEr2   Zdataclass_class_maker_callbackrx   rR   rR   rS   Úget_class_decorator_hookŠ   s    z'PydanticPlugin.get_class_decorator_hook©ÚctxrI   c                 C   s   | j S )zjReturn all plugin config data.

        Used by mypy to determine if cache needs to be discarded.
        )r`   )rc   r…   rR   rR   rS   Úreport_config_data“   s    z!PydanticPlugin.report_config_datac                 C   s   t || jƒ}| ¡  d S r\   )ÚPydanticModelTransformerr^   Ú	transform)rc   r…   ZtransformerrR   rR   rS   rr   š   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 )zÓReset 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_transformÚclsÚinfoZdeclared_metaclassÚAssertionErrorÚgetattrÚtyper‰   )rc   r…   Zinfo_metaclassrR   rR   rS   rw   ž   s    
z8PydanticPlugin._pydantic_model_metaclass_marker_callbackr
   c           	         s   |j ‰ |jd dkstdƒ‚|jd dks2tdƒ‚|jd }|jd }|r`|r`t|j|jƒ ˆ S |rŠ|jd d }|d }t|t	ƒsˆ|S n’|�r|jd d }t|t
ƒrÈtdkr¼|jd }n| ¡ d }t|tƒ�r|j}t|dd	ƒ}|�rtd
d„ |D ƒƒ�rt‡ fdd„|D ƒƒ|_|S ˆ S )ax  
        Extract the type of the `default` argument from the Field function, and use it as the return type.

        In particular:
        * Check whether the default and default_factory argument is specified.
        * Output an error if both are specified.
        * Retrieve the type of the argument which is specified, and use it as return type for the function.
        r   Údefaultz0"default" is no longer first argument in Field()r€   Údefault_factoryz9"default_factory" is no longer second argument in Field())r   iŽ  ÚargsNc                 s   s   | ]}t |tƒV  qd S r\   )rn   r>   )rj   ÚargrR   rR   rS   rl   Ù   s     z:PydanticPlugin._pydantic_field_callback.<locals>.<genexpr>c                 3   s   | ]
}ˆ V  qd S r\   rR   )rj   Ú_©Zdefault_any_typerR   rS   rl   Û   s     )Údefault_return_typeZcallee_arg_namesr�   r’   Ú+error_default_and_default_factory_specifiedÚapiÚcontextÚ	arg_typesrn   r   r9   r‚   Úitemsr6   Úret_typerŽ   ÚallrL   )	rc   r…   Zdefault_argsZdefault_factory_argsZdefault_typeZdefault_argZdefault_factory_typerœ   r’   rR   r•   rS   r{   «   s6    	



z'PydanticPlugin._pydantic_field_callback)Ú__name__Ú
__module__Ú__qualname__r*   rb   Ústrru   r   r   r,   ry   r|   r.   r
   r   rƒ   r0   r   r   r†   rr   rw   r-   r{   Ú__classcell__rR   rR   rd   rS   rX   l   s   	rX   c                   @   s`   e Zd ZU dZeed< eed< eed< eed< eed< eddœd	d
„Zee	e
f dœdd„ZdS )r]   )Úinit_forbid_extraÚ
init_typedÚwarn_required_dynamic_aliasesÚwarn_untyped_fieldsrŠ   r£   r¤   r¥   r¦   rŠ   NrZ   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| ||ƒ qŠd S )NZtoolrF   Fz/Configuration value must be a boolean for key: )Úfallback)Úconfig_fileÚ
parse_tomlÚgetÚ	__slots__rn   ÚboolÚ
ValueErrorÚsetattrr   ÚreadÚ
getbooleanÚCONFIGFILE_KEY)rc   r[   Ztoml_configÚconfigÚkeyZsettingr^   rR   rR   rS   rb   ï   s    




zPydanticPluginConfig.__init__©rI   c                    s   ‡ fdd„ˆ j D ƒS )Nc                    s   i | ]}|t ˆ |ƒ“qS rR   )rŽ   )rj   r³   ©rc   rR   rS   Ú
<dictcomp>  s      z0PydanticPluginConfig.to_data.<locals>.<dictcomp>)r«   rµ   rR   rµ   rS   r_     s    zPydanticPluginConfig.to_data)rž   rŸ   r    r«   r¬   Ú__annotations__r*   rb   r   r¡   r   r_   rR   rR   rR   rS   r]   á   s   
r]   r„   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 | di ¡ d¡}|dk	r¼tt|j ƒ| j
| jƒ | jS )z3
    Raise an error if orm_mode is not enabled
    z
ctx.type: ú
 (of type ú)Nr²   Úorm_modeT)r�   rn   r<   Úitemr6   rœ   r7   re   rž   Úerror_unexpected_behaviorr˜   r™   r–   Úmetadatarª   ÚMETADATA_KEYÚerror_from_ormÚget_name)r…   Zctx_typeZ
model_typeÚdetailZpydantic_metadatarº   rR   rR   rS   r~     s"    

r~   c                   @   sn  e Zd ZU ddddddhZee ed< eedd	œd
d„Z	ddœdd„Z
ddœdd„Zddœdd„Zded dœdd„Zed deddœdd„Zed ddœdd„Zed eddœdd „Zeed d!œd"d#„Zeeeeed$œd%d&„ƒZeee ed'œd(d)„ƒZeeeee ef d*œd+d,„ƒZed eeeee d-œd.d/„Zed ded0œd1d2„Z eed eed3œd4d5„ƒZ!dS )6r‡   ÚextraÚallow_mutationÚfrozenrº   Úallow_population_by_field_nameÚalias_generatorÚtracked_config_fieldsN)r…   r^   rI   c                 C   s   || _ || _d S r\   )Ú_ctxr^   )rc   r…   r^   rR   rR   rS   rb   )  s    z!PydanticModelTransformer.__init__r´   c                 C   sœ   | j }|jj}|  ¡  |  ¡ }|  |¡}tdd„ |jdd… D ƒƒ}|  |||¡ |  	|¡ | j
||jdkpt|jdk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 allow_mutation = False or frozen = True
        * stores the fields, config, and if the class is settings in the mypy metadata for access by subclasses
        c                 s   s   | ]}t |ƒtkV  qd S r\   )rg   ÚBASESETTINGS_FULLNAMEri   rR   rR   rS   rl   =  s     z5PydanticModelTransformer.transform.<locals>.<genexpr>NéÿÿÿÿFT)rÄ   c                 S   s   i | ]}|j | ¡ “qS rR   )ÚnameÚ	serialize©rj   ÚfieldrR   rR   rS   r¶   B  s      z6PydanticModelTransformer.transform.<locals>.<dictcomp>)Úfieldsr²   )rÈ   r‹   rŒ   Úadjust_validator_signaturesÚcollect_configÚcollect_fieldsrp   rq   Úadd_initializerÚadd_construct_methodÚ
set_frozenrÃ   rÄ   Úset_values_dictr½   r¾   )rc   r…   rŒ   r²   rÏ   Úis_settingsrR   rR   rS   rˆ   -  s    


þz"PydanticModelTransformer.transformc                 C   sh   | j jjj ¡ D ]R\}}t|jtƒr|jjd }t|t	ƒrt|j
tƒr|j
jt› d�krd|jj_qdS )a[  When we decorate a function `f` with `pydantic.validator(...), 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()` call as a classmethod.
        r   z.class_validators.validatorTN)rÈ   r‹   rŒ   Únamesr›   rn   ro   r   Zoriginal_decoratorsr   Úcalleer   rf   Ú
_NAMESPACEÚfuncÚis_class)rc   rË   rt   Z	first_decrR   rR   rS   rÐ   F  s    ÿ
þýz4PydanticModelTransformer.adjust_validator_signaturesÚModelConfigDatac           	      C   sâ   | j }|j}tƒ }|jjD ]d}t|tƒs*q|jdkr|jjD ] }t|tƒsLq<| 	|  
|¡¡ q<|jr|js| jjrt|j|ƒ q|jjdd… D ]L}t|jkr q�|j tt|ƒƒ¡ |jt d  ¡ D ]\}}| ||¡ qÆq�|S )zz
        Collects the values of the config attributes that are used by the plugin, accounting for parent classes.
        ZConfigr€   Nr²   )rÈ   r‹   rÝ   ÚdefsÚbodyrn   r   rË   r   ÚupdateÚget_config_updateÚhas_alias_generatorrÅ   r^   r¥   Úerror_required_dynamic_aliasesr˜   rŒ   rq   r¾   r½   Úadd_plugin_dependencyr4   rg   r›   Ú
setdefault)	rc   r…   r‹   r²   ÚstmtÚsubstmtrŒ   rË   ÚvaluerR   rR   rS   rÑ   X  s2    


ÿþý
z'PydanticModelTransformer.collect_configÚPydanticModelField)Úmodel_configrI   c                    sØ  | j }| j j}g }tƒ }|jjD ]ð}t|tƒs0q |jd }t|tƒr t	|j
ƒsPq |jsj| jjrjt|j|ƒ |jj |j
¡}|dkr„q |j}	t|	tƒr–q t|	tƒs¢q |	jrªq |  |||¡}
|  |¡\}}|rä|jsä| jjrät|j|ƒ | t|j
|
|||j|jd�¡ |  |j
¡ q | !¡ }|jj"dd… D ]¨}t#|j$k�r>�q*g }|j %t&t'|ƒƒ¡ |j$t# d  (¡ D ]^\‰ }ˆ |k�rœt )||¡}|  ˆ ¡ | |¡ n(‡ fdd„|D ƒ\}| *|¡ | |¡ �qh|| }�q*|S )zR
        Collects the fields for the model, accounting for parent classes
        r   N©rË   Úis_requiredÚaliasÚhas_dynamic_aliasÚlineÚcolumnr€   rÏ   c                 3   s   | ]}|j ˆ kr|V  qd S r\   ©rË   )rj   Úarñ   rR   rS   rl   Å  s     
 z:PydanticModelTransformer.collect_fields.<locals>.<genexpr>)+rÈ   r‹   ÚsetrÞ   rß   rn   r   Úlvaluesr   rD   rË   Z
new_syntaxr^   r¦   Úerror_untyped_fieldsr˜   rŒ   rØ   rª   ro   r!   r)   Zis_classvarÚget_is_requiredÚget_alias_inforÅ   r¥   rã   Úappendré   rï   rð   ÚaddÚcopyrq   r¾   r½   rä   r4   rg   r›   ÚdeserializeÚremove)rc   rê   r…   r‹   rÏ   Zknown_fieldsræ   Úlhsrt   ro   rì   rí   rî   Z
all_fieldsrŒ   Zsuperclass_fieldsÚdatarÎ   rR   rñ   rS   rÒ   w  st    



ÿþýúÿ



z'PydanticModelTransformer.collect_fields)rÏ   r²   r×   rI   c           
      C   s�   | j }| jj}|jdk	}|p,t|jo*|j ƒ}| j||||d�}|  ||¡sntdƒ}	| 	t
|	ttjƒdtƒ¡ d|jjjkrŒt|d|tƒ ƒ dS )z°
        Adds a fields-aware `__init__` method to the class.

        The added `__init__` will be annotated with types vs. all `Any` depending on the plugin settings.
        T©ÚtypedÚforce_all_optionalÚ	use_aliasÚkwargsNrb   )rÈ   r^   r¤   rÅ   r¬   râ   Úget_field_argumentsÚshould_init_forbid_extrar)   rø   r   r5   r;   Úexplicitr   r‹   rŒ   rØ   Ú
add_methodr8   )
rc   rÏ   r²   r×   r…   r   r  r  Zinit_argumentsÚvarrR   rR   rS   rÓ   Ë  s"    
ÿ   ÿz(PydanticModelTransformer.add_initializer)rÏ   rI   c              	   C   sL  | j }|j t› d�|j t› d�¡g¡}t|tƒ gƒ}ttd|ƒ|dtƒ}| j	|dddd�}|g| }|j t› d�¡}d	}|j
jd
 | }	tdkræt||	tdkr¸td|j
jd d�ntdƒg |ttjƒƒ}
t||	g |ttjƒƒ}nt||	dg |ƒ}
t||	g |ƒ}tt|ƒ|j
jj|< t|
tƒ�r*|
}nt|
ƒ}t|d||||
dd� dS )zç
        Adds a fully typed `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_setNTFrÿ   z.objectZ_PydanticBaseModelrK   )r€   é   )r€   é   rÊ   z
.construct)Ú	namespaceZ	construct)Úreturn_typeÚ	self_typeÚtvar_defÚis_classmethod)rÈ   r˜   Ú
named_typeÚBUILTINS_NAMEr?   r8   r   r)   r   r  r‹   rf   r‚   r>   r=   r5   r;   Zfrom_omitted_genericsr(   rE   r%   r   rŒ   rØ   rn   r  )rc   rÏ   r…   Zset_strZoptional_set_strZfields_set_argumentZconstruct_argumentsZobj_typeZself_tvar_nameZtvar_fullnameZtvdZself_tvar_exprr  rR   rR   rS   rÔ   á  sT    $
ÿöûùz-PydanticModelTransformer.add_construct_method)rÏ   rÄ   rI   c           
   	   C   sü   | j }|jj}|D ]ä}|j |j¡}|dk	r²|j}t|tƒrD||_	qöt|t
ƒrb|jjsb|j ¡  qözt|ƒ}W n tk
rŠ   t|ƒ}Y nX d|› d|j› d�}	t|	|j|jƒ q|j|dd�}||_||_	t|ƒd t|ƒ |_tt|ƒ|jt|ƒ< qdS )z°
        Marks 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  rK   )rÈ   r‹   rŒ   rØ   rª   rË   ro   rn   r)   Zis_propertyr!   r˜   Zfinal_iterationÚdeferr¡   Ú	TypeErrorÚreprre   r¼   Úto_varrg   rÀ   Ú	_fullnamer%   r   )
rc   rÏ   rÄ   r…   rŒ   rÎ   Zsym_noder  Zvar_strrÁ   rR   rR   rS   rÕ     s*    
z#PydanticModelTransformer.set_frozen)rç   rI   c                 C   sü   |j d }t|tƒr |j| jks$dS |jdkr‚t|jtƒrH|jjdk}n0t|jtƒrb|jjdk}nt	|j| j
j|ƒ dS t|d�S |jdkr¶d}t|jtƒr¬|jjdkr¬d	}t|d
�S t|jtƒræ|jjdkrætf |j|jjdkiŽS t	|j| j
j|ƒ dS )zß
        Determines the config update due to a single statement in the Config class definition.

        Warns if a tracked config attribute is set to a value the plugin doesn't know how to interpret (e.g., an int)
        r   NrÂ   Zforbid)Úforbid_extrarÆ   Tzbuiltins.NoneF)râ   )úbuiltins.Truezbuiltins.Falser  )rô   rn   r   rË   rÇ   Úrvaluer#   rè   r   Úerror_invalid_config_valuerÈ   r˜   rÝ   rf   )rc   rç   rý   r  râ   rR   rR   rS   rá   <  s(    




z*PydanticModelTransformer.get_config_update)r‹   ræ   rý   rI   c                 C   s¼   |j }t|tƒr.t| j|j jƒ}t |¡ S t|t	ƒr²t|j
tƒr²|j
jtkr²t|j|jƒD ]4\}}|dksv|dkr„|jtk  S |dkr^ dS q^t| j|j jƒ}t |¡ S t|tƒS )zg
        Returns a boolean indicating whether the field defined in `stmt` is a required field.
        Nr�   r‘   F)r  rn   r&   r@   rŒ   rË   r�   r‡   Útype_has_implicit_defaultr   rÙ   r"   rf   rz   Úzipr’   Ú	arg_namesre   r   )r‹   ræ   rý   ÚexprZ
value_typer“   rË   rR   rR   rS   rö   X  s    
"z(PydanticModelTransformer.get_is_required)Útype_rI   c                 C   s4   t | tƒrdS t | tƒr0tdd„ | jD ƒƒr0dS dS )zº
        Returns True if the passed type will be given an implicit default value.

        In pydantic v1, this is the case for Optional types and Any (with default value None).
        Tc                 s   s"   | ]}t |tƒpt |tƒV  qd S r\   )rn   r8   r5   )rj   r»   rR   rR   rS   rl   |  s    zEPydanticModelTransformer.type_has_implicit_default.<locals>.<genexpr>F)rn   r5   r?   rp   r›   )r  rR   rR   rS   r  r  s    
ÿz2PydanticModelTransformer.type_has_implicit_default)ræ   rI   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  rn   r&   r   rÙ   r"   rf   rz   Ú	enumerater  r’   r#   rè   )ræ   r  ÚiZarg_namer“   rR   rR   rS   r÷   ƒ  s$    
ÿ
ÿ
ÿ

z'PydanticModelTransformer.get_alias_info)rÏ   r   r  r  rI   c                    s&   | j jj‰‡ ‡‡‡fdd„|D ƒ}|S )zË
        Helper function used during the construction of the `__init__` and `construct` method signatures.

        Returns a list of mypy Argument instances for use in the generated signatures.
        c                    s(   g | ] }ˆr|j s|jˆˆˆ ˆd �‘qS ))r   Úforce_optionalr  )rî   Úto_argumentrÍ   ©r  rŒ   r   r  rR   rS   Ú
<listcomp>©  s    þz@PydanticModelTransformer.get_field_arguments.<locals>.<listcomp>)rÈ   r‹   rŒ   )rc   rÏ   r   r  r  Ú	argumentsrR   r$  rS   r     s
    
þz,PydanticModelTransformer.get_field_arguments)rÏ   r²   rI   c                 C   s.   |j s|  |t|jƒ¡rdS |jr&dS | jjS )aH  
        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  r^   r£   )rc   rÏ   r²   rR   rR   rS   r  °  s    z1PydanticModelTransformer.should_init_forbid_extra)rÏ   râ   rI   c                 C   s8   | D ]}|j r dS q|r4| D ]}|jdkr dS qdS )zš
        Returns 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Î   rR   rR   rS   r'  ¾  s    
z1PydanticModelTransformer.is_dynamic_alias_present)"rž   rŸ   r    rÇ   r   r¡   r·   r,   r]   rb   rˆ   rÐ   rÑ   r   rÒ   r¬   rÓ   rÔ   rÕ   r   r   rá   Ústaticmethodr   r   rö   r:   r  r	   r÷   r   r  r  r'  rR   rR   rR   rS   r‡     s>   
ú	T:!   þr‡   c                   @   st   e Zd Zeeee eeedœdd„Zeee	dœdd„Z
eeeeedœdd	„Zed
œdd„Zeeed dœdd„ƒZdS )ré   rë   c                 C   s(   || _ || _|| _|| _|| _|| _d S r\   rë   )rc   rË   rì   rí   rî   rï   rð   rR   rR   rS   rb   Ï  s    zPydanticModelField.__init__)rŒ   r  rI   c                 C   s,   | j }|r| jd k	r| j}t||| j  jƒS r\   )rË   rí   r)   r�   )rc   rŒ   r  rË   rR   rR   rS   r  Ù  s    zPydanticModelField.to_var)rŒ   r   r"  r  rI   c                 C   sR   |r"|| j  jd k	r"|| j  j}n
ttjƒ}t|  ||¡|d |sF| jsJtnt	d�S )N)ÚvariableÚtype_annotationZinitializerÚkind)
rË   r�   r5   r;   r  r   r  rì   r   r   )rc   rŒ   r   r"  r  r*  rR   rR   rS   r#  ß  s    

üzPydanticModelField.to_argumentr´   c                 C   s   | j S r\   )Ú__dict__rµ   rR   rR   rS   rÌ   ë  s    zPydanticModelField.serialize)rŒ   rþ   rI   c                 C   s
   | f |ŽS r\   rR   )r‹   rŒ   rþ   rR   rR   rS   rû   î  s    zPydanticModelField.deserializeN)rž   rŸ   r    r¡   r¬   r   rN   rb   r'   r)   r  r   r#  r   rÌ   Úclassmethodrû   rR   rR   rR   rS   ré   Î  s        ÿ
ré   c                   @   sz   e Zd Zdee ee ee ee ee ee dœdd„Zeeef dœdd„Z	ed  ddœd	d
„Z
eeddœdd„ZdS )rÝ   N©r  rÃ   rÄ   rº   rÅ   râ   c                 C   s(   || _ || _|| _|| _|| _|| _d S r\   r.  )rc   r  rÃ   rÄ   rº   rÅ   râ   rR   rR   rS   rb   ô  s    	zModelConfigData.__init__r´   c                 C   s   dd„ | j  ¡ D ƒS )Nc                 S   s   i | ]\}}|d k	r||“qS r\   rR   )rj   ÚkÚvrR   rR   rS   r¶     s       z3ModelConfigData.set_values_dict.<locals>.<dictcomp>)r,  r›   rµ   rR   rR   rS   rÖ     s    zModelConfigData.set_values_dict)r²   rI   c                 C   s2   |d krd S |  ¡  ¡ D ]\}}t| ||ƒ qd S r\   )rÖ   r›   r®   )rc   r²   r/  r0  rR   rR   rS   rà     s    zModelConfigData.update)r³   rè   rI   c                 C   s   t | |ƒd krt| ||ƒ d S r\   )rŽ   r®   )rc   r³   rè   rR   rR   rS   rå     s    zModelConfigData.setdefault)NNNNNN)rž   rŸ   r    r   r¬   rb   r   r¡   r   rÖ   rà   rå   rR   rR   rR   rS   rÝ   ó  s"         ùùrÝ   zpydantic-ormzInvalid from_orm callZPydanticzpydantic-configzInvalid config valuezpydantic-aliaszDynamic alias disallowedzpydantic-unexpectedzUnexpected behaviorzpydantic-fieldzUntyped field disallowedzInvalid Field defaults)Ú
model_namer˜   r™   rI   c                 C   s   |j d| › d�|td� d S )Nú"z" does not have orm_mode=True©Úcode)ÚfailÚ	ERROR_ORM)r1  r˜   r™   rR   rR   rS   r¿     s    r¿   )rË   r˜   r™   rI   c                 C   s   |j d| › d�|td� d S )NzInvalid value for "Config.r2  r3  )r5  ÚERROR_CONFIG)rË   r˜   r™   rR   rR   rS   r    s    r  )r˜   r™   rI   c                 C   s   | j d|td� d S )Nz#Required dynamic aliases disallowedr3  )r5  ÚERROR_ALIAS©r˜   r™   rR   rR   rS   rã   "  s    rã   )rÁ   r˜   r™   rI   c                 C   s4   d}d| › d�}|d|› d�7 }|j ||td� d S )Nz6https://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!r3  )r5  ÚERROR_UNEXPECTED)rÁ   r˜   r™   ÚlinkZfull_messagerR   rR   rS   r¼   &  s    r¼   c                 C   s   | j d|td� d S )NzUntyped fields disallowedr3  )r5  ÚERROR_UNTYPEDr9  rR   rR   rS   rõ   0  s    rõ   c                 C   s   | j d|td� d S )Nz>Field default and default_factory cannot be specified togetherr3  )r5  ÚERROR_FIELD_DEFAULTSr9  rR   rR   rS   r—   4  s    r—   F)	r…   rË   r’   r  r  r  r  Úis_newrI   c                 C   s  | j j}||jkr@|j| }	|	jr@t|	jtƒr@| j jj 	|	j¡ |pJt
|ƒ}|sT|rpttdƒt |¡dtƒg}
n |pzt
|ƒ}ttdƒ|dtƒg}
|
| }g g g   }}}|D ]:}|js¾tdƒ‚| |j¡ | t|jƒ¡ | |j¡ q¬| j t› d�¡}t|||||ƒ}|�r|g|_t||ttƒ gƒƒ}||_t||ƒ|_||_t |ƒd | |_!|j"|_"||jk�r†t#||jƒ}|j| |j|< |�rØd|_$t||jƒ}||_|j!|_!d|_%t&|t'dƒg|ƒ}|j"|_"t(t)|ƒ}	n
t(t)|ƒ}	d|	_|	|j|< |j*jj |¡ dS )	z}
    Adds a new method to a class.

    This can be dropped if/when https://github.com/python/mypy/issues/7301 is merged
    Ú_clsNZ__pydantic_self__z"All arguments must be fully typed.z	.functionrK   Tr-  )+r‹   rŒ   rØ   Zplugin_generatedrn   ro   r   rÞ   rß   rü   rA   r   r)   r<   Zmake_normalizedr   r*  r�   rø   rÀ   r)  r+  r˜   r  r  r6   Ú	variablesr   r    r3   r�   rÜ   rg   r  rï   rB   Zis_decoratedr  r   r   r%   r   Zdefn)r…   rË   r’   r  r  r  r  r?  rŒ   rt   Úfirstrš   r  Z	arg_kindsr“   Zfunction_typeÚ	signaturerÛ   Zr_namer0  ÚdecrR   rR   rS   r  8  sV    



r  )ÚxrI   c                 C   s   | j }t|ƒr|ƒ S |S ©zc
    Used for compatibility with mypy 0.740; can be dropped once support for 0.740 is dropped.
    )rf   Úcallable©rE  ÚfnrR   rR   rS   rg   ‹  s    rg   c                 C   s   | j }t|ƒr|ƒ S |S rF  )rË   rG  rH  rR   rR   rS   rÀ   •  s    rÀ   )r¨   rI   c                 C   s°   |   d¡sd S d}tjdkr&dd l}n^zdd l}W nP tk
r‚   d}zdd l}W n* tk
r|   dd l}| d¡ Y Y d S X Y nX t	| |ƒ�}| 
|¡W  5 Q R £ S Q R X d S )Nz.tomlÚrb)é   r
  r   ÚrzJNo TOML parser installed, cannot read configuration from `pyproject.toml`.)r}   ÚsysÚversion_infoZtomllibZtomliÚImportErrorÚtomlÚwarningsÚwarnÚopenÚload)r¨   Z	read_modeZtoml_rQ  ÚrfrR   rR   rS   r©   Ÿ  s"    



r©   )NNFF)|rM  Úconfigparserr   Útypingr   r   r   r   r   r   r	   r
   Z
TypingTyper   Zmypy.errorcodesr   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)   Zmypy.optionsr*   Zmypy.pluginr+   r,   r-   r.   r/   r0   r1   Zmypy.pluginsr2   Zmypy.semanalr3   Zmypy.server.triggerr4   Z
mypy.typesr5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   Zmypy.typevarsrA   Z	mypy.utilrB   Zmypy.versionrC   Zmypy_versionZpydantic.v1.utilsrD   rE   rO  r±   r¾   rž   rÚ   rh   rÉ   rv   rz   r�   r¡   rN   rT   r‚   r  rY   rX   r]   r~   r‡   ré   rÝ   r6  r7  r8  r;  r=  r>  r¿   r  rã   r¼   rõ   r—   r¬   r  rg   rÀ   r©   rR   rR   rR   rS   Ú<module>   s”   ,|$	<





u%   2% 
 þ
	    øöS

