3
ga3                 @   s>  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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'eedddZ(ee	e dddZ)eee	e f 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
    N)AnyDictIterableListNewTypeOptionalTuple)ConfigurationError!ConfigurationFileCouldNotBeLoaded)appdirs)WINDOWS)	getLogger)
ensure_direnumKindzpip.inizpip.confversionhelpuserglobalZsiteenvzenv-var)USERGLOBALSITEENVENV_VAR)namereturnc             C   s*   | j  jdd} | jdr&| dd } | S )zAMake a name consistent regardless of source (environment or file)_-z--   N)lowerreplace
startswith)r    r#   Y/var/www/tester-filtro-web/env/lib/python3.6/site-packages/pip/_internal/configuration.py_normalize_name2   s    
r%   c             C   s&   d| krdj | }t|| j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*   )r   c              C   st   dd t jdD } tjjtjt}tjjtjjdt	r<dndt}tjjt j
dt}tj| tj|gtj||giS )Nc             S   s   g | ]}t jj|tqS r#   )ospathjoinCONFIG_BASENAME).0r,   r#   r#   r$   
<listcomp>F   s    z+get_configuration_files.<locals>.<listcomp>pip~z.pip)r   Zsite_config_dirsr+   r,   r-   sysprefixr.   
expanduserr   Zuser_config_dirkindsr   r   r   )Zglobal_config_filesZsite_config_fileZlegacy_config_fileZnew_config_filer#   r#   r$   get_configuration_filesD   s    

r7   c                   s  e Zd ZdZd6eee dd fddZddddZee	 dd	d
Z
eee	ef  dddZe	edddZe	eddddZe	ddddZddddZddddZeee	ef dddZddddZee	edddZe	ed d!d"Zddd#d$Ze	eee	ef  ee	ef d%d&d'Zeee	e	f  dd(d)Zeeeee	 f  dd*d+Zeee	ef d,d-d.Z ee	ef dd/d0Z!e	edd1d2d3Z"e	dd4d5Z#  Z$S )7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  j  |d k	r4|tkr4tdjdj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>r   s   z*Configuration.__init__.<locals>.<dictcomp>c             S   s   i | ]
}i |qS r#   r#   )r/   r;   r#   r#   r$   r<   u   s   )super__init__VALID_LOAD_ONLYr	   r(   r-   mapreprr9   r:   OVERRIDE_ORDER_parsers_config_modified_parsers)selfr9   r:   )	__class__r#   r$   r>   e   s    


zConfiguration.__init__)r   c             C   s   | j   | js| j  dS )z<Loads configuration from configuration files and environmentN)_load_config_filesr9   _load_environment_vars)rF   r#   r#   r$   loadz   s    zConfiguration.loadc             C   s8   | j dk	stdy| j d S  tk
r2   dS X dS )z7Returns the file with highest priority in configurationNz)Need to be specified a file to be editingr   )r:   AssertionError_get_parser_to_modify
IndexError)rF   r#   r#   r$   get_file_to_edit   s
    zConfiguration.get_file_to_editc             C   s
   | j j S )z`Returns key-value pairs like dict.items() representing the loaded
        configuration
        )_dictionaryitems)rF   r#   r#   r$   rP      s    zConfiguration.items)keyr   c             C   s2   y
| j | S  tk
r,   td| Y nX dS )z#Get a value from the configuration.zNo such key - N)rO   KeyErrorr	   )rF   rQ   r#   r#   r$   	get_value   s    
zConfiguration.get_value)rQ   valuer   c             C   st   | j   | jst| j \}}|dk	rTt|\}}|j|sF|j| |j||| || j| j |< | j	|| dS )z$Modify a value in the configuration.N)
_ensure_have_load_onlyr:   rK   rL   r*   has_sectionZadd_sectionsetrD   _mark_as_modified)rF   rQ   rT   fnameparsersectionr   r#   r#   r$   	set_value   s    


zConfiguration.set_valuec             C   s   | j   | jst|| j| j kr0td| | j \}}|dk	rt|\}}|j|od|j||sntd|j	|s|j
| | j|| | j| j |= dS )z#Unset a value in the configuration.zNo such key - Nz4Fatal Internal error [id=1]. Please report as a bug.)rU   r:   rK   rD   r	   rL   r*   rV   remove_optionrP   Zremove_sectionrX   )rF   rQ   rY   rZ   r[   r   r#   r#   r$   unset_value   s    


zConfiguration.unset_valuec          
   C   s\   | j   xN| jD ]D\}}tjd| ttjj| t|d}|j	| W dQ R X qW dS )z!Save the current in-memory state.zWriting to %swN)
rU   rE   loggerinfor   r+   r,   dirnameopenwrite)rF   rY   rZ   fr#   r#   r$   save   s    zConfiguration.savec             C   s$   | j d krtdtjd| j  d S )Nz'Needed a specific file to be modifying.z$Will be working with %s variant only)r:   r	   r`   debug)rF   r#   r#   r$   rU      s    
z$Configuration._ensure_have_load_onlyc             C   s&   i }xt D ]}|j| j|  q
W |S )z3A dictionary representing the loaded configuration.)rB   updaterD   )rF   Zretvalr;   r#   r#   r$   rO      s    
zConfiguration._dictionaryc             C   s   t | j }|tj dd tjgkr4tjd dS xf|j D ]Z\}}xP|D ]H}| j	dk	rt|| j	krttjd|| qL| j
||}| j| j||f qLW q>W 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_filesr6   r   r+   devnullr`   rg   rP   r:   
_load_filerC   append)rF   config_filesr;   filesrY   rZ   r#   r#   r$   rH      s    
z Configuration._load_config_files)r;   rY   r   c             C   sP   t jd|| | j|}x2|j D ]&}|j|}| j| j| j|| q"W |S )Nz'For variant '%s', will try loading '%s')r`   verbose_construct_parserZsectionsrP   rD   rh   _normalized_keys)rF   r;   rY   rZ   r[   rP   r#   r#   r$   rl      s    

zConfiguration._load_file)rY   r   c             C   s   t j }tjj|r|y|j| W nX tk
rN   tdjt	j
d|dY n. t jk
rz } zt|dW Y d d }~X nX |S )Nzcontains invalid {} charactersF)reasonrY   )error)configparserRawConfigParserr+   r,   existsreadUnicodeDecodeErrorr
   r(   localegetpreferredencodingError)rF   rY   rZ   rt   r#   r#   r$   rq     s    
zConfiguration._construct_parserc             C   s"   | j tj j| jd| j  dS )z.Loads configuration from environment variablesz:env:N)rD   r6   r   rh   rr   get_environ_vars)rF   r#   r#   r$   rI     s    z$Configuration._load_environment_vars)r[   rP   r   c             C   s2   i }x(|D ] \}}|d t | }|||< q
W |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[   rP   Z
normalizedr   valrQ   r#   r#   r$   rr   "  s
    zConfiguration._normalized_keysc             c   sH   xBt jj D ]4\}}|jdr|dd j }|tkr||fV  qW dS )z@Returns a generator with all environmental vars with prefix PIP_ZPIP_   N)r+   environrP   r"   r    ENV_NAMES_IGNORED)rF   rQ   r~   r   r#   r#   r$   r}   0  s
    
zConfiguration.get_environ_varsc             c   s   t jjdd}|dk	r&tj|gfV  ntjg fV  t }tj|tj fV  | j ob|o`t j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   getr6   r   r7   r   r9   r,   rw   r   r   )rF   Zconfig_filern   Zshould_load_user_configr#   r#   r$   rj   9  s    zConfiguration.iter_config_files)r;   r   c             C   s
   | j | S )z#Get values present in a config file)rD   )rF   r;   r#   r#   r$   get_values_in_configW  s    z"Configuration.get_values_in_configc             C   s*   | j s
t| j| j  }|s"td|d S )Nz4Fatal Internal error [id=2]. Please report as a bug.r'   )r:   rK   rC   r	   )rF   Zparsersr#   r#   r$   rL   [  s    
z#Configuration._get_parser_to_modify)rY   rZ   r   c             C   s"   ||f}|| j kr| j j| d S )N)rE   rm   )rF   rY   rZ   Zfile_parser_tupler#   r#   r$   rX   i  s    
zConfiguration._mark_as_modifiedc             C   s   | j j d| jdS )N())rG   __name__rO   )rF   r#   r#   r$   __repr__n  s    zConfiguration.__repr__)N)%r   
__module____qualname____doc__boolr   r   r>   rJ   strrN   r   r   r   rP   rS   r\   r^   rf   rU   propertyr   rO   rH   rv   rl   rq   rI   rr   r}   r   rj   r   rL   rX   r   __classcell__r#   r#   )rG   r$   r8   W   s0   	
	r8   )r   r   ),r   ru   rz   r+   r3   typingr   r   r   r   r   r   r   pip._internal.exceptionsr	   r
   pip._internal.utilsr   Zpip._internal.utils.compatr   Zpip._internal.utils.loggingr   pip._internal.utils.miscr   r   rv   r   r   r.   r   r6   r   r   r   r   r   rB   r?   r   r`   r%   r*   r7   r8   r#   r#   r#   r$   <module>   s6   $

