o
    >Je6                     @   sB  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rRd
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edefddZ(dede	e fddZ)deee	e f f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global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$   i/home/seandotau/au.memorygallery.club/gallery/lib/python3.10/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+   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   site_config_dirsr,   r-   r.   sysprefixr/   
expanduserr   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   


r:   c                       s  e Zd ZdZd7dedee ddf fddZd8dd	Zdee	 fd
dZ
deee	ef  fddZde	defddZde	deddfddZde	ddfddZd8ddZd8ddZedee	ef fddZd8ddZdede	defd d!Zde	defd"d#Zd8d$d%Zd&e	d'eee	ef  dee	ef fd(d)Zdeee	e	f  fd*d+Zdeeeee	 f  fd,d-Zdedee	ef fd.d/Z dee	ef fd0d1Z!de	d2eddfd3d4Z"de	fd5d6Z#  Z$S )9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r|tvrt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       z*Configuration.__init__.<locals>.<dictcomp>c                 S   s   i | ]}|i qS r$   r$   r>   r$   r$   r%   r@   u   rA   )super__init__VALID_LOAD_ONLYr	   r)   r.   mapreprr<   r=   OVERRIDE_ORDER_parsers_config_modified_parsers)selfr<   r=   	__class__r$   r%   rC   e   s    

zConfiguration.__init__c                 C   s   |    | js|   dS dS )z<Loads configuration from configuration files and environmentN)_load_config_filesr<   _load_environment_varsrK   r$   r$   r%   loadz   s   zConfiguration.loadc                 C   s6   | j dus	J dz|  d W S  ty   Y dS w )z7Returns the file with highest priority in configurationNz)Need to be specified a file to be editingr   )r=   _get_parser_to_modify
IndexErrorrP   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itemsrP   r$   r$   r%   rV      s   
zConfiguration.itemskeyc                 C   s>   |}t |}z| j| W S  ty   t| td| w )z#Get a value from the configuration.No such key - )r&   rU   KeyErrorr+   r	   )rK   rW   orig_keyr$   r$   r%   	get_value   s   zConfiguration.get_valuevaluec                 C   s|   t |}|   | jsJ |  \}}|dur.t|\}}||s'|| |||| || j| j |< | 	|| dS )z$Modify a value in the configuration.N)
r&   _ensure_have_load_onlyr=   rR   r+   has_sectionadd_sectionsetrI   _mark_as_modified)rK   rW   r\   fnameparsersectionr   r$   r$   r%   	set_value   s   


zConfiguration.set_valuec                 C   s   |}t |}|   | jsJ || j| j vrtd| |  \}}|durMt|\}}||r9|||s=td|	|sG|
| | || | j| j |= dS )z#Unset a value in the configuration.rX   Nz4Fatal Internal error [id=1]. Please report as a bug.)r&   r]   r=   rI   r	   rR   r+   r^   remove_optionrV   remove_sectionra   )rK   rW   rZ   rb   rc   rd   r   r$   r$   r%   unset_value   s(   



zConfiguration.unset_valuec                 C   s   |    | jD ]D\}}td| ttj| zt|d}|	| W d   n1 s/w   Y  W q t
yK } z
td| d| d}~ww dS )z!Save the current in-memory state.zWriting to %swNz:An error occurred while writing to the configuration file z: )r]   rJ   loggerinfor   r,   r-   dirnameopenwriteOSErrorr	   )rK   rb   rc   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)r=   r	   rj   debugrP   r$   r$   r%   r]      s   
z$Configuration._ensure_have_load_onlyc                 C   s"   i }t D ]
}|| j|  q|S )z3A dictionary representing the loaded configuration.)rG   updaterI   )rK   retvalr?   r$   r$   r%   rU      s   zConfiguration._dictionaryc                 C   s   t |  }|tj dd tjgkrtd dS | D ]+\}}|D ]$}| j	dur8|| j	kr8td|| q$| 
||}| j| ||f q$q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_filesr9   r   r,   devnullrj   rs   rV   r=   
_load_filerH   append)rK   config_filesr?   filesrb   rc   r$   r$   r%   rN      s   z Configuration._load_config_filesr?   rb   c                 C   sL   t d|| | |}| D ]}||}| j| | || q|S )Nz'For variant '%s', will try loading '%s')rj   verbose_construct_parsersectionsrV   rI   rt   _normalized_keys)rK   r?   rb   rc   rd   rV   r$   r$   r%   ry     s   

zConfiguration._load_filec              
   C   s|   t  }tj|r<td}z
|j||d W |S  ty*   t	d| d|d t j
y; } zt	|dd }~ww |S )NF)encodingzcontains invalid z characters)reasonrb   )rq   )configparserRawConfigParserr,   r-   existslocalegetpreferredencodingreadUnicodeDecodeErrorr
   Error)rK   rb   rc   Zlocale_encodingrq   r$   r$   r%   r~     s    



zConfiguration._construct_parserc                 C   s"   | j tj | d|   dS )z.Loads configuration from environment variablesz:env:N)rI   r9   r   rt   r   get_environ_varsrP   r$   r$   r%   rO   *  s   z$Configuration._load_environment_varsrd   rV   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&   )rK   rd   rV   
normalizedr   valrW   r$   r$   r%   r   0  s
   
zConfiguration._normalized_keysc                 c   sF    t j D ]\}}|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,   environrV   r#   r!   ENV_NAMES_IGNORED)rK   rW   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 o2|o1t 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.
        ZPIP_CONFIG_FILEN)r,   r   getr9   r   r:   r   r<   r-   r   r   r   )rK   config_filer{   Zshould_load_user_configr$   r$   r%   rw   G  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_confige  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=   rH   r	   )rK   Zparsersr$   r$   r%   rR   i  s   
z#Configuration._get_parser_to_modifyrc   c                 C   s&   ||f}|| j vr| j | d S d S N)rJ   rz   )rK   rb   rc   Zfile_parser_tupler$   r$   r%   ra   w  s   
zConfiguration._mark_as_modifiedc                 C   s   | j j d| jdS )N())rM   __name__rU   rP   r$   r$   r%   __repr__|  s   zConfiguration.__repr__r   )r   N)%r   
__module____qualname____doc__boolr   r   rC   rQ   strrT   r   r   r   rV   r[   re   rh   rr   r]   propertyr   rU   rN   r   ry   r~   rO   r   r   r   rw   r   rR   ra   r   __classcell__r$   r$   rL   r%   r;   W   s<     
	






	r;   ),r   r   r   r,   r5   typingr   r   r   r   r   r   r   pip._internal.exceptionsr	   r
   pip._internal.utilsr   pip._internal.utils.compatr   pip._internal.utils.loggingr   pip._internal.utils.miscr   r   r   r   r   r/   r   r9   r   r   r   r   r   rG   rD   r   rj   r&   r+   r:   r;   r$   r$   r$   r%   <module>   s:    $

