B
    He6                 @   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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$   o/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/pip/_internal/configuration.py_normalize_name2   s    
r&   c             C   s&   d| k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,   )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>F   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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    |d k	r4|tkr4t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   s   z*Configuration.__init__.<locals>.<dictcomp>c             S   s   i | ]
}i |qS r$   r$   )r1   rC   r$   r$   r%   rD   u   s   )super__init__VALID_LOAD_ONLYr	   r)   r/   mapreprrA   rB   OVERRIDE_ORDER_parsers_config_modified_parsers)selfrA   rB   )	__class__r$   r%   rF   e   s    


zConfiguration.__init__)r   c             C   s   |    | js|   dS )z<Loads configuration from configuration files and environmentN)_load_config_filesrA   _load_environment_vars)rN   r$   r$   r%   loadz   s    zConfiguration.loadc             C   s8   | j dk	stdy|  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   )rB   AssertionError_get_parser_to_modify
IndexError)rN   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items)rN   r$   r$   r%   rX      s    zConfiguration.items)keyr   c             C   sF   |}t |}y
| j| S  tk
r@   t| td| Y nX dS )z#Get a value from the configuration.zNo such key - N)r&   rW   KeyErrorr,   r	   )rN   rY   orig_keyr$   r$   r%   	get_value   s    
zConfiguration.get_value)rY   valuer   c             C   s|   t |}|   | jst|  \}}|dk	r\t|\}}||sN|| |||| || j	| j |< | 
|| dS )z$Modify a value in the configuration.N)r&   _ensure_have_load_onlyrB   rS   rT   r,   has_sectionadd_sectionsetrL   _mark_as_modified)rN   rY   r]   fnameparsersectionr   r$   r$   r%   	set_value   s    


zConfiguration.set_valuec             C   s   |}t |}|   | jst|| j| j kr<td| |  \}}|dk	rt|\}}||rr|	||sztd|
|s|| | || | 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.)r&   r^   rB   rS   rL   r	   rT   r,   r_   remove_optionrX   remove_sectionrb   )rN   rY   r[   rc   rd   re   r   r$   r$   r%   unset_value   s     


zConfiguration.unset_valuec             C   s   |    x| jD ]\}}td| ttj| y$t|d}|	| W dQ R X W q t
k
r } ztd| d| W dd}~X Y qX q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: )r^   rM   loggerinfor   r-   r.   dirnameopenwriteOSErrorr	   )rN   rc   rd   ferrorr$   r$   r%   save   s    zConfiguration.savec             C   s$   | j d k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	   rk   debug)rN   r$   r$   r%   r^      s    
z$Configuration._ensure_have_load_onlyc             C   s&   i }xt D ]}|| j|  q
W |S )z3A dictionary representing the loaded configuration.)rJ   updaterL   )rN   retvalrC   r$   r$   r%   rW      s    
zConfiguration._dictionaryc             C   s   t |  }|tj dd tjgkr4td dS xf| D ]Z\}}xP|D ]H}| j	dk	rt|| j	krttd|| qL| 
||}| 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_filesr:   r   r-   devnullrk   rt   rX   rB   
_load_filerK   append)rN   config_filesrC   filesrc   rd   r$   r$   r%   rP      s    
z Configuration._load_config_files)rC   rc   r   c             C   sP   t d|| | |}x2| D ]&}||}| j| | || q"W |S )Nz'For variant '%s', will try loading '%s')rk   verbose_construct_parsersectionsrX   rL   ru   _normalized_keys)rN   rC   rc   rd   re   rX   r$   r$   r%   rz     s    

zConfiguration._load_file)rc   r   c          
   C   s   t  }tj|rtd}y|j||d W nT tk
rX   t	d| d|dY n. t j
k
r } zt	|dW d d }~X Y nX |S )NF)encodingzcontains invalid z characters)reasonrc   )rr   )configparserRawConfigParserr-   r.   existslocalegetpreferredencodingreadUnicodeDecodeErrorr
   Error)rN   rc   rd   locale_encodingrr   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)rL   r:   r   ru   r   get_environ_vars)rN   r$   r$   r%   rQ   *  s    z$Configuration._load_environment_vars)re   rX   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&   )rN   re   rX   
normalizedr   valrY   r$   r$   r%   r   0  s
    zConfiguration._normalized_keysc             c   sH   xBt j D ]4\}}|dr|dd  }|tkr||fV  qW dS )z@Returns a generator with all environmental vars with prefix PIP_PIP_   N)r-   environrX   r#   r!   ENV_NAMES_IGNORED)rN   rY   r   r   r$   r$   r%   r   >  s
    
zConfiguration.get_environ_varsc             c   s   t 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	| }|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.
        PIP_CONFIG_FILEN)r-   r   getr:   r   r?   r   rA   r.   r   r   r   )rN   config_filer|   should_load_user_configr$   r$   r%   rx   G  s    zConfiguration.iter_config_files)rC   r   c             C   s
   | j | S )z#Get values present in a config file)rL   )rN   rC   r$   r$   r%   get_values_in_confige  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.)rB   rS   rK   r	   )rN   parsersr$   r$   r%   rT   i  s    
z#Configuration._get_parser_to_modify)rc   rd   r   c             C   s"   ||f}|| j kr| j | d S )N)rM   r{   )rN   rc   rd   file_parser_tupler$   r$   r%   rb   w  s    
zConfiguration._mark_as_modifiedc             C   s   | j j d| jdS )N())rO   __name__rW   )rN   r$   r$   r%   __repr__|  s    zConfiguration.__repr__)N)%r   
__module____qualname____doc__boolr   r   rF   rR   strrV   r   r   r   rX   r\   rf   ri   rs   r^   propertyr   rW   rP   r   rz   r   rQ   r   r   r   rx   r   rT   rb   r   __classcell__r$   r$   )rO   r%   r@   W   s0   	
	r@   ),r   r   r   r-   r6   typingr   r   r   r   r   r   r   pip._internal.exceptionsr	   r
   Z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   rJ   rG   r   rk   r&   r,   r?   r@   r$   r$   r$   r%   <module>   s6   $

