o
    ©„jâ8  ã                   @  s  d Z ddlm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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"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Úget_locale_encoding)Ú	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"   úY/var/www/html/django_cbt/venv/lib/python3.10/site-packages/pip/_internal/configuration.pyÚ_normalize_name4   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>F   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_filesE   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"   ©r0   Úvariantr"   r"   r#   Ú
<dictcomp>s   ó    ÿz*Configuration.__init__.<locals>.<dictcomp>c                 S  s   i | ]}|i “qS r"   r"   rE   r"   r"   r#   rG   v   rH   )ÚsuperÚ__init__ÚVALID_LOAD_ONLYr   Úformatr.   ÚmapÚreprr@   rB   ÚOVERRIDE_ORDERÚ_parsersÚ_configÚ_modified_parsers)Úselfr@   rB   ©Ú	__class__r"   r#   rJ   f   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©rS   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   )rB   Ú_get_parser_to_modifyÚ
IndexErrorrX   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ÚitemsrX   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   )rS   ra   Ú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_onlyrB   r[   r*   Úhas_sectionÚadd_sectionÚsetrQ   Ú
setdefaultÚ_mark_as_modified)rS   ra   rj   Ú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.rb   Nz4Fatal Internal error [id=1]. Please report as a bug.)r$   rk   rB   r[   rQ   r   r*   rl   Úremove_optionr`   Úremove_sectionrp   re   )rS   ra   rf   rq   rr   rs   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: )rk   rR   ÚloggerÚinfor   r,   r-   ÚdirnameÚopenÚwriteÚOSErrorr   )rS   rq   rr   Ú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)rB   r   ry   ÚdebugrX   r"   r"   r#   rk   í   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.)rO   rd   rQ   )rS   ÚretvalrF   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_filesr9   r   r,   Údevnullry   r‚   r`   rB   Ú
_load_filerP   Úappend)rS   Úconfig_filesrF   Úfilesrq   rr   r"   r"   r#   rV   þ   s   ÿöÿz Configuration._load_config_filesrF   r   rq   ÚRawConfigParserc                 C  sb   t  d||¡ |  |¡}| ¡ D ]}| |¡}| j|  |i ¡ | j| |  |  ||¡¡ q|S )Nz'For variant '%s', will try loading '%s')	ry   ÚverboseÚ_construct_parserÚsectionsr`   rQ   ro   rd   Ú_normalized_keys)rS   rF   rq   rr   rs   r`   r"   r"   r#   rˆ     s   

zConfiguration._load_filec              
   C  sx   t  ¡ }tj |¡r:tƒ }z
|j||d� W |S  ty(   td|› d�|d�‚ t j	y9 } zt|d�‚d }~ww |S )N)Úencodingzcontains invalid z characters)Úreasonrq   )r€   )
ÚconfigparserrŒ   r,   r-   Úexistsr
   ÚreadÚUnicodeDecodeErrorr   ÚError)rS   rq   rr   Ú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)rQ   r9   r   ro   rd   r�   Úget_environ_varsrX   r"   r"   r#   rW   5  s   ÿz$Configuration._load_environment_varsrs   r`   údict[str, Any]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$   )rS   rs   r`   Ú
normalizedr   Úvalra   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)rS   ra   rœ   r   r"   r"   r#   r™   J  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>   r9   r   r@   r-   r”   r   r   r   )rS   Úenv_config_filerŠ   Úshould_load_user_configr"   r"   r#   r†   S  s   €ÿzConfiguration.iter_config_filesc                 C  s
   | j | S )z#Get values present in a config file)rQ   )rS   rF   r"   r"   r#   Úget_values_in_configs  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.éÿÿÿÿ)rB   rP   r   )rS   Úparsersr"   r"   r#   r[   w  s   
ÿz#Configuration._get_parser_to_modifyrr   c                 C  s&   ||f}|| j vr| j  |¡ d S d S ©N)rR   r‰   )rS   rq   rr   Úfile_parser_tupler"   r"   r#   rp   …  s   
ÿzConfiguration._mark_as_modifiedc                 C  s   | j j› d| j›d�S )Nú(ú))rU   Ú__name__r_   rX   r"   r"   r#   Ú__repr__Š  s   zConfiguration.__repr__r¬   )r@   rA   rB   rC   r   rD   )r   rD   )r   rZ   )r   r^   )ra   r   r   r   )ra   r   rj   r   r   rD   )ra   r   r   rD   )r   rƒ   )rF   r   rq   r   r   rŒ   )rq   r   r   rŒ   )rs   r   r`   r^   r   rš   )r   r�   )r   r£   )rF   r   r   rš   )r   r©   )rq   r   rr   rŒ   r   rD   )r   r   )r°   Ú
__module__Ú__qualname__Ú__doc__rJ   rY   r]   r`   ri   rt   rw   r�   rk   Úpropertyr_   rV   rˆ   rŽ   rW   r�   r™   r†   r¨   r[   rp   r±   Ú__classcell__r"   r"   rT   r#   r?   X   s0    


	



"







	
 

r?   )r   r   r   r   )r   r   r   r%   )r   r+   )+r´   Ú
__future__r   r“   r,   r5   Úcollections.abcr   Útypingr   r   Úpip._internal.exceptionsr   r   Úpip._internal.utilsr   Úpip._internal.utils.compatr	   r
   Úpip._internal.utils.loggingr   Úpip._internal.utils.miscr   r   rŒ   r   r   r/   r¢   r9   r   r   r   r   r   rO   rK   r°   ry   r$   r*   r>   r?   r"   r"   r"   r#   Ú<module>   s<    
û



