o
    _�¿jê8  ã                   @  sô  d Z ddlmZ ddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZ ddlmZmZmZmZmZmZ dd	lmZmZmZmZ dd
lmZ ddlmZ ddlmZ ddl m!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, G dd„ dedd�Z-dld d!„Z.dmdnd%d&„Z/dodpd+d,„Z0			dqdrd0d1„Z1dsd6d7„Z2dtd9d:„Z3dodud>d?„Z4dvdAdB„Z5dwdDdE„Z6dodxdFdG„Z7dwdHdI„Z8	J			dydzdRdS„Z9dtdTdU„Z:d{dVdW„Z;d|dYdZ„Z<dwd[d\„Z=d}d`da„Z>		J	d~ddfdg„Z?d€didj„Z@g dk¢ZAdS )�z0Utility functions for pydantic-settings sources.é    )ÚannotationsN)Údeque)ÚMappingÚSequence)Úis_dataclass)ÚEnum)ÚAnyÚ	TypedDictÚTypeVarÚcastÚget_argsÚ
get_origin)Ú	BaseModelÚJsonÚ	RootModelÚSecret)Úis_model_class)Úis_pydantic_dataclass)Ú	FieldInfo)ÚStrict)Útyping_objects)Úis_union_originé   )Ú IncompleteFieldDefinitionWarningÚSettingsError)Ú_lenient_issubclassé   ©ÚEnvNoneTypec                   @  s   e Zd ZU dZded< dS )Ú	InitStatezJState shared between settings sources during a single settings resolution.zset[int]Úfield_info_idsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© r&   r&   úZ/home/dinkstrade/pdmp/venv/lib/python3.10/site-packages/pydantic_settings/sources/utils.pyr      s   
 r   F)ÚtotalÚ
field_infor   Ú
field_nameÚstrÚ
init_stateÚreturnÚNonec                 C  sT   t | ddƒrdS | dtƒ ¡}t| ƒ|v rdS | t| ƒ¡ t d|›d�t¡ dS )u  Warn if the field is incomplete, i.e. its annotation contains unresolved forward references.

    An incomplete `FieldInfo` instance is unsafe to inspect â€” any of its attributes (annotation,
    aliases, metadata, default) may rely on the unresolved annotation, so settings sources may
    silently fail to resolve the field's value. Each instance is only warned about once per
    `init_state`, so that a field accessed by multiple sources during a single settings
    resolution doesn't emit duplicate warnings.
    Ú	_completeTNr    zField zÿ has an incomplete definition: its annotation contains an unresolved forward reference, so settings sources may fail to correctly resolve its value. Call `model_rebuild()` on the model where the field is defined, once all the referenced types are defined.)ÚgetattrÚ
setdefaultÚsetÚidÚaddÚwarningsÚwarnr   )r)   r*   r,   Ú
warned_idsr&   r&   r'   Ú_warn_if_field_info_incomplete    s   	
ûr8   ÚkeyÚcase_sensitiveÚboolc                 C  s   |r| S |   ¡ S ©N©Úlower)r9   r:   r&   r&   r'   Ú_get_env_var_key8   s   r?   Úvalueú
str | NoneÚparse_none_strústr | None | EnvNoneTypec                 C  s   | |kr|d us
| S t | ƒS r<   r   )r@   rB   r&   r&   r'   Ú_parse_env_none_str<   s   rD   Úenv_varsúMapping[str, str | None]Úignore_emptyc                   s   ‡ ‡‡fdd„|   ¡ D ƒS )Nc                   s.   i | ]\}}ˆr|d kst |ˆ ƒt|ˆƒ“qS )Ú )r?   rD   )Ú.0ÚkÚv©r:   rG   rB   r&   r'   Ú
<dictcomp>F   s    ýþz"parse_env_vars.<locals>.<dictcomp>)Úitems)rE   r:   rG   rB   r&   rL   r'   Úparse_env_vars@   s   þrO   Útpr   Ú	param_mapúdict[Any, Any]c                   sœ   t | tƒr| ˆ v rˆ |  S t| ƒ}|s| S t‡ fdd„|D ƒƒ}||kr&| S t| ƒ}|durLz|| W S  tyK   ddl}ddl}| |j	|¡ Y S w | S )zLSubstitute TypeVars in a type annotation with concrete types from param_map.c                 3  s   � | ]}t |ˆ ƒV  qd S r<   )Ú_substitute_typevars©rI   Úarg©rQ   r&   r'   Ú	<genexpr>T   ó   € z'_substitute_typevars.<locals>.<genexpr>Nr   )
Ú
isinstancer
   r   Útupler   Ú	TypeErrorÚ	functoolsÚoperatorÚreduceÚor_)rP   rQ   ÚargsÚnew_argsÚoriginr\   r]   r&   rV   r'   rS   M   s$   
úrS   Ú
annotationc                 C  s`   t  | ¡r| jS t| ƒ}t  |¡r.t|ddƒ}t| ƒ}|j}|r,|r,t|tt||ƒƒƒS |S | S )z[Resolve a TypeAliasType to its underlying value, substituting type params if parameterized.Ú__type_params__r&   )	r   Úis_typealiastypeÚ	__value__r   r0   r   rS   ÚdictÚzip)rc   rb   Útype_paramsÚ	type_argsr@   r&   r&   r'   Ú_resolve_type_aliase   s   

rk   Úmetadataú	list[Any]úInitState | Nonec                 C  sÖ   t | ƒ} | d ur2t| tƒr2| tur2td| ƒ} | jd }|d ur)t|| j› d�|ƒ |j}|d ur2|} tdd„ |D ƒƒr=dS t	| ƒ}t
 |¡rRt| ƒ^}}t|||ƒS t|tƒrYdS t| ƒpjt|ƒpjt|dƒpjt|dƒS )	Nztype[RootModel[Any]]Úrootz.rootc                 s  ó   � | ]}t |tƒV  qd S r<   ©rY   r   ©rI   Úmdr&   r&   r'   rW   �   rX   z)_annotation_is_complex.<locals>.<genexpr>FÚ__pydantic_core_schema__Ú__get_pydantic_core_schema__)rk   r   r   r   Úmodel_fieldsr8   r!   rc   Úanyr   r   Úis_annotatedr   Ú_annotation_is_complexr   Ú_annotation_is_complex_innerÚhasattr)rc   rl   r,   Ú
root_fieldÚroot_annotationrb   ÚinnerÚmetar&   r&   r'   ry   t   s0   



ÿþüry   Úfieldc                 C  s:   t | jƒ}| j}t|ƒ}t |¡rt|ƒ^}}||7 }|S r<   )rk   rc   rl   r   r   rx   r   )r€   rc   rl   rb   Ú_r   r&   r&   r'   Ú_get_field_metadata—   s   

r‚   útype[Any] | Nonec              	   C  s2   t | ttfƒr	dS t | ttttttt	fƒpt
| ƒS )NF)r   r+   Úbytesr   r   r   rZ   r2   Ú	frozensetr   r   ©rc   r&   r&   r'   rz   ¡   s   ÿþrz   c                 C  sr   t | ƒD ]2}t|||ƒr dS t|ƒ}||ur't |ƒ^}}tdd„ |D ƒƒr'qtt|ƒƒr6t|||ƒr6 dS qdS )z1Check if a union type contains any complex types.Tc                 s  rp   r<   rq   rr   r&   r&   r'   rW   ¶   rX   z$_union_is_complex.<locals>.<genexpr>F)r   ry   Ú_strip_annotatedrw   r   r   Ú_union_is_complex)rc   rl   r,   rU   r~   r�   Ú
inner_metar&   r&   r'   rˆ   ª   s   €rˆ   c                 C  sD   t | ƒD ]}t t|ƒ¡rt |ƒ^}}tdd„ |D ƒƒr dS qdS )z:Check if a union type contains any strict-annotated types.c                 s  rp   r<   )rY   r   )rI   Úmr&   r&   r'   rW   Â   rX   z*_union_has_strict_types.<locals>.<genexpr>TF)r   r   rx   r   rw   )rc   rU   r�   r   r&   r&   r'   Ú_union_has_strict_types½   s   €r‹   TÚtypesútuple[Any, ...]Úis_include_originÚis_strip_annotatedÚis_instanceÚcollectúset[Any] | Nonec              	     sì   |rt ˆ ƒ‰ |du r5tˆ ƒ‰ˆ|v r|du rdS | ˆ ¡ |r5t‡fdd„|D ƒƒr5|du r0dS | ˆ ¡ tˆ ƒD ]}t||d|||d�rL|du rL dS q9|ret‡ fdd„|D ƒƒre|du r`dS | ˆ ¡ ˆ |v rt|durr| ˆ ¡ dS dS )z?Check if a type annotation contains any of the specified types.TNc                 3  ó   � | ]}t ˆ |ƒV  qd S r<   ©rY   ©rI   Útype_)rb   r&   r'   rW   Ø   rX   z-_annotation_contains_types.<locals>.<genexpr>)rŽ   r�   r�   r‘   c                 3  r“   r<   r”   r•   r†   r&   r'   rW   é   rX   F)r‡   r   r4   rw   r   Ú_annotation_contains_types)rc   rŒ   rŽ   r�   r�   r‘   r–   r&   )rc   rb   r'   r—   Ç   sD   	

úÿ	€

r—   c                 C  s   t  t| ƒ¡r
| jS | S r<   )r   rx   r   Ú
__origin__r†   r&   r&   r'   r‡   ô   s   r‡   c                 C  sn   | t | ƒfD ]}t|tƒr td|ƒ}||j ¡ v r ||ƒj  S qt| ƒD ]}t||ƒ}|d ur4|  S q%d S ©Nz
type[Enum])	r   r   r   r   Ú__members__ÚvaluesÚnamer   Ú_annotation_enum_val_to_name)rc   r@   r–   Ú	enum_typerU   Ú	enum_namer&   r&   r'   r�   û   s   

€
ÿr�   rœ   c                 C  sh   | t | ƒfD ]}t|tƒrtd|ƒ}||jv r||   S qt| ƒD ]}t||ƒ}|d ur1|  S q"d S r™   )r   r   r   r   rš   r   Ú_annotation_enum_name_to_val)rc   rœ   r–   rž   rU   Úenum_valr&   r&   r'   r      s   


€
ÿr    c                 C  sl   t  t| ƒ¡rtdd„ t| ƒD ƒƒS t  t| ƒ¡r#t| ƒd }t|ƒS tt| ƒƒr4tdd„ t| ƒD ƒƒS dS )zlCheck if annotation is a Literal type containing numeric Enum members (IntEnum, (int, Enum), (float, Enum)).c                 s  s(   � | ]}t |ttfƒot |tƒV  qd S r<   )rY   ÚintÚfloatr   rT   r&   r&   r'   rW     s   €& z,_literal_has_numeric_enum.<locals>.<genexpr>r   c                 s  s   � | ]}t |ƒV  qd S r<   )Ú_literal_has_numeric_enumrT   r&   r&   r'   rW     s   € F)r   Ú
is_literalr   rw   r   rx   r¤   r   )rc   r~   r&   r&   r'   r¤     s   r¤   Ú	model_clsú	type[Any]údict[str, FieldInfo]c                 C  s8   t | ƒrt| dƒr| jS t| ƒr| jS td| j› d�ƒ‚)z.Get fields from a pydantic model or dataclass.Ú__pydantic_fields__zError: z? is not subclass of BaseModel or pydantic.dataclasses.dataclass)r   r{   r©   r   rv   r   r!   )r¦   r&   r&   r'   Ú_get_model_fields#  s
   rª   Úalias_path_argsúdict[str, int | None] | NoneÚpopulate_by_nameútuple[tuple[str, ...], bool]c                 C  sj  ddl m}m} g }d}t|j|jfƒs|| g7 }d}n‡g }	|j|jfD ]7}
|
du r+q$t|
tƒr8| |
¡ d}q$t|
|ƒrV|
j	D ]}t|tƒrO| |¡ d}q@|	 |¡ q@q$|	 |
¡ q$|	D ]7}t
t|jd ƒ}|sn| ¡ n|}|durŒt|jƒdkrˆt|jd tƒrˆ|jd nd||< |s•|r•| |¡ q^|r£| |vr£| | ¡ d}|s¬dd„ |D ƒ}tt |¡ƒ|fS )	zGGet alias names for a field, handling alias paths and case sensitivity.r   )ÚAliasChoicesÚ	AliasPathTFNr   c                 S  s   g | ]}|  ¡ ‘qS r&   r=   )rI   Ú
alias_namer&   r&   r'   Ú
<listcomp>Z  s    z$_get_alias_names.<locals>.<listcomp>)Úpydanticr¯   r°   rw   ÚaliasÚvalidation_aliasrY   r+   ÚappendÚchoicesr   Úpathr>   Úlenr¢   rZ   rg   Úfromkeys)r*   r)   r«   r:   r­   r¯   r°   Úalias_namesÚis_alias_path_onlyÚnew_alias_pathsr´   rœ   Ú
alias_pathr&   r&   r'   Ú_get_alias_names-  sH   






û*ÿ
€
r¿   Úobjc                 C  s   ddl m}m} t| ||fƒS )z!Check if an object is a function.r   )ÚBuiltinFunctionTypeÚFunctionType)rŒ   rÁ   rÂ   rY   )rÀ   rÁ   rÂ   r&   r&   r'   Ú_is_function^  s   rÃ   )r   r—   r    r�   ry   rz   r¿   r?   rª   rÃ   r¤   rD   rk   r‡   r‹   rˆ   r8   rO   )r)   r   r*   r+   r,   r   r-   r.   )F)r9   r+   r:   r;   r-   r+   r<   )r@   rA   rB   rA   r-   rC   )FFN)
rE   rF   r:   r;   rG   r;   rB   rA   r-   rF   )rP   r   rQ   rR   r-   r   )rc   r   r-   r   )rc   r   rl   rm   r,   rn   r-   r;   )r€   r   r-   rm   )rc   rƒ   r-   r;   )rc   rƒ   rl   rm   r,   rn   r-   r;   )TFFN)rc   rƒ   rŒ   r�   rŽ   r;   r�   r;   r�   r;   r‘   r’   r-   r;   )rc   rƒ   r@   r   r-   rA   )rc   rƒ   rœ   r   r-   r   )r¦   r§   r-   r¨   )NTF)r*   r+   r)   r   r«   r¬   r:   r;   r­   r;   r-   r®   )rÀ   r   r-   r;   )Br$   Ú
__future__r   Ú_annotationsr5   Úcollectionsr   Úcollections.abcr   r   Údataclassesr   Úenumr   Útypingr   r	   r
   r   r   r   r³   r   r   r   r   Úpydantic._internal._utilsr   Úpydantic.dataclassesr   Úpydantic.fieldsr   Úpydantic.typesr   Útyping_inspectionr   Útyping_inspection.introspectionr   Ú
exceptionsr   r   Úutilsr   rŒ   r   r   r8   r?   rD   rO   rS   rk   ry   r‚   rz   rˆ   r‹   r—   r‡   r�   r    r¤   rª   r¿   rÃ   Ú__all__r&   r&   r&   r'   Ú<module>   sb     
ü


#

	
ú
-



û
1