
    fj"                         d dl Z d dl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 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 e	rddlmZ ddlmZ dZ G d de          Zde
de
fdZdS )    N)Iterator)reduce)Path)TYPE_CHECKINGAnyLiteralOptional   )SettingsError)path_type_label   )PydanticBaseSettingsSource)parse_env_vars   )EnvSettingsSource)SecretsSettingsSource)BaseSettings)PathTypei   c                   &    e Zd Z	 	 	 	 	 	 	 	 	 ddeez  ded         ded         dz  dedz  dedz  d	e	dz  d
e	dz  dedz  dedz  de	dz  ddf fdZ
deddfdZededee         fd            Zededee	e	f         fd            Zde	fdZ xZS )NestedSecretsSettingsSourceNfile_secret_settingssecrets_dirr   secrets_dir_missingokwarnerrorsecrets_dir_max_sizesecrets_case_sensitivesecrets_prefixsecrets_nested_delimitersecrets_nested_subdircase_sensitive
env_prefixreturnc           	          t          |d|          }|j        }t          t          |dd           ||                    d                     _        t          ||                    d          d           _         j        dvrt          d j                   t          ||                    d          t                     _        t          ||                    d          |	|                    d	          d
           _	        t          ||                    d          |
|                    d          d           _
        t          ||                    d          |                    d                     _        t          ||                    d          d
           _         j        r7|s|                    d          rt          d          t          j         _         j        g }n>t           j        t           t"          f          r	 j        g}nt%           j                  }d |D              _         j        D ]}                     |           t+                                          | j	         j
         j        d
dd            d  _        t1           j                  s	i  _        d S t5          d  fd j        D                       }t7          | j	         j         j                   _        d S )Nsettings_clsr   r   r   r   z#invalid secrets_dir_missing value: r   r   r#   Fr    r$    r!   env_nested_delimiterr"   zQOptions secrets_nested_delimiter and secrets_nested_subdir are mutually exclusivec                 t    g | ]5}t          |                                                                          6S  )r   
expanduserresolve).0ps     v/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/nested_secrets.py
<listcomp>z8NestedSecretsSettingsSource.__init__.<locals>.<listcomp>i   s6    )X)X)XQ$q''*<*<*>*>*F*F*H*H)X)X)X    T)r#   r$   r)   env_ignore_emptyenv_parse_enumsenv_parse_none_strc                 r    t          g |                                 |                                R           S N)dictitems)d1d2s     r0   <lambda>z6NestedSecretsSettingsSource.__init__.<locals>.<lambda>~   s,    t$>bhhjj$>288::$>$>?? r2   c              3   B   K   | ]}                     |          V  d S r7   )load_secrets)r.   r/   selfs     r0   	<genexpr>z7NestedSecretsSettingsSource.__init__.<locals>.<genexpr>   s1      BB!""1%%BBBBBBr2   )getattrmodel_configfirst_not_nonegetr   r   r   SECRETS_DIR_MAX_SIZEr   r#   r    r!   r"   ossep
isinstancer   strlistsecrets_pathsvalidate_secrets_pathsuper__init__r5   lenenv_varsr   r   r3   )r?   r   r   r   r   r   r    r!   r"   r#   r$   r'   confpathspathsecrets	__class__s   `               r0   rN   z$NestedSecretsSettingsSource.__init__   sH   $ ,3  ,
 ,
 (,:(->>HH]##-
 -

 DRHH*++D
 D
 
 #+BBB `dF^ ` `aaa)7 HH+,, *
 *
!
 %3"HH-..HH%&&%
 %
 $2HH%&&HH\""$
 $
 5C$HH/00HH+,,5
 5
%
 ,:!HH,--,
 ,
"
 % 	7' 74884N+O+O 7#$wxxx02- #EE(4+66 	+%&EE)**E)X)XRW)X)X)X& 	- 	-D&&t,,,, 	.*!%!>" # 	 	
 	
 	
 #' 4%&& 	DMMM??BBBBt/ABBB G +#%'	 DMMMr2   rS   c                    |                                 sY| j        dk    rd S | j        dk    rt          j        d| dd           d S | j        dk    rt	          d| d          t
          |                                st	          dt          |                     t          d	 | 	                    |          D                       }|| j
        k    rt	          d
| j
         d          d S )Nr   r   zdirectory "z" does not existr   )
stacklevelr   z.secrets_dir must reference a directory, not a c              3   H   K   | ]}|                                 j        V  d S r7   )statst_size)r.   fs     r0   r@   zDNestedSecretsSettingsSource.validate_secrets_path.<locals>.<genexpr>   s-      "["[16688#3"["["["["["[r2   zsecrets_dir size is above z bytes)existsr   warningsr   r   
ValueErroris_dirr   sum_iter_secret_filesr   )r?   rS   secrets_dir_sizes      r0   rL   z1NestedSecretsSettingsSource.validate_secrets_path   s   {{}} 	d'4//)V33BDBBBqQQQQQQ)W44#$H$$H$H$HIII  ;;== n#$lUdeiUjUj$l$lmmm""["[T=T=TUY=Z=Z"["["[[[$";;;#$bAZ$b$b$bccc <;r2   c              #       K   t                      dt          dt          t                   f fd            E d{V  dS )a  Yield the secret files contained in ``path``.

        ``path`` is expected to already be resolved. The directory tree is walked
        explicitly so that symbolic links are handled safely:

        * a file is only yielded if its real location stays within ``path``; entries
          that resolve outside of it (e.g. through a symbolic link) are skipped, so
          they neither contribute to the ``secrets_dir_max_size`` accounting nor get
          loaded;
        * each real directory is visited at most once, so cyclic or repeated
          symlinks cannot make the walk loop and inflate the size accounting or the
          number of loaded secrets.

        Because the size check and the loader share this iterator, they always see
        the same set of files.
        	directoryr%   c              3     K   |                                  }|v rd S                     |           	 t          |                                           }n# t          $ r Y d S w xY w|D ]l}|                                 }|                                r!|k    s	|j        v r |          E d {V  K|                                r|j        v r|V  md S r7   )r-   addsortediterdirOSErrorr_   parentsis_file)rd   resolved_direntriesentryresolvedrS   	seen_dirswalks        r0   rq   z<NestedSecretsSettingsSource._iter_secret_files.<locals>.walk   s      %,,..Ly((MM,''' !2!2!4!455         ==????$$  
  4''483C+C+C#'4;;.......%%''  DH4D,D,D  KKK   s   !A 
A$#A$N)setr   r   )rS   rp   rq   s   `@@r0   ra   z.NestedSecretsSettingsSource._iter_secret_files   sv      $  #uu		 D 	 Xd^ 	  	  	  	  	  	  	  	 4 4::r2   c                 F    fd|                                D             S )Nc                     i | ]I}t          |                                        |                                                                JS r+   )rI   relative_to	read_textstrip)r.   r/   rS   s     r0   
<dictcomp>z<NestedSecretsSettingsSource.load_secrets.<locals>.<dictcomp>   sC    fffAAMM$''((!++--*=*=*?*?fffr2   )ra   )clsrS   s    `r0   r>   z(NestedSecretsSettingsSource.load_secrets   s,    ffffI_I_`dIeIeffffr2   c                     d| j         dS )Nz(NestedSecretsSettingsSource(secrets_dir=))r   )r?   s    r0   __repr__z$NestedSecretsSettingsSource.__repr__   s    O$:JOOOOr2   )	NNNNNNNNN)__name__
__module____qualname__r   r   r	   r   intboolrI   rN   r   rL   staticmethodr   ra   classmethodr8   r>   r|   __classcell__)rU   s   @r0   r   r      s        -1EI+/.2%)/3-1&*!%n n8;PPn j)n %%:;dB	n
 "Djn !%tn d
n #&*n  $d{n tn $Jn 
n n n n n n`d$ d4 d d d d" - -(4. - - - \-^ g gc3h g g g [gP# P P P P P P P Pr2   r   objsr%   c                  @    t          t          d |           d           S )Nc                 
    | d uS r7   r+   )os    r0   r<   z first_not_none.<locals>.<lambda>   s
    $ r2   )nextfilter)r   s    r0   rC   rC      s     ..55t<<<r2   )rF   r]   collections.abcr   	functoolsr   pathlibr   typingr   r   r   r	   
exceptionsr   utilsr   baser   r   envr   rT   r   mainr   sourcesr   rE   r   rC   r+   r2   r0   <module>r      sy   				  $ $ $ $ $ $             8 8 8 8 8 8 8 8 8 8 8 8 ' ' ' ' ' ' $ $ $ $ $ $ - - - - - - " " " " " " " " " " " " * * * * * * $$$$$$$###### " wP wP wP wP wP"3 wP wP wPt=# =# = = = = = =r2   