a
    ýÓEbs3  ã                   @   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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'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*   |   ¡  dd¡} |  d¡r&| dd… } | S )zAMake a name consistent regardless of source (environment or file)Ú_ú-z--é   N)ÚlowerÚreplaceÚ
startswith)r   © r#   ú[/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/pip/_internal/configuration.pyÚ_normalize_name2   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*   ©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>E   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    ÿ

ý
ýr8   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 ur4|tv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#   ©r0   Ú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>   u   s   )ÚsuperÚ__init__ÚVALID_LOAD_ONLYr	   r(   r.   ÚmapÚreprr:   r;   ÚOVERRIDE_ORDERÚ_parsersÚ_configÚ_modified_parsers)Úselfr:   r;   ©Ú	__class__r#   r$   r@   e   s     
ÿÿÿÿzConfiguration.__init__r+   c                 C   s   |   ¡  | js|  ¡  dS )z<Loads configuration from configuration files and environmentN)Ú_load_config_filesr:   Ú_load_environment_vars©rH   r#   r#   r$   Úloadz   s    zConfiguration.loadc                 C   s:   | j dusJ dƒ‚z|  ¡ d W S  ty4   Y dS 0 dS )z7Returns the file with highest priority in configurationNz)Need to be specified a file to be editingr   )r;   Ú_get_parser_to_modifyÚ
IndexErrorrM   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ÚitemsrM   r#   r#   r$   rS   ‰   s    zConfiguration.items)Úkeyr   c                 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)rR   ÚKeyErrorr	   )rH   rT   r#   r#   r$   Ú	get_value�   s    zConfiguration.get_value)rT   Úvaluer   c                 C   st   |   ¡  | jsJ ‚|  ¡ \}}|durTt|ƒ\}}| |¡sF| |¡ | |||¡ || j| j |< |  ||¡ dS )z$Modify a value in the configuration.N)	Ú_ensure_have_load_onlyr;   rO   r*   Úhas_sectionZadd_sectionÚsetrF   Ú_mark_as_modified)rH   rT   rX   Ú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rŽt|ƒ\}}| |¡rf| ||¡sntdƒ‚| |¡s‚| 	|¡ |  
||¡ | j| j |= dS )z#Unset a value in the configuration.rU   Nz4Fatal Internal error [id=1]. Please report as a bug.)rY   r;   rF   r	   rO   r*   rZ   Úremove_optionrS   Zremove_sectionr\   )rH   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)
rY   rG   ÚloggerÚinfor   r,   r-   ÚdirnameÚopenÚwrite)rH   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)r;   r	   rd   ÚdebugrM   r#   r#   r$   rY   Ô   s    
z$Configuration._ensure_have_load_onlyc                 C   s"   i }t D ]}| | j| ¡ q|S )z3A dictionary representing the loaded configuration.)rD   ÚupdaterF   )rH   Zretvalr=   r#   r#   r$   rR   Ù   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 )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_filesr7   r   r,   Údevnullrd   rk   rS   r;   Ú
_load_filerE   Úappend)rH   Úconfig_filesr=   Úfilesr]   r^   r#   r#   r$   rK   å   s    ÿz Configuration._load_config_files)r=   r]   r   c                 C   sL   t  d||¡ |  |¡}| ¡ D ]&}| |¡}| j|  |  ||¡¡ q |S )Nz'For variant '%s', will try loading '%s')rd   ÚverboseÚ_construct_parserZsectionsrS   rF   rl   Ú_normalized_keys)rH   r=   r]   r^   r_   rS   r#   r#   r$   rp   ü   s    

zConfiguration._load_file)r]   r   c              
   C   sŠ   t  ¡ }tj |¡r†t d¡}z|j||d� W nT tyV   t	d|› d�|d�‚Y n0 t j
y„ } zt	|d�‚W Y d }~n
d }~0 0 |S )NF)Úencodingzcontains invalid z characters)Úreasonr]   )Úerror)ÚconfigparserÚRawConfigParserr,   r-   ÚexistsÚlocaleÚgetpreferredencodingÚreadÚUnicodeDecodeErrorr
   ÚError)rH   r]   r^   Zlocale_encodingry   r#   r#   r$   ru     s    

þ
 zConfiguration._construct_parserc                 C   s"   | j tj  |  d|  ¡ ¡¡ dS )z.Loads configuration from environment variablesz:env:N)rF   r7   r   rl   rv   Úget_environ_varsrM   r#   r#   r$   rL     s    ÿz$Configuration._load_environment_vars)r_   rS   r   c                 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%   )rH   r_   rS   Z
normalizedr   ÚvalrT   r#   r#   r$   rv   !  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,   ÚenvironrS   r"   r    ÚENV_NAMES_IGNORED)rH   rT   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…   Úgetr7   r   r8   r   r:   r-   r|   r   r   )rH   Zconfig_filerr   Zshould_load_user_configr#   r#   r$   rn   8  s    ÿzConfiguration.iter_config_files)r=   r   c                 C   s
   | j | S )z#Get values present in a config file)rF   )rH   r=   r#   r#   r$   Úget_values_in_configV  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.éÿÿÿÿ)r;   rE   r	   )rH   Zparsersr#   r#   r$   rO   Z  s    
ÿz#Configuration._get_parser_to_modify)r]   r^   r   c                 C   s"   ||f}|| j vr| j  |¡ d S )N)rG   rq   )rH   r]   r^   Zfile_parser_tupler#   r#   r$   r\   h  s    
zConfiguration._mark_as_modifiedc                 C   s   | j j› d| j›d�S )Nú(ú))rJ   Ú__name__rR   rM   r#   r#   r$   Ú__repr__m  s    zConfiguration.__repr__)N)%rŒ   Ú
__module__Ú__qualname__Ú__doc__Úboolr   r   r@   rN   ÚstrrQ   r   r   r   rS   rW   r`   rb   rj   rY   Úpropertyr   rR   rK   r{   rp   ru   rL   rv   r‚   r   rn   rˆ   rO   r\   r�   Ú__classcell__r#   r#   rI   r$   r9   W   s2   	

þ	r9   ),r�   rz   r}   r,   r4   Ú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   r{   r’   r   r/   r†   r7   r   r   r   r   r   rD   rA   rŒ   rd   r%   r*   r8   r9   r#   r#   r#   r$   Ú<module>   s8   $
û
