a
    `P6                     @   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rdd	lmZmZmZmZmZmZmZ ejZed
eZerd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globalZ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$   =/usr/lib/python3/dist-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>Zpip~z.pip)r   Zsite_config_dirsr,   r-   r.   sysprefixr/   r   r   Z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     


r6   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$   r0   variantr$   r$   r%   
<dictcomp>~   s   z*Configuration.__init__.<locals>.<dictcomp>c                 S   s   i | ]
}|i qS r$   r$   r8   r$   r$   r%   r:      s   )superr7   __init__VALID_LOAD_ONLYr   r)   r.   mapreprisolated	load_onlyOVERRIDE_ORDER_parsers_config_modified_parsers)selfr@   rA   	__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_filesr@   _load_environment_varsrF   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   )rA   _get_parser_to_modify
IndexErrorrK   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itemsrK   r$   r$   r%   rQ      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)rP   KeyErrorr   r)   )rF   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_onlyrA   rM   r+   has_sectionZadd_sectionsetrD   _mark_as_modified)rF   rT   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rt|\}}||rf|||sntd|	|s|
| | || | j| j |= dS )z#Unset a value in the configuration.rR   Nz4Fatal Internal error [id=1]. Please report as a bug.)rV   rA   rD   r   r)   rM   r+   rW   Zremove_optionrQ   Zremove_sectionrY   )rF   rT   r[   r\   r]   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)
rV   rE   loggerinfor   r,   r-   dirnameopenwrite)rF   r[   r\   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)rA   r   ra   debugrK   r$   r$   r%   rV      s    
z$Configuration._ensure_have_load_onlyc                 C   s"   i }t D ]}|| j|  q|S )z<A dictionary representing the loaded configuration.
        )rB   updaterD   )rF   Zretvalr9   r$   r$   r%   rP      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_filesr5   r   r,   devnullra   rh   rQ   rA   
_load_filerC   append)rF   config_filesr9   filesr[   r\   r$   r$   r%   rI      s    z Configuration._load_config_filesc                 C   sL   t d|| | |}| D ]&}||}| j| | || q |S )Nz'For variant '%s', will try loading '%s')ra   rh   _construct_parserZsectionsrQ   rD   ri   _normalized_keys)rF   r9   r[   r\   r]   rQ   r$   r$   r%   rm     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)rF   r[   r\   rt   r$   r$   r%   rq   &  s    
 zConfiguration._construct_parserc                 C   s"   | j tj | d|   dS )z7Loads configuration from environment variables
        z:env:N)rD   r5   r   ri   rr   get_environ_varsrK   r$   r$   r%   rJ   =  s    z$Configuration._load_environment_varsc                 C   s.   i }|D ] \}}|d t | }|||< q|S )zNormalizes 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&   )rF   r]   rQ   Z
normalizedr#   valrT   r$   r$   r%   rr   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,   environrQ   r"   r    ENV_NAMES_IGNORED)rF   rT   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   getr5   r   r6   r   r@   r-   rv   r   r   )rF   Zconfig_filero   Zshould_load_user_configr$   r$   r%   rk   \  s    	zConfiguration.iter_config_filesc                 C   s
   | j | S )z#Get values present in a config file)rD   )rF   r9   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.)rA   rC   r   )rF   Zparsersr$   r$   r%   rM     s    
z#Configuration._get_parser_to_modifyc                 C   s"   ||f}|| j vr| j | d S )N)rE   rn   )rF   r[   r\   Zfile_parser_tupler$   r$   r%   rY     s    
zConfiguration._mark_as_modifiedc                 C   s   d | jj| jS )Nz{}({!r}))r)   rH   __name__rP   rK   r$   r$   r%   __repr__  s    zConfiguration.__repr__)N)r   
__module____qualname____doc__r<   rL   rO   rQ   rU   r^   r_   rg   rV   propertyrP   rI   rm   rq   rJ   rr   r|   rk   r   rM   rY   r   __classcell__r$   r$   rG   r%   r7   b   s.   	

r7   )1r   ry   Zloggingr,   r3   Zpip._vendor.six.movesr   Zpip._internal.exceptionsr   r   Zpip._internal.utilsr   Zpip._internal.utils.compatr   r   Zpip._internal.utils.miscr   r	   Zpip._internal.utils.typingr
   typingr   r   r   r   r   r   r   ru   strr   r/   r   r5   r   r   r   r   r   rB   r=   Z	getLoggerr   ra   r&   r+   r6   objectr7   r$   r$   r$   r%   <module>   s<   $


