a
    bai8                     @  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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&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!   U/var/www/html/SiteWeb/venv/lib/python3.9/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rt|\}}||r|||st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|rt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   Z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 )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#   )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rt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<   

