a
    ñ»jè8  ã                   @  s2  d Z ddlm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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&dddœdd„Z'dddœdd„Z(d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
é    )ÚannotationsN)ÚIterable)ÚAnyÚNewType)Ú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Ústr)ÚnameÚreturnc                 C  s   |   ¡  dd¡} |  d¡} | S )zAMake a name consistent regardless of source (environment or file)Ú_ú-z--)ÚlowerÚreplaceÚremoveprefix)r   © r!   úAE:\soccer\ml_env\Lib\site-packages\pip/_internal/configuration.pyÚ_normalize_name5   s    
r#   z	list[str]c                 C  s(   d| vrd| › d�}t |ƒ‚|  dd¡S )NÚ.zVKey does not contain dot separated section and key. Perhaps you wanted to use 'global.z
' instead?é   )r   Úsplit)r   Úerror_messager!   r!   r"   Ú_disassemble_key<   s    ÿÿr(   zdict[Kind, list[str]]©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>G   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_filesF   s    ÿ

ý
ýr<   c                      s`  e Zd ZdZdDddddœ‡ fdd„Zdd	œd
d„Zdd	œdd„Zdd	œdd„Zdddœdd„Zddddœdd„Z	dddœdd„Z
dd	œdd„Zdd	œdd„Zed d	œd!d"„ƒZdd	œd#d$„Zd%dd&d'œd(d)„Zdd&d*œd+d,„Zdd	œd-d.„Zddd/d0œd1d2„Zd3d	œd4d5„Zd6d	œd7d8„Zd%d/d9œd:d;„Zd<d	œd=d>„Zdd&dd?œd@dA„Zdd	œdBdC„Z‡  ZS )EÚ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ÚboolzKind | NoneÚNone)Ú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!   ©r.   Úvariantr!   r!   r"   Ú
<dictcomp>t   s   z*Configuration.__init__.<locals>.<dictcomp>c                 S  s   i | ]
}|i “qS r!   r!   rB   r!   r!   r"   rD   w   s   )ÚsuperÚ__init__ÚVALID_LOAD_ONLYr   Úformatr,   ÚmapÚreprr@   rA   ÚOVERRIDE_ORDERÚ_parsersÚ_configÚ_modified_parsers)Úselfr@   rA   ©Ú	__class__r!   r"   rF   g   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©rO   r!   r!   r"   Úload|   s    zConfiguration.loadz
str | Nonec                 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   )rA   Ú_get_parser_to_modifyÚ
IndexErrorrT   r!   r!   r"   Úget_file_to_edit‚   s
    zConfiguration.get_file_to_editzIterable[tuple[str, Any]]c                 C  s
   | j  ¡ S )z`Returns key-value pairs like dict.items() representing the loaded
        configuration
        )Ú_dictionaryÚitemsrT   r!   r!   r"   rZ   ‹   s    zConfiguration.itemsr   r   )Úkeyr   c                 C  sb   |}t |ƒ}z(i }| j ¡ D ]}| |¡ q|| W S  ty\   t|ƒ td|› �ƒ‚Y n0 dS )z#Get a value from the configuration.úNo such key - N)r#   rY   ÚvaluesÚupdateÚKeyErrorr(   r   )rO   r[   Úorig_keyZclean_configZfile_valuesr!   r!   r"   Ú	get_value‘   s    
zConfiguration.get_value)r[   Úvaluer   c                 C  s”   t |ƒ}|  ¡  | jsJ ‚|  ¡ \}}|dur\t|ƒ\}}| |¡sN| |¡ | |||¡ | j| j  	|i ¡ || j| j | |< |  
||¡ dS )z$Modify a value in the configuration.N)r#   Ú_ensure_have_load_onlyrA   rV   r(   Úhas_sectionÚadd_sectionÚsetrM   Ú
setdefaultÚ_mark_as_modified)rO   r[   rb   ÚfnameÚparserÚsectionr   r!   r!   r"   Ú	set_value    s    


zConfiguration.set_valuec                 C  sê   |}t |ƒ}|  ¡  | jsJ ‚|  ¡ \}}|| j| j | vr\|| j| j vr\td|› �ƒ‚|dur®t|ƒ\}}| |¡r†| ||¡sŽtdƒ‚| 	|¡s¢| 
|¡ |  ||¡ z| j| j | |= W n  tyä   | j| j |= Y n0 dS )z#Unset a value in the configuration.r\   Nz4Fatal Internal error [id=1]. Please report as a bug.)r#   rc   rA   rV   rM   r   r(   rd   Úremove_optionrZ   Úremove_sectionrh   r_   )rO   r[   r`   ri   rj   rk   r   r!   r!   r"   Úunset_value´   s4    
ÿþÿ
ÿÿ

zConfiguration.unset_valuec                 C  sª   |   ¡  | jD ]–\}}t d|¡ ttj |¡ƒ z8t|dƒ�}| 	|¡ W d  ƒ n1 s^0    Y  W q t
y¢ } z td|› d|› �ƒ‚W Y d}~qd}~0 0 qdS )z!Save the current in-memory state.zWriting to %sÚwNz:An error occurred while writing to the configuration file z: )rc   rN   ÚloggerÚinfor   r*   r+   ÚdirnameÚopenÚwriteÚOSErrorr   )rO   ri   rj   ÚfÚerrorr!   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)rA   r   rq   ÚdebugrT   r!   r!   r"   rc   î   s    
z$Configuration._ensure_have_load_onlyzdict[str, dict[str, Any]]c                 C  s"   i }t D ]}| | j| ¡ q|S )z3A dictionary representing the loaded configuration.)rK   r^   rM   )rO   ÚretvalrC   r!   r!   r"   rY   ó   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*   Údevnullrq   rz   rZ   rA   Ú
_load_filerL   Úappend)rO   Úconfig_filesrC   Úfilesri   rj   r!   r!   r"   rR   ÿ   s    ÿz Configuration._load_config_filesr   ÚRawConfigParser)rC   ri   r   c                 C  sb   t  d||¡ |  |¡}| ¡ D ]<}| |¡}| j|  |i ¡ | j| |  |  ||¡¡ q |S )Nz'For variant '%s', will try loading '%s')	rq   ÚverboseÚ_construct_parserÚsectionsrZ   rM   rg   r^   Ú_normalized_keys)rO   rC   ri   rj   rk   rZ   r!   r!   r"   r     s    

zConfiguration._load_file)ri   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)Úreasonri   )rx   )Úconfigparserrƒ   r*   r+   ÚexistsÚlocaleÚgetpreferredencodingÚreadÚUnicodeDecodeErrorr   ÚError)rO   ri   rj   Úlocale_encodingrx   r!   r!   r"   r…   !  s    

þ
 zConfiguration._construct_parserc                 C  s:   | j tj  di ¡ | j tj d  |  d|  ¡ ¡¡ dS )z.Loads configuration from environment variablesz:env:N)rM   r7   r   rg   r^   r‡   Úget_environ_varsrT   r!   r!   r"   rS   6  s    ÿz$Configuration._load_environment_varszdict[str, Any])rk   rZ   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#   )rO   rk   rZ   Ú
normalizedr   Úvalr[   r!   r!   r"   r‡   =  s
    
zConfiguration._normalized_keyszIterable[tuple[str, str]]c                 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_ÚPIP_é   N)r*   ÚenvironrZ   Ú
startswithr   ÚENV_NAMES_IGNORED)rO   r[   r”   r   r!   r!   r"   r’   K  s
    
zConfiguration.get_environ_varsz Iterable[tuple[Kind, list[str]]]c                 c  s�   t j dd¡}tƒ }tj|tj fV  | j o>|o<t j |¡ }|rVtj	|tj	 fV  tj
|tj
 fV  |dur€tj|gfV  ntjg fV  dS )a�  Yields variant and configuration files associated with it.

        This should be treated like items of a dictionary. The order
        here doesn't affect what gets overridden. That is controlled
        by OVERRIDE_ORDER. However this does control the order they are
        displayed to the user. It's probably most ergonomic to display
        things in the same order as OVERRIDE_ORDER
        ÚPIP_CONFIG_FILEN)r*   r—   Úgetr<   r7   r   r@   r+   r‹   r   r   r   )rO   Zenv_config_filer�   Úshould_load_user_configr!   r!   r"   r}   T  s    ÿzConfiguration.iter_config_files)rC   r   c                 C  s
   | j | S )z#Get values present in a config file)rM   )rO   rC   r!   r!   r"   Úget_values_in_configt  s    z"Configuration.get_values_in_configztuple[str, RawConfigParser]c                 C  s*   | j s
J ‚| j| j  }|s"tdƒ‚|d S )Nz4Fatal Internal error [id=2]. Please report as a bug.éÿÿÿÿ)rA   rL   r   )rO   Úparsersr!   r!   r"   rV   x  s    
ÿz#Configuration._get_parser_to_modify)ri   rj   r   c                 C  s"   ||f}|| j vr| j  |¡ d S )N)rN   r€   )rO   ri   rj   Úfile_parser_tupler!   r!   r"   rh   †  s    
zConfiguration._mark_as_modifiedc                 C  s   | j j› d| j›d�S )Nú(ú))rQ   Ú__name__rY   rT   r!   r!   r"   Ú__repr__‹  s    zConfiguration.__repr__)N)r£   Ú
__module__Ú__qualname__Ú__doc__rF   rU   rX   rZ   ra   rl   ro   ry   rc   ÚpropertyrY   rR   r   r…   rS   r‡   r’   r}   r�   rV   rh   r¤   Ú__classcell__r!   r!   rP   r"   r=   Y   s.   	"	 r=   )+r§   Ú
__future__r   rŠ   rŒ   r*   r3   Úcollections.abcr   Útypingr   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   r-   r™   r7   r   r   r   r   r   rK   rG   r£   rq   r#   r(   r<   r=   r!   r!   r!   r"   Ú<module>   s<   
û
