a
    ‡ÀàgP6  ã                   @   s0  d 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 ddlmZmZ ddlmZmZ ddlmZ er°dd	lmZmZmZmZmZmZmZ ejZed
eƒZer¸d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„ Z,dd„ Z-dd„ Z.G dd„ de/ƒZ0d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)Úconfigparser)ÚConfigurationErrorÚ!ConfigurationFileCouldNotBeLoaded)Úappdirs)ÚWINDOWSÚ
expanduser)Ú
ensure_dirÚenum)ÚMYPY_CHECK_RUNNING)ÚAnyÚDictÚIterableÚListÚNewTypeÚOptionalÚTupleÚKindzpip.inizpip.conf)ÚversionÚhelpÚuserÚglobalÚsiteÚenvzenv-var)ÚUSERÚGLOBALÚSITEÚENVÚENV_VARc                 C   s*   |   ¡  dd¡} |  d¡r&| dd… } | S )zFMake a name consistent regardless of source (environment or file)
    Ú_ú-z--é   N)ÚlowerÚreplaceÚ
startswith)Úname© r%   úT/var/www/sistema_ama/venv/lib/python3.9/site-packages/pip/_internal/configuration.pyÚ_normalize_name6   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$   Zerror_messager%   r%   r&   Ú_disassemble_key@   s    ÿýr,   c                  C   sp   dd„ t  d¡D ƒ} tj tjt¡}tj tdƒt	r8d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>M   s   ÿz+get_configuration_files.<locals>.<listcomp>Úpipú~z.pip)r   Úsite_config_dirsr-   r.   r/   ÚsysÚprefixr0   r   r   Úuser_config_dirÚkindsr   r   r   )Zglobal_config_filesZsite_config_fileZlegacy_config_fileZnew_config_filer%   r%   r&   Úget_configuration_filesK   s     þ
ý
ÿ
ýr:   c                       sÆ   e Zd ZdZd-‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Z‡  ZS ).Ú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.
    Nc                    sn   t t| ƒ ¡  |d ur8|tvr8t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>~   s   z*Configuration.__init__.<locals>.<dictcomp>c                 S   s   i | ]
}|i “qS r%   r%   r<   r%   r%   r&   r>   �   s   )Úsuperr;   Ú__init__ÚVALID_LOAD_ONLYr   r*   r/   ÚmapÚreprÚisolatedÚ	load_onlyÚOVERRIDE_ORDERÚ_parsersÚ_configÚ_modified_parsers)ÚselfrD   rE   ©Ú	__class__r%   r&   r@   p   s     ÿÿÿÿzConfiguration.__init__c                 C   s   |   ¡  | js|  ¡  dS )zELoads configuration from configuration files and environment
        N)Ú_load_config_filesrD   Ú_load_environment_vars©rJ   r%   r%   r&   Úload†   s    zConfiguration.loadc                 C   s:   | j dusJ dƒ‚z|  ¡ d W S  ty4   Y dS 0 dS )z@Returns the file with highest priority in configuration
        Nz)Need to be specified a file to be editingr   )rE   Ú_get_parser_to_modifyÚ
IndexErrorrO   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ÚitemsrO   r%   r%   r&   rU   š   s    zConfiguration.itemsc                 C   s2   z| j | W S  ty,   td |¡ƒ‚Y n0 dS )z,Get a value from the configuration.
        úNo such key - {}N)rT   ÚKeyErrorr   r*   )rJ   Úkeyr%   r%   r&   Ú	get_value¡   s    zConfiguration.get_valuec                 C   st   |   ¡  | jsJ ‚|  ¡ \}}|durTt|ƒ\}}| |¡sF| |¡ | |||¡ || j| j |< |  ||¡ dS )z-Modify a value in the configuration.
        N)	Ú_ensure_have_load_onlyrE   rQ   r,   Úhas_sectionÚadd_sectionÚsetrH   Ú_mark_as_modified)rJ   rX   ÚvalueÚfnameÚparserÚsectionr$   r%   r%   r&   Ú	set_valueª   s    


zConfiguration.set_valuec                 C   s    |   ¡  | jsJ ‚|| j| j vr0td |¡ƒ‚|  ¡ \}}|durŽt|ƒ\}}| |¡rf| ||¡sntdƒ‚| 	|¡s‚| 
|¡ |  ||¡ | j| j |= dS )z#Unset a value in the configuration.rV   Nz4Fatal Internal error [id=1]. Please report as a bug.)rZ   rE   rH   r   r*   rQ   r,   r[   Úremove_optionrU   Úremove_sectionr^   )rJ   rX   r`   ra   rb   r$   r%   r%   r&   Úunset_value¾   s"    


ÿÿ

zConfiguration.unset_valuec              	   C   sl   |   ¡  | jD ]X\}}t d|¡ ttj |¡ƒ t|dƒ�}| 	|¡ W d  ƒ q1 s\0    Y  qdS )z*Save the current in-memory state.
        zWriting to %sÚwN)
rZ   rI   ÚloggerÚinfor   r-   r.   ÚdirnameÚopenÚwrite)rJ   r`   ra   Ú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)rE   r   rh   ÚdebugrO   r%   r%   r&   rZ   ì   s    
z$Configuration._ensure_have_load_onlyc                 C   s"   i }t D ]}| | j| ¡ q|S )z<A dictionary representing the loaded configuration.
        )rF   ÚupdaterH   )rJ   Úretvalr=   r%   r%   r&   rT   ò   s    zConfiguration._dictionaryc                 C   s˜   t |  ¡ ƒ}|tj dd… tjgkr4t d¡ dS | ¡ D ]V\}}|D ]H}| j	durp|| j	krpt d||¡ qH|  
||¡}| j|  ||f¡ qHq<dS )z5Loads configuration from configuration files
        r   r)   zZSkipping loading configuration files due to environment's PIP_CONFIG_FILE being os.devnullNz Skipping file '%s' (variant: %s))ÚdictÚiter_config_filesr9   r   r-   Údevnullrh   ro   rU   rE   Ú
_load_filerG   Úappend)rJ   Úconfig_filesr=   Úfilesr`   ra   r%   r%   r&   rM      s    ÿÿz Configuration._load_config_filesc                 C   sL   t  d||¡ |  |¡}| ¡ D ]&}| |¡}| j|  |  ||¡¡ q |S )Nz'For variant '%s', will try loading '%s')rh   ro   Ú_construct_parserÚsectionsrU   rH   rp   Ú_normalized_keys)rJ   r=   r`   ra   rb   rU   r%   r%   r&   ru     s    

zConfiguration._load_filec              
   C   s€   t  ¡ }tj |¡r|z| |¡ W nX tyL   td t	 
d¡¡|d�‚Y n0 t jyz } zt|d�‚W Y d }~n
d }~0 0 |S )Nzcontains invalid {} charactersF)Úreasonr`   )Úerror)r   ÚRawConfigParserr-   r.   ÚexistsÚreadÚUnicodeDecodeErrorr   r*   ÚlocaleÚgetpreferredencodingÚError)rJ   r`   ra   r}   r%   r%   r&   ry   &  s    ÿü
 zConfiguration._construct_parserc                 C   s"   | j tj  |  d|  ¡ ¡¡ dS )z7Loads configuration from environment variables
        z:env:N)rH   r9   r   rp   r{   Úget_environ_varsrO   r%   r%   r&   rN   =  s    ÿz$Configuration._load_environment_varsc                 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'   )rJ   rb   rU   Ú
normalizedr$   ÚvalrX   r%   r%   r&   r{   E  s
    
zConfiguration._normalized_keysc                 c   sD   t j ¡ D ]4\}}| d¡r
|dd…  ¡ }|tvr
||fV  q
dS )z@Returns a generator with all environmental vars with prefix PIP_ZPIP_é   N)r-   ÚenvironrU   r#   r!   ÚENV_NAMES_IGNORED)rJ   rX   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 ob|o`t j 	|¡ }|rzt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.
        ZPIP_CONFIG_FILEN)r-   r‰   Úgetr9   r   r:   r   rD   r.   r   r   r   )rJ   Úconfig_filerw   Zshould_load_user_configr%   r%   r&   rs   \  s    	ÿzConfiguration.iter_config_filesc                 C   s
   | j | S )z#Get values present in a config file)rH   )rJ   r=   r%   r%   r&   Úget_values_in_config{  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.éÿÿÿÿ)rE   rG   r   )rJ   Úparsersr%   r%   r&   rQ   €  s    
ÿz#Configuration._get_parser_to_modifyc                 C   s"   ||f}|| j vr| j  |¡ d S )N)rI   rv   )rJ   r`   ra   Zfile_parser_tupler%   r%   r&   r^   �  s    
zConfiguration._mark_as_modifiedc                 C   s   d  | jj| j¡S )Nz{}({!r}))r*   rL   Ú__name__rT   rO   r%   r%   r&   Ú__repr__•  s    zConfiguration.__repr__)N)r�   Ú
__module__Ú__qualname__Ú__doc__r@   rP   rS   rU   rY   rc   rf   rn   rZ   ÚpropertyrT   rM   ru   ry   rN   r{   r…   rs   r�   rQ   r^   r‘   Ú__classcell__r%   r%   rK   r&   r;   b   s.   	

r;   )1r”   r‚   Úloggingr-   r6   Zpip._vendor.six.movesr   Úpip._internal.exceptionsr   r   Úpip._internal.utilsr   Úpip._internal.utils.compatr   r   Úpip._internal.utils.miscr   r	   Úpip._internal.utils.typingr
   Útypingr   r   r   r   r   r   r   r~   Ústrr   r0   rŠ   r9   r   r   r   r   r   rF   rA   Ú	getLoggerr�   rh   r'   r,   r:   Úobjectr;   r%   r%   r%   r&   Ú<module>   s<   $
û

