
    i4                       d dl mZ d dl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mZ ddlm Z m!Z!m"Z"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+dS )    )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EnvPrefixTarget)_annotation_contains_types_annotation_enum_name_to_val_annotation_is_complex_get_model_fields_literal_has_numeric_enum_union_has_strict_types_union_is_complexparse_env_vars)BaseSettingsc                  z     e Zd ZdZ	 	 	 	 	 	 	 	 d,d- fdZd.dZd/dZd0d Zd1d"Z	 d2d3d&Z	d4d)Z
d5d*Zd6d+Z xZS )7EnvSettingsSourcezN
    Source class for loading settings values from environment variables.
    Nsettings_clstype[BaseSettings]case_sensitivebool | None
env_prefix
str | Noneenv_prefix_targetEnvPrefixTarget | Noneenv_nested_delimiterenv_nested_max_split
int | Noneenv_ignore_emptyenv_parse_none_strenv_parse_enumsreturnNonec
           	     h   t                                          |||||||	           ||n| j                            d          | _        ||n| j                            d          | _        | j        pddz
  | _        t          | j                  | _	        | 
                                | _        d S )Nr*   r+   r      )super__init__configgetr*   r+   maxsplitlenr&   env_prefix_len_load_env_varsenv_vars)selfr"   r$   r&   r(   r*   r+   r-   r.   r/   	__class__s             n/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/env.pyr5   zEnvSettingsSource.__init__*   s     		
 	
 	
 %9$D  $+//ZpJqJq 	! %9$D  $+//ZpJqJq 	! 27a1<!$/22++--    Mapping[str, str | None]c                X    t          t          j        | j        | j        | j                  S N)r   osenvironr$   r-   r.   r=   s    r?   r;   z EnvSettingsSource._load_env_varsJ   s"    bj$*=t?TVZVmnnnr@   fieldr   
field_namestrtuple[Any, str, bool]c                    d}|                      ||          D ]$\  }}}| 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<   r7   )r=   rG   rH   env_val	field_keyenv_namevalue_is_complexs          r?   get_field_valuez!EnvSettingsSource.get_field_valueM   sf     #595M5MeU_5`5` 	 	1Ix!1m''11G" # 	#333r@   valuer   rP   boolc                   |                      |          \  }}| j        rt          |j        |          }||n|}|s|rt	          |t
                    r|S |"|                     ||| j                  }|r|S dS 	 |                     |||          }n# t          $ r}	|s|	Y d}	~	nd}	~	ww xY wt	          |t                    r*t          ||                     ||| j                            S |S ||                     ||          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.
        N)_field_is_complexr/   r   
annotation
isinstancer   explode_env_varsr<   decode_complex_value
ValueErrordictr   _coerce_env_val_strict)
r=   rH   rG   rR   rP   
is_complexallow_parse_failureenum_valenv_val_builtes
             r?   prepare_field_valuez%EnvSettingsSource.prepare_field_valueb   sl   " +/*@*@*G*G'
' 	<3E4DeLLH%-EE8E 	=) 	=%-- ! $ 5 5j% W W  )(() )  55j%OOEE!      .             eT** !&ud.C.CJPUW[Wd.e.efff L..ue<<< s   ;B 
B+B&&B+tuple[bool, bool]c                    |                      |          rd}n@t          t          |j                            rt	          |j        |j                  rd}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)field_is_complexr   r   rV   r   metadata)r=   rG   r^   s      r?   rU   z#EnvSettingsSource._field_is_complex   sr       '' 	 "'Z(899:: 	 ?PQVQachcq?r?r 	 "&<(((r@   FieldInfo | Any | NonekeyFieldInfo | Nonec                   |sdS t          |t                    r|j        n|}t          |          D ]}|                     |||          }|r|c S  t          t          |          t                    rt          |          d         S t          |          st          |          rt          |          }|                                D ]\  }}	|                     |	|          D ]w\  }
}}
||r||k    s||k    r|	c c S |                                |                                k    s*|                                |                                k    r|	c c S xd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)rW   r   rV   r   
next_fieldr   r   r[   r   r   r   itemsrL   lower)r=   rG   rh   r$   rV   type_type_has_keyfieldsrH   f_rO   s               r?   rl   zEnvSettingsSource.next_field   s   @  	4)3E9)E)EPU%%5
j)) 	$ 	$E??5#~FFL $####$z*55t<< 	!J''++J'' 
	!+@+L+L 
	!&z22F "( ! !
A&*&>&>q*&M&M ! !NAx%--%,,C#$HHHHH 1@#))++syy{{::hnn>N>NRUR[R[R]R]>]>]  ?^	! tr@   r<   dict[str, Any]c                     j         si S |j        }|t          u p!t          t	          |          t                    } fd                     ||          D             }i }|                                D ]\  }	 t          fd|D                       }	n# t          $ r Y /w xY wt          |	          d         }
|

                     j          j                  ^ }}|}|}|D ]I}                     || j                  }t          |t                    r|                    |i           }J                     || j                  }|s|r|rt          |t                     r;                     |          \  }} j        rt'          |j        |          }||n|}n|rt)          |g           }d}nd\  }}|rM	 t          |t                     r|nd}                     |||          }n# t,          $ r}|s|Y d}~nd}~ww xY wt          |t                    r>||vs!t          |t.                    r||         i k    r                     ||          ||<   |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                .    g | ]\  }}}| j          S  )r*   ).0rs   rO   r=   s      r?   
<listcomp>z6EnvSettingsSource.explode_env_vars.<locals>.<listcomp>   s:     
 
 
9GHax4244
 
 
r@   c              3  F   K   | ]}                     |          |V  d S rC   )
startswith)rx   prefixrO   s     r?   	<genexpr>z5EnvSettingsSource.explode_env_vars.<locals>.<genexpr>   s7      [[x?R?RSY?Z?Z[f[[[[[[r@   NT)TT)r*   rV   r[   r   r   rL   rm   nextStopIterationr9   splitr8   rl   r$   rW   
setdefaultr   rU   r/   r   r   rY   rZ   r   r\   )r=   rH   rG   r<   annis_dictprefixesresultrM   r|   env_name_without_prefixkeyslast_keyenv_vartarget_fieldrh   r]   allow_json_failurer_   
field_infora   rO   s   `                    @r?   rX   z"EnvSettingsSource.explode_env_vars   s    ( 	I+K!4Z__d!K!K
 
 
 
KOKcKcdikuKvKv
 
 
 "$!)!1!1 )	[ )	[Hg[[[[8[[[[[     '/s6{{}}&=#5;;D<UW[WdeeOT8G-2L : :#|S$BUVVgt,, :%00b99G  ??<4CVWWL  $ $W $lI66 @595K5KL5Y5Y2J 2+ L#?@WY`#a#a-5-=''8! @!7b!I!IJ)-&& 6@2J 2 $$5?i5X5X%b\\^b
"&";";HjRY"Z"Z% $ $ $1 $"#G$ $ $ $ $$ '4(( [7***Wk2R2R*V]^fVgkmVmVm(,(C(CLRY(Z(ZGH%s*   =B
B&%B&0G33
H=HHc                   	 | j                             d          }|s^t          |t                    rIt	          t          |j                            ot          |j                  pt          |j                  }|rt          |t                    rt          |t                    r|| j
        k    r|S t          |j        t          fd          s	 t          |j                                      |          S # t          $ rq 	 t!          j        |          }n# t$          t           j        f$ r  w xY wt          |t                    s)t          |j                                      |          cY S  w xY wn# t          $ r Y nw xY w|S )a  
        Coerce environment string values based on field annotation if model config is `strict=True`
        or if the field annotation contains strict-annotated types (e.g. Optional[StrictBool]).

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

        Returns:
            The coerced value if successful, otherwise the original value.
        strictT)is_instance)r6   r7   rW   r   r   r   rV   r   r   rI   r.   r   r	   r
   validate_pythonr   jsonloadsrZ   JSONDecodeError)r=   rG   rR   should_coercedecodeds        r?   r\   z(EnvSettingsSource._coerce_env_val_strict  s   	 KOOH55M  AZy%A%A A#Ju/?$@$@AAoF]^c^nFoFo!A.u/?@@   E3!7!7 Jui<X<X D333 L1%2BTGY]^^^ 
*5+;<<LLUSSS*   "&*j&7&7GG *D,@A " " "!")'377 Z#.u/?#@#@#P#PQX#Y#YYYY  	 	 	D	 sN   B2E9 5E9 &C: :
E5DE5D22?E51E9 3E55E9 9
FFc                @    | j         j         d| j        d| j        dS )Nz(env_nested_delimiter=z, env_prefix_len=))r>   __name__r*   r:   rF   s    r?   __repr__zEnvSettingsSource.__repr__B  s=    ~& 7 7d>W 7 7"17 7 7	
r@   )NNNNNNNN)r"   r#   r$   r%   r&   r'   r(   r)   r*   r'   r+   r,   r-   r%   r.   r'   r/   r%   r0   r1   )r0   rA   )rG   r   rH   rI   r0   rJ   )
rH   rI   rG   r   rR   r   rP   rS   r0   r   )rG   r   r0   rc   rC   )rG   rg   rh   rI   r$   r%   r0   ri   )rH   rI   rG   r   r<   rA   r0   rt   )rG   ri   rR   r   r0   r   )r0   rI   )r   
__module____qualname____doc__r5   r;   rQ   rb   rU   rl   rX   r\   r   __classcell__)r>   s   @r?   r!   r!   %   s         '+!%48+/+/(,)-'+. . . . . . .@o o o o4 4 4 4*,= ,= ,= ,=\) ) ) )" VZ6 6 6 6 6pB B B BH$ $ $ $L
 
 
 
 
 
 
 
r@   r!   ),
__future__r   _annotationsr   rD   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   r   r   r   r   pydantic_settings.mainr   r!   __all__rw   r@   r?   <module>r      s   2 2 2 2 2 2  				 # # # # # #            8 7 7 7 7 7 7 7 7 7 A A A A A A A A 6 6 6 6 6 6 % % % % % % ; ; ; ; ; ; ( ( ( ( ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  4333333a
 a
 a
 a
 a
5 a
 a
 a
H	 
r@   