U
    +|j�5  ã                   @   s  d Z ddl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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ƒ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)Ú
ensure_dirÚenumÚ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"   úcC:\Users\snmko\Desktop\web_content\django_cbt\venv\Lib\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*   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>I   s   ÿz+get_configuration_files.<locals>.<listcomp>Úpipú~z.pip)r   Úsite_config_dirsr+   r,   r-   ÚsysÚprefixr.   Ú
expanduserr   Úuser_config_dirÚkindsr   r   r   )Úglobal_config_filesÚsite_config_fileÚlegacy_config_fileÚnew_config_filer"   r"   r#   Úget_configuration_filesG   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                    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"   ©r/   Úvariantr"   r"   r#   Ú
<dictcomp>z   s     z*Configuration.__init__.<locals>.<dictcomp>c                 S   s   i | ]
}|i “qS r"   r"   r?   r"   r"   r#   rA   }   s     )ÚsuperÚ__init__ÚVALID_LOAD_ONLYr	   r'   r-   ÚmapÚreprÚisolatedÚ	load_onlyÚOVERRIDE_ORDERÚ_parsersÚ_configÚ_modified_parsers)ÚselfrG   rH   ©Ú	__class__r"   r#   rC   l   s     
ÿÿÿÿzConfiguration.__init__c                 C   s   |   ¡  | js|  ¡  dS )zELoads configuration from configuration files and environment
        N)Ú_load_config_filesrG   Ú_load_environment_vars©rM   r"   r"   r#   Úload‚   s    zConfiguration.loadc                 C   s<   | j dk	stdƒ‚z|  ¡ d W S  tk
r6   Y dS X dS )z@Returns the file with highest priority in configuration
        Nz)Need to be specified a file to be editingr   )rH   ÚAssertionErrorÚ_get_parser_to_modifyÚ
IndexErrorrR   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ÚitemsrR   r"   r"   r#   rY   –   s    zConfiguration.itemsc                 C   s4   z| j | W S  tk
r.   td|› �ƒ‚Y nX dS )z,Get a value from the configuration.
        úNo such key - N)rX   ÚKeyErrorr	   )rM   Úkeyr"   r"   r#   Ú	get_value�   s    zConfiguration.get_valuec                 C   st   |   ¡  | jst‚|  ¡ \}}|dk	rTt|ƒ\}}| |¡sF| |¡ | |||¡ || j| j |< |  	||¡ dS )z-Modify a value in the configuration.
        N)
Ú_ensure_have_load_onlyrH   rT   rU   r*   Úhas_sectionÚadd_sectionÚsetrK   Ú_mark_as_modified)rM   r\   ÚvalueÚfnameÚparserÚsectionr!   r"   r"   r#   Ú	set_value¦   s    


zConfiguration.set_valuec                 C   s    |   ¡  | jst‚|| j| j kr0td|› �ƒ‚|  ¡ \}}|dk	rŽt|ƒ\}}| |¡rf| ||¡sntdƒ‚| 	|¡s‚| 
|¡ |  ||¡ | j| j |= dS )z#Unset a value in the configuration.rZ   Nz4Fatal Internal error [id=1]. Please report as a bug.)r^   rH   rT   rK   r	   rU   r*   r_   Úremove_optionrY   Úremove_sectionrb   )rM   r\   rd   re   rf   r!   r"   r"   r#   Úunset_valueº   s"    


ÿÿ

zConfiguration.unset_valuec              
   C   sX   |   ¡  | jD ]D\}}t d|¡ ttj |¡ƒ t|dƒ�}| 	|¡ W 5 Q R X qdS )z*Save the current in-memory state.
        zWriting to %sÚwN)
r^   rL   ÚloggerÚinfor   r+   r,   ÚdirnameÚopenÚwrite)rM   rd   re   Úfr"   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)rH   r	   rl   ÚdebugrR   r"   r"   r#   r^   è   s    
z$Configuration._ensure_have_load_onlyc                 C   s"   i }t D ]}| | j| ¡ q|S )z<A dictionary representing the loaded configuration.
        )rI   ÚupdaterK   )rM   Úretvalr@   r"   r"   r#   rX   î   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k	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_filesr8   r   r+   Údevnullrl   rs   rY   rH   Ú
_load_filerJ   Úappend)rM   Úconfig_filesr@   Úfilesrd   re   r"   r"   r#   rP   ü   s"    ÿ  ÿz Configuration._load_config_filesc                 C   sL   t  d||¡ |  |¡}| ¡ D ]&}| |¡}| j|  |  ||¡¡ q |S )Nz'For variant '%s', will try loading '%s')rl   rs   Ú_construct_parserÚsectionsrY   rK   rt   Ú_normalized_keys)rM   r@   rd   re   rf   rY   r"   r"   r#   ry     s    

zConfiguration._load_filec              
   C   s€   t  ¡ }tj |¡r|z| |¡ W nX tk
rN   td t	 
d¡¡|d�‚Y n. t jk
rz } zt|d�‚W 5 d }~X Y nX |S )Nzcontains invalid {} charactersF)Úreasonrd   )Úerror)ÚconfigparserÚRawConfigParserr+   r,   ÚexistsÚreadÚUnicodeDecodeErrorr
   r'   ÚlocaleÚgetpreferredencodingÚError)rM   rd   re   r�   r"   r"   r#   r}   "  s    ÿü
zConfiguration._construct_parserc                 C   s"   | j tj  |  d|  ¡ ¡¡ dS )z7Loads configuration from environment variables
        z:env:N)rK   r8   r   rt   r   Úget_environ_varsrR   r"   r"   r#   rQ   9  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$   )rM   rf   rY   Ú
normalizedr!   Úvalr\   r"   r"   r#   r   A  s
    
zConfiguration._normalized_keysc                 c   sD   t j ¡ D ]4\}}| d¡r
|dd…  ¡ }|tkr
||fV  q
dS )z@Returns a generator with all environmental vars with prefix PIP_ÚPIP_é   N)r+   ÚenvironrY   r    r   ÚENV_NAMES_IGNORED)rM   r\   rŒ   r!   r"   r"   r#   rŠ   N  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�   Úgetr8   r   r=   r   rG   r,   r„   r   r   )rM   Úconfig_filer{   Úshould_load_user_configr"   r"   r#   rw   X  s    	ÿzConfiguration.iter_config_filesc                 C   s
   | j | S )z#Get values present in a config file)rK   )rM   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.éÿÿÿÿ)rH   rT   rJ   r	   )rM   Úparsersr"   r"   r#   rU   |  s    
ÿz#Configuration._get_parser_to_modifyc                 C   s"   ||f}|| j kr| j  |¡ d S )N)rL   rz   )rM   rd   re   Úfile_parser_tupler"   r"   r#   rb   ‹  s    
zConfiguration._mark_as_modifiedc                 C   s   | j j› d| j›d�S )Nú(ú))rO   Ú__name__rX   rR   r"   r"   r#   Ú__repr__‘  s    zConfiguration.__repr__)N)r›   Ú
__module__Ú__qualname__Ú__doc__rC   rS   rW   rY   r]   rg   rj   rr   r^   ÚpropertyrX   rP   ry   r}   rQ   r   rŠ   rw   r•   rU   rb   rœ   Ú__classcell__r"   r"   rN   r#   r>   ^   s.   	

r>   ),rŸ   r‚   r‡   Úloggingr+   r4   Útypingr   r   r   r   r   r   r   Úpip._internal.exceptionsr	   r
   Zpip._internal.utilsr   Úpip._internal.utils.compatr   Úpip._internal.utils.miscr   r   rƒ   Ústrr   r.   r�   r8   r   r   r   r   r   rI   rD   Ú	getLoggerr›   rl   r$   r*   r=   r>   r"   r"   r"   r#   Ú<module>   s8   $
û

