o
    àejè8  ã                   @  s"  d Z ddlmZ ddlZddl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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rTd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"dd„Z'd#dd„Z(d$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
é    )ÚannotationsN)ÚIterable)ÚAnyÚNewType)Ú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ÚstrÚreturnc                 C  s   |   ¡  dd¡} |  d¡} | S )zAMake a name consistent regardless of source (environment or file)Ú_ú-z--)ÚlowerÚreplaceÚremoveprefix)r   © r!   ú[/var/www/html/choboyeo/PHP/venv/lib/python3.10/site-packages/pip/_internal/configuration.pyÚ_normalize_name5   s   
r#   ú	list[str]c                 C  s(   d| vrd| › d�}t |ƒ‚|  dd¡S )NÚ.zVKey does not contain dot separated section and key. Perhaps you wanted to use 'global.z
' instead?é   )r   Úsplit)r   Úerror_messager!   r!   r"   Ú_disassemble_key<   s   ÿÿr)   údict[Kind, list[str]]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>G   s    ÿz+get_configuration_files.<locals>.<listcomp>Úpipú~z.pip)r   Úsite_config_dirsr+   r,   r-   ÚsysÚprefixr.   Ú
expanduserr	   Úuser_config_dirÚkindsr   r   r   )Úglobal_config_filesÚsite_config_fileÚlegacy_config_fileÚnew_config_filer!   r!   r"   Úget_configuration_filesF   s   ÿ

ý
ýr=   c                      sð   e Zd ZdZdEdF‡ fd	d
„ZdGdd„ZdHdd„ZdIdd„ZdJdd„ZdKdd„Z	dLdd„Z
dGdd„ZdGdd „ZedMd"d#„ƒZdGd$d%„ZdNd*d+„ZdOd,d-„ZdGd.d/„ZdPd3d4„ZdQd6d7„ZdRd9d:„ZdSd;d<„ZdTd>d?„ZdUdAdB„ZdVdCdD„Z‡  ZS )WÚ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ÚboolÚ	load_onlyúKind | Noner   ÚNonec                   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!   ©r/   Úvariantr!   r!   r"   Ú
<dictcomp>t   ó    ÿz*Configuration.__init__.<locals>.<dictcomp>c                 S  s   i | ]}|i “qS r!   r!   rD   r!   r!   r"   rF   w   rG   )ÚsuperÚ__init__ÚVALID_LOAD_ONLYr   Úformatr-   ÚmapÚreprr?   rA   ÚOVERRIDE_ORDERÚ_parsersÚ_configÚ_modified_parsers)Úselfr?   rA   ©Ú	__class__r!   r"   rI   g   s    
ÿÿÿÿ
zConfiguration.__init__c                 C  s   |   ¡  | js|  ¡  dS dS )z<Loads configuration from configuration files and environmentN)Ú_load_config_filesr?   Ú_load_environment_vars©rR   r!   r!   r"   Úload|   s   ÿzConfiguration.loadú
str | Nonec                 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   )rA   Ú_get_parser_to_modifyÚ
IndexErrorrW   r!   r!   r"   Úget_file_to_edit‚   s   ÿzConfiguration.get_file_to_editúIterable[tuple[str, Any]]c                 C  s
   | j  ¡ S )z`Returns key-value pairs like dict.items() representing the loaded
        configuration
        )Ú_dictionaryÚitemsrW   r!   r!   r"   r_   ‹   s   
zConfiguration.itemsÚkeyr   r   c                 C  sZ   |}t |ƒ}zi }| j ¡ D ]}| |¡ q|| W S  ty,   t|ƒ td|› �ƒ‚w )z#Get a value from the configuration.úNo such key - )r#   r^   ÚvaluesÚupdateÚKeyErrorr)   r   )rR   r`   Úorig_keyÚclean_configÚfile_valuesr!   r!   r"   Ú	get_value‘   s   
üzConfiguration.get_valueÚvaluec                 C  s”   t |ƒ}|  ¡  | jsJ ‚|  ¡ \}}|dur.t|ƒ\}}| |¡s'| |¡ | |||¡ | j| j  	|i ¡ || j| j | |< |  
||¡ dS )z$Modify a value in the configuration.N)r#   Ú_ensure_have_load_onlyrA   rZ   r)   Úhas_sectionÚadd_sectionÚsetrP   Ú
setdefaultÚ_mark_as_modified)rR   r`   ri   ÚfnameÚparserÚsectionr   r!   r!   r"   Ú	set_value    s   


zConfiguration.set_valuec                 C  sê   |}t |ƒ}|  ¡  | jsJ ‚|  ¡ \}}|| j| j | vr.|| j| j vr.td|› �ƒ‚|durWt|ƒ\}}| |¡rC| ||¡sGtdƒ‚| 	|¡sQ| 
|¡ |  ||¡ z| j| j | |= W dS  tyt   | j| j |= Y dS w )z#Unset a value in the configuration.ra   Nz4Fatal Internal error [id=1]. Please report as a bug.)r#   rj   rA   rZ   rP   r   r)   rk   Úremove_optionr_   Úremove_sectionro   rd   )rR   r`   re   rp   rq   rr   r   r!   r!   r"   Úunset_value´   s2   
ÿ
ÿÿ

ÿzConfiguration.unset_valuec                 C  sœ   |   ¡  | jD ]D\}}t d|¡ ttj |¡ƒ zt|dƒ�}| 	|¡ W d  ƒ n1 s/w   Y  W q t
yK } z
td|› d|› �ƒ‚d}~ww dS )z!Save the current in-memory state.zWriting to %sÚwNz:An error occurred while writing to the configuration file z: )rj   rQ   ÚloggerÚinfor   r+   r,   ÚdirnameÚopenÚwriteÚOSErrorr   )rR   rp   rq   ÚfÚerrorr!   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)rA   r   rx   ÚdebugrW   r!   r!   r"   rj   î   s   
z$Configuration._ensure_have_load_onlyúdict[str, dict[str, Any]]c                 C  s"   i }t D ]
}| | j| ¡ q|S )z3A dictionary representing the loaded configuration.)rN   rc   rP   )rR   ÚretvalrE   r!   r!   r"   r^   ó   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_filesr8   r   r+   Údevnullrx   r�   r_   rA   Ú
_load_filerO   Úappend)rR   Úconfig_filesrE   Úfilesrp   rq   r!   r!   r"   rU   ÿ   s   ÿöÿz Configuration._load_config_filesrE   r   rp   ÚRawConfigParserc                 C  sb   t  d||¡ |  |¡}| ¡ D ]}| |¡}| j|  |i ¡ | j| |  |  ||¡¡ q|S )Nz'For variant '%s', will try loading '%s')	rx   ÚverboseÚ_construct_parserÚsectionsr_   rP   rn   rc   Ú_normalized_keys)rR   rE   rp   rq   rr   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)Úreasonrp   )r   )Úconfigparserr‹   r+   r,   ÚexistsÚlocaleÚgetpreferredencodingÚreadÚUnicodeDecodeErrorr   ÚError)rR   rp   rq   Úlocale_encodingr   r!   r!   r"   r�   !  s    

÷
þ
€þzConfiguration._construct_parserc                 C  s:   | j tj  di ¡ | j tj d  |  d|  ¡ ¡¡ dS )z.Loads configuration from environment variablesz:env:N)rP   r8   r   rn   rc   r�   Úget_environ_varsrW   r!   r!   r"   rV   6  s   ÿz$Configuration._load_environment_varsrr   r_   údict[str, Any]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#   )rR   rr   r_   Ú
normalizedr   Úvalr`   r!   r!   r"   r�   =  s
   
zConfiguration._normalized_keysúIterable[tuple[str, str]]c                 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_   Ú
startswithr   ÚENV_NAMES_IGNORED)rR   r`   r�   r   r!   r!   r"   rš   K  s   €

€üzConfiguration.get_environ_varsú Iterable[tuple[Kind, list[str]]]c                 c  s”   � t j dd¡}tƒ }tj|tj fV  | j o |ot j |¡ }|r,tj	|tj	 fV  tj
|tj
 fV  |durBtj|gfV  dS tjg fV  dS )a�  Yields variant and configuration files associated with it.

        This should be treated like items of a dictionary. The order
        here doesn't affect what gets overridden. That is controlled
        by OVERRIDE_ORDER. However this does control the order they are
        displayed to the user. It's probably most ergonomic to display
        things in the same order as OVERRIDE_ORDER
        ÚPIP_CONFIG_FILEN)r+   r¡   Úgetr=   r8   r   r?   r,   r“   r   r   r   )rR   Úenv_config_filer‰   Úshould_load_user_configr!   r!   r"   r…   T  s   €ÿzConfiguration.iter_config_filesc                 C  s
   | j | S )z#Get values present in a config file)rP   )rR   rE   r!   r!   r"   Úget_values_in_configt  s   
z"Configuration.get_values_in_configútuple[str, RawConfigParser]c                 C  s*   | j sJ ‚| j| j  }|stdƒ‚|d S )Nz4Fatal Internal error [id=2]. Please report as a bug.éÿÿÿÿ)rA   rO   r   )rR   Úparsersr!   r!   r"   rZ   x  s   
ÿz#Configuration._get_parser_to_modifyrq   c                 C  s&   ||f}|| j vr| j  |¡ d S d S ©N)rQ   rˆ   )rR   rp   rq   Úfile_parser_tupler!   r!   r"   ro   †  s   
ÿzConfiguration._mark_as_modifiedc                 C  s   | j j› d| j›d�S )Nú(ú))rT   Ú__name__r^   rW   r!   r!   r"   Ú__repr__‹  s   zConfiguration.__repr__r­   )r?   r@   rA   rB   r   rC   )r   rC   )r   rY   )r   r]   )r`   r   r   r   )r`   r   ri   r   r   rC   )r`   r   r   rC   )r   r‚   )rE   r   rp   r   r   r‹   )rp   r   r   r‹   )rr   r   r_   r]   r   r›   )r   rž   )r   r¤   )rE   r   r   r›   )r   rª   )rp   r   rq   r‹   r   rC   )r   r   )r±   Ú
__module__Ú__qualname__Ú__doc__rI   rX   r\   r_   rh   rs   rv   r€   rj   Úpropertyr^   rU   r‡   r�   rV   r�   rš   r…   r©   rZ   ro   r²   Ú__classcell__r!   r!   rS   r"   r>   Y   s0    


	



"







	
 

r>   )r   r   r   r   )r   r   r   r$   )r   r*   )+rµ   Ú
__future__r   r’   r”   r+   r4   Úcollections.abcr   Útypingr   r   Úpip._internal.exceptionsr   r   Úpip._internal.utilsr   Úpip._internal.utils.compatr	   Úpip._internal.utils.loggingr
   Úpip._internal.utils.miscr   r   r‹   r   r   r.   r£   r8   r   r   r   r   r   rN   rJ   r±   rx   r#   r)   r=   r>   r!   r!   r!   r"   Ú<module>   s>    
û



