
    G@dD                     P   d Z ddl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
Z
ddlZddlZddlmZmZ ddlmZmZ ddlmZ  G d d          Z G d d	ej        e          Z G d
 de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )z
This module provides user configuration file management features for Spyder.

It is based on the ConfigParser module present in the standard library.
    N)get_conf_pathget_module_source_path)is_text_stringto_text_string)check_versionc                       e Zd ZdS )	NoDefaultN)__name__
__module____qualname__     2lib/python3.11/site-packages/spyder/config/user.pyr	   r	   !   s        Dr   r	   c                   D     e Zd ZdZ fdZd Z fdZd Zd Zd Z	 xZ
S )DefaultsConfigzM
    Class used to save defaults to a file and as UserConfig base class.
    c                 &   t          t          |                               d           || _        || _        t          j        t          j        | j                            s-t          j	        t          j        | j                             dS dS )zU
        Class used to save defaults to a file and as UserConfig base class.
        N)interpolation)
superr   __init___name_pathospisdirdirnameosmakedirs)selfnamepath	__class__s      r   r   zDefaultsConfig.__init__-   s~     	nd##,,4,@@@

yTZ0011 	1KDJ//00000	1 	1r   c                 J   | j         r|                    d                    t          j                             | j                                         D ]Q\  }}t          |                              dd          }|                    d                    ||                     R|                    d           | j        D ]}|                    d                    |                     | j        |                                         D ]\  }}|dk    r|| j	        | j
        k    r<t          |          }|                    dd          }d                    ||f          }|                    d                    |                     |                    d           dS )	zu
        Write method for Python 2.

        The one from configparser fails for non-ascii Windows accounts.
        z[{}]

z
	z{} = {}
r
   Nz = z{}
)	_defaultswriteformatcpDEFAULTSECTitemsstrreplace	_sections_optcreOPTCREr   join)r   fpkeyvaluevalue_plus_end_of_linesections         r   _writezDefaultsConfig._write9   s    > 	HHX__R^44555 $ 4 4 6 6 J Je),U););D&)I)I&++C1GHHIIIIHHTNNN~ 	 	GHHX__W--... $w 7 = = ? ? 	- 	-e*$$%4<4;+F+F*511E-2]]4-H-H***c+A%BCCCs++,,,,HHTNNNN	 	r   c                 <   |                      |          s|                     |           t          |          st          |          }|r&d                    |||          }t          |           t          t          |                               |||           dS )zSet method.z[{}][{}] = {}N)	has_sectionadd_sectionr   reprr%   printr   r   set)r   r3   optionr1   verbosetextr    s         r   _setzDefaultsConfig._setV   s    (( 	&W%%%e$$ 	 KKE 	"))'65AAD$KKKnd##''?????r   c                 r                                      } fd}	  ||           dS # t          $ r 	 t          j        |          rt	          j        |           t          j        d            ||           Y dS # t          $ r*}t          d           t          |           Y d}~Y dS d}~ww xY ww xY w)z*Save config into the associated .ini file.c                     t          j        | dd          5 }                    |           d d d            d S # 1 swxY w Y   d S )Nwutf-8encoding)ioopenr$   )fpath
configfiler   s     r   _write_filez)DefaultsConfig._save.<locals>._write_fileh   s    g666 '*

:&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's   <A A g?zOFailed to write user configuration file to disk, with the exception shown belowN)
get_config_fpathEnvironmentErrorr   isfiler   removetimesleep	Exceptionr9   )r   rG   rI   es   `   r   _savezDefaultsConfig._saved   s   %%''	' 	' 	' 	' 	'	K 	 	 	
:e$$ %Ie$$$
4   E""""""    2 3 3 3a	s-   ) 
B6AA>>
B2B-&B6-B22B6c                 n    | j         }t          j        |d                    | j                            }|S )z7Return the ini file where this configuration is stored.z{}.ini)r   r   r.   r%   r   )r   r   config_files      r   rJ   zDefaultsConfig.get_config_fpath~   s.    zhtX__TZ%@%@AAr   c                 b    |D ]+\  }}|D ]#}||         }|                      |||d           $,dS )z8Set default values and save to defaults folder location.F)r<   N)r>   )r   defaultsr3   optionsr;   	new_values         r   set_defaultszDefaultsConfig.set_defaults   sa     ( 	E 	EGW! E E#FO			'69e	DDDDE	E 	Er   )r
   r   r   __doc__r   r4   r>   rR   rJ   rY   __classcell__r    s   @r   r   r   (   s         
1 
1 
1 
1 
1  :@ @ @ @ @  4  E E E E E E Er   r   c                   :    e Zd ZdZdZ	 	 	 d$ fd	Zed             Zed             Zed	             Z	d
 Z
ed             Zd%dZd Zd Zd Zd&dZd Zd Zd'dZd%dZd'dZd'dZd(dZd)dZd*dZd Zd Zef fd	Zd Zd+dZ  fd Z! fd!Z"d" Z#d# Z$ xZ%S ),
UserConfigaB  
    UserConfig class, based on ConfigParser.

    Parameters
    ----------
    name: str
        Name of the config
    path: str
        Configuration file will be saved in path/%name%.ini
    defaults: {} or [(str, {}),]
        Dictionary containing options *or* list of tuples (sec_name, options)
    load: bool
        If a previous configuration file is found, load will take the values
        from this existing file, instead of using default values.
    version: str
        version of the configuration file in 'major.minor.micro' format.
    backup: bool
        A backup will be created on version changes and on initial setup.
    raw_mode: bool
        If `True` do not apply any automatic conversion on values read from
        the configuration.
    remove_obsolete: bool
        If `True`, values that were removed from the configuration on version
        change, are removed from the saved configuration file.

    Notes
    -----
    The 'get' and 'set' arguments number and type differ from the overriden
    methods. 'defaults' is an attribute and not a method.
    mainNTFc
                    t          t          |                               ||           || _        |                     |          | _        || _        |rdnd| _        || _        |	| _	        t          d          | _        d| _        d| _        d| _        d| _        |                     |          | _        |r|                                  |r|                                 }
|                     |
           |                     |          }|| _        |                     | j                   |                     |          |                     |          k    r\|r|                     |           |                     |	           |r|                     |           |                     |d
           ||                                  dS dS dS )z(UserConfig class, based on ConfigParser.r   r      r   spyderrV   backupsz.bakversion)old_versionFsaveN)r   r^   r   _load_check_version_version_backup_raw_remove_obsolete_external_pluginr   _module_source_path_defaults_folder_backup_folder_backup_suffix_defaults_name_prefix_check_defaultsrV   _make_backupget_previous_config_fpath_load_from_iniget_version_old_version_save_new_defaults_get_minor_versionapply_configuration_patches_remove_deprecated_optionsset_versionset_as_defaults)r   r   r   rV   loadrf   backupraw_moderemove_obsoleteexternal_pluginprevious_fpathrg   r    s               r   r   zUserConfig.__init__   s    	j$((d(>>>
++G44!(AAq	 / /#9(#C#C  *'$%/" ,,X66 	  	'!;;==N///**733K +D ##DM222 ''00..{;;< <  ;%%k%:::00[0III # A33K@@@   u 555$$&&&&&9	' 	'4  r   c                 <    | d|                      d                   S )z3Return the 'major.minor' components of the version.N.)rfindre   s    r   r}   zUserConfig._get_minor_version   s!     *c***++r   c                 <    | d|                      d                   S )z,Return the 'major' component of the version.Nr   )findre   s    r   _get_major_versionzUserConfig._get_major_version   s!     )S)))**r   c                 |    t          j        d|           }| $|"t          d                    |                     | S )z'Check version is compliant with format.z^(\d+).(\d+).(\d+)$NzDVersion number {} is incorrect - must be in major.minor.micro format)rematch
ValueErrorr%   )rf   regex_checks     r   rk   zUserConfig._check_version   sM     h5w??;#6 88>wI I I r   c                    || j         i fg}nt          |t                    r| j         |fg}nt          |t                    r\|D ]X\  }}t	          |          sJ t          |t                    sJ |                                D ]\  }}t	          |          sJ Ynt          d          || _        ||                     d           |S )z7Check if defaults are valid and update defaults values.Nz.`defaults` must be a dict or a list of tuples!Frh   )	DEFAULT_SECTION_NAME
isinstancedictlistr   r(   r   rV   reset_to_defaults)r   rV   secrW   opt_s         r   rv   zUserConfig._check_defaults   s   2B78HH$'' 
	O2H=>HH$'' 	O ( / /W%c*****!'400000%mmoo / /FC)#......// MNNN !"""...r   c                     || j         }nt          |          st          d          t          |          st          d          |S )zCheck section and option types.Nz#Argument 'section' must be a stringz"Argument 'option' must be a string)r   r   RuntimeError)clsr3   r;   s      r   _check_section_optionz UserConfig._check_section_option  sX     ?.GG(( 	FDEEEf%% 	ECDDDr   c                 8   |                                  }|                     ||          }t          j                            |          }t          j        |          st          j        |           	 t          j	        ||           dS # t          $ r Y dS w xY w)a  
        Make a backup of the configuration file.

        If `old_version` is `None` a normal backup is made. If `old_version`
        is provided, then the backup was requested for minor version changes
        and appends the version number to the backup file.
        )rf   rg   N)rJ   get_backup_fpath_from_versionr   r   r   r   r   r   shutilcopyfileIOError)r   rf   rg   rG   fpath_backupr   s         r   rw   zUserConfig._make_backup"  s     %%''99 : 6 6w|,,y 	K	OE<00000 	 	 	DD	s   4B 
BBc                     	 |                      |d           dS # t          j        $ r d}t          |           Y dS w xY w)z;Load config from the associated .ini file found at `fpath`.rB   rC   z*Warning: File contains no section headers.N)readr&   MissingSectionHeaderErrorr9   )r   rG   
error_texts      r   ry   zUserConfig._load_from_ini7  s]    	IIegI.....+ 	 	 	EJ*	s     ??c                     t          j                    }|                     |          \  }}|                    t	          j        ||dz                        |S )zRead old defaults.z.ini)r&   ConfigParser#get_defaults_path_name_from_versionr   r   r.   )r   rg   old_defaultsr   r   s        r   _load_old_defaultszUserConfig._load_old_defaults?  sP    ((==kJJ
d#(477888r   c                     |                                  \  }}t          ||          }t          j        |                                          s+|                    |           |                                 dS dS )zSave new defaults.ra   N)r   r   r   rL   rJ   rY   rR   )r   rV   r   r   new_defaultss        r   r|   zUserConfig._save_new_defaultsF  s}    ==??
d%4d;;;z,7799:: 	!%%h///     	! 	!r   c                 *   |                      |          }|D ]z\  }}|D ]r}||         }	 |                    ||          }	n## t          j        t          j        f$ r d}	Y nw xY w|	t          |          |	k    r|                     ||||           s{dS )z*Update defaults after a change in version.N)r   getr&   NoSectionErrorNoOptionErrorr   r>   )
r   rV   rg   r<   r   r3   rW   r;   rX   old_vals
             r   _update_defaultszUserConfig._update_defaultsN  s    ..{;; ( 		C 		CGW! C C#FO	#*..w??GG)2+;< # # #"GGG# ?nY&?&?7&J&JIIgvy'BBBC		C 		Cs   AA! A!c                    |                      |          }|                                D ]}|                    || j                  D ]\  }}|                     ||          t
          u r	 |                     ||           t          |                     || j                            dk    r|                     |           |# t          j
        $ r |                     |           Y w xY wdS )zX
        Remove options which are present in the .ini file but not in defaults.
        rawr   N)r   sectionsr(   rn   get_defaultr	   remove_optionlenremove_sectionr&   r   )r   rg   r   r3   r;   r   s         r   r   z%UserConfig._remove_deprecated_options\  s    ..{;;#,,.. 	5 	5G)//TY/GG 5 5	##GV44	AA5**7F;;;tzz'tyzAABBaGG //888, 5 5 5++G444445 B5	5 	5s   +AC$C+*C+c                 *    |                                  S )z1Return the last configuration file used if found.rJ   r   s    r   rx   z$UserConfig.get_previous_config_fpathm  s    $$&&&r   c                 *    |                                  S )z
        Return the configuration path for given version.

        If no version is provided, it returns the current file path.
        r   r   rf   s     r   get_config_fpath_from_versionz(UserConfig.get_config_fpath_from_versionq  s     $$&&&r   c                 H   |                                  }t          j        t          j        |          | j                  }t          j        |t          j        |                    }|d                    || j                  }nd                    ||| j                  }|S )z
        Get backup location based on version.

        `old_version` can be used for checking compatibility whereas `version`
        relates to adding the version to the file name.

        To be overridden if versions changed backup location.
        N{}{}{}-{}{})rJ   r   r.   r   rs   basenamer%   rt   )r   rf   rg   rG   r   	new_fpathbackup_fpaths          r   r   z(UserConfig.get_backup_fpath_from_versiony  s     %%''xE**D,?@@HT3<#6#677	?!==D4GHHLL$++Iw,0,?A ALr   c                 .   |r|n| j         }t          j        t          j        |                                           | j                  }d                    | j        | j        |          }t          j	        |          st          j        |           ||fS )zz
        Get defaults location based on version.

        To be overridden if versions changed defaults location.
        z{}-{}-{})rl   r   r.   r   rJ   rr   r%   ru   r   r   r   r   )r   rg   rf   defaults_pathr   s        r   r   z.UserConfig.get_defaults_path_name_from_version  s     "-?++$-T-B-B-D-D!E!E!%!68 8  &J
 

 y'' 	'K&&&d""r   c                     dS )z
        Apply any patch to configuration values on version changes.

        To be overridden if patches to configuration values are needed.
        Nr   )r   rg   s     r   r~   z&UserConfig.apply_configuration_patches  s	     	r   0.0.0c                 :    |                      | j        d|          S )z0Return configuration (not application!) version.rf   )r   r   r   s     r   rz   zUserConfig.get_version  s    xx19gFFFr   c                 l    |                      |          }|                     | j        d||           dS )z-Set configuration (not application!) version.rf   rh   N)rk   r:   r   )r   rf   ri   s      r   r   zUserConfig.set_version  s8    %%g..*IwTJJJJJr   c                     | j         D ]6\  }}|dk    s||k    r%|D ]"}||         }|                     ||||           #7|r|                                  dS dS )zReset config to Default values.N)rV   r>   rR   )r   ri   r<   r3   r   rW   r;   r1   s           r   r   zUserConfig.reset_to_defaults  s     M 	; 	;LC$'S..% ; ;F#FOEIIc65':::: 	JJLLLLL	 	r   c                 &   g | _         |                                 D ]t}i }|                     || j                  D ]7\  }}	 t	          j        |          }n# t          t          f$ r Y nw xY w|||<   8| j                             ||f           udS )z%Set defaults from the current config.r   N)	rV   r   r(   rn   astliteral_evalSyntaxErrorr   append)r   r3   secdictr;   r1   s        r   r   zUserConfig.set_as_defaults  s    }} 	5 	5GG!%G!C!C ( (,U33EE#Z0   D"'M  '7!34444	5 	5s   AA+*A+c                     |                      ||          }| j        D ]\  }}||k    r||v r
||         } nt          }|S )z
        Get default value for a given `section` and `option`.

        This is useful for type checking in `get` method.
        )r   rV   r	   )r   r3   r;   r   rW   r1   s         r   r   zUserConfig.get_default  s[     ,,Wf== M 	 	LCg~~W$$#FOEEEr   c                 J   |                      ||          }|                     |          s2|t          u rt          j        |          |                     |           |                     ||          s7|t          u rt          j        ||          |                     |||           |S t          t          |                               ||| j                  }|                     ||          }t          |t                    rt!          j        |          }nt          |t$                    rt%          |          }nbt          |t&                    rt'          |          }n=t)          |          rn-	 t!          j        |          }n# t*          t,          f$ r Y nw xY w|S )ad  
        Get an option.

        Parameters
        ----------
        section: str
            Section name. If `None` is provide use the default section name.
        option: str
            Option name for `section`.
        default:
            Default value (if not specified, an exception will be raised if
            option doesn't exist).
        r   )r   r6   r	   r&   r   r7   
has_optionr   r:   r   r^   r   rn   r   r   boolr   r   floatintr   r   r   )r   r3   r;   defaultr1   default_valuer    s         r   r   zUserConfig.get  s    ,,Wf==(( 	*)##'000  )))w// 	)##&vw777&'222j$''++GV+KK((&99mT** 	$U++EEu-- 	%LLEEs++ 		JJEEM** 	(//,    s   7F F F c                 b    |                      ||          }| j        D ]\  }}||k    r|||<   dS )z
        Set Default value for a given `section`, `option`.

        If no defaults exist, no default is created. To be able to set
        defaults, a call to set_as_defaults is needed to create defaults
        based on current values.
        N)r   rV   )r   r3   r;   r   r   rW   s         r   set_defaultzUserConfig.set_default  sK     ,,Wf== M 	0 	0LCg~~"/	0 	0r   c                    |                      ||          }|                     ||          }|t          u r|}|                     |||           t	          |t
                    rt          |          }nht	          |t                    rt          |          }nCt	          |t                    rt          |          }nt          |          st          |          }| 
                    ||||           |r|                                  dS dS )
        Set an `option` on a given `section`.

        If section is None, the `option` is added to the default section.
        N)r   r   r	   r   r   r   r   r   r   r8   r>   rR   )r   r3   r;   r1   r<   ri   r   s          r   r:   zUserConfig.set  s	    ,,Wf==((&99I%%!MWfm<<<mT** 	 KKEEu-- 	 %LLEEs++ 	 JJEE.. 	 KKE		'65'222 	JJLLLLL	 	r   c                     t          t          |                               |           |                                  dS z+Remove `section` and all options within it.N)r   r^   r   rR   )r   r3   r    s     r   r   zUserConfig.remove_section2  s2    j$..w777

r   c                     t          t          |                               ||           |                                  dS zRemove `option` from `section`.N)r   r^   r   rR   )r   r3   r;   r    s      r   r   zUserConfig.remove_option7  s4    j$--gv>>>

r   c                 R    t          j        |                                            dS )z&Remove .ini file associated to config.N)r   rM   rJ   r   s    r   cleanupzUserConfig.cleanup<  s$    
	$''))*****r   c                    g }|                      |                                            | j        D ]O}i }|                     |          D ]\  }}|                     ||          ||<   |                    ||f           P|S )z
        Return in list format.

        The format is [('section1', {'opt-1': value, ...}),
                       ('section2', {'opt-2': othervalue, ...}), ...]
        )ry   rJ   r+   r(   r   r   )r   r   r3   sec_datar;   r   s         r   to_listzUserConfig.to_list@  s     D1133444~ 	5 	5GH#zz'22 = =#'88GV#<#<  ( 34444r   NTNFFFFNN)FN)r   )r   T)TFNFT)&r
   r   r   rZ   r   r   staticmethodr}   r   rk   rv   classmethodr   rw   ry   r   r|   r   r   rx   r   r   r   r~   rz   r   r   r   r   r	   r   r   r:   r   r   r   r   r[   r\   s   @r   r^   r^      s        < "EI?D!&5' 5' 5' 5' 5' 5'r , , \, + + \+   \  0 
 
 [
   *    ! ! !C C C C5 5 5"' ' '' ' ' '   &# # # #&   G G G GK K K K
   5 5 5  " ,5 / / / / / /b0 0 0   4    
    
+ + +      r   r^   c                   B     e Zd Zd ZddZd fd	Zd fd	ZddZ xZS )	SpyderUserConfigc                     |                                  }| j        r|g}n.|t          j                            t                      d          g}|D ]}t          j        |          r n|S )z]
        Override method.

        Return the last configuration file used if found.
        
spyder.ini)rJ   rp   r   r   r.   r   r   rL   )r   rG   previous_pathss      r   rx   z*SpyderUserConfig.get_previous_config_fpathT  s     %%''   	#WNN ]__l;;	N $ 	 	Ez%    r   Nc                     || j         r|                                 }nGt          |dd          r"t          j        t                      d          }n|                                 }|S )z
        Override method.

        Return the configuration path for given version.

        If no version is provided, it returns the current file path.
        N51.0.0<r   )rp   rJ   r   r   r.   r   )r   rf   rG   s      r   r   z.SpyderUserConfig.get_config_fpath_from_versionp  sd     ?d3?))++EE7Hc22 	,H]__l;;EE))++Er   c                 V   |rzt          |dd          rid}t          j                            t	                      |          }|d                    || j                  }nHd                    ||| j                  }n+t          t          |           }|	                    ||          }|S )zT
        Override method.

        Make a backup of the configuration file.
        r   r   r   Nr   r   )
r   r   r   r.   r   r%   rt   r   r   r   )r   rf   rg   r   rG   r   super_classr    s          r   r   z.SpyderUserConfig.get_backup_fpath_from_version  s      	&=hDD 	&DGLL$77E%}}UD4GHH(//w040C E  E   0$77K&DD& &L r   c                 `   |r|t          |dd          r=d                    | j        |          }t          j        t                      d          }nZt          t          |           }|                    |          \  }}n,t          t          |           }|                                \  }}||fS )zS
        Override method.

        Get defaults location based on version.
        r   r   z{}-{}rV   )	r   r%   ru   r   r.   r   r   r   r   )r   rg   r   r   r   r    s        r   r   z4SpyderUserConfig.get_defaults_path_name_from_version  s      
	K[(C88 !~~d&@+NNx<<#$4d;;(LL! !
dd   0$77K$HHJJJD$Tzr   c                 2   |                      | j        |           | j        rdS |rlt          |dd          r]t	          |                     dd                    }|t          ur3|                    dd          }|                     dd|           dS dS dS dS )zg
        Override method.

        Apply any patch to configuration values on version changes.
        Nz44.1.0r   ipython_consolezstartup/run_lines,z; )	r   rV   rp   r   r   r   r	   r*   r:   )r   rg   	run_liness      r   r~   z,SpyderUserConfig.apply_configuration_patches  s     	dm[999  	F 	L=hDD 	L&txx0A0C(E (E F FI	))%--c488	*,?KKKKK	L 	L 	L 	L *)r   r   r   )	r
   r   r   rx   r   r   r   r~   r[   r\   s   @r   r   r   R  s          8   "     *     (L L L L L L L Lr   r   c                       e Zd ZdZdZ	 	 	 ddZd Zd Zed	             Z	ed
             Z
ed             Zed             ZddZed             Zd Zd Zd Zd Zd ZefdZddZddZd Zd Zd ZdS )MultiUserConfigaF  
    Multiuser config class which emulates the basic UserConfig interface.

    This class provides the same basic interface as UserConfig but allows
    splitting the configuration sections and options among several files.

    The `name` is now a `name_map` where the sections and options per file name
    are defined.
    rc   NTFc
           	      $   |                      |          | _        || _        || _        || _        || _        || _        |rdnd| _        || _        |	| _	        i | _
        |                     ||          | _        ||||||d|	d| _        |D ]s}
| j                            |
          }|
|d}| j                                        }|                    |           |                                 } |di || j
        |
<   t| j
                            | j                  }|                    |          }|                    |j                  }|s||k    r9| j
                                        D ]!\  }}|                    |j                    dS dS )z2Multi user config class based on UserConfig class.rb   r   F)r   rV   r   rf   r   r   r   r   )r   rV   Nr   )_check_name_map	_name_mapr   r#   rj   rl   rm   	_raw_modero   rp   _configs_map_get_defaults_for_name_map_config_defaults_map_config_kwargsr   copyupdateget_config_classDEFAULT_FILE_NAMEr   r{   r(   r   )r   name_mapr   rV   r   rf   r   r   r   r   r   
mod_kwargs
new_kwargsconfig_classdefault_config	major_vermajor_old_verr   configs                      r   r   zMultiUserConfig.__init__  s    --h77
!
&-A / /$($C$CHDL%N %N!   $.	
 	
  		A 		AD044T::H$ J ,1133Jj)))0022L&2l&@&@Z&@&@Dd## *..t/EFF"55g>>	&99') )  	Gi=88!.4466 G G	611&2EFFFF 98G Gr   c                     |                      ||          }| j                            |d          }|| j        | j                 }|S )z:Get the correct configuration based on section and option.N)_get_name_from_mapr  r   r  )r   r3   r;   r   config_values        r   _get_configzMultiUserConfig._get_config  sM     &&w77(,,T488,T-CDLr   c                     g }|                                 D ]T\  }}|D ]L\  }}|D ]D}||f}||vr|                    |            d                    ||          }	t          |	          MU|S )z,Check `name_map` follows the correct format.z=Different files are holding the same section/option: "{}/{}"!)r(   r   r%   r   )
r   r  sections_optionsr   sec_optsr3   rW   r;   sec_opt	error_msgs
             r   r  zMultiUserConfig._check_name_map  s     #>>++ 	4 	4KAx$, 
4 
4 % 	4 	4F&/G&666(//888877=vgv7N7N " )333	4
4 r   c                 n    | D ]\  }}||k    r|} n#t          d                    |                    |S )z+Get the section contents from the defaults.zsection "{}" not found!)r   r%   )rV   r3   r   rW   r1   s        r   _get_section_from_defaultsz*MultiUserConfig._get_section_from_defaults  sU     % 	H 	HLC#~~  6==gFFGGGr   c                 j    t           }| D ](\  }}||k    r|                    |t                     } n)|S )z/Get the section,option value from the defaults.)r	   r   )rV   r3   r;   r1   r   rW   s         r   _get_option_from_defaultsz)MultiUserConfig._get_option_from_defaults"  sI     $ 	 	LC#~~FI66  r   c                     d}t          |           D ]\  }\  }}||k    r|} n||                     |           dS dS )zRemove section from defaults.N)	enumeratepop)rV   r3   
idx_removeidxr   r   s         r   _remove_section_from_defaultsz-MultiUserConfig._remove_section_from_defaults,  sh     
&x00 	 	MC#q#~~ 
  !LL "!r   c                 Z    | D ]'\  }}||k    r||v r|                     |            dS (dS )z$Remove section,option from defaults.N)r'  )rV   r3   r;   r   rW   s        r   _remove_option_from_defaultsz,MultiUserConfig._remove_option_from_defaults8  sO     % 	 	LC#~~W$$KK'''EE		 	r   c                    | j                                         D ]e\  }}| j                            |          j        }||k    r+|D ]7\  }}||k    r,t          |          dk    r|c c S |D ]}||k    r|c c c S 8fdS )zT
        Search for section and option on the name_map and return the name.
        r   N)r  r(   r  r   r   r   )	r   r3   r;   r   r  default_sec_namer   rW   r   s	            r   r  z"MultiUserConfig._get_name_from_mapA  s     #n2244 	, 	,ND(#044T::O''' ( , ,W'>>7||q((##* , ,C"f}}'+  -,	, 	,r   c                    i }t          j        |          }|                                D ]\  }}g }t          |          dk    r|||<    |D ]\  }}	t          |	          dk    r-|                     ||          }
|                     ||           nCi }
|	D ]>}|                     |||          }|t          ur||
|<   |                     |||           ?|	                    ||
f           |||<   |S )z-Split the global defaults using the name_map.r   )
r  deepcopyr(   r   r"  r*  r$  r	   r,  r   )r   rV   r  name_map_configdefaults_copyr   r  default_map_for_namer3   rW   r   r   vals                r   r	  z*MultiUserConfig._get_defaults_for_name_mapS  sh    h//&nn.. 	= 	=ND(#% 8}}!!(5%%(0 @ @$GW7||q((!<<]=DF F 99-:AC C C C
 !#* K KC"%"?"?@G#N #NC")33+.C  <<]=DcK K K K )//#????(<%%r   c                     t           S )z#Return the UserConfig class to use.)r   r   s    r   r  z MultiUserConfig.get_config_class|  s    r   c                     t                      }| j                                        D ]1\  }}|                                D ]}|                    |           2t          t          |                    S )z.Return all sections of the configuration file.)r:   r  r(   r   addr   sorted)r   r   r   r  r3   s        r   r   zMultiUserConfig.sections  sx    55*0022 	& 	&IAv!??,, & &W%%%%& F8$$%%%r   c                     |                      |d          }|| j        | j                 }|                    |          r|                    |          S dS )z9Return all the items option/values for the given section.Nr3   )r  r  r  r6   r(   r   r3   r  s      r   r(   zMultiUserConfig.items  s[    !!'400>&t'=>Fg&& 	<<<0004r   c                 Z    |                      |d          }|                    |          S )z-Return all the options for the given section.Nr:  )r  rW   r;  s      r   rW   zMultiUserConfig.options  s+    !!'400~~g~...r   c                     |                      ||          }|| j        | j                 }|                    ||          S )z
        Get Default value for a given `section` and `option`.

        This is useful for type checking in `get` method.
        )r  r  r  r   r   r3   r;   r  s       r   r   zMultiUserConfig.get_default  sD     !!'622>&t'=>F!!'6222r   c                     |                      ||          }|| j        | j                 }|                    |||          S )z
        Get an `option` on a given `section`.

        If section is None, the `option` is requested from default section.
        N)r3   r;   r   )r  r  r  r   )r   r3   r;   r   r  s        r   r   zMultiUserConfig.get  sF     !!'622>&t'=>Fzz'&'zJJJr   c                 f    |                      ||          }|                    |||||           dS )r   )r3   r;   r1   r<   ri   N)r  r:   )r   r3   r;   r1   r<   ri   r  s          r   r:   zMultiUserConfig.set  sI     !!'622

76" 	 	/ 	/ 	/ 	/ 	/r   c                 p    | j                                         D ]\  }}|                    |           dS )z&Reset configuration to Default values.r:  N)r  r(   r   )r   r3   r   r  s       r   r   z!MultiUserConfig.reset_to_defaults  sH    *0022 	6 	6IAv$$W$5555	6 	6r   c                 \    |                      |d          }|                    |           dS r   )r  r   r;  s      r   r   zMultiUserConfig.remove_section  s1    !!'400g&&&&&r   c                 ^    |                      ||          }|                    ||           dS r   )r  r   r>  s       r   r   zMultiUserConfig.remove_option  s3    !!'622Wf-----r   c                     | j                                         D ]+\  }}t          j        |                                           ,dS )z/Remove .ini files associated to configurations.N)r  r(   r   rM   rJ   )r   r   r  s      r   r   zMultiUserConfig.cleanup  sM    *0022 	1 	1IAvIf--//0000	1 	1r   r   r   r   r   )r
   r   r   rZ   r  r   r  r  r   r"  r$  r*  r,  r  r   r	  r  r   r(   rW   r   r	   r   r:   r   r   r   r   r   r   r   r  r    s         !IM?D!&0G 0G 0G 0Gd    $ 	 	 \	   \ 	 	 \	   \, , , ,$ & & [&P     & & &	 	 	/ / /
	3 	3 	3 ,5 K K K K/ / / /6 6 6 6
' ' '
. . .
1 1 1 1 1r   r  c                       e Zd ZdZdS )PluginConfigzPlugin configuration handler.N)r
   r   r   rZ   r   r   r   rF  rF    s        ''''r   rF  c                       e Zd ZdZd ZdS )PluginMultiConfigz4Plugin configuration handler with multifile support.c                     t           S r   )rF  r   s    r   r  z"PluginMultiConfig.get_config_class  s    r   N)r
   r   r   rZ   r  r   r   r   rH  rH    s)        >>    r   rH  )rZ   r   configparserr&   r  rE   r   os.pathr   r   r   r   rN   spyder.config.baser   r   spyder.py3compatr   r   spyder.utils.programsr   r	   r   objectr   r^   r   r  rF  rH  r   r   r   <module>rP     s    


      				 				       				   E D D D D D D D ; ; ; ; ; ; ; ; / / / / / /	 	 	 	 	 	 	 	aE aE aE aE aER_f aE aE aEN@ @ @ @ @ @ @ @FgL gL gL gL gLz gL gL gLTQ1 Q1 Q1 Q1 Q1f Q1 Q1 Q1h( ( ( ( (: ( ( (         r   