U
    ={fD                    @  sp  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZmZ d dlmZ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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)Z)d dl*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dl)mAZAmBZBmCZCmDZD d dlEmFZF erejGdkrd dlHaHndaHd dlIaId dlJaJd dlKmLZL ndaJdaHdaIddddZMddddZNe&eeOe!e&eeOf  e$e&eeOf df f ZPe&eeOe!e&eeOf  e$e&eeOf df f ZQedZRdeSd < edZTd!eSd"< G d#d$ d$ZUG d%d& d&ZVG d'd( d(eZWe%d)ZXeAe&eXdf eUf ZYeAeXeVf ZZG d*d+ d+eOZ[G d,d- d-e\Z]G d.d/ d/eZ^G d0d1 d1e^Z_G d2d3 d3e^Z`G d4d5 d5e`ZaG d6d7 d7e`ZbG d8d9 d9ebZcG d:d; d;ebe eX ZdG d<d= d=eZeG d>d? d?e_eeZfG d@dA dAe_eeZgG dBdC dCegZhG dDdE dEe_eeZidldGdHdGdIdJdKZjdmdLdLdMdNdOdPZkdndQdHdHdLdQdRdSdTZlddFdFddUdVdLdHdHdLdQdWdXdYZmdZd[dHd\d]d^ZndZdHd_d`daZodZd[dHd\dbdcZpdodZdedHdHdHdfdgdhZqdidid_djdkZrdS )p    )annotationsN)ABCabstractmethod)SUPPRESSArgumentParserHelpFormatter	Namespace_SubParsersAction)deque)is_dataclass)Enum)Path)FunctionType)TYPE_CHECKINGAnyCallableGenericListMappingSequenceTupleTypeVarUnioncastoverload)dotenv_values)AliasChoices	AliasPath	BaseModelJson)Representation)WithArgsTypesorigin_is_uniontyping_base)deep_updateis_model_classlenient_issubclass)is_pydantic_dataclass)	FieldInfo)PydanticUndefined)	Annotated_AnnotatedAliasget_args
get_origin)path_type_label      )BaseSettingsNonereturnc               
   C  sJ   t d k	rd S zdd l a W n, tk
rD }  ztd| W 5 d } ~ X Y nX d S )Nr   zBPyYAML is not installed, run `pip install pydantic-settings[yaml]`)yamlImportErrore r:   X/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/pydantic_settings/sources.pyimport_yaml<   s    r<   c               
   C  sj   t jdk rRtd k	rd S zdd laW qf tk
rN }  ztd| W 5 d } ~ X Y qfX ntd k	r^d S dd lad S )Nr/   r   zAtomli is not installed, run `pip install pydantic-settings[toml]`)sysversion_infotomlir7   tomllibr8   r:   r:   r;   import_tomlF   s    
rA   . PathTypeDEFAULT_PATH
DotenvTypeENV_FILE_SENTINELc                   @  s   e Zd ZdS )_CliSubCommandN__name__
__module____qualname__r:   r:   r:   r;   rG   `   s   rG   c                   @  s   e Zd ZdS )_CliPositionalArgNrH   r:   r:   r:   r;   rL   d   s   rL   c                   @  s   e Zd ZdS )_CliInternalArgParserNrH   r:   r:   r:   r;   rM   h   s   rM   Tc                   @  s   e Zd ZdS )EnvNoneTypeNrH   r:   r:   r:   r;   rO   q   s   rO   c                   @  s   e Zd ZdS )SettingsErrorNrH   r:   r:   r:   r;   rP   u   s   rP   c                   @  s   e Zd ZdZddddZedddd	d
dZdddddZddddddddZdddddddZ	eddddZ
dS )PydanticBaseSettingsSourcezi
    Abstract base class for settings sources, every settings source classes should inherit from it.
    type[BaseSettings])settings_clsc                 C  s   || _ |j| _d S N)rS   model_configconfig)selfrS   r:   r:   r;   __init__~   s    z#PydanticBaseSettingsSource.__init__r(   strtuple[Any, str, bool]field
field_namer5   c                 C  s   dS )a  
        Gets the value, the key for model creation, and a flag to determine whether value is complex.

        This is an abstract method that should be overridden in every settings source classes.

        Args:
            field: The field.
            field_name: The field name.

        Returns:
            A tuple contains the key, value and a flag to determine whether value is complex.
        Nr:   rW   r\   r]   r:   r:   r;   get_field_value   s    z*PydanticBaseSettingsSource.get_field_valueboolr\   r5   c                 C  s   t |j|jS )z
        Checks whether a field is complex, in which case it will attempt to be parsed as JSON.

        Args:
            field: The field.

        Returns:
            Whether the field is complex.
        )_annotation_is_complex
annotationmetadata)rW   r\   r:   r:   r;   field_is_complex   s    
z+PydanticBaseSettingsSource.field_is_complexr   r]   r\   valuevalue_is_complexr5   c                 C  s(   |dk	r$|  |s|r$| |||S |S )aF  
        Prepares the value of a field.

        Args:
            field_name: The field name.
            field: The field.
            value: The value of the field that has to be prepared.
            value_is_complex: A flag to determine whether value is complex.

        Returns:
            The prepared value.
        N)re   decode_complex_value)rW   r]   r\   rg   rh   r:   r:   r;   prepare_field_value   s    z.PydanticBaseSettingsSource.prepare_field_value)r]   r\   rg   r5   c                 C  s
   t |S )a  
        Decode the value for a complex field

        Args:
            field_name: The field name.
            field: The field.
            value: The value of the field that has to be prepared.

        Returns:
            The decoded value for further preparation
        )jsonloads)rW   r]   r\   rg   r:   r:   r;   ri      s    z/PydanticBaseSettingsSource.decode_complex_valuedict[str, Any]r4   c                 C  s   d S rT   r:   rW   r:   r:   r;   __call__   s    z#PydanticBaseSettingsSource.__call__N)rI   rJ   rK   __doc__rX   r   r_   re   rj   ri   ro   r:   r:   r:   r;   rQ   y   s   rQ   c                      sV   e Zd ZdZddd fddZddd	d
ddZddddZddddZ  ZS )InitSettingsSourcezX
    Source class for loading values provided during settings class initialization.
    rR   rm   )rS   init_kwargsc                   s   || _ t | d S rT   )rr   superrX   )rW   rS   rr   	__class__r:   r;   rX      s    zInitSettingsSource.__init__r(   rY   rZ   r[   c                 C  s   dS )N)NrB   Fr:   r^   r:   r:   r;   r_      s    z"InitSettingsSource.get_field_valuer4   c                 C  s   | j S rT   rr   rn   r:   r:   r;   ro      s    zInitSettingsSource.__call__c                 C  s   d| j dS )NzInitSettingsSource(init_kwargs=)rv   rn   r:   r:   r;   __repr__   s    zInitSettingsSource.__repr__)	rI   rJ   rK   rp   rX   r_   ro   rx   __classcell__r:   r:   rt   r;   rq      s
   rq   c                	      s   e Zd Zddddddddd fddZd	d	d
ddZdd	ddddZddddddZdddddZddddZ  Z	S )PydanticBaseEnvSettingsSourceNrR   bool | None
str | Noner3   )rS   case_sensitive
env_prefixenv_ignore_emptyenv_parse_none_strenv_parse_enumsr5   c                   s   t  | |d k	r|n| jdd| _|d k	r4|n| jdd| _|d k	rP|n| jdd| _|d k	rl|n
| jd| _|d k	r|n
| jd| _d S )Nr}   Fr~   rB   r   r   r   )	rs   rX   rV   getr}   r~   r   r   r   )rW   rS   r}   r~   r   r   r   rt   r:   r;   rX      s    	z&PydanticBaseEnvSettingsSource.__init__rY   )rg   r5   c                 C  s   | j s| S |S rT   )r}   lower)rW   rg   r:   r:   r;   _apply_case_sensitive   s    z3PydanticBaseEnvSettingsSource._apply_case_sensitiver(   zlist[tuple[str, str, bool]]r[   c                 C  s&  g }t |jttfr |j }n|j}|rt |tr|D ]t}t |trn||| |t	|dkrddndf q8t |tr8t
t|d }||| |t	|dkrdndf q8n||| |df nZtt|jrt|j|jr||| | j| df n||| | j| df |S )a  
        Extracts field info. This info is used to get the value of field from environment variables.

        It returns a list of tuples, each tuple contains:
            * field_key: The key of field that has to be used in model creation.
            * env_name: The environment variable name of the field.
            * value_is_complex: A flag to determine whether the value from environment variable
              is complex and has to be parsed.

        Args:
            field (FieldInfo): The field.
            field_name (str): The field name.

        Returns:
            list[tuple[str, str, bool]]: List of tuples, each tuple contains field_key, env_name, and value_is_complex.
           TFr   )
isinstancevalidation_aliasr   r   Zconvert_to_aliaseslistrY   appendr   lenr   r"   r-   rc   _union_is_complexrd   r~   )rW   r\   r]   
field_infoZv_aliasaliasZ	first_argr:   r:   r;   _extract_field_info   s&    

(
 z1PydanticBaseEnvSettingsSource._extract_field_inform   )r\   field_valuesr5   c                 C  s   i }|  D ]\}}d}|j}t|}tt|jrjt|dkrjtd|krj|D ]}	|	tdkrP|	} qjqP|rxt|ds|||< q|j  D ]&\}
}|j	s|

 |
 kr|} qq|s|||< qt|jtrt|tr| ||||
< q|||
< q|S )ae  
        Replace field names in values dict by looking in models fields insensitively.

        By having the following models:

            ```py
            class SubSubSub(BaseModel):
                VaL3: str

            class SubSub(BaseModel):
                Val2: str
                SUB_sub_SuB: SubSubSub

            class Sub(BaseModel):
                VAL1: str
                SUB_sub: SubSub

            class Settings(BaseSettings):
                nested: Sub

                model_config = SettingsConfigDict(env_nested_delimiter='__')
            ```

        Then:
            _replace_field_names_case_insensitively(
                field,
                {"val1": "v1", "sub_SUB": {"VAL2": "v2", "sub_SUB_sUb": {"vAl3": "v3"}}}
            )
            Returns {'VAL1': 'v1', 'SUB_sub': {'Val2': 'v2', 'SUB_sub_SuB': {'VaL3': 'v3'}}}
        N   model_fields)itemsrc   r,   r"   r-   r   typehasattrr   r   r   r&   r   r   dict'_replace_field_names_case_insensitively)rW   r\   r   valuesnamerg   Zsub_model_fieldrc   argsargZsub_model_field_namefr:   r:   r;   r     s0    &
zEPydanticBaseEnvSettingsSource._replace_field_names_case_insensitively)field_valuer5   c                 C  sJ   i }|  D ]8\}}t|ts<t|ts,|n| |||< qd||< q|S )ze
        Recursively parse values that are of "None" type(EnvNoneType) to `None` type(None).
        N)r   r   rO   r   _replace_env_none_type_values)rW   r   r   keyrg   r:   r:   r;   r   ]  s    

z;PydanticBaseEnvSettingsSource._replace_env_none_type_valuesr4   c                 C  s.  i }| j j D ]\}}z| ||\}}}W n> tk
rn } z td| d| jj d|W 5 d }~X Y nX z| ||||}W n> t	k
r } z td| d| jj d|W 5 d }~X Y nX |d k	r| j
d k	rt|tr| |}nt|trd }| js t|tr | ||||< q|||< q|S )Nzerror getting value for field "z" from source ""zerror parsing value for field ")rS   r   r   r_   	ExceptionrP   ru   rI   rj   
ValueErrorr   r   r   r   rO   r}   r   )rW   datar]   r\   r   	field_keyrh   r9   r:   r:   r;   ro   k  s>    



z&PydanticBaseEnvSettingsSource.__call__)NNNNN)
rI   rJ   rK   rX   r   r   r   r   ro   ry   r:   r:   rt   r;   rz      s         *Erz   c                
      s   e Zd ZdZdddddddddd fd	d
Zdd fddZedddddddZddddddZddddZ	  Z
S )SecretsSettingsSourcezE
    Source class for loading settings values from secret files.
    NrR   zstr | Path | Noner{   r|   r3   )rS   secrets_dirr}   r~   r   r   r   r5   c                   s4   t  |||||| |d k	r"|n
| jd| _d S )Nr   )rs   rX   rV   r   r   )rW   rS   r   r}   r~   r   r   r   rt   r:   r;   rX     s    
     zSecretsSettingsSource.__init__rm   r4   c                   sl   i }| j dkr|S t| j  | _| j sDtd| j d |S | j sbtdt	| j t
  S )z4
        Build fields from "secrets" files.
        Nzdirectory "z" does not existz.secrets_dir must reference a directory, not a )r   r   
expandusersecrets_pathexistswarningswarnis_dirrP   r.   rs   ro   )rW   Zsecretsrt   r:   r;   ro     s    


zSecretsSettingsSource.__call__r   rY   r`   Path | None)dir_path	file_namer}   r5   c                 C  sB   |  D ]4}|j|kr|  S |s|j | kr|  S qdS )af  
        Find a file within path's directory matching filename, optionally ignoring case.

        Args:
            dir_path: Directory path.
            file_name: File name.
            case_sensitive: Whether to search for file name case sensitively.

        Returns:
            Whether file path or `None` if file does not exist in directory.
        N)iterdirr   r   )clsr   r   r}   r   r:   r:   r;   find_case_path  s    

z$SecretsSettingsSource.find_case_pathr(   rZ   r[   c                 C  sx   |  ||D ]`\}}}| | j|| j}|s.q| rL|  ||f  S tjd| dt	| ddd qd||fS )ag  
        Gets the value for field from secret file and a flag to determine whether value is complex.

        Args:
            field: The field.
            field_name: The field name.

        Returns:
            A tuple contains the key, value if the file exists otherwise `None`, and
                a flag to determine whether value is complex.
        zattempted to load secret file "z" but found a z	 instead.   )
stacklevelN)
r   r   r   r}   is_file	read_textstripr   r   r.   )rW   r\   r]   r   env_namerh   pathr:   r:   r;   r_     s    z%SecretsSettingsSource.get_field_valuec                 C  s   d| j dS )Nz"SecretsSettingsSource(secrets_dir=rw   )r   rn   r:   r:   r;   rx     s    zSecretsSettingsSource.__repr__)NNNNNN)rI   rJ   rK   rp   rX   ro   classmethodr   r_   rx   ry   r:   r:   rt   r;   r     s         "r   c                
      s   e Zd ZdZd(ddddddddd fdd	Zd
dddZddddddZddddddddZdddddZe	d)dddddd d!Z
ddd
d"d#d$d%Zddd&d'Z  ZS )*EnvSettingsSourcezN
    Source class for loading settings values from environment variables.
    NrR   r{   r|   r3   )rS   r}   r~   env_nested_delimiterr   r   r   r5   c                   sJ   t  |||||| |d k	r"|n
| jd| _t| j| _|  | _	d S )Nr   )
rs   rX   rV   r   r   r   r~   env_prefix_len_load_env_varsenv_vars)rW   rS   r}   r~   r   r   r   r   rt   r:   r;   rX     s    
     zEnvSettingsSource.__init__Mapping[str, str | None]r4   c                 C  s   t tj| j| j| jS rT   )parse_env_varsosenvironr}   r   r   rn   r:   r:   r;   r     s    z EnvSettingsSource._load_env_varsr(   rY   rZ   r[   c                 C  s>   d}|  ||D ]"\}}}| j|}|dk	r q4q|||fS )aq  
        Gets the value for field from environment variables and a flag to determine whether value is complex.

        Args:
            field: The field.
            field_name: The field name.

        Returns:
            A tuple contains the key, value if the file exists otherwise `None`, and
                a flag to determine whether value is complex.
        N)r   r   r   )rW   r\   r]   env_valr   r   rh   r:   r:   r;   r_     s    z!EnvSettingsSource.get_field_valuer   r`   rf   c           	   
   C  s   |  |\}}| jrBt|jtrB|tdd |jD krB|j| }|sJ|rt|trX|S |dkrz| ||| j	}|r|S qz| 
|||}W n* tk
r } z|s|W 5 d}~X Y nX t|trt|| ||| j	S |S n|dk	r|S dS )a  
        Prepare value for the field.

        * Extract value for nested field.
        * Deserialize value to python object for complex field.

        Args:
            field: The field.
            field_name: The field name.

        Returns:
            A tuple contains prepared value for the field.

        Raises:
            ValuesError: When There is an error in deserializing value for complex field.
        c                 s  s   | ]}|j V  qd S rT   r   .0valr:   r:   r;   	<genexpr>0  s     z8EnvSettingsSource.prepare_field_value.<locals>.<genexpr>N)_field_is_complexr   r&   rc   r   tupler   rO   explode_env_varsr   ri   r   r   r$   )	rW   r]   r\   rg   rh   
is_complexallow_parse_failureZenv_val_builtr9   r:   r:   r;   rj     s*    


z%EnvSettingsSource.prepare_field_valueztuple[bool, bool]ra   c                 C  s>   |  |rd}n&tt|jr2t|j|jr2d}ndS d|fS )za
        Find out if a field is complex, and if so whether JSON errors should be ignored
        FT)FF)re   r"   r-   rc   r   rd   )rW   r\   r   r:   r:   r;   r   K  s    
z#EnvSettingsSource._field_is_complexzFieldInfo | Any | NonezFieldInfo | None)r\   r   r}   r5   c           	      C  s   | sdS t | tr| jn| }tt|s2t |tr\t|D ]}t|||}|r:|  S q:nvt	|slt
|rt
|rz|jn
tt|j}|dks|r||r|| S |s| D ] \}}| | kr|  S qdS )aK  
        Find the field in a sub model by key(env name)

        By having the following models:

            ```py
            class SubSubModel(BaseSettings):
                dvals: Dict

            class SubModel(BaseSettings):
                vals: list[str]
                sub_sub_model: SubSubModel

            class Cfg(BaseSettings):
                sub_model: SubModel
            ```

        Then:
            next_field(sub_model, 'vals') Returns the `vals` field of `SubModel` class
            next_field(sub_model, 'sub_sub_model') Returns `sub_sub_model` field of `SubModel` class

        Args:
            field: The field.
            key: The key (env name).
            case_sensitive: Whether to search for key case sensitively.

        Returns:
            Field if it finds the next field otherwise `None`.
        N)r   r(   rc   r"   r-   r!   r,   r   
next_fieldr%   r'   __pydantic_fields__r   r   r   r   r   r   )	r\   r   r}   rc   type_Ztype_has_keyfieldsr]   r   r:   r:   r;   r   [  s(    

zEnvSettingsSource.next_fieldrm   )r]   r\   r   r5   c                   sp  t t|jt}fdd||D }i }| D ]2\ }t fdd|D sXq6 jd }|j	^}	}
}|}|}|
D ]*}
||j}t|tr||i }q
||j}|s|r6|r6|r|\}}nd\}}|r6z|||}W n. tk
r4 } z|s$|W 5 d}~X Y nX t|tr6||ksbt|trb|| i kr6|||< q6|S )a  
        Process env_vars and extract the values of keys containing env_nested_delimiter into nested dictionaries.

        This is applied to a single field, hence filtering by env_var prefix.

        Args:
            field_name: The field name.
            field: The field.
            env_vars: Environment variables.

        Returns:
            A dictionary contains extracted values from nested env values.
        c                   s    g | ]\}}}|  j  qS r:   )r   )r   _r   rn   r:   r;   
<listcomp>  s    z6EnvSettingsSource.explode_env_vars.<locals>.<listcomp>c                 3  s   | ]}  |V  qd S rT   )
startswith)r   prefix)r   r:   r;   r     s     z5EnvSettingsSource.explode_env_vars.<locals>.<genexpr>N)TT)r&   r-   rc   r   r   r   anyr   splitr   r   r}   r   
setdefaultr   ri   r   rO   )rW   r]   r\   r   Zis_dictprefixesresultr   Zenv_name_without_prefixr   keyslast_keyenv_varZtarget_fieldr   r   Zallow_json_failurer9   r:   )r   rW   r;   r     s>    



"
z"EnvSettingsSource.explode_env_varsc                 C  s   d| j d| jdS )Nz'EnvSettingsSource(env_nested_delimiter=, env_prefix_len=rw   )r   r   rn   r:   r:   r;   rx     s    zEnvSettingsSource.__repr__)NNNNNN)N)rI   rJ   rK   rp   rX   r   r_   rj   r   staticmethodr   r   rx   ry   r:   r:   rt   r;   r     s          ".87r   c                      s   e Zd ZdZedddddddfddddddddddd
 fd	d
ZddddZddddZdd fddZddddZ	  Z
S )DotEnvSettingsSourcezB
    Source class for loading settings values from env files.
    NrR   zDotenvType | Noner|   r{   r3   )
rS   env_fileenv_file_encodingr}   r~   r   r   r   r   r5   c
           
   	     sP   |t kr|n
|jd| _|d k	r&|n
|jd| _t |||||||	 d S )Nr   r   )rF   rU   r   r   r   rs   rX   )
rW   rS   r   r   r}   r~   r   r   r   r   rt   r:   r;   rX     s    zDotEnvSettingsSource.__init__r   r4   c                 C  s   |   S rT   )_read_env_filesrn   r:   r:   r;   r     s    z#DotEnvSettingsSource._load_env_varsc              
   C  sn   | j }|d kri S t|ttjfr(|g}i }|D ]8}t| }| r0|t	|| j
| j| j| jd q0|S )Nencodingr}   ignore_emptyparse_none_str)r   r   rY   r   PathLiker   r   r   updateread_env_filer   r}   r   r   )rW   Z	env_filesZdotenv_varsr   Zenv_pathr:   r:   r;   r     s&    
z$DotEnvSettingsSource._read_env_filesrm   c                   s   t   }| jddk}| j D ]\}}|s2q$d}| jj D ]2\}}| ||D ]\}}	}|	|	rVd} qBqVqB|s$|r|	| j
r|t| j
d  }
|||
< q$|||< q$|S )NextraZforbidFT)rs   ro   rV   r   r   r   rS   r   r   r   r~   r   )rW   r   Zis_extra_allowedr   Z	env_valueZenv_usedr]   r\   r   Zfield_env_nameZnormalized_env_namert   r:   r;   ro     s"    



zDotEnvSettingsSource.__call__rY   c              	   C  s&   d| j d| jd| jd| jd	S )NzDotEnvSettingsSource(env_file=z, env_file_encoding=z, env_nested_delimiter=r   rw   )r   r   r   r   rn   r:   r:   r;   rx   $  s    $zDotEnvSettingsSource.__repr__)rI   rJ   rK   rp   rF   rX   r   r   ro   rx   ry   r:   r:   rt   r;   r     s   &r   c                      s  e Zd ZdZddddddddddejejejej	ej
efdddddddddddd	d	d	d	d	dd
d fddZeddddZedddddZedddddZddddddd fddZeddd d!Zedddd"d!Zdd#dd$dd%d!Zd&d'd'd(d)d*Zd'd&d+d'd,d-d.Zd'd&d'd/d0d1Zd'd&d2d'd3d4d5Zd6d'd7d8d9d:d;Zd'd7d<d=d>d?d@Zd6dAdBdCdDZedEddFdGZd	d'dddHdIdJdKZejejejej	ej
efdEd	d	d	d	d	dd
dLdMdNZdd6d&d'd'dd&dOdPdQdRZd'd'd&dSd&dTdUdVZdd8d&d'd'd'd&dd7dSd
dWdXdYZdd<d&d'd'dd
dZd[d\ZddSd]d^d_Zdjd&dd'd`dadbZ dd'd]dcddZ!dd'd]dedfZ"d7d'dgdhdiZ#  Z$S )kCliSettingsSourcea#
  
    Source class for loading settings values from CLI.

    Note:
        A `CliSettingsSource` connects with a `root_parser` object by using the parser methods to add
        `settings_cls` fields as command line arguments. The `CliSettingsSource` internal parser representation
        is based upon the `argparse` parsing library, and therefore, requires the parser methods to support
        the same attributes as their `argparse` library counterparts.

    Args:
        cli_prog_name: The CLI program name to display in help text. Defaults to `None` if cli_parse_args is `None`.
            Otherwse, defaults to sys.argv[0].
        cli_parse_args: The list of CLI arguments to parse. Defaults to None.
            If set to `True`, defaults to sys.argv[1:].
        cli_parse_none_str: The CLI string value that should be parsed (e.g. "null", "void", "None", etc.) into `None`
            type(None). Defaults to "null" if cli_avoid_json is `False`, and "None" if cli_avoid_json is `True`.
        cli_hide_none_type: Hide `None` values in CLI help text. Defaults to `False`.
        cli_avoid_json: Avoid complex JSON objects in CLI help text. Defaults to `False`.
        cli_enforce_required: Enforce required fields at the CLI. Defaults to `False`.
        cli_use_class_docs_for_groups: Use class docstrings in CLI group help text instead of field descriptions.
            Defaults to `False`.
        cli_prefix: Prefix for command line arguments added under the root parser. Defaults to "".
        case_sensitive: Whether CLI "--arg" names should be read with case-sensitivity. Defaults to `True`.
            Note: Case-insensitive matching is only supported on the internal root parser and does not apply to CLI
            subcommands.
        root_parser: The root parser object.
        parse_args_method: The root parser parse args method. Defaults to `argparse.ArgumentParser.parse_args`.
        add_argument_method: The root parser add argument method. Defaults to `argparse.ArgumentParser.add_argument`.
        add_argument_group_method: The root parser add argument group method.
            Defaults to `argparse.ArgumentParser.add_argument_group`.
        add_parser_method: The root parser add new parser (sub-command) method.
            Defaults to `argparse._SubParsersAction.add_parser`.
        add_subparsers_method: The root parser add subparsers (sub-commands) method.
            Defaults to `argparse.ArgumentParser.add_subparsers`.
        formatter_class: A class for customizing the root parser help text. Defaults to `argparse.HelpFormatter`.
    NTrR   r|   z)bool | list[str] | tuple[str, ...] | Noner{   r   zCallable[..., Any] | Noner3   )rS   cli_prog_namecli_parse_argscli_parse_none_strcli_hide_none_typecli_avoid_jsoncli_enforce_requiredcli_use_class_docs_for_groups
cli_prefixr}   root_parserparse_args_methodadd_argument_methodadd_argument_group_methodadd_parser_methodadd_subparsers_methodformatter_classr5   c              	     s  |d k	r|n|j dtjd | _|d k	r.|n|j dd| _|d k	rJ|n|j dd| _|sp| jdkrldnd}|| _|d k	r|n|j d	d| _|d k	r|n|j d
d| _	|	d k	r|	n|j dd| _
| j
r|	ds|	ds|	dd std|	 |  j
d7  _
|
d k	r"|
nd}
|
s>|d k	r>tdt j|d| jd| j
|
d |d krtt| j|jdn|}| j|||||||d |dkr|dkrtjdd  }n"t|ttfstdt| | j| | j|d d S )Nr   r   r   Fr   Tr3   nullr   r   r   rB   .z'CLI settings source prefix is invalid: zGCase-insensitive matching is only supported on the internal root parser)r   r   r   r~   r}   )progdescription)r   r   r   r   r   r   r   NFr   z>cli_parse_args must be List[str] or Tuple[str, ...], recieved parsed_args)rU   r   r=   argvr   r   r   r   r   r   r   r   endswithreplaceisidentifierrP   rs   rX   rM   rp   _connect_root_parserr   r   r   r   r   _parse_argsr   )rW   rS   r   r   r   r   r   r   r   r   r}   r   r   r   r   r   r   r   rt   r:   r;   rX   Q  sp    &


zCliSettingsSource.__init__rm   r4   c                 C  s   d S rT   r:   rn   r:   r:   r;   ro     s    zCliSettingsSource.__call__z"list[str] | tuple[str, ...] | boolzCliSettingsSource[T])r   r5   c                C  s   dS )a  
        Parse and load the command line arguments list into the CLI settings source.

        Args:
            args:
                The command line arguments to parse and load. Defaults to `None`, which means do not parse
                command line arguments. If set to `True`, defaults to sys.argv[1:]. If set to `False`, does
                not parse command line arguments.

        Returns:
            CliSettingsSource: The object instance itself.
        Nr:   )rW   r   r:   r:   r;   ro     s    z&Namespace | dict[str, list[str] | str])r  r5   c                C  s   dS )at  
        Loads parsed command line arguments into the CLI settings source.

        Note:
            The parsed args must be in `argparse.Namespace` or vars dictionary (e.g., vars(argparse.Namespace))
            format.

        Args:
            parsed_args: The parsed args to load.

        Returns:
            CliSettingsSource: The object instance itself.
        Nr:   rW   r  r:   r:   r;   ro     s    )r   r  z)list[str] | tuple[str, ...] | bool | Nonez-Namespace | dict[str, list[str] | str] | Nonez%dict[str, Any] | CliSettingsSource[T])r   r  r5   c                  s   |d k	r|d k	rt dnf|d k	rb|dkr6| ji dS |dkrLtjdd  }| j| | j|dS |d k	rv| j|dS t  S d S )Nz/`args` and `parsed_args` are mutually exclusiveFr  Tr   )rP   r   r=   r  r  r   rs   ro   )rW   r   r  rt   r:   r;   ro     s    
r   c                 C  s   d S rT   r:   rn   r:   r:   r;   r     s    z CliSettingsSource._load_env_varsc                C  s   dS )a  
        Loads the parsed command line arguments into the CLI environment settings variables.

        Note:
            The parsed args must be in `argparse.Namespace` or vars dictionary (e.g., vars(argparse.Namespace))
            format.

        Args:
            parsed_args: The parsed args to load.

        Returns:
            CliSettingsSource: The object instance itself.
        Nr:   r	  r:   r:   r;   r     s    r  z/Mapping[str, str | None] | CliSettingsSource[T]c                  s  |d kri S t |trt|}g }| D ]N\}}t |trN| ||||< q*|dr*|d k	r*||dd |  q*| j	
 D ] }|D ]}||kr| j||< qqdd | D }|rt|td t fdd| D sd	| < tttttf || j| j| j| _| S )
N:subcommand:r   c                 S  s    i | ]\}}| d s||qS )r
  )r  )r   r   r   r:   r:   r;   
<dictcomp>  s     
  z4CliSettingsSource._load_env_vars.<locals>.<dictcomp>)r   c                 3  s    | ]}  d |kr|V  qdS )r   Nr:   )r   r]   Zlast_selected_subcommandr:   r;   r     s      z3CliSettingsSource._load_env_vars.<locals>.<genexpr>z{})r   r   varsr   r   _merge_parsed_listr  r   r   _cli_subcommandsr   r   maxr   r   r   r   r   r   rY   r}   r   r   )rW   r  Zselected_subcommandsr]   r   subcommands
subcommandr:   r  r;   r     s4    

z	list[str]rY   )parsed_listr]   r5   c                 C  s  zg }d}| j |t}|tksDtt|rDtdd t|D sJ|}n&|rlt|dksh|d drltnt	}|D ]}|dr|
dr|dd }|r<|d	r| |||}d}q|d
s|dr| ||}nXz| |||}W nD tk
r4 } z$||kr||}| |||}W 5 d }~X Y nX d}q|st| |||}qt|t	krd|d W S |tkrdd	| dW S i }	|D ]}
|	t|
 qt|	W S W n8 tk
r } ztd| d| W 5 d }~X Y nX d S )NFc                 s  s.   | ]&}|t d k	rt|ttfkr|V  qd S rT   )r   r-   r   r   r   r   r:   r:   r;   r     s    z7CliSettingsSource._merge_parsed_list.<locals>.<genexpr>r   r   [],{TzParsing error encountered for z: )_cli_dict_argsr   r   r"   r-   r   r,   r   r   rY   r  _consume_comma_consume_object_or_array_consume_string_or_numberr   joinr   rk   rl   dumpsr   rP   )rW   r  r]   merged_listis_last_consumed_a_value
merge_typeZinferred_typer   r9   Zmerged_dictitemr:   r:   r;   r    sX    
	$

 


z$CliSettingsSource._merge_parsed_listr`   )r$  r!  r"  r5   c                 C  s   |s| d |dd  S )Nz""r   )r   )rW   r$  r!  r"  r:   r:   r;   r  L  s    
z CliSettingsSource._consume_comma)r$  r!  r5   c                 C  s   d}| drdnd}tdt|D ]l}|| dkr>|d7 }q$|| dkr$|d8 }|| |kr$|dkr$||d |d   ||d d    S q$td| d	d S )
Nr   r  }r  )r  r  )r%  r  r   zMissing end delimiter "r   )r   ranger   r   rP   )rW   r$  r!  countZclose_delimconsumedr:   r:   r;   r  Q  s    
z*CliSettingsSource._consume_object_or_arraytype[Any] | None)r$  r!  r#  r5   c           	      C  sz  |t k	rdnt|}d}|t|k rj|| dkrN|dksH||d  dkrN| }|s`|| dkr`qj|d7 }q|rvtd|d |  }|tt fkrzt| W n@ tk
r   || jkrd}|d	kr|dsd| d}Y nX |	| nd
d |
ddD \}}|drD|dsD|dsD|drDtd| |d|d }}|	t||i ||d  S )Nr   Fr   r   \r  zMismatched quotesr   )truefalser   c                 s  s   | ]
}|V  qd S rT   r:   )r   kvr:   r:   r;   r   t  s     z>CliSettingsSource._consume_string_or_number.<locals>.<genexpr>=z1Dictionary key=val parameter is a quoted string: )rY   r   rP   r   r   floatr   r   r   r   r   r  rk   r   )	rW   r$  r!  r#  r(  Zis_find_end_quoteZ
val_stringr   r   r:   r:   r;   r  ^  s4    $

0z+CliSettingsSource._consume_string_or_numberztype[BaseModel]r(   zlist[type[BaseModel]])modelr]   r   r5   c                 C  s   t |js|jfnt |j}| jr4tdd |D }g }|D ]l}t|tfddrhtd|j d| n&t|tfddrtd|j d| t	|st
|r<|| q<|S )Nc                 S  s   g | ]}|t d k	r|qS rT   r   r  r:   r:   r;   r     s      z5CliSettingsSource._get_sub_models.<locals>.<listcomp>F)is_include_originz.CliSubCommand is not outermost annotation for r   z1CliPositionalArg is not outermost annotation for )r,   rc   r   r   _annotation_contains_typesrG   rP   rI   rL   r%   r'   r   )rW   r0  r]   r   field_types
sub_modelsr   r:   r:   r;   _get_sub_models{  s    z!CliSettingsSource._get_sub_modelszdict[str, str]ztuple[tuple[str, ...], bool])r]   r   alias_path_argsr5   c           
      C  s*  g }d}t |j|jfs(||g7 }d}ng }|j|jfD ]p}|d krHq8q8t|trb|| d}q8t|tr|jD ](}t|tr|| d}qr|| qrq8|| q8|D ]R}	tt|	j	d }| j
s| n|}t|	j	dkrdnd||< |s|r|| q| j
sdd |D }tt||fS )	NTFr   r   r   r   c                 S  s   g | ]}|  qS r:   r   )r   Zresolved_namer:   r:   r;   r     s     z9CliSettingsSource._get_resolved_names.<locals>.<listcomp>)r   r   r   r   rY   r   r   choicesr   r   r}   r   r   r   r   fromkeys)
rW   r]   r   r7  resolved_namesis_alias_path_onlyZnew_alias_pathsr   r   Z
alias_pathr:   r:   r;   _get_resolved_names  s8    






z%CliSettingsSource._get_resolved_nameszlist[tuple[str, FieldInfo]])r0  r5   c           	      C  s  g g g   }}}t |r|jn|j}| D ]R\}}t|jkr| sdtd|j d| dnt	|j
|jfrtd|j d| dnjdd t|jD }t|dkrtd|j d| dn0t|d	 st |d	 std|j d| d
|||f q,t|jkrr| s8td|j d| dn*t	|j
|jfrbtd|j d| d|||f q,|||f q,|| | S )Nzsubcommand argument r   z has a default valuez has an aliasc                 S  s   g | ]}|t d k	r|qS rT   r1  r  r:   r:   r;   r     s      z6CliSettingsSource._sort_arg_fields.<locals>.<listcomp>r   z has multiple typesr   z is not derived from BaseModelzpositional argument )r'   r   r   r   rG   rd   is_requiredrP   rI   r   r   r   r,   rc   r   r%   r   rL   )	rW   r0  Zpositional_argsZsubcommand_argsZoptional_argsr   r]   r   r4  r:   r:   r;   _sort_arg_fields  s0    
z"CliSettingsSource._sort_arg_fieldsrN   c                 C  s   | j S )z#The connected root parser instance.)_root_parserrn   r:   r:   r;   r     s    zCliSettingsSource.root_parserzCallable[..., Any])parser_methodmethod_namer   kwargsr5   c                   sn   d k	rD| j dkrD dkrDt| jtrDddddddfdd	}|S d krfdddd
 fdd}|S S d S )NFparsed_args_methodrM   z"list[str] | tuple[str, ...] | NonezNamespace | Noner   )r   r   	namespacer5   c                   s`   g }|rt t |ng D ]6}td|}|rH|d |d }|| q | ||S )Nz^(--[^\s=]+)(.*)r   r   )shlexr   r  rematchgroupr   r   )r   r   rE  Zinsensitive_argsr   Zmatched)rA  r:   r;   parse_args_insensitive_method  s    zOCliSettingsSource._connect_parser_method.<locals>.parse_args_insensitive_method)r   rC  r5   c                    s   t d  dd S )Nz0cannot connect CLI settings source root parser: z. is set to `None` but is needed for connecting)rP   )r   rC  )rB  r:   r;   none_parser_method  s    
zDCliSettingsSource._connect_parser_method.<locals>.none_parser_method)NN)r}   r   r@  rM   )rW   rA  rB  r   rC  rJ  rK  r:   )rB  rA  r;   _connect_parser_method  s     
	  z(CliSettingsSource._connect_parser_method)r   r   r   r   r   r   r   r5   c              	   C  s   || _ | |d| _| |d| _| |d| _| |d| _| |d| _|| _i | _i | _	| j
| j| jg | j| jd g d d S )NrD  r   r   r   r   parserr0  
added_args
arg_prefixsubcommand_prefixrI  alias_prefixes)r@  rL  r  _add_argument_add_argument_group_add_parser_add_subparsers_formatter_classr  r  _add_parser_argsr   rS   r~   )rW   r   r   r   r   r   r   r   r:   r:   r;   r    s$    
z&CliSettingsSource._connect_root_parserr   )rN  r0  rO  rP  rQ  rI  rR  r5   c                   s  d }i }	|  |D ]\}
}| ||
|}t|jkr|d krt| j|d| d| jd}| |
 g| j| d< n| j| d | |
  t|drd	| j| d }d| d|_
|d }| j| j||
|j| j|jd	|g | |
 d
| |
 d
d g d q| |
||	\}}d i }t|d< | ||d< | |d  |d< | |j|d< | jon| |d< |d |krqt|jtttttfddrd|d< t|jttfddr|j| j|d < | ||||}t|jkr|d  |d< |d g}|d= |d= d |rH| ddkrH| !||||| ||||
 q|rRqq|d k	rt"|trv| j#|f|}|t|7 }| j$|f fdd|D | q|t|7 }| j$|f fdd|D | q| %||	|||| |S )Nr  r
  )titledestrequiredmetavarr  r  r%  r   )helpr   r   r   rM  --defaultr]  rZ  r[  T)is_strip_annotatedr   actionrB   c                 3  s   | ]}  | V  qd S rT   r:   r   r   arg_flagr:   r;   r   i  s     z5CliSettingsSource._add_parser_args.<locals>.<genexpr>c                 3  s   | ]}  | V  qd S rT   r:   rb  rc  r:   r;   r   l  s     )&r?  r6  rG   rd   rV  r   r  r   r   r  r\  rX  rU  r   rW  rp   r=  r   _help_format_metavar_formatrc   r>  r3  r   setr   r   r   r  _get_arg_namesrL   upperr   _add_parser_submodelsr   rT  rS  _add_parser_alias_paths)rW   rN  r0  rO  rP  rQ  rI  rR  Z
subparsersr7  r]   r   r5  r\  r;  r<  rC  	arg_namesr:   rc  r;   rX    s    
   
  

""z"CliSettingsSource._add_parser_argsztuple[str, ...])rP  rQ  rR  r;  r5   c              	   C  sT   g }|g| D ]@}|D ]6}| || jkr4| | n||dd |  qq|S )NrB   r   )r   r~   r  )rW   rP  rQ  rR  r;  rl  r   r   r:   r:   r;   rh  q  s    z CliSettingsSource._get_arg_names)rN  r5  rO  rP  rQ  rd  rl  rC  r   r;  r5   c                   s   d }i }|d  d|d< | j r6t|dkr6|d jn|	j|d< | js||d  d|d  d|d< | j|f|}| j|f fd	d
|D | |D ]H}| j||| |
d  d||r|n|fdd|
dd  D d qd S )Nr   z optionsrY  r   r   zset z from JSON stringr]  c                 3  s   | ]}  | V  qd S rT   r:   rb  rc  r:   r;   r     s     z:CliSettingsSource._add_parser_submodels.<locals>.<genexpr>r   c                   s   g | ]}  | d qS )r   r:   rb  )rP  r:   r;   r     s     z;CliSettingsSource._add_parser_submodels.<locals>.<listcomp>rM  )	r   r   rp   r   r   r   rT  rS  rX  )rW   rN  r5  rO  rP  rQ  rd  rl  rC  r   r;  Zmodel_groupZmodel_group_kwargsr0  r:   )rd  rP  r;   rj  ~  s0    
 
z'CliSettingsSource._add_parser_submodels)rN  r7  rO  rP  rQ  rI  r5   c                 C  s  |r|}|d k	r.t |tr*| j|f|n|}|d}|rH|d d n|}| D ]\}	}
|rddn|	}	|| jkr~| |	 n||dd |	 }i }t|d< d|d< | |	 |d< |
d	ks|rd	|d
< nd|d< d|d
< ||krT|| | j	|d| f| qTd S )Nr   r  rB   r   r_  zpydantic alias pathr]  rZ  r   r\  r   ra  r   r^  )
r   r   rT  r  r   r~   r  r   r   rS  )rW   rN  r7  rO  rP  rQ  rI  contextZis_nested_alias_pathr   r\  Zarg_namerC  r:   r:   r;   rk    s.    	


z)CliSettingsSource._add_parser_alias_paths)objr5   c                 C  s(   | j st|S tdd t|D S d S )Nc                 S  s   g | ]}|t d k	r|qS rT   r1  r  r:   r:   r;   r     s      z8CliSettingsSource._get_modified_args.<locals>.<listcomp>)r   r,   r   rW   rn  r:   r:   r;   _get_modified_args  s    z$CliSettingsSource._get_modified_args)r   obj_qualnamer5   c                 C  s|   d|kr>|d | dd  dd || dd d  D  }d|}|r\| d| dS t|dkrl|S d| d	S d S )
NJSONr   c                 S  s   g | ]}|d kr|qS )rr  r:   r   r   r:   r:   r;   r     s      z=CliSettingsSource._metavar_format_choices.<locals>.<listcomp>r  r  r  r  r%  )indexr  r   )rW   r   rq  r\  r:   r:   r;   _metavar_format_choices  s    6
z)CliSettingsSource._metavar_format_choicesc                 C  sR  t |}t|tr|jS |dkr$dS t|tr6t|S t|tjrJt|S t|t	t
tfs`|j}tt|r| tt| j| |S t|tjtjfkr| ttt| |S t|tr| dd |D S t|t
r| jtt| j| ||jdS |tdkr| jS t|r$dS t|tr6|jS t|dd	d
d	S dS )z\Pretty metavar representation of a type. Adapts logic from `pydantic._repr.display_as_type`..z...c                 S  s   g | ]
}|j qS r:   r   r   r:   r:   r;   r     s     z=CliSettingsSource._metavar_format_recurse.<locals>.<listcomp>)rq  Nrr  ztyping.rB   ztyping_extensions.)_strip_annotatedr   r   rI   r    reprtyping_extensionsZTypeAliasTyperY   r#   r!   r   ru   r"   r-   ru  r   map_metavar_format_recurserp  Literaltypingr&   r   rK   r   r%   r  ro  r:   r:   r;   rz    s:    


 
z)CliSettingsSource._metavar_format_recursec                 C  s   |  |ddS )Nz, r  )rz  r  ro  r:   r:   r;   rf    s    z!CliSettingsSource._metavar_format)r   r5   c                 C  s   |j r|j nd}| r4t|jkr||r,dnd7 }nZd| j d}|jtd fkr`d|j d}n|jd k	rxd|j d}||rd| n|7 }tt	| j
tr|ddS |S )	NrB   z (required)z
(required)z
(default: rw    %z%%)r   r>  rL   rd   r   r_  r)   default_factory
issubclassr   r@  r   r  )rW   r   Z_helpr_  r:   r:   r;   re    s    

zCliSettingsSource._help_format)N)%rI   rJ   rK   rp   r   
parse_argsadd_argumentadd_argument_groupr	   
add_parseradd_subparsersr   rX   r   ro   r   r  r  r  r  r6  r=  r?  propertyr   rL  r  rX  rh  rj  rk  rp  ru  rz  rf  re  ry   r:   r:   rt   r;   r   +  sv   (6W$5#(_"%#	"r   c                   @  s0   e Zd ZdddddZeddddd	Zd
S )ConfigFileSourceMixinPathType | Nonerm   )filesr5   c                 C  sX   |d kri S t |ttjfr"|g}i }|D ](}t| }| r*|| | q*|S rT   )	r   rY   r   r   r   r   r   r   
_read_file)rW   r  r  file	file_pathr:   r:   r;   _read_files
  s    z!ConfigFileSourceMixin._read_filesr   )r   r5   c                 C  s   d S rT   r:   )rW   r   r:   r:   r;   r    s    z ConfigFileSourceMixin._read_fileN)rI   rJ   rK   r  r   r  r:   r:   r:   r;   r  	  s   r  c                      s@   e Zd ZdZedfdddd fddZd	d
dddZ  ZS )JsonConfigSettingsSourcez>
    A source class that loads variables from a JSON file
    NrR   r  r|   )rS   	json_filejson_file_encodingc                   sV   |t kr|n
|jd| _|d k	r&|n
|jd| _| | j| _t || j d S )Nr  r  )	rD   rU   r   Zjson_file_pathr  r  Z	json_datars   rX   )rW   rS   r  r  rt   r:   r;   rX      s    
z!JsonConfigSettingsSource.__init__r   rm   r  r5   c              
   C  s0   t || jd}t|W  5 Q R  S Q R X d S Nr   )openr  rk   load)rW   r  r  r:   r:   r;   r  /  s    z#JsonConfigSettingsSource._read_filerI   rJ   rK   rp   rD   rX   r  ry   r:   r:   rt   r;   r    s
   r  c                      s<   e Zd ZdZefddd fddZddd	d
dZ  ZS )TomlConfigSettingsSourcez>
    A source class that loads variables from a TOML file
    rR   r  )rS   	toml_filec                   s<   |t kr|n
|jd| _| | j| _t || j d S )Nr  )rD   rU   r   toml_file_pathr  	toml_datars   rX   )rW   rS   r  rt   r:   r;   rX   9  s    z!TomlConfigSettingsSource.__init__r   rm   r  c              
   C  sT   t   t|dd8}tjdk r4t|W  5 Q R  S t|W  5 Q R  S Q R X d S )Nrb)moder/   )rA   r  r=   r>   r?   r  r@   )rW   r  r  r:   r:   r;   r  B  s
    
z#TomlConfigSettingsSource._read_filer  r:   r:   rt   r;   r  4  s   	r  c                      sB   e Zd ZdZddddd fddZedd	d
dddZ  ZS )!PyprojectTomlConfigSettingsSourcezK
    A source class that loads variables from a `pyproject.toml` file.
    NrR   r   r3   )rS   r  r5   c                   sj   |  ||jdd| _|jdd| _| | j| _| jD ]}| j|i | _q<tt| 	|| j d S )NZpyproject_toml_depthr   Zpyproject_toml_table_header)Ztoolzpydantic-settings)
_pick_pyproject_toml_filerU   r   r  Ztoml_table_headerr  r  rs   r  rX   )rW   rS   r  r   rt   r:   r;   rX   O  s      
z*PyprojectTomlConfigSettingsSource.__init__intr   )provideddepthr5   c                 C  sp   | r|   S t d }d}| sl|jjd }||k rl| rD|S t|j|jkrVql|jjd }|d7 }q0|S )zPick a `pyproject.toml` file path to use.

        Args:
            provided: Explicit path provided when instantiating this class.
            depth: Number of directories up the tree to check of a pyproject.toml.

        zpyproject.tomlr   r   )resolver   cwdr   parentrY   root)r  r  rvr'  childr:   r:   r;   r  _  s    	
z;PyprojectTomlConfigSettingsSource._pick_pyproject_toml_file)N)rI   rJ   rK   rp   rX   r   r  ry   r:   r:   rt   r;   r  J  s
    r  c                      s@   e Zd ZdZedfdddd fddZd	d
dddZ  ZS )YamlConfigSettingsSourcez>
    A source class that loads variables from a yaml file
    NrR   r  r|   )rS   	yaml_fileyaml_file_encodingc                   sV   |t kr|n
|jd| _|d k	r&|n
|jd| _| | j| _t || j d S )Nr  r  )	rD   rU   r   Zyaml_file_pathr  r  Z	yaml_datars   rX   )rW   rS   r  r  rt   r:   r;   rX   }  s    
z!YamlConfigSettingsSource.__init__r   rm   r  c              
   C  s6   t   t|| jd}t|W  5 Q R  S Q R X d S r  )r<   r  r  r6   Z	safe_load)rW   r  r  r:   r:   r;   r    s    z#YamlConfigSettingsSource._read_filer  r:   r:   rt   r;   r  x  s
   r  FrY   r`   )r   r}   r5   c                 C  s   |r| S |   S rT   r8  )r   r}   r:   r:   r;   _get_env_var_key  s    r  r|   zstr | None | EnvNoneType)rg   r   r5   c                 C  s   | |kr|d k	s| S t | S rT   )rO   )rg   r   r:   r:   r;   _parse_env_none_str  s    r  r   )r   r}   r   r   r5   c                   s    fdd|   D S )Nc                   s.   i | ]&\}}r|d kst | t|qS )rB   )r  r  )r   kvr}   r   r   r:   r;   r    s
     z"parse_env_vars.<locals>.<dictcomp>)r   )r   r}   r   r   r:   r  r;   r     s    r   r   r   )r  r   r}   r   r   r5   c                C  s   t | |p
dd}t||||S )Nutf8r  )r   r   )r  r   r}   r   r   Z	file_varsr:   r:   r;   r     s    r   r)  z	list[Any])rc   rd   r5   c                 C  sb   t dd |D rdS t| tr6t| ^}}t||S t| }t| p`t|p`t|dp`t|dS )Nc                 s  s   | ]}t |tV  qd S rT   )r   r   )r   mdr:   r:   r;   r     s     z)_annotation_is_complex.<locals>.<genexpr>FZ__pydantic_core_schema__Z__get_pydantic_core_schema__)r   r   r+   r,   rb   r-   _annotation_is_complex_innerr   )rc   rd   innermetaoriginr:   r:   r;   rb     s    

rb   )rc   r5   c              	   C  s2   t | ttfrdS t | ttttttt	fp0t
| S r   )r&   rY   bytesr   r   r   r   rg  	frozensetr
   r   rc   r:   r:   r;   r    s
    r  c                   s   t  fddt| D S )Nc                 3  s   | ]}t | V  qd S rT   )rb   rs  rd   r:   r;   r     s     z$_union_is_complex.<locals>.<genexpr>)r   r,   )rc   rd   r:   r  r;   r     s    r   Tztuple[Any, ...])rc   typesr2  r`  r5   c                 C  sP   |rt | } |dkr$t| |kr$dS t| D ]}t||d|dr, dS q,| |kS )NT)r2  r`  )rv  r-   r,   r3  )rc   r  r2  r`  r   r:   r:   r;   r3    s    r3  r   c                 C  s   t | tkrt| d } q | S )Nr   )r-   r*   r,   r  r:   r:   r;   rv    s    rv  )F)N)FFN)TF)s
__future__r   Z_annotationsrk   r   rG  rF  r=   r|  r   abcr   r   argparser   r   r   r   r	   collectionsr
   dataclassesr   enumr   pathlibr   r  r   r   r   r   r   r   r   r   r   r   r   r   r   rx  Zdotenvr   Zpydanticr   r   r   r   Zpydantic._internal._reprr    Z pydantic._internal._typing_extrar!   r"   r#   Zpydantic._internal._utilsr$   r%   r&   Zpydantic.dataclassesr'   Zpydantic.fieldsr(   Zpydantic_corer)   r*   r+   r,   r-   Zpydantic_settings.utilsr.   r>   r@   r?   r6   Zpydantic_settings.mainr2   r<   rA   rY   rE   rC   rD   __annotations__rF   rG   rL   rM   rN   ZCliSubCommandZCliPositionalArgrO   r   rP   rQ   rq   rz   r   r   r   r   r  r  r  r  r  r  r  r   r   rb   r  r   r3  rv  r:   r:   r:   r;   <module>   s    8

,,I :] gY     c.   	  