
    g6                        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j2                  Z e
d	e      Zerd
ndZdZ eddddd      Zej>                  ej@                  ejB                  ejD                  ejF                  fZ$ej@                  ej>                  ejB                  fZ% ee&      Z'dedefdZ(dede	e   fdZ)deee	e   f   fdZ* G d d      Z+y)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                 r    | j                         j                  dd      } | j                  d      r| dd } | S )zAMake a name consistent regardless of source (environment or file)_-z--   N)lowerreplace
startswith)r   s    N/var/www/html/venv/lib/python3.12/site-packages/pip/_internal/configuration.py_normalize_namer'   2   s6    ::<S)DtABxK    c                 P    d| vrd|  d}t        |      | j                  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_messages     r&   _disassemble_keyr.   :   s>    
$115jB 	 !//::c1r(   c                  d   t        j                  d      D  cg c]&  } t        j                  j	                  | t
              ( }} t        j                  j	                  t        j                  t
              }t        j                  j	                  t        j                  j                  d      t        rdndt
              }t        j                  j	                  t        j                  d      t
              }t        j                  |t        j                  |gt        j                  ||giS c c} w )Npip~z.pip)r   site_config_dirsospathjoinCONFIG_BASENAMEsysprefix
expanduserr   user_config_dirkindsr   r   r   )r4   global_config_filessite_config_filelegacy_config_filenew_config_files        r&   get_configuration_filesr@   D   s    8?8P8PQV8W04T?+  ww||CJJ@
3f
 ggll7#:#:5#A?SO)

%&

'9 s   +D-c                       e Zd ZdZd"dedee   ddf fdZd#dZdee	   fdZ
deee	ef      fd	Zd
e	defdZd
e	deddfdZd
e	ddfdZd#dZd#dZedee	ef   fd       Zd#dZdede	defdZde	defdZd#dZde	deee	ef      dee	ef   fdZdeee	e	f      fdZdeeeee	   f      fdZdedee	ef   fdZ dee	ef   fdZ!de	deddfd Z"de	fd!Z# xZ$S )$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           
      R   t         |           |C|t        vr;t        dj	                  dj                  t        t        t                                || _        || _	        t        D ci c]  }|g  c}| _        t        D ci c]  }|i  c}| _        g | _        y c c}w c c}w )Nz5Got invalid value for load_only - should be one of {}z, )super__init__VALID_LOAD_ONLYr
   formatr5   mapreprrC   rD   OVERRIDE_ORDER_parsers_config_modified_parsers)selfrC   rD   variant	__class__s       r&   rG   zConfiguration.__init__e   s     Yo%E$GNNIIc$89 
 !" (6H
#GRKH
 (64
#GRK4
 EGH
4
s   +
B
B$c                 ^    | j                          | j                  s| j                          yy)z<Loads configuration from configuration files and environmentN)_load_config_filesrC   _load_environment_varsrP   s    r&   loadzConfiguration.loadz   s&    !}}'') r(   c                 n    | j                   J d       	 | j                         d   S # t        $ r Y yw xY w)z7Returns the file with highest priority in configurationNz)Need to be specified a file to be editingr   )rD   _get_parser_to_modify
IndexErrorrV   s    r&   get_file_to_editzConfiguration.get_file_to_edit   sC    ~~)V+VV)	--/22 		s   ( 	44c                 6    | j                   j                         S )z`Returns key-value pairs like dict.items() representing the loaded
        configuration
        )_dictionaryitemsrV   s    r&   r^   zConfiguration.items   s     %%''r(   keyc                     |}t        |      }	 | j                  |   S # t        $ r t        |       t	        d|       w xY w)z#Get a value from the configuration.No such key - )r'   r]   KeyErrorr.   r
   )rP   r_   orig_keys      r&   	get_valuezConfiguration.get_value   sU    c"	B##C(( 	B S!$~hZ%@AA		Bs	    #Avaluec                 b   t        |      }| j                          | j                  sJ | j                         \  }}|Ct	        |      \  }}|j                  |      s|j                  |       |j                  |||       || j                  | j                     |<   | j                  ||       y)z$Modify a value in the configuration.N)
r'   _ensure_have_load_onlyrD   rY   r.   has_sectionadd_sectionsetrN   _mark_as_modified)rP   r_   re   fnameparsersectionr   s          r&   	set_valuezConfiguration.set_value   s    c"##%~~~224v,S1MGT %%g.""7+JJwe,,1T^^$S)uf-r(   c                    |}t        |      }| j                          | j                  sJ || j                  | j                     vrt	        d|       | j                         \  }}|pt        |      \  }}|j                  |      r|j                  ||      st	        d      |j                  |      s|j                  |       | j                  ||       | j                  | j                     |= y)z#Unset a value in the configuration.ra   Nz4Fatal Internal error [id=1]. Please report as a bug.)r'   rg   rD   rN   r
   rY   r.   rh   remove_optionr^   remove_sectionrk   )rP   r_   rc   rl   rm   rn   r   s          r&   unset_valuezConfiguration.unset_value   s    c"##%~~~dll4>>22$~hZ%@AA224v,S1MGT""7+0D0DWd0S )J 
 <<(%%g.""5&1LL(-r(   c                 r   | j                          | j                  D ]j  \  }}t        j                  d|       t	        t
        j                  j                  |             	 t        |d      5 }|j                  |       ddd       l y# 1 sw Y   xY w# t        $ r}t        d| d|       d}~ww xY w)z!Save the current in-memory state.zWriting to %swNz:An error occurred while writing to the configuration file z: )rg   rO   loggerinfor   r3   r4   dirnameopenwriteOSErrorr
   )rP   rl   rm   ferrors        r&   savezConfiguration.save   s    ##%!33 	ME6KK/ rwwu-.%% $LLO$	$ $ (PgRw( s0   "B.B BB	B	B6 B11B6c                 r    | j                   t        d      t        j                  d| j                          y )Nz'Needed a specific file to be modifying.z$Will be working with %s variant only)rD   r
   rv   debugrV   s    r&   rg   z$Configuration._ensure_have_load_only   s+    >>!$%NOO;T^^Lr(   c                 \    i }t         D ]   }|j                  | j                  |          " |S )z3A dictionary representing the loaded configuration.)rL   updaterN   )rP   retvalrQ   s      r&   r]   zConfiguration._dictionary   s4    
 % 	1GMM$,,w/0	1 r(   c                    t        | j                               }|t        j                     dd t        j
                  gk(  rt        j                  d       y|j                         D ]q  \  }}|D ]g  }| j                  '|| j                  k7  rt        j                  d||       6| j                  ||      }| j                  |   j                  ||f       i s y)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_filesr;   r   r3   devnullrv   r   r^   rD   
_load_filerM   append)rP   config_filesrQ   filesrl   rm   s         r&   rT   z Configuration._load_config_files   s    D2245		"1Q'BJJ<7LLA *002 	?NGU 
? >>-'T^^2KLL!CUGT%8 g&--ufo>
?	?r(   rQ   rl   c                     t         j                  d||       | j                  |      }|j                         D ]A  }|j	                  |      }| j
                  |   j                  | j                  ||             C |S )Nz'For variant '%s', will try loading '%s')rv   verbose_construct_parsersectionsr^   rN   r   _normalized_keys)rP   rQ   rl   rm   rn   r^   s         r&   r   zConfiguration._load_file  st    @'5Q''.( 	PGLL)ELL!(()>)>w)NO	P r(   c                 B   t        j                         }t        j                  j	                  |      r+t        j                  d      }	 |j                  ||       |S |S # t        $ r t        d| d|      t         j                  $ r}t        |      d }~ww xY w)NF)encodingzcontains invalid z characters)reasonrl   )r}   )configparserRawConfigParserr3   r4   existslocalegetpreferredencodingreadUnicodeDecodeErrorr   Error)rP   rl   rm   locale_encodingr}   s        r&   r   zConfiguration._construct_parser  s    --/
 77>>% $99%@O
EEO< v & 7..?{K   %% E7eDDEs   
A! !,BBBc                     | j                   t        j                     j                  | j	                  d| j                                      y)z.Loads configuration from environment variablesz:env:N)rN   r;   r   r   r   get_environ_varsrV   s    r&   rU   z$Configuration._load_environment_vars*  s6    U]]#**!!'4+@+@+BC	
r(   rn   r^   c                 J    i }|D ]  \  }}|dz   t        |      z   }|||<    |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'   )rP   rn   r^   
normalizedr   valr_   s          r&   r   zConfiguration._normalized_keys0  s@     
 	"ID#C-/$"77C!JsO	" r(   c              #      K   t         j                  j                         D ]9  \  }}|j                  d      s|dd j	                         }|t
        vs4||f ; yw)z@Returns a generator with all environmental vars with prefix PIP_PIP_   N)r3   environr^   r%   r#   ENV_NAMES_IGNORED)rP   r_   r   r   s       r&   r   zConfiguration.get_environ_vars>  sU     

((* 	$HC~~f%12w}}00)O		$s   6AA	Ac              #      K   t         j                  j                  dd      }t               }t        j
                  |t        j
                     f | j                   xr$ |xr t         j                  j                  |       }|r%t        j                  |t        j                     f t        j                  |t        j                     f |t        j                  |gf yt        j                  g f yw)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 ergononmic to display
        things in the same order as OVERRIDE_ORDER
        PIP_CONFIG_FILEN)r3   r   getr@   r;   r   rC   r4   r   r   r   r   )rP   env_config_filer   should_load_user_configs       r&   r   zConfiguration.iter_config_filesG  s      **..):DA.0llL666 '+mm"3 #
? ?9
 #**l5::666 jj,uzz222&))o...))R-s   C<C>c                      | j                   |   S )z#Get values present in a config file)rN   )rP   rQ   s     r&   get_values_in_configz"Configuration.get_values_in_configg  s    ||G$$r(   c                 t    | j                   sJ | j                  | j                      }|st        d      |d   S )Nz4Fatal Internal error [id=2]. Please report as a bug.)rD   rM   r
   )rP   parserss     r&   rY   z#Configuration._get_parser_to_modifyk  s?    ~~~--/$F 
 r{r(   rm   c                 `    ||f}|| j                   vr| j                   j                  |       y y N)rO   r   )rP   rl   rm   file_parser_tuples       r&   rk   zConfiguration._mark_as_modifiedy  s4    "FOD$:$::""))*;< ;r(   c                 N    | j                   j                   d| j                  dS )N())rR   __name__r]   rV   s    r&   __repr__zConfiguration.__repr__~  s'    ..))*!D,<,<+?qAAr(   r   )r   N)%r   
__module____qualname____doc__boolr   r   rG   rW   strr[   r   r	   r   r^   rd   ro   rs   r~   rg   propertyr   r]   rT   r   r   r   rU   r   r   r   r   r   rY   rk   r   __classcell__)rR   s   @r&   rB   rB   W   s   G G(4. GD G**(3- (xc3h0 (
BS 
BS 
B.S . . .&.s .t .:0M
 	T#s(^ 	 	?.$ s  s  *
#+E#s(O#<	c3h$(5c?"; $ 8E$S	/,B#C  @%D %T#s(^ %uS/-A'B =s =O = =
B# Br(   rB   ),r   r   r   r3   r7   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   r6   r   r;   r   r   r   r   r   rL   rH   r   rv   r'   r.   r@   rB    r(   r&   <module>r      s     	 
 F F F ( . 1 5..vs&)J%  				 uzz5::uyy%--O**ellEJJ6	8	# # 3 49 dDIo!6 &hB hBr(   