
    <'i-                        S SK Jr  S SKrS SKJr  S SKJrJrJ	r	J
r
  S SKJrJrJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S
SKJr  SSKJr  SSKJr  SSKJrJrJ r J!r!J"r"  \(       a  S SK#J$r$   " S S\5      r%S/r&g)    )annotationsN)Mapping)TYPE_CHECKINGAnyget_args
get_origin)JsonTypeAdapterValidationError)deep_updateis_model_class)is_pydantic_dataclass)	FieldInfo)is_union_origin   )_lenient_issubclass   )PydanticBaseEnvSettingsSource)EnvNoneType)_annotation_contains_types_annotation_enum_name_to_val_get_model_fields_union_is_complexparse_env_vars)BaseSettingsc                     ^  \ rS rSrSr       S                 SU 4S jjjrSS jrSS jrSS jrSS jr	 S       SS jjr
SS	 jrSS
 jrSS jrSrU =r$ )EnvSettingsSource!   zF
Source class for loading settings values from environment variables.
c	                T  > [         T	U ]  XX6Xx5        Ub  UOU R                  R                  S5      U l        Ub  UOU R                  R                  S5      U l        U R
                  =(       d    SS-
  U l        [        U R                  5      U l	        U R                  5       U l        g )Nenv_nested_delimiterenv_nested_max_splitr      )super__init__configgetr    r!   maxsplitlen
env_prefixenv_prefix_len_load_env_varsenv_vars)
selfsettings_clscase_sensitiver)   r    r!   env_ignore_emptyenv_parse_none_strenv_parse_enums	__class__s
            Glib/python3.13/site-packages/pydantic_settings/sources/providers/env.pyr$   EnvSettingsSource.__init__&   s     	*HZ	
 %9$D $++//ZpJq 	! %9$D $++//ZpJq 	! 227a1<!$//2++-    c                v    [        [        R                  U R                  U R                  U R
                  5      $ N)r   osenvironr/   r0   r1   r-   s    r4   r+    EnvSettingsSource._load_env_vars?   s*    bjj$*=*=t?T?TVZVmVmnnr6   c                    SnU R                  X5       H&  u  pEnU R                  R                  U5      nUc  M&    O   UWW4$ )a(  
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 that contains the value (`None` if not found), key, and
        a flag to determine whether value is complex.
N)_extract_field_infor,   r&   )r-   field
field_nameenv_val	field_keyenv_namevalue_is_complexs          r4   get_field_value!EnvSettingsSource.get_field_valueB   sR     #595M5Me5`1I!1mm''1G" 6a
 	#333r6   c                (   U R                  U5      u  pVU R                  (       a  [        UR                  U5      nUc  UOUnU(       d  U(       a  [	        U[
        5      (       a  U$ Uc&  U R                  XU R                  5      nU(       a  U$ g U R                  XU5      n[	        U[        5      (       a%  [        X0R                  XU R                  5      5      $ U$ Ub  U R                  X#5      $ g! [         a  n	U(       d  U	e Sn	A	NiSn	A	ff = f)aN  
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.
N)_field_is_complexr2   r   
annotation
isinstancer   explode_env_varsr,   decode_complex_value
ValueErrordictr   _coerce_env_val_strict)
r-   r@   r?   valuerD   
is_complexallow_parse_failureenum_valenv_val_builtes
             r4   prepare_field_value%EnvSettingsSource.prepare_field_valueW   s   " +/*@*@*G'
3E4D4DeLH%-E8E)%-- $ 5 5j W (( !  55jOE
 eT**&u.C.CJW[WdWd.eff L..u<<  "  . / s   C4 4
D>	DDc                    U R                  U5      (       a  SnSU4$ [        [        UR                  5      5      (       a+  [	        UR                  UR
                  5      (       a  SnSU4$ g)zQ
Find out if a field is complex, and if so whether JSON errors should be ignored
FT)FF)field_is_complexr   r   rI   r   metadata)r-   r?   rR   s      r4   rH   #EnvSettingsSource._field_is_complex   su       ''"' ((( Z(8(89::?PQVQaQachcqcq?r?r"& (((  r6   c                B   U(       d  g[        U[        5      (       a  UR                  OUn[        U5       H   nU R	                  XRU5      nU(       d  M  Us  $    [        U5      (       d  [        U5      (       a  [        U5      nUR                  5        H  u  pU R                  X5       Hl  u  pn
Ub  U(       a  X:X  d  X:X  a  U	s  s  $ M"  UR                  5       UR                  5       :X  d$  UR                  5       UR                  5       :X  d  Mh  U	s  s  $    M     g)a  
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)rJ   r   rI   r   
next_fieldr   r   r   itemsr>   lower)r-   r?   keyr/   rI   type_type_has_keyfieldsr@   f_rC   s               r4   r]   EnvSettingsSource.next_field   s    @ )3E9)E)EU%%5
j)E??5~FL|## * *%%)>z)J)J&z2F "(
&*&>&>q&MNA%-%,#$H 1@#))+syy{:hnn>NRUR[R[R]>]  'N "0 r6   c                  ^ U R                   (       d  0 $ UR                  nU[        L =(       d    [        [	        U5      [        5      nU R                  X!5       VVs/ s H  u  pgog U R                    3PM     nnn0 n	UR                  5        GH  u  mn
 [        U4S jU 5       5      nT[        U5      S nUR                  U R                   U R                  5      Gt pU	nUnU HI  nU R                  UUU R                  5      n[        U[        5      (       d  M7  UR                  U0 5      nMK     U R                  UXR                  5      nU(       d  U(       aq  U
(       aj  U(       aC  U R!                  U5      u  nnU R"                  (       a  [%        UR                  U
5      nUc  U
OUn
OSu  nnU(       a   U R'                  UUU
5      n
[        U[        5      (       d  GMY  X;  d   [        U
[*        5      (       a  X   0 :X  d  GM~  U R-                  UU
5      X'   GM     U	$ s  snnf ! [         a     GM  f = f! [(         a  nU(       d  Ue SnANSnAff = f)aa  
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              3  X   >#    U  H  nTR                  U5      (       d  M  Uv   M!     g 7fr8   )
startswith).0prefixrC   s     r4   	<genexpr>5EnvSettingsSource.explode_env_vars.<locals>.<genexpr>   s!     [8x?R?RSY?Zff8s   *	*N)TT)r    rI   rN   r   r   r>   r^   nextStopIterationr(   splitr'   r]   r/   rJ   
setdefaultrH   r2   r   rL   rM   r   rO   )r-   r@   r?   r,   annis_dictre   rC   prefixesresultrA   rk   env_name_without_prefixkeyslast_keyenv_vartarget_fieldr`   rQ   allow_json_failurerS   rU   s          `              r4   rK   "EnvSettingsSource.explode_env_vars   s:    ((I+K!4Z_d!K LPKcKcdiKv
Kvaj2234Kv 	 
 "$!)!1Hg[8[[ '/s6{}&=#5;;D<U<UW[WdWdeOTG-2L#|S$BUBUVgt,,%00b9G   ??<CVCVWL W595K5KL5Y2J 2++#?@W@WY`#a-5-='8 6@2J 2$"&";";HlT["\ '4((**Wk2R2RV]VgkmVm(,(C(CLRY(ZG%I "2J S
 ! 8 & $1"#G  2$s0   H'H-<H?-
H<;H<?
I		IIc                B    U R                   R                  S5      (       al  [        U[        5      (       aW  UbT  X R                  :X  a  U$ [        UR                  [        4SS9(       d$  [        UR                  5      R                  U5      $ U$ ! [         a     U$ f = f)z
Coerce environment string values based on field annotation if model config is `strict=True`.

Args:
    field: The field.
    value: The value to coerce.

Returns:
    The coerced value if successful, otherwise the original value.
strictT)is_instance)r%   r&   rJ   strr1   r   rI   r	   r
   validate_pythonr   )r-   r?   rP   s      r4   rO   (EnvSettingsSource._coerce_env_val_strict	  s    	{{x((Zs-C-CHY333 L1%2B2BTGY]^&u'7'78HHOO   		s   AB AB 
BBc                l    U R                   R                   SU R                  < SU R                  < S3$ )Nz(env_nested_delimiter=z, env_prefix_len=))r3   __name__r    r*   r;   s    r4   __repr__EnvSettingsSource.__repr__  s>    ~~&&''=d>W>W=Z ["114A7	
r6   )r    r!   r*   r,   r'   )NNNNNNN)r.   ztype[BaseSettings]r/   bool | Noner)   
str | Noner    r   r!   z
int | Noner0   r   r1   r   r2   r   returnNone)r   Mapping[str, str | None])r?   r   r@   r   r   ztuple[Any, str, bool])
r@   r   r?   r   rP   r   rD   boolr   r   )r?   r   r   ztuple[bool, bool]r8   )r?   zFieldInfo | Any | Noner`   r   r/   r   r   FieldInfo | None)r@   r   r?   r   r,   r   r   zdict[str, Any])r?   r   rP   r   r   r   )r   r   )r   
__module____qualname____firstlineno____doc__r$   r+   rE   rV   rH   r]   rK   rO   r   __static_attributes____classcell__)r3   s   @r4   r   r   !   s     '+!%+/+/(,)-'+.(. $. 	.
 ). ). &. '. %. 
. .2o4*,=\)" VZ3+3253GR3	3j=~,
 
r6   r   )'
__future__r   _annotationsr9   collections.abcr   typingr   r   r   r   pydanticr	   r
   r   pydantic._internal._utilsr   r   pydantic.dataclassesr   pydantic.fieldsr   typing_inspection.introspectionr   utilsr   baser   typesr   r   r   r   r   r   pydantic_settings.mainr   r   __all__ r6   r4   <module>r      sa    2 	 #  8 7 A 6 % ; ( 0   3B
5 B
J 
r6   