
    biv                        d Z 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
 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 e	rddlmZ  G d de      Zy)zSecrets file settings source.    )annotationsN)Path)TYPE_CHECKINGAny)	FieldInfo)path_type_label   )SettingsError   )PydanticBaseEnvSettingsSource)EnvPrefixTargetPathType)BaseSettingsc                       e Zd ZdZ	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZd	 fdZed
d       ZddZddZ	 xZ
S )SecretsSettingsSourcezE
    Source class for loading settings values from secret files.
    c	           	         t         	|   |||||||       ||| _        y | j                  j                  d      | _        y )Nsecrets_dir)super__init__configgetr   )
selfsettings_clsr   case_sensitive
env_prefixenv_prefix_targetenv_ignore_emptyenv_parse_none_strenv_parse_enums	__class__s
            s/home/jang/Projects/ai-researcher/.venv/lib/python3.12/site-packages/pydantic_settings/sources/providers/secrets.pyr   zSecretsSettingsSource.__init__   sK     		
 +6*A;t{{WdGe    c                `   i }| j                   |S t        | j                   t        t        j                  f      r| j                   gn| j                   }|D cg c]  }t        |      j                          }}g | _        |D ]G  }|j                         st        j                  d| d       -| j                  j                  |       I t        | j                        s|S | j                  D ])  }|j                         rt        dt        |              t         | E         S c c}w )z4
        Build fields from "secrets" files.
        zdirectory "z" does not existz.secrets_dir must reference a directory, not a )r   
isinstancestrosPathLiker   
expandusersecrets_pathsexistswarningswarnappendlenis_dirr
   r   r   __call__)r   secretssecrets_dirspr)   pathr    s         r!   r0   zSecretsSettingsSource.__call__4   s    *,#N-78H8H3PRP[P[J\-](()cgcscs7CD!a++-DD! 	0D;;=D61ABC""))$/		0 4%%&N&& 	nD;;=#&TUdeiUjTk$lmm	n w!!! Es    D+c                    |j                         D ]G  }|j                  |k(  r|c S |r|j                  j                         |j                         k(  sE|c S  y)af  
        Find a file within path's directory matching filename, optionally ignoring case.

        Args:
            dir_path: Directory path.
            file_name: File name.
            case_sensitive: Whether to search for file name case sensitively.

        Returns:
            Whether file path or `None` if file does not exist in directory.
        N)iterdirnamelower)clsdir_path	file_namer   fs        r!   find_case_pathz$SecretsSettingsSource.find_case_pathP   sR     !!# 	Avv"#)//:K(K		
 r"   c           
     n   | j                  ||      D ]  \  }}}t        | j                        D ]~  }| j                  ||| j                        }|s#|j                         r%|j                         j                         ||fc c S t        j                  d| dt        |       dd         dfS )al  
        Gets the value for field from secret file 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 the file does not exist), key, and
                a flag to determine whether value is complex.
        zattempted to load secret file "z" but found a z	 instead.   )
stacklevelN)_extract_field_inforeversedr)   r=   r   is_file	read_textstripr+   r,   r   )r   field
field_name	field_keyenv_namevalue_is_complexsecrets_pathr4   s           r!   get_field_valuez%SecretsSettingsSource.get_field_valued   s     6:5M5MeU_5` 	1Ix!1 ();); < **<4CVCVW<<>>>+113Y@PPPMM9$~o^bNcMddmn#$	  Y 000r"   c                N    | j                   j                   d| j                  dS )Nz(secrets_dir=))r    __name__r   )r   s    r!   __repr__zSecretsSettingsSource.__repr__   s'    ..))*-8H8H7K1MMr"   )NNNNNNN)r   ztype[BaseSettings]r   zPathType | Noner   bool | Noner   
str | Noner   zEnvPrefixTarget | Noner   rQ   r   rR   r   rQ   returnNone)rS   zdict[str, Any])r:   r   r;   r%   r   boolrS   zPath | None)rF   r   rG   r%   rS   ztuple[Any, str, bool])rS   r%   )rO   
__module____qualname____doc__r   r0   classmethodr=   rL   rP   __classcell__)r    s   @r!   r   r      s     (,&*!%48(,)-'+f(f %f $	f
 f 2f &f 'f %f 
f,"8  &1>Nr"   r   )rX   
__future__r   _annotationsr&   r+   pathlibr   typingr   r   pydantic.fieldsr   pydantic_settings.utilsr   
exceptionsr
   baser   typesr   r   pydantic_settings.mainr   r    r"   r!   <module>rf      sA    # 2 	  
 & 3 ' 0 -3kN9 kNr"   