o
    [۷i                     @  s   d 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 ddlmZmZ er3ddladd	lmZ ndadddZG dd dee
ZdgZdS )zYAML file settings source.    )annotations)Path)TYPE_CHECKINGAny   )ConfigFileSourceMixinInitSettingsSource)DEFAULT_PATHPathTypeN)BaseSettingsreturnNonec               
   C  s>   t d urd S zdd l a W d S  ty }  ztd| d } ~ ww )Nr   zBPyYAML is not installed, run `pip install pydantic-settings[yaml]`)yamlImportError)e r   ^/home/ubuntu/vllm_env/lib/python3.10/site-packages/pydantic_settings/sources/providers/yaml.pyimport_yaml   s   
r   c                      sN   e Zd ZdZedddfd fddZdddZ	dd ddZd!ddZ  Z	S )"YamlConfigSettingsSourcez>
    A source class that loads variables from a yaml file
    NFsettings_clstype[BaseSettings]	yaml_filePathType | Noneyaml_file_encoding
str | Noneyaml_config_section
deep_mergeboolc                   s   |t kr|n|jd| _|d ur|n|jd| _|d ur |n|jd| _| j| j|d| _| jd ur@| | j| j| j| _t	 
|| j d S )Nr   r   r   )r   )r	   model_configgetyaml_file_pathr   r   _read_files	yaml_data_traverse_nested_sectionsuper__init__)selfr   r   r   r   r   	__class__r   r   r%   %   s   


z!YamlConfigSettingsSource.__init__	file_pathr   r   dict[str, Any]c                 C  sF   t   |j| jd}t|pi W  d    S 1 sw   Y  d S )N)encoding)r   openr   r   	safe_load)r&   r)   r   r   r   r   
_read_file@   s   $z#YamlConfigSettingsSource._read_filedatasection_pathstroriginal_pathc              
   C  s  |du r|}|st dz|| W S  ty   Y n ty,   td| d| j dw d|vr<td| d| j |d}tt|d	 d
dD ]8}d|d| }d||d }||v rz| || ||W   S  ty   td| d| j dw qKtd| d| j )a  
        Traverse nested YAML sections using dot-notation path.

        This method tries to match the longest possible key first before splitting on dots,
        allowing access to YAML keys that contain literal dot characters.

        For example, with section_path="a.b.c", it will try:
        1. "a.b.c" as a literal key
        2. "a.b" as a key, then traverse to "c"
        3. "a" as a key, then traverse to "b.c"
        4. "a" as a key, then "b" as a key, then "c" as a key
        Nz#yaml_config_section cannot be emptyzyaml_config_section path "z" cannot be traversed in z,. An intermediate value is not a dictionary..zyaml_config_section key "z" not found in    r   )	
ValueErrorKeyError	TypeErrorr    splitrangelenjoinr#   )r&   r/   r0   r2   partsiprefixsuffixr   r   r   r#   E   s:   

z1YamlConfigSettingsSource._traverse_nested_sectionc                 C  s   | j j d| j dS )Nz(yaml_file=))r(   __name__r    )r&   r   r   r   __repr__~   s   z!YamlConfigSettingsSource.__repr__)
r   r   r   r   r   r   r   r   r   r   )r)   r   r   r*   )N)r/   r*   r0   r1   r2   r   r   r*   )r   r1   )
rB   
__module____qualname____doc__r	   r%   r.   r#   rC   __classcell__r   r   r'   r   r       s    
9r   )r   r   )rF   
__future__r   _annotationspathlibr   typingr   r   baser   r   typesr	   r
   r   pydantic_settings.mainr   r   r   __all__r   r   r   r   <module>   s    


b