
    h,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+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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                       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
           	     N   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,   env_prefix_targetr#   r$   env_ignore_emptyenv_parse_none_strenv_parse_enums	__class__s             w/var/www/hypershopcomercio.com.br/hyper-ai/venv/lib/python3.12/site-packages/pydantic_settings/sources/providers/env.pyr'   zEnvSettingsSource.__init__*   s     		
 %9$D $++//ZpJq 	! %9$D $++//ZpJq 	! 227a1<!$//2++-    c                v    t        t        j                  | j                  | j                  | j
                        S N)r   osenvironr2   r4   r5   r0   s    r8   r.   z EnvSettingsSource._load_env_varsJ   s*    bjj$*=*=t?T?TVZVmVmnnr9   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)   )r0   field
field_nameenv_val	field_keyenv_namevalue_is_complexs          r8   get_field_valuez!EnvSettingsSource.get_field_valueM   s[     #595M5MeU_5` 	1Ix!1mm''1G"	
 	#333r9   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_complexr6   r   
annotation
isinstancer   explode_env_varsr/   decode_complex_value
ValueErrordictr   _coerce_env_val_strict)
r0   rB   rA   valuerF   
is_complexallow_parse_failureenum_valenv_val_builtes
             r8   prepare_field_valuez%EnvSettingsSource.prepare_field_valueb   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   rJ   r   metadata)r0   rA   rS   s      r8   rI   z#EnvSettingsSource._field_is_complex   sl       '"' ((( Z(8(89:?PQVQaQachcqcq?r"& (((  r9   c                H   |syt        |t              r|j                  n|}t        |      D ]  }| j	                  |||      }|s|c S  t        t        |      t              rt        |      d   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)rK   r   rJ   r   
next_fieldr   r   rO   r   r   r   itemsr@   lower)r0   rA   keyr2   rJ   type_type_has_keyfieldsrB   f_rE   s               r8   r]   zEnvSettingsSource.next_field   s   @ )3E9)EU%%5
j) 	$E??5#~FL##	$ z*5t<J'++J'+@+L&z2F "( !
A&*&>&>q*&M !NAx%-%,C#$H#))+syy{:hnn>NRUR[R[R]>] !! r9   c                   | 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|
rt        |t               r=| j#                  |      \  }}| j$                  r3t'        |j                  |
      }||
n|}
n|rt)        |g       }d}nd\  }}|r(	 t        |t               r|nd}| j+                  |||
      }
t        |t              s`||vst        |
t.              r
||   i k(  s~| j1                  ||
      ||<    |	S c c}}w # t        $ r Y w 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r;   )
startswith).0prefixrE   s     r8   	<genexpr>z5EnvSettingsSource.explode_env_vars.<locals>.<genexpr>   s     [x?R?RSY?Zf[s   !!NT)TT)r#   rJ   rO   r   r   r@   r^   nextStopIterationr+   splitr*   r]   r2   rK   
setdefaultr   rI   r6   r   r   rM   rN   r   rP   )r0   rB   rA   r/   annis_dictre   rE   prefixesresultrC   rj   env_name_without_prefixkeyslast_keyenv_vartarget_fieldr`   rR   allow_json_failurerT   
field_inforV   s          `               r8   rL   z"EnvSettingsSource.explode_env_vars   sy    ((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lI6595K5KL5Y2J 2++#?@W@WY`#a-5-='8!!7b!IJ)-& 6@2J 2$5?i5X\^b
"&";";HjRY"Z '4(7**Wk2RV]^fVgkmVm(,(C(CLRY(ZGH%S)	[T ]
 ! B & $1"#G  2$s0   HH"+'H2"	H/.H/2	I	;II	c                   	 | j                   j                  d      }|s\t        |t              rLt	        t        |j                              xr t        |j                        xs t        |j                        }|rst        |t              rct        |t              rS|| j                  k(  r|S t        |j                  t        fd      s%	 t        |j                        j                  |      S |S # t        $ rm 	 t!        j"                  |      }n# t$        t         j&                  f$ r  w xY wt        |t              s&t        |j                        j                  |      cY S  w xY w# t        $ r Y |S w xY w)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)r(   r)   rK   r   r   r   rJ   r   r   strr5   r   r	   r
   validate_pythonr   jsonloadsrN   JSONDecodeError)r0   rA   rQ   should_coercedecodeds        r8   rP   z(EnvSettingsSource._coerce_env_val_strict  sM   	 KKOOH5M Zy%A#Ju/?/?$@AoF]^c^n^nFo!A.u/?/?@  E3!7Jui<XD333 L1%2B2BTGY]^
*5+;+;<LLUSS  + "&*jj&7G *D,@,@A "!")'37#.u/?/?#@#P#PQX#YY  		sN   B+E+ .E+ #C2 2	E(<DE(D--7E($E+ &E((E+ +	E87E8c                h    | j                   j                   d| j                  d| j                  dS )Nz(env_nested_delimiter=z, env_prefix_len=))r7   __name__r#   r-   r>   s    r8   __repr__zEnvSettingsSource.__repr__B  s>    ~~&&''=d>W>W=Z ["114A7	
r9   )NNNNNNNN)r1   ztype[BaseSettings]r2   bool | Noner,   
str | Noner3   zEnvPrefixTarget | Noner#   r   r$   z
int | Noner4   r   r5   r   r6   r   returnNone)r   Mapping[str, str | None])rA   r   rB   r~   r   ztuple[Any, str, bool])
rB   r~   rA   r   rQ   r   rF   boolr   r   )rA   r   r   ztuple[bool, bool]r;   )rA   zFieldInfo | Any | Noner`   r~   r2   r   r   FieldInfo | None)rB   r~   rA   r   r/   r   r   zdict[str, Any])rA   r   rQ   r   r   r   )r   r~   )r   
__module____qualname____doc__r'   r.   rG   rW   rI   r]   rL   rP   r   __classcell__)r7   s   @r8   r!   r!   %   s     '+!%48+/+/(,)-'+.(. $. 	.
 2. ). ). &. '. %. 
.@o4*,=\)" VZ6+6256GR6	6pBH$L
r9   r!   ),
__future__r   _annotationsr   r<   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__ r9   r8   <module>r      si    2  	 #  8 7 A 6 % ; ( 0 0	 	 	 3a
5 a
H	 
r9   