
    ceL?                         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ZddlZddl	Z	ddl
Z
ddlZddlmZ  G d d          Z G d dej                  Z G d	 d
e          ZdS )z
This module provides user configuration file management features.

It's based on the ConfigParser module (present in the standard library).
    )print_functionN)get_home_dirc                       e Zd ZdZdS )	NoDefaultzNoDefault object.N)__name__
__module____qualname____doc__     >lib/python3.11/site-packages/anaconda_navigator/config/user.pyr   r   !   s        r   r   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	DefaultsConfigz&Class used to save defaults to a file.c                 `    t           j                            |            || _        || _        dS )z
        Class used to save defaults to a file.

        Parameters
        -----------
        name: str
            Name of the configuration.
        subfolder: str
            Path to folder location of configuration file.
        N)configparserConfigParser__init__name	subfolder)selfr   r   s      r   r   zDefaultsConfig.__init__+   s-     	!**4000	"r   c           	         | j         r|                    dt          j         d           | j                                         D ]C\  }}t          |                              dd          }|                    | d| d           D|                    d           | j        D ]}|                    d| d           | j        |                                         D ]p\  }}|dk    r|| j        | j	        k    r:t          |          }d
                    ||                    dd          f          }|                    | d           q|                    d           dS )ztPrivate write method for Python 2.

        The one from configparser fails for non-ascii Windows accounts.
        [z]

z
	z = r   N)	_defaultswriter   DEFAULTSECTitemsstrreplace	_sections_optcreOPTCREjoin)r   fpkeyvaluewrite_valuesections         r   _writezDefaultsConfig._write:   s|   
 > 	HH61666777 $ 4 4 6 6 5 5e!%jj00v>>C33K3334444HHTNNN~ 		 		GHH%%%%&&& $w 7 = = ? ? % %e*$$%4<4;+F+FJJE**c5==v+F+F%GHHCC$$$$HHTNNNN		 		r   c                    |                      |          s|                     |           t          |t                    st	          |          }|rt          | d| d|            t          j                            | |||           dS )zPrivate set method.z[ z ] = N)	has_sectionadd_section
isinstancer   reprprintr   r   set)r   r(   optionr&   verboses        r   _setzDefaultsConfig._setP   s    (( 	&W%%%%%% 	 KKE 	6W4444U44555!%%dGVUCCCCCr   c                 t                                      } fd}	  ||           dS # t          $ r 	 t          j                            |          rt          j        |           t          j        d            ||           Y dS # t          $ r  t          d           t          d            w xY ww xY w)z*Save config into the associated .ini file.c                     t          | dd          5 }                    |           d d d            d S # 1 swxY w Y   d S )Nwutf-8encoding)openr   )fname
configfiler   s     r   _write_filez)DefaultsConfig._save.<locals>._write_file^   s    eS7333 'z

:&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's   7;;g?z(Failed to write user configuration file.zPlease submit a bug report.N)
filenameIOErrorospathisfileremovetimesleep	Exceptionr/   )r   r;   r=   s   `  r   _savezDefaultsConfig._saveZ   s    	' 	' 	' 	' 	'	K 		 		 		7>>%(( %Ie$$$
4   E""""""   @AAA3444		s   ) 
B7AB		*B33B7c                 `   t           j                            t                      | j                  }d| j        v r t           j                            |d          }	 t          j        |           n# t           j        $ r Y nw xY wt           j                            || j         d          }|S )z6Create a .ini filename located in user home directory.defaults.ini)r@   rA   r#   r   r   r   makedirserror)r   folderini_files      r   r>   zDefaultsConfig.filenameo   s    lnndn== ""W\\&*55F	Kx 	 	 	D	 7<<49(:(:(:;;s   A1 1BBc                     |D ]<\  }}|D ]4}t          j        ||                   }|                     |||d           5=dS )zSet default configuration.FN)copydeepcopyr3   )r   rI   r(   optionsr1   	new_values         r   set_defaultszDefaultsConfig.set_defaults~   sb     ( 	= 	=GW! = = M'&/::			'69e<<<<=	= 	=r   N)
r   r   r	   r
   r   r)   r3   rG   r>   rT   r   r   r   r   r   (   sw        00# # #  ,D D D  *  = = = = =r   r   c                       e Zd ZdZdZ	 	 	 	 	 	 	 ddZed             Zed             Zd d
Z	d!dZ
d"dZd Zd"dZd Zd Zed             Zd#dZd Zd Zd Zd Zd$dZd Zd ZefdZd Z	 d%dZd Zd ZdS )&
UserConfigz
    User configuration class.

    Note that 'get' and 'set' arguments number and type differ from the
    overriden methods.
    mainNTFc	                    t                               | ||           |rdnd| _        |(t          j        d|          t          d| d          t          |t                    r
| j        |fg}|| _	        || 
                    d           |                                 }	|r*	 t          j        |	|	 d	           n# t          $ r Y nw xY w|r#|                                  |                     |          }
|                     |||           |                     |          |                     |
          k    r|r-	 t          j        |	|	 d
|
 d	           n# t          $ r Y nw xY w|                     ||
           |s,|                     |          |                     |
          k    r|                     |
           |                     |d           ||                                  dS dS dS )a  
        User configuration class.

        Parameters
        ----------
        name: str
            Name of the configuration.
        defaults: dict
            dictionnary containing options *or* list of tuples (section_name,
            options).
        version: str
            Version of the configuration file (X.Y.Z format).
        subfolder: str
            Configuration file will be saved in HOME/subfolder/name.ini.
           r   Nz^(\d+).(\d+).(\d+)$zVersion number z' is incorrect - must be in X.Y.Z formatFsavez.bak-)r   r   rawrematch
ValueErrorr-   dictDEFAULT_SECTION_NAMErI   reset_to_defaultsr>   shutilcopyfiler?   load_from_iniget_version_UserConfig__save_new_defaults_minor_UserConfig__update_defaults_major&_UserConfig__remove_deprecated_optionsset_versionset_as_defaults)r   r   rI   loadversionr   backupraw_moderemove_obsoleter;   old_vers              r   r   zUserConfig.__init__   s[   4 	dI666 '11abh/Ew&O&O&W_w___```h%% 	?2H=>H """... 	%~~~6666     	'   &&w//G $$Xw	BBB {{7##t{{7';';;; %/G/G'/G/G/GHHHH"   &&x999 $ >t{{7';';t{{7?S?S'S'S44W===   u 555$$&&&&&3	' 	'.  s$   'C   
CCE 
E+*E+c                 <    | d|                      d                   S )z*Return major component in config versions.N.)find_ts    r   rk   zUserConfig._major   s     -2773<<-  r   c                 <    | d|                      d                   S )z*Return minor component in config versions.Nrv   )rfindrx   s    r   ri   zUserConfig._minor   s     .288C==.!!r   0.0.0c                 :    |                      | j        d|          S )z0Return configuration (not application!) version.rp   getrb   )r   rp   s     r   rg   zUserConfig.get_version   s    xx19gFFFr   c                 B    |                      | j        d||           dS )z-Set configuration (not application!) version.rp   rZ   Nr0   rb   )r   rp   r[   s      r   rm   zUserConfig.set_version   s%    *IwTJJJJJr   c                 v    |                      | j        d|           |                      | j        d|           dS )z7Set `logged_api_url` and `logged_brand` config options.logged_api_urllogged_brandNr   )r   urlbrands      r   set_logged_datazUserConfig.set_logged_data   s;    *,<cBBB*NEBBBBBr   c                 n    |                      | j        d          |                      | j        d          fS )z7Set `logged_brand` and `logged_api_url` config options.r   r   r~   r   s    r   get_logged_datazUserConfig.get_logged_data   s7    xx1>CCHHT.0@AAB 	Br   c                 \    |                                  \  }}|r|r||k    S |r|r||k    S dS )z3Check if given `url` or `brand` match current repo.F)r   )r   r   r   r   
logged_urls        r   is_logged_brandzUserConfig.is_logged_brand   sQ    #'#7#7#9#9 j 	)\ 	)L(( 	%# 	%*$$ur   c                     	 |                      |                                 d           dS # t          j        $ r t	          d           Y dS w xY w)z*Load config from the associated .ini file.r7   r8   z*Warning: File contains no section headers.N)readr>   r   MissingSectionHeaderErrorr/   r   s    r   rf   zUserConfig.load_from_ini  sf    	@IIdmmooI888885 	@ 	@ 	@>??????	@s   )- AAc                 @   t          j                    }t          j                            |                                           }t          j                            |d          }|                    t          j                            |d|z   dz                        |S )zRead old defaults.rI   	defaults-rJ   )r   r   r@   rA   dirnamer>   r#   r   )r   old_versionold_defaultsrA   s       r   __load_old_defaultszUserConfig.__load_old_defaults
  st    #022wt}}//w||D*--"',,t[;-F-OPPQQQr   c                     t          d|z   |          }t          j                            |                                          s+|                    |            |                                 dS dS )zSave new defaults.r   )r   r   N)r   r@   rA   rB   r>   rT   rG   )rI   new_versionr   new_defaultss       r   __save_new_defaultszUserConfig.__save_new_defaults  s}     &{*
 
 
 w~~l335566 	!%%h///     	! 	!r   c                 N   |                      |          }|D ]\  }}|D ]}t          j        ||                   }	 |                    ||          }	n## t          j        t          j        f$ r d}	Y nw xY w|	t          |          |	k    r|                     ||||           dS )z*Update defaults after a change in version.N)	_UserConfig__load_old_defaultsrP   rQ   r   r   NoSectionErrorNoOptionErrorr   r3   )
r   rI   r   r2   r   r(   rR   r1   rS   	old_values
             r   __update_defaultszUserConfig.__update_defaults  s    //<< ( 	C 	CGW! C C M'&/::	% , 0 0& A AII$3\5OP % % % $III%%3y>>Y+F+FIIgvy'BBBC	C 	Cs   AA32A3c                    |                      |          }|                                D ]}|                    || j                  D ]z\  }}|                     ||          t
          u rX|                     ||           t          |                     || j                            dk    r|                     |           {dS )z<Remove options present in the .ini file but not in defaults.r]   r   N)	r   sectionsr   r]   get_defaultr   remove_optionlenremove_section)r   r   r   r(   r1   _s         r   __remove_deprecated_optionsz&UserConfig.__remove_deprecated_options*  s    //<<#,,.. 	5 	5G)//TX/FF 5 5	##GV44	AA&&w7774::g48:<<==BB++G444	5	5 	5r   c                 R    t          j        |                                            dS )z&Remove .ini file associated to config.N)r@   rC   r>   r   s    r   cleanupzUserConfig.cleanup4  s     
	$--//"""""r   c                     g | _         |                                 D ]G}i }|                     || j                  D ]
\  }}|||<   | j                             ||f           HdS )z%Set defaults from the current config.r   N)rI   r   r   r]   append)r   r(   secdictr1   r&   s        r   rn   zUserConfig.set_as_defaults8  s}    }} 	5 	5GG!%G!B!B ( ("'M  '7!34444		5 	5r   c                    |                      d           t          j                    5 }|                     |           |                    d           |                                cd d d            S # 1 swxY w Y   d S )NFrZ   r   )rc   ioStringIOr   seekr   )r   fds     r   get_defaultszUserConfig.get_defaultsA  s    E***[]] 	bJJrNNNGGAJJJ7799	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   >A55A9<A9c                     | j         D ]D\  }}|||k    r7|D ]4}t          j        ||                   }|                     ||||           5E|r|                                  dS dS )zReset config to Default values.N)rI   rP   rQ   r3   rG   )r   r[   r2   r(   secrR   r1   r&   s           r   rc   zUserConfig.reset_to_defaultsI  s     M 	; 	;LC'S..% ; ;F M'&/::EIIc65':::: 	JJLLLLL	 	r   c                     || j         }n$t          |t                    st          d          t          |t                    st          d          |S )z1Private method to check section and option types.Nz#Argument 'section' must be a stringz"Argument 'option' must be a string)rb   r-   r   RuntimeErrorr   r(   r1   s      r   __check_section_optionz!UserConfig.__check_section_optionS  sZ    ?/GGGS)) 	FDEEE&#&& 	ECDDDr   c                     |                      ||          }| j        D ]+\  }}||k    r ||v rt          j        ||                   c S ,t          S )zw
        Get Default value for a given (section, option).

        -> useful for type checking in 'get' method
        )!_UserConfig__check_section_optionrI   rP   rQ   r   )r   r(   r1   r   rR   s        r   r   zUserConfig.get_default]  sb     --gv>> M 	6 	6LCwVw%6%6}WV_55555r   c                 H   |                      ||          }|                     |          s2|t          u rt          j        |          |                     |           |                     ||          s7|t          u rt          j        ||          |                     |||           |S t          j	        
                    | ||| j                  }|                     ||          }t          |t                    rt          j        |          }nt          |t"                    rt#          |          }njt          |t$                    rt%          |          }nEt'          j        t*                    5  t          j        |          }ddd           n# 1 swxY w Y   |S )z
        Get an option.

        section=None: attribute a default section name
        default: default value (if not specified, an exception
        will be raised if option doesn't exist)
        r   N)r   r+   r   r   r   r,   
has_optionr   r0   r   r   r]   r   r-   boolastliteral_evalfloatint
contextlibsuppressBaseException)r   r(   r1   defaultr&   default_values         r   r   zUserConfig.geti  s    --gv>>(( 	&)##"1':::W%%%w// 	)##"0AAAHHWfg...N)--dGV-RR((&99mT** 		0$U++EEu-- 	0%LLEEs++ 	0JJEE$]33 0 0(//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s   6FFFc                 b    |                      ||          }| j        D ]\  }}||k    r|||<   dS )z
        Set Default value for a given (section, option).

        -> called when a new (section, option) is set and no default exists
        N)r   rI   )r   r(   r1   r   r   rR   s         r   set_defaultzUserConfig.set_default  sK     --gv>> M 	0 	0LCg~~"/	0 	0r   c                 (   |                      ||          }|                     ||          }|t          u r|}|                     |||           t	          |t
                    rt          |          }nnt	          |t                    rt          |          }nIt	          |t                    rt          |          }n$t	          |t                    st          |          }| 
                    ||||           |r|                                  dS dS )zX
        Set an option.

        section=None: attribute a default section name
        N)r   r   r   r   r-   r   r   r   r   r.   r3   rG   )r   r(   r1   r&   r2   r[   r   s          r   r0   zUserConfig.set  s    --gv>>((&99I%%!MWfm<<<mT** 	 KKEEu-- 	 %LLEEs++ 	 JJEEM3// 	 KKE		'65'222 	JJLLLLL	 	r   c                 n    t           j                            | |           |                                  dS )z4Remove the specified section from the configuration.N)r   r   r   rG   )r   r(   s     r   r   zUserConfig.remove_section  s,    !00w???

r   c                 p    t           j                            | ||           |                                  dS )z7Remove the specified option from the specified section.N)r   r   r   rG   r   s      r   r   zUserConfig.remove_option  s.    !//gvFFF

r   )NTNNFFF)r|   )r|   T)NN)F)TFN)FT)r   r   r	   r
   rb   r   staticmethodrk   ri   rg   rm   r   r   r   rf   r   rh   rj   rl   r   rn   r   rc   r   r   r   r   r   r0   r   r   r   r   r   rV   rV      s         "
 F' F' F' F'P ! ! \! " " \"G G G GK K K KC C C C
B B B

 
 
 
@ @ @   ! ! \!C C C C5 5 5# # #5 5 5       
 
 
 ,5 " " " "H	0 	0 	0 ?C   4  
    r   rV   )r
   
__future__r   r   r   r   rP   r   r@   r^   rd   rD   anaconda_navigator.config.baser   r   r   r   rV   r   r   r   <module>r      s(    & % % % % % 



          				 				 				   7 7 7 7 7 7       [= [= [= [= [=\. [= [= [=Bq q q q q q q q q qr   