
    ~<i-                        d dl mZ d dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZmZ d dl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m Z m!Z!m"Z" erd dl#m$Z$  G d de      Z%dgZ&y)    )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                       e Zd ZdZ	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZddZddZddZ	 d	 	 	 	 	 	 	 ddZ	ddZ
dd	Zdd
Z xZS )EnvSettingsSourcezN
    Source class for loading settings values from environment variables.
    c	                L   t         	|   ||||||       ||n| j                  j                  d      | _        ||n| j                  j                  d      | _        | j
                  xs ddz
  | _        t        | j                        | _	        | j                         | _        y )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
            l/home/www/utuvibe.miabetepe.com/venv/lib/python3.12/site-packages/pydantic_settings/sources/providers/env.pyr#   zEnvSettingsSource.__init__&   s     	.*6FHZ\k	
 %9$D $++//ZpJq 	! %9$D $++//ZpJq 	! 227a1<!$//2++-    c                v    t        t        j                  | j                  | j                  | j
                        S N)r   osenvironr.   r/   r0   r,   s    r3   r*   z EnvSettingsSource._load_env_vars?   s*    bjj$*=*=t?T?TVZVmVmnnr4   c                    d}| j                  ||      D ]%  \  }}}| j                  j                  |      }|% n |fS )ah  
        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          r3   get_field_valuez!EnvSettingsSource.get_field_valueB   s[     #595M5MeU_5` 	1Ix!1mm''1G"	
 	#333r4   c                   | j                  |      \  }}| j                  rt        |j                  |      }||n|}|s|rt	        |t
              r|S |!| j                  ||| j                        }|rO|S 	 | j                  |||      }t	        |t              r't        || j                  ||| j                              S |S y|| j                  ||      S y# t        $ r}	|s|	Y d}	~	ad}	~	ww xY w)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.
        N)_field_is_complexr1   r   
annotation
isinstancer   explode_env_varsr+   decode_complex_value
ValueErrordictr   _coerce_env_val_strict)
r,   r=   r<   valuerA   
is_complexallow_parse_failureenum_valenv_val_builtes
             r3   prepare_field_valuez%EnvSettingsSource.prepare_field_valueW   s   " +/*@*@*G'
'3E4D4DeLH%-E8E)%- $ 5 5j% W ((  55j%OE
 eT*&ud.C.CJPUW[WdWd.eff L ! ..ue<<  "  . / s   7C 	C0"C++C0c                    | j                  |      rd}d|fS t        t        |j                              r&t	        |j                  |j
                        rd}d|fS y)za
        Find out if a field is complex, and if so whether JSON errors should be ignored
        FT)FF)field_is_complexr   r   rE   r   metadata)r,   r<   rN   s      r3   rD   z#EnvSettingsSource._field_is_complex   sl       '"' ((( Z(8(89:?PQVQaQachcqcq?r"& (((  r4   c                   |syt        |t              r|j                  n|}t        |      D ]  }| j	                  |||      }|s|c S  t        |      st        |      rt        |      }|j                         D ]}  \  }}	| j                  |	|      D ]c  \  }
}}
||r||k(  s||k(  s|	c c S |j                         |j                         k(  s"|j                         |j                         k(  s_|	c c S   y)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)rF   r   rE   r   
next_fieldr   r   r   itemsr;   lower)r,   r<   keyr.   rE   type_type_has_keyfieldsr=   f_r@   s               r3   rW   zEnvSettingsSource.next_field   s    @ )3E9)EU%%5
j) 	$E??5#~FL##	$ *%)>z)J&z2F "( !
A&*&>&>q*&M !NAx%-%,C#$H#))+syy{:hnn>NRUR[R[R]>] !! r4   c                2   | j                   si S |j                  }|t        u xs t        t	        |      t              }| j                  ||      D cg c]  \  }}}| | j                     }}}i }	|j                         D ]_  \  }
	 t        fd|D              }t        |      d }|j                  | j                   | j                        ^ }}|	}|}|D ]B  }| j                  ||| j                        }t        |t              s1|j                  |i       }D | j                  ||| j                        }|s|r\|
rZ|r=| j!                  |      \  }}| j"                  r"t%        |j                  |
      }||
n|}
nd\  }}|r	 | j'                  |||
      }
t        |t              s-||vst        |
t*              r
||   i k(  sK| j-                  ||
      ||<   b |	S c c}}w # t        $ r Y ww xY w# t(        $ r}|s|Y d}~rd}~ww xY w)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              3  F   K   | ]  }j                  |      s|  y wr6   )
startswith).0prefixr@   s     r3   	<genexpr>z5EnvSettingsSource.explode_env_vars.<locals>.<genexpr>   s     [x?R?RSY?Zf[s   !!N)TT)r   rE   rJ   r   r   r;   rX   nextStopIterationr'   splitr&   rW   r.   rF   
setdefaultrD   r1   r   rH   rI   r   rK   )r,   r=   r<   r+   annis_dictr_   r@   prefixesresultr>   rd   env_name_without_prefixkeyslast_keyenv_vartarget_fieldrZ   rM   allow_json_failurerO   rQ   s          `              r3   rG   z"EnvSettingsSource.explode_env_vars   sK    ((I+K!4Z_d!K LPKcKcdikuKv
9GHaxj2234
 
 "$!)!1 $	[Hg[8[[ '/s6{}&=#5;;D<U<UW[WdWdeOT8G-2L :#|S$BUBUVgt,%00b9G:  ??<4CVCVWL W595K5KL5Y2J 2++#?@W@WY`#a-5-='8 6@2J 2$"&";";HlT["\ '4(7**Wk2RV]^fVgkmVm(,(C(CLRY(ZGH%I$	[J S
 ! 8 & $1"#G  2$s0   G)G/G?/	G<;G<?	HHHc                &   	 | j                   j                  d      rdt        |t              rT|R|| j                  k(  r|S t        |j                  t        fd      s$t        |j                        j                  |      S |S # t        $ r Y |S w xY w)a   
        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%   rF   strr0   r   rE   r	   r
   validate_pythonr   )r,   r<   rL   s      r3   rK   z(EnvSettingsSource._coerce_env_val_strict	  s    	{{x(Zs-CHYD333 L1%2B2BTGY]^&u'7'78HHOO   		s   =B  A B 	BBc                h    | j                   j                   d| j                  d| j                  dS )Nz(env_nested_delimiter=z, env_prefix_len=))r2   __name__r   r)   r9   s    r3   __repr__zEnvSettingsSource.__repr__  s>    ~~&&''=d>W>W=Z ["114A7	
r4   )NNNNNNN)r-   ztype[BaseSettings]r.   bool | Noner(   
str | Noner   r~   r    z
int | Noner/   r}   r0   r~   r1   r}   returnNone)r   Mapping[str, str | None])r<   r   r=   rw   r   ztuple[Any, str, bool])
r=   rw   r<   r   rL   r   rA   boolr   r   )r<   r   r   ztuple[bool, bool]r6   )r<   zFieldInfo | Any | NonerZ   rw   r.   r}   r   FieldInfo | None)r=   rw   r<   r   r+   r   r   zdict[str, Any])r<   r   rL   r   r   r   )r   rw   )r{   
__module____qualname____doc__r#   r*   rB   rR   rD   rW   rG   rK   r|   __classcell__)r2   s   @r3   r   r   !   s     '+!%+/+/(,)-'+.(. $. 	.
 ). ). &. '. %. 
.2o4*,=\)" VZ3+3253GR3	3j=~,
r4   r   )'
__future__r   _annotationsr7   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__ r4   r3   <module>r      sa    2 	 #  8 7 A 6 % ; ( 0   3B
5 B
J 
r4   