o
    i8                     @  s"  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rTd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Z'd#ddZ(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namestrreturnc                 C  s   |   dd} | d} | S )zAMake a name consistent regardless of source (environment or file)_-z--)lowerreplaceremoveprefix)r    r!   W/var/www/html/ocr-read/venv/lib/python3.10/site-packages/pip/_internal/configuration.py_normalize_name5   s   
r#   	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)   dict[Kind, list[str]]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dEdF fd	d
ZdGddZdHddZdIddZdJddZdKddZ	dLddZ
dGddZdGdd ZedMd"d#ZdGd$d%ZdNd*d+ZdOd,d-ZdGd.d/ZdPd3d4ZdQd6d7ZdRd9d:ZdSd;d<ZdTd>d?ZdUdAdBZdVdCdDZ  ZS )W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bool	load_onlyKind | Noner   Nonec                   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!   r/   variantr!   r!   r"   
<dictcomp>t       z*Configuration.__init__.<locals>.<dictcomp>c                 S  s   i | ]}|i qS r!   r!   rD   r!   r!   r"   rF   w   rG   )super__init__VALID_LOAD_ONLYr   formatr-   mapreprr?   rA   OVERRIDE_ORDER_parsers_config_modified_parsers)selfr?   rA   	__class__r!   r"   rI   g   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rR   r!   r!   r"   load|   s   zConfiguration.load
str | Nonec                 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   )rA   _get_parser_to_modify
IndexErrorrW   r!   r!   r"   get_file_to_edit   s   zConfiguration.get_file_to_editIterable[tuple[str, Any]]c                 C  s
   | j  S )z`Returns key-value pairs like dict.items() representing the loaded
        configuration
        )_dictionaryitemsrW   r!   r!   r"   r_      s   
zConfiguration.itemskeyr   r   c                 C  sZ   |}t |}zi }| j D ]}|| q|| W S  ty,   t| td| w )z#Get a value from the configuration.No such key - )r#   r^   valuesupdateKeyErrorr)   r   )rR   r`   orig_keyclean_configfile_valuesr!   r!   r"   	get_value   s   
zConfiguration.get_valuevaluec                 C  s   t |}|   | jsJ |  \}}|dur.t|\}}||s'|| |||| | j| j 	|i  || j| j | |< | 
|| dS )z$Modify a value in the configuration.N)r#   _ensure_have_load_onlyrA   rZ   r)   has_sectionadd_sectionsetrP   
setdefault_mark_as_modified)rR   r`   ri   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rWt|\}}||rC|||sGtd|	|sQ|
| | || z| j| j | |= W dS  tyt   | j| j |= Y dS w )z#Unset a value in the configuration.ra   Nz4Fatal Internal error [id=1]. Please report as a bug.)r#   rj   rA   rZ   rP   r   r)   rk   remove_optionr_   remove_sectionro   rd   )rR   r`   re   rp   rq   rr   r   r!   r!   r"   unset_value   s2   



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: )rj   rQ   loggerinfor   r+   r,   dirnameopenwriteOSErrorr   )rR   rp   rq   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   rx   debugrW   r!   r!   r"   rj      s   
z$Configuration._ensure_have_load_onlydict[str, dict[str, Any]]c                 C  s"   i }t D ]
}|| j|  q|S )z3A dictionary representing the loaded configuration.)rN   rc   rP   )rR   retvalrE   r!   r!   r"   r^      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_filesr8   r   r+   devnullrx   r   r_   rA   
_load_filerO   append)rR   config_filesrE   filesrp   rq   r!   r!   r"   rU      s   z Configuration._load_config_filesrE   r   rp   RawConfigParserc                 C  sb   t d|| | |}| D ]}||}| j| |i  | j| | | || q|S )Nz'For variant '%s', will try loading '%s')	rx   verbose_construct_parsersectionsr_   rP   rn   rc   _normalized_keys)rR   rE   rp   rq   rr   r_   r!   r!   r"   r     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)reasonrp   )r   )configparserr   r+   r,   existslocalegetpreferredencodingreadUnicodeDecodeErrorr   Error)rR   rp   rq   locale_encodingr   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)rP   r8   r   rn   rc   r   get_environ_varsrW   r!   r!   r"   rV   6  s   z$Configuration._load_environment_varsrr   r_   dict[str, Any]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#   )rR   rr   r_   
normalizedr   valr`   r!   r!   r"   r   =  s
   
zConfiguration._normalized_keysIterable[tuple[str, str]]c                 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_PIP_   N)r+   environr_   
startswithr   ENV_NAMES_IGNORED)rR   r`   r   r   r!   r!   r"   r   K  s   

zConfiguration.get_environ_vars Iterable[tuple[Kind, list[str]]]c                 c  s    t jdd}t }tj|tj fV  | j o |ot j| }|r,tj	|tj	 fV  tj
|tj
 fV  |durBtj|gfV  dS 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=   r8   r   r?   r,   r   r   r   r   )rR   env_config_filer   should_load_user_configr!   r!   r"   r   T  s   zConfiguration.iter_config_filesc                 C  s
   | j | S )z#Get values present in a config file)rP   )rR   rE   r!   r!   r"   get_values_in_configt  s   
z"Configuration.get_values_in_config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   rO   r   )rR   parsersr!   r!   r"   rZ   x  s   
z#Configuration._get_parser_to_modifyrq   c                 C  s&   ||f}|| j vr| j | d S d S N)rQ   r   )rR   rp   rq   file_parser_tupler!   r!   r"   ro     s   
zConfiguration._mark_as_modifiedc                 C  s   | j j d| jdS )N())rT   __name__r^   rW   r!   r!   r"   __repr__  s   zConfiguration.__repr__r   )r?   r@   rA   rB   r   rC   )r   rC   )r   rY   )r   r]   )r`   r   r   r   )r`   r   ri   r   r   rC   )r`   r   r   rC   )r   r   )rE   r   rp   r   r   r   )rp   r   r   r   )rr   r   r_   r]   r   r   )r   r   )r   r   )rE   r   r   r   )r   r   )rp   r   rq   r   r   rC   )r   r   )r   
__module____qualname____doc__rI   rX   r\   r_   rh   rs   rv   r   rj   propertyr^   rU   r   r   rV   r   r   r   r   rZ   ro   r   __classcell__r!   r!   rS   r"   r>   Y   s0    


	



"







	
 

r>   )r   r   r   r   )r   r   r   r$   )r   r*   )+r   
__future__r   r   r   r+   r4   collections.abcr   typingr   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   r8   r   r   r   r   r   rN   rJ   r   rx   r#   r)   r=   r>   r!   r!   r!   r"   <module>   s>    




