
(hP6                 @   s  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 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 j) e*  Z+ d d   Z, d d   Z- d d   Z. Gd d    d  e/  Z0 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)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userGLOBALglobalSITEsiteENVenvENV_VARzenv-varc             C   s;   |  j    j d d  }  |  j d  r7 |  d d  }  |  S)zFMake a name consistent regardless of source (environment or file)
    _-z--   N)lowerreplace
startswith)name r%   :/tmp/pip-build-kmztzv_d/pip/pip/_internal/configuration.py_normalize_name6   s    r'   c             C   s7   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$   error_messager%   r%   r&   _disassemble_key@   s
    	r-   c              C   s   d d   t  j d  D }  t j j t j t  } t j j t d  t	 rR 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 Sr%   )ospathjoinCONFIG_BASENAME).0r/   r%   r%   r&   
<listcomp>N   s   	z+get_configuration_files.<locals>.<listcomp>pip~z.pip)r   site_config_dirsr.   r/   r0   sysprefixr1   r   r   user_config_dirkindsr   r   r   )Zglobal_config_filesZsite_config_file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   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                s   t  t |   j   | d  k	 rR | t k rR t 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 Sr%   r%   )r2   variantr%   r%   r&   
<dictcomp>~   s   	z*Configuration.__init__.<locals>.<dictcomp>c             S   s   i  |  ] } i  |  q Sr%   r%   )r2   r>   r%   r%   r&   r?      s   	)superr=   __init__VALID_LOAD_ONLYr   r*   r0   mapreprisolated	load_onlyOVERRIDE_ORDER_parsers_config_modified_parsers)selfrE   rF   )	__class__r%   r&   rA   p   s    				zConfiguration.__init__c             C   s!   |  j    |  j s |  j   d S)zELoads configuration from configuration files and environment
        N)_load_config_filesrE   _load_environment_vars)rK   r%   r%   r&   load   s    
	zConfiguration.loadc             C   sJ   |  j  d k	 s t d   y |  j   d SWn t k
 rE d SYn Xd S)z@Returns the file with highest priority in configuration
        Nz)Need to be specified a file to be editingr   )rF   AssertionError_get_parser_to_modify
IndexError)rK   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)rK   r%   r%   r&   rU      s    zConfiguration.itemsc             C   s=   y |  j  | SWn' t k
 r8 t d j |    Yn Xd S)z,Get a value from the configuration.
        zNo such key - {}N)rT   KeyErrorr   r*   )rK   keyr%   r%   r&   	get_value   s    zConfiguration.get_valuec             C   s   |  j    |  j s t  |  j   \ } } | d k	 rx t |  \ } } | j |  se | j |  | j | | |  | |  j |  j | <|  j	 | |  d S)z-Modify a value in the configuration.
        N)
_ensure_have_load_onlyrF   rP   rQ   r-   has_sectionadd_sectionsetrI   _mark_as_modified)rK   rW   valuefnameparsersectionr$   r%   r%   r&   	set_value   s    
zConfiguration.set_valuec             C   s   |  j    |  j s t  | |  j |  j k rD t d j |    |  j   \ } } | d k	 r t |  \ } } | j |  o | j	 | |  s t 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.)rY   rF   rP   rI   r   r*   rQ   r-   rZ   remove_optionrU   remove_sectionr]   )rK   rW   r_   r`   ra   r$   r%   r%   r&   unset_value   s    
	zConfiguration.unset_valuec          
   C   st   |  j    xc |  j D]X \ } } t j d |  t t j j |   t | d   } | j	 |  Wd QRXq Wd S)z*Save the current in-memory state.
        zWriting to %swN)
rY   rJ   loggerinfor   r.   r/   dirnameopenwrite)rK   r_   r`   fr%   r%   r&   save   s    
zConfiguration.savec             C   s2   |  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)rF   r   rg   debug)rK   r%   r%   r&   rY      s    z$Configuration._ensure_have_load_onlyc             C   s/   i  } x" t  D] } | j |  j |  q W| S)z<A dictionary representing the loaded configuration.
        )rG   updaterI   )rK   retvalr>   r%   r%   r&   rT      s    zConfiguration._dictionaryc             C   s   t  |  j    } | t j d d  t j g k rF t j d  d Sx | j   D]} \ } } xn | D]f } |  j	 d k	 r | |  j	 k r t j d | |  qf |  j
 | |  } |  j | j | | f  qf WqS Wd 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_filesr:   r   r.   devnullrg   rn   rU   rF   
_load_filerH   append)rK   config_filesr>   filesr_   r`   r%   r%   r&   rM      s    #z Configuration._load_config_filesc             C   sl   t  j d | |  |  j |  } xC | j   D]5 } | j |  } |  j | j |  j | |   q/ W| S)Nz'For variant '%s', will try loading '%s')rg   rn   _construct_parsersectionsrU   rI   ro   _normalized_keys)rK   r>   r_   r`   ra   rU   r%   r%   r&   rt     s    $zConfiguration._load_filec             C   s   t  j   } t j j |  r y | j |  Wno t k
 rj t d d j t	 j
 d   d |   Yn7 t  j k
 r } z t d |   WYd  d  } ~ Xn X| S)Nreasonzcontains invalid {} charactersFr_   error)r   RawConfigParserr.   r/   existsreadUnicodeDecodeErrorr   r*   localegetpreferredencodingError)rK   r_   r`   r|   r%   r%   r&   rx   &  s    "zConfiguration._construct_parserc             C   s-   |  j  t j j |  j d |  j     d S)z7Loads configuration from environment variables
        z:env:N)rI   r:   r   ro   rz   get_environ_vars)rK   r%   r%   r&   rN   =  s    z$Configuration._load_environment_varsc             C   s?   i  } x2 | 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'   )rK   ra   rU   
normalizedr$   valrW   r%   r%   r&   rz   E  s
    zConfiguration._normalized_keysc             c   s`   xY t  j j   D]H \ } } | j d  r | d d  j   } | t k r | | f Vq Wd S)z@Returns a generator with all environmental vars with prefix PIP_ZPIP_   N)r.   environrU   r#   r!   ENV_NAMES_IGNORED)rK   rW   r   r$   r%   r%   r&   r   R  s
    zConfiguration.get_environ_varsc             c   s   t  j j d d  } | d k	 r5 t j | g f Vn t j g  f Vt   } t j | t j f V|  j o | o t  j j	 |  } | r t 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   rE   r/   r~   r   r   )rK   config_filerv   Zshould_load_user_configr%   r%   r&   rr   \  s    		
zConfiguration.iter_config_filesc             C   s   |  j  | S)z#Get values present in a config file)rI   )rK   r>   r%   r%   r&   get_values_in_config{  s    z"Configuration.get_values_in_configc             C   s9   |  j  s t  |  j |  j  } | s1 t d   | d S)Nz4Fatal Internal error [id=2]. Please report as a bug.r)   )rF   rP   rH   r   )rK   parsersr%   r%   r&   rQ     s    	z#Configuration._get_parser_to_modifyc             C   s/   | | f } | |  j  k r+ |  j  j |  d  S)N)rJ   ru   )rK   r_   r`   Zfile_parser_tupler%   r%   r&   r]     s    zConfiguration._mark_as_modifiedc             C   s   d j  |  j j |  j  S)Nz{}({!r}))r*   rL   __name__rT   )rK   r%   r%   r&   __repr__  s    zConfiguration.__repr__)r   
__module____qualname____doc__rA   rO   rS   rU   rX   rb   re   rm   rY   propertyrT   rM   rt   rx   rN   rz   r   rr   r   rQ   r]   r   r%   r%   )rL   r&   r=   b   s,   	
r=   )zversionzhelp)1r   r   loggingr.   r7   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
   Ztypingr   r   r   r   r   r   r   r}   strr   r1   r   r:   r   r   r   r   r   rG   rB   	getLoggerr   rg   r'   r-   r<   objectr=   r%   r%   r%   r&   <module>   s:   4		$
