o
    [۷iv                     @  s   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	rFddlmZ G dd deZdS )zSecrets file settings source.    )annotationsN)Path)TYPE_CHECKINGAny)	FieldInfo)path_type_label   )SettingsError   )PydanticBaseEnvSettingsSource)EnvPrefixTargetPathType)BaseSettingsc                      sb   e Zd ZdZ							d'd( fddZd) fddZed*ddZd+d#d$Zd,d%d&Z	  Z
S )-SecretsSettingsSourcezE
    Source class for loading settings values from secret files.
    Nsettings_clstype[BaseSettings]secrets_dirPathType | Nonecase_sensitivebool | None
env_prefix
str | Noneenv_prefix_targetEnvPrefixTarget | Noneenv_ignore_emptyenv_parse_none_strenv_parse_enumsreturnNonec	           	   	     s<   t  ||||||| |d ur|| _d S | jd| _d S )Nr   )super__init__configgetr   )	selfr   r   r   r   r   r   r   r   	__class__ a/home/ubuntu/vllm_env/lib/python3.10/site-packages/pydantic_settings/sources/providers/secrets.pyr       s   $	zSecretsSettingsSource.__init__dict[str, Any]c                   s   i }| j du r	|S t| j ttjfr| j gn| j }dd |D }g | _|D ]}| s5td| d q%| j	| q%t
| jsC|S | jD ]}| sUtdt| qFt  S )z4
        Build fields from "secrets" files.
        Nc                 S  s   g | ]}t | qS r&   )r   
expanduser).0pr&   r&   r'   
<listcomp>>   s    z2SecretsSettingsSource.__call__.<locals>.<listcomp>zdirectory "z" does not existz.secrets_dir must reference a directory, not a )r   
isinstancestrosPathLikesecrets_pathsexistswarningswarnappendlenis_dirr	   r   r   __call__)r#   secretssecrets_dirsr1   pathr$   r&   r'   r8   4   s"   
 


zSecretsSettingsSource.__call__dir_pathr   	file_namer.   boolPath | Nonec                 C  sB   |  D ]}|j|kr|  S |s|j | kr|  S qdS )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)clsr<   r=   r   fr&   r&   r'   find_case_pathP   s   
z$SecretsSettingsSource.find_case_pathfieldr   
field_nametuple[Any, str, bool]c                 C  s   |  ||D ]9\}}}t| jD ].}| ||| j}|sq| r.|  ||f    S tj	d| dt
| ddd qq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reversedr1   rE   r   is_file	read_textstripr3   r4   r   )r#   rF   rG   	field_keyenv_namevalue_is_complexsecrets_pathr;   r&   r&   r'   get_field_valued   s   
z%SecretsSettingsSource.get_field_valuec                 C  s   | j j d| jdS )Nz(secrets_dir=))r%   __name__r   )r#   r&   r&   r'   __repr__   s   zSecretsSettingsSource.__repr__)NNNNNNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r(   )r<   r   r=   r.   r   r>   r   r?   )rF   r   rG   r.   r   rH   )r   r.   )rV   
__module____qualname____doc__r    r8   classmethodrE   rT   rW   __classcell__r&   r&   r$   r'   r      s    
r   )rZ   
__future__r   _annotationsr/   r3   pathlibr   typingr   r   pydantic.fieldsr   pydantic_settings.utilsr   
exceptionsr	   baser   typesr   r   pydantic_settings.mainr   r   r&   r&   r&   r'   <module>   s    