o
    Ëý°js3  ã                   @   sB  d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
Z
mZ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mZ ejZe
d	eƒZerRd
ndZdZedddddd�Zejej ej!ej"ej#fZ$ej ejej!fZ%ee&ƒZ'dedefdd„Z(dede	e fdd„Z)deee	e f fdd„Z*G dd„ dƒZ+dS )a  Configuration management setup

Some terminology:
- name
  As written in config files.
- value
  Value associated with a name
- key
  Name combined with it's section (section.name)
- variant
  A single word describing where the configuration key-value pair came from
é    N)ÚAnyÚDictÚIterableÚListÚNewTypeÚOptionalÚTuple)ÚConfigurationErrorÚ!ConfigurationFileCouldNotBeLoaded)Úappdirs)ÚWINDOWS)Ú	getLogger)Ú
ensure_dirÚenumÚKindzpip.inizpip.conf)ÚversionÚhelpÚuserÚglobalÚsiteÚenvzenv-var)ÚUSERÚGLOBALÚSITEÚENVÚENV_VARÚnameÚreturnc                 C   s*   |   ¡  dd¡} |  d¡r| dd… } | S )zAMake a name consistent regardless of source (environment or file)Ú_ú-z--é   N)ÚlowerÚreplaceÚ
startswith)r   © r$   úŽ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pip/_internal/configuration.pyÚ_normalize_name2   s   
r&   c                 C   s&   d| vrd  | ¡}t|ƒ‚|  dd¡S )NÚ.zbKey does not contain dot separated section and key. Perhaps you wanted to use 'global.{}' instead?é   )Úformatr	   Úsplit)r   Úerror_messager$   r$   r%   Ú_disassemble_key:   s   ýr,   c                  C   st   dd„ t  d¡D ƒ} tj tjt¡}tj tj d¡t	rdndt¡}tj t  
d¡t¡}tj| tj|gtj||giS )Nc                 S   s   g | ]	}t j |t¡‘qS r$   )ÚosÚpathÚjoinÚCONFIG_BASENAME)Ú.0r.   r$   r$   r%   Ú
<listcomp>E   s    ÿz+get_configuration_files.<locals>.<listcomp>Úpipú~z.pip)r   Úsite_config_dirsr-   r.   r/   ÚsysÚprefixr0   Ú
expanduserr   Úuser_config_dirÚkindsr   r   r   )Úglobal_config_filesÚsite_config_fileÚlegacy_config_fileÚnew_config_filer$   r$   r%   Úget_configuration_filesD   s   ÿ

ý
ýr?   c                       sÄ  e Zd ZdZd7dedee ddf‡ fdd„Zd8dd	„Zdee	 fd
d„Z
deee	ef  fdd„Zde	defdd„Zde	deddfdd„Zde	ddfdd„Zd8dd„Zd8dd„Zedee	ef fdd„ƒZd8dd„Zdede	defd d!„Zde	defd"d#„Zd8d$d%„Zd&e	d'eee	ef  dee	ef fd(d)„Zdeee	e	f  fd*d+„Zdeeeee	 f  fd,d-„Zdedee	ef fd.d/„Z dee	ef fd0d1„Z!de	d2eddfd3d4„Z"de	fd5d6„Z#‡  Z$S )9ÚConfigurationaâ  Handles management of configuration.

    Provides an interface to accessing and managing configuration files.

    This class converts provides an API that takes "section.key-name" style
    keys and stores the value associated with it as "key-name" under the
    section "section".

    This allows for a clean interface wherein the both the section and the
    key-name are preserved in an easy to manage form in the configuration files
    and the data stored is also nice.
    NÚisolatedÚ	load_onlyr   c                    sj   t ƒ  ¡  |d ur|tvrtd d tttƒ¡¡ƒ‚|| _|| _	dd„ t
D ƒ| _dd„ t
D ƒ| _g | _d S )Nz5Got invalid value for load_only - should be one of {}z, c                 S   s   i | ]}|g “qS r$   r$   ©r1   Úvariantr$   r$   r%   Ú
<dictcomp>r   ó    ÿz*Configuration.__init__.<locals>.<dictcomp>c                 S   s   i | ]}|i “qS r$   r$   rC   r$   r$   r%   rE   u   rF   )ÚsuperÚ__init__ÚVALID_LOAD_ONLYr	   r)   r/   ÚmapÚreprrA   rB   ÚOVERRIDE_ORDERÚ_parsersÚ_configÚ_modified_parsers)ÚselfrA   rB   ©Ú	__class__r$   r%   rH   e   s    
ÿÿÿÿ
zConfiguration.__init__c                 C   s   |   ¡  | js|  ¡  dS dS )z<Loads configuration from configuration files and environmentN)Ú_load_config_filesrA   Ú_load_environment_vars©rP   r$   r$   r%   Úloadz   s   ÿzConfiguration.loadc                 C   s6   | j dus	J dƒ‚z|  ¡ d W S  ty   Y dS w )z7Returns the file with highest priority in configurationNz)Need to be specified a file to be editingr   )rB   Ú_get_parser_to_modifyÚ
IndexErrorrU   r$   r$   r%   Úget_file_to_edit€   s   ÿzConfiguration.get_file_to_editc                 C   s
   | j  ¡ S )z`Returns key-value pairs like dict.items() representing the loaded
        configuration
        )Ú_dictionaryÚitemsrU   r$   r$   r%   r[   ‰   s   
zConfiguration.itemsÚkeyc                 C   s*   z| j | W S  ty   td|› �ƒ‚w )z#Get a value from the configuration.úNo such key - )rZ   ÚKeyErrorr	   )rP   r\   r$   r$   r%   Ú	get_value�   s
   ÿzConfiguration.get_valueÚvaluec                 C   st   |   ¡  | js	J ‚|  ¡ \}}|dur*t|ƒ\}}| |¡s#| |¡ | |||¡ || j| j |< |  ||¡ dS )z$Modify a value in the configuration.N)	Ú_ensure_have_load_onlyrB   rW   r,   Úhas_sectionÚadd_sectionÚsetrN   Ú_mark_as_modified)rP   r\   r`   ÚfnameÚparserÚsectionr   r$   r$   r%   Ú	set_value–   s   


zConfiguration.set_valuec                 C   s    |   ¡  | js	J ‚|| j| j vrtd|› �ƒ‚|  ¡ \}}|durGt|ƒ\}}| |¡r3| ||¡s7tdƒ‚| |¡sA| 	|¡ |  
||¡ | j| j |= dS )z#Unset a value in the configuration.r]   Nz4Fatal Internal error [id=1]. Please report as a bug.)ra   rB   rN   r	   rW   r,   rb   Úremove_optionr[   Úremove_sectionre   )rP   r\   rf   rg   rh   r   r$   r$   r%   Úunset_value¨   s$   
ÿ
ÿÿ

zConfiguration.unset_valuec              	   C   sl   |   ¡  | jD ],\}}t d|¡ ttj |¡ƒ t|dƒ�}| 	|¡ W d  ƒ n1 s.w   Y  qdS )z!Save the current in-memory state.zWriting to %sÚwN)
ra   rO   ÚloggerÚinfor   r-   r.   ÚdirnameÚopenÚwrite)rP   rf   rg   Úfr$   r$   r%   ÚsaveÃ   s   ÿ€úzConfiguration.savec                 C   s$   | j d u r	tdƒ‚t d| j ¡ d S )Nz'Needed a specific file to be modifying.z$Will be working with %s variant only)rB   r	   rn   ÚdebugrU   r$   r$   r%   ra   Ô   s   
z$Configuration._ensure_have_load_onlyc                 C   s"   i }t D ]
}| | j| ¡ q|S )z3A dictionary representing the loaded configuration.)rL   ÚupdaterN   )rP   ÚretvalrD   r$   r$   r%   rZ   Ù   s   zConfiguration._dictionaryc                 C   s˜   t |  ¡ ƒ}|tj dd… tjgkrt d¡ dS | ¡ D ]+\}}|D ]$}| j	dur8|| j	kr8t d||¡ q$|  
||¡}| j|  ||f¡ q$qdS )z,Loads configuration from configuration filesr   r(   zZSkipping loading configuration files due to environment's PIP_CONFIG_FILE being os.devnullNz Skipping file '%s' (variant: %s))ÚdictÚiter_config_filesr:   r   r-   Údevnullrn   ru   r[   rB   Ú
_load_filerM   Úappend)rP   Úconfig_filesrD   Úfilesrf   rg   r$   r$   r%   rS   å   s   ÿöÿz Configuration._load_config_filesrD   rf   c                 C   sL   t  d||¡ |  |¡}| ¡ D ]}| |¡}| j|  |  ||¡¡ q|S )Nz'For variant '%s', will try loading '%s')rn   ÚverboseÚ_construct_parserÚsectionsr[   rN   rv   Ú_normalized_keys)rP   rD   rf   rg   rh   r[   r$   r$   r%   r{   ü   s   

zConfiguration._load_filec              
   C   s|   t  ¡ }tj |¡r<t d¡}z
|j||d� W |S  ty*   t	d|› d�|d�‚ t j
y; } zt	|d�‚d }~ww |S )NF)Úencodingzcontains invalid z characters)Úreasonrf   )Úerror)ÚconfigparserÚRawConfigParserr-   r.   ÚexistsÚlocaleÚgetpreferredencodingÚreadÚUnicodeDecodeErrorr
   ÚError)rP   rf   rg   Úlocale_encodingr…   r$   r$   r%   r€     s    

÷
þ
€þzConfiguration._construct_parserc                 C   s"   | j tj  |  d|  ¡ ¡¡ dS )z.Loads configuration from environment variablesz:env:N)rN   r:   r   rv   r‚   Úget_environ_varsrU   r$   r$   r%   rT     s   ÿz$Configuration._load_environment_varsrh   r[   c                 C   s.   i }|D ]\}}|d t |ƒ }|||< q|S )z×Normalizes items to construct a dictionary with normalized keys.

        This routine is where the names become keys and are made the same
        regardless of source - configuration files or environment.
        r'   )r&   )rP   rh   r[   Ú
normalizedr   Úvalr\   r$   r$   r%   r‚   !  s
   
zConfiguration._normalized_keysc                 c   sF   � t j ¡ D ]\}}| d¡r |dd…  ¡ }|tvr ||fV  qdS )z@Returns a generator with all environmental vars with prefix PIP_ÚPIP_é   N)r-   Úenvironr[   r#   r!   ÚENV_NAMES_IGNORED)rP   r\   r‘   r   r$   r$   r%   r�   /  s   €

€üzConfiguration.get_environ_varsc                 c   s’   � t j dd¡}|durtj|gfV  ntjg fV  tƒ }tj|tj fV  | j o2|o1t j 	|¡ }|r>tj
|tj
 fV  tj|tj fV  dS )zYields variant and configuration files associated with it.

        This should be treated like items of a dictionary.
        ÚPIP_CONFIG_FILEN)r-   r”   Úgetr:   r   r?   r   rA   r.   rˆ   r   r   )rP   Úconfig_filer}   Úshould_load_user_configr$   r$   r%   ry   8  s   €ÿzConfiguration.iter_config_filesc                 C   s
   | j | S )z#Get values present in a config file)rN   )rP   rD   r$   r$   r%   Úget_values_in_configV  s   
z"Configuration.get_values_in_configc                 C   s*   | j sJ ‚| j| j  }|stdƒ‚|d S )Nz4Fatal Internal error [id=2]. Please report as a bug.éÿÿÿÿ)rB   rM   r	   )rP   Úparsersr$   r$   r%   rW   Z  s   
ÿz#Configuration._get_parser_to_modifyrg   c                 C   s&   ||f}|| j vr| j  |¡ d S d S ©N)rO   r|   )rP   rf   rg   Úfile_parser_tupler$   r$   r%   re   h  s   
ÿzConfiguration._mark_as_modifiedc                 C   s   | j j› d| j›d�S )Nú(ú))rR   Ú__name__rZ   rU   r$   r$   r%   Ú__repr__m  s   zConfiguration.__repr__r�   )r   N)%r¡   Ú
__module__Ú__qualname__Ú__doc__Úboolr   r   rH   rV   ÚstrrY   r   r   r   r[   r_   ri   rl   rt   ra   Úpropertyr   rZ   rS   r‡   r{   r€   rT   r‚   r�   r   ry   rš   rW   re   r¢   Ú__classcell__r$   r$   rQ   r%   r@   W   s<     
	




ÿÿ

þ	r@   ),r¥   r†   r‰   r-   r6   Útypingr   r   r   r   r   r   r   Úpip._internal.exceptionsr	   r
   Úpip._internal.utilsr   Úpip._internal.utils.compatr   Úpip._internal.utils.loggingr   Úpip._internal.utils.miscr   r   r‡   r§   r   r0   r•   r:   r   r   r   r   r   rL   rI   r¡   rn   r&   r,   r?   r@   r$   r$   r$   r%   Ú<module>   s:    $
û
