o
    _�¿j,$  ã                   @   sÞ   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mZ ddlmZ ddlmZ e	rZddlmZ ddlmZ dZG dd„ deƒZde
de
fdd„ZdS )é    N)ÚIterator)Úreduce)ÚPath)ÚTYPE_CHECKINGÚAnyÚLiteralÚOptionalé   )ÚSettingsError)Úpath_type_labelé   )ÚPydanticBaseSettingsSource)Ú	InitStateÚparse_env_varsé   )ÚEnvSettingsSource)ÚSecretsSettingsSource)ÚBaseSettings)ÚPathTypei   c                       sì   e Zd Z										ddeeB ded ded dB dedB dedB d	e	dB d
e	dB dedB dedB de	dB de
dB ddf‡ fdd„Zdeddfdd„Zededee fdd„ƒZededee	e	f fdd„ƒZde	fdd„Z‡  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Ú_init_stateÚreturnc                    sà  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r|sw| d¡r{tdƒ‚tjˆ _ˆ jd u r‡g }ntˆ jttfƒr”ˆ jg}ntˆ jƒ}dd„ |D ƒˆ _ˆ jD ]}ˆ  |¡ q¤tƒ j|ˆ j	ˆ j
ˆ jd
dd |d ur¿|nt |dd ƒd� d ˆ _tˆ jƒsÔi ˆ _d S tdd„ ‡ fdd„ˆ jD ƒƒ}t|ˆ 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                 S   s   g | ]
}t |ƒ ¡  ¡ ‘qS © )r   Ú
expanduserÚresolve©Ú.0Úpr)   r)   úm/home/dinkstrade/pdmp/venv/lib/python3.10/site-packages/pydantic_settings/sources/providers/nested_secrets.pyÚ
<listcomp>j   s    z8NestedSecretsSettingsSource.__init__.<locals>.<listcomp>Tr$   )r"   r#   r(   Úenv_ignore_emptyÚenv_parse_enumsÚenv_parse_none_strr$   c                 S   s   t g |  ¡ ¢| ¡ ¢R ƒS ©N)ÚdictÚitems)Úd1Úd2r)   r)   r/   Ú<lambda>€   s    z6NestedSecretsSettingsSource.__init__.<locals>.<lambda>c                 3   s   � | ]}ˆ   |¡V  qd S r4   )Úload_secretsr,   ©Úselfr)   r/   Ú	<genexpr>�   ó   € z7NestedSecretsSettingsSource.__init__.<locals>.<genexpr>)Ú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__r3   ÚlenÚenv_varsr   r   r1   )r<   r   r   r   r   r   r   r    r!   r"   r#   r$   r&   ÚconfÚpathsÚpathÚsecrets©Ú	__class__r;   r/   rL      s¤   ý
ýý
ýûû	ýý



ø


þ
üz$NestedSecretsSettingsSource.__init__rQ   c                 C   sª   |  ¡ s,| jdkrd S | jdkrtjd|› d�dd� d S | jdkr*td|› d�ƒ‚t‚| ¡ s9tdt|ƒ› �ƒ‚td	d
„ |  	|¡D ƒƒ}|| j
krStd| j
› d�ƒ‚d S )Nr   r   zdirectory "z" does not existr   )Ú
stacklevelr   z.secrets_dir must reference a directory, not a c                 s   s   � | ]}|  ¡ jV  qd S r4   )ÚstatÚst_size)r-   Úfr)   r)   r/   r=   —   r>   zDNestedSecretsSettingsSource.validate_secrets_path.<locals>.<genexpr>zsecrets_dir size is above z bytes)Úexistsr   Úwarningsr   r
   Ú
ValueErrorÚis_dirr   ÚsumÚ_iter_secret_filesr   )r<   rQ   Úsecrets_dir_sizer)   r)   r/   rJ   Š   s   



ÿz1NestedSecretsSettingsSource.validate_secrets_pathc                 #   s8   � t ƒ ‰dtdtt f‡ ‡‡fdd„‰ˆˆ ƒE dH  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   sž   � |   ¡ }|ˆv rd S ˆ |¡ zt|  ¡ ƒ}W n
 ty"   Y d S w |D ]'}|  ¡ }| ¡ r@|ˆ ks8ˆ |jv r?ˆ|ƒE d H  q%| ¡ rLˆ |jv rL|V  q%d S r4   )r+   ÚaddÚsortedÚiterdirÚOSErrorr\   ÚparentsÚis_file)r`   Úresolved_dirÚentriesÚentryÚresolved©rQ   Ú	seen_dirsÚwalkr)   r/   rm   ¯   s(   €
ÿ€€óz<NestedSecretsSettingsSource._iter_secret_files.<locals>.walkN)Úsetr   r   ©rQ   r)   rk   r/   r^   ›   s   €z.NestedSecretsSettingsSource._iter_secret_filesc                    s   ‡ fdd„|   ˆ ¡D ƒS )Nc                    s(   i | ]}t | ˆ ¡ƒ|jd d� ¡ “qS )zutf-8)Úencoding)rG   Úrelative_toÚ	read_textÚstripr,   ro   r)   r/   Ú
<dictcomp>Ï   s   ( z<NestedSecretsSettingsSource.load_secrets.<locals>.<dictcomp>)r^   )ÚclsrQ   r)   ro   r/   r:   Ë   s   z(NestedSecretsSettingsSource.load_secretsc                 C   s   d| j ›d�S )Nz(NestedSecretsSettingsSource(secrets_dir=ú))r   r;   r)   r)   r/   Ú__repr__Ñ   s   z$NestedSecretsSettingsSource.__repr__)
NNNNNNNNNN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚintÚboolrG   r   rL   r   rJ   Ústaticmethodr   r^   Úclassmethodr5   r:   rw   Ú__classcell__r)   r)   rS   r/   r      sT    óþý
üûúùø	÷õôóòr/r   Úobjsr%   c                  G   s   t tdd„ | ƒd ƒS )Nc                 S   s   | d uS r4   r)   )Úor)   r)   r/   r9   Ö   s    z first_not_none.<locals>.<lambda>)ÚnextÚfilter)r€   r)   r)   r/   rA   Õ   s   rA   ) rD   rZ   Úcollections.abcr   Ú	functoolsr   Úpathlibr   Útypingr   r   r   r   Ú
exceptionsr
   Úutilsr   Úbaser   r   r   Úenvr   rR   r   Úmainr   Úsourcesr   rC   r   rA   r)   r)   r)   r/   Ú<module>   s&     ?