
    XhD                       d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlZddl	m
Z ddl	mZ ddl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mZmZmZ dZ	 	 	 	 	 	 	 	 	 	 ddZddZddZ 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ!	 	 	 	 	 	 	 	 ddZ"	 d 	 	 	 	 	 	 	 	 	 d!dZ#d"dZ$	 	 	 	 	 d#	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d$dZ%	 d%	 	 	 	 	 	 	 	 	 	 	 	 	 d&dZ& G d de      Z'y)'z Frontend config storage helpers.    )annotationsN)glob)Any)Draft7Validator)ValidationError)_tz)
APIHandler)ConfigManagerrecursive_update)web   )DEFAULT_LOCALEL10N_SCHEMA_NAMEPSEUDO_LANGUAGE
SYS_LOCALEis_valid_localez.jupyterlab-settingsc           
     f   d}d}d}d}||j                  d      \  }}	}
|D ]l  }t        j                  j                  ||d||
dz         }t        j                  j	                  |      sIt        j                  j                  ||d      } |} n |t        | |      }t        j                  j	                  |      st        j                  d||z        t        |d	
      5 }	 t        j                  |      }	 ddd       t        ||      }	 t        j                  |       t!        | |      }||fS # t        $ r,}|}t        j                  d||t        |      fz        dd}~ww xY w# 1 sw Y   txY w# t        $ r,}|}t        j                  d||t        |      fz        dd}~ww xY w)z=Returns a dict containing a parsed and validated JSON schema.zSchema not found: %szFailed parsing schema (%s): %sz!Failed validating schema (%s): %sN:schemas.json  utf-8encoding  )	partitionospathjoinexists_pathr   	HTTPErroropenjsonload	Exceptionstr	_override	Validatorcheck_schema_get_version)schemas_dirschema_name	overrideslabextensions_pathnotfound_errorparse_errorvalidation_errorr   ext_name_plugin_nameext_pathtargetfidschemaenameversions                     T/var/www/html/myenv/lib/python3.12/site-packages/jupyterlab_server/settings_utils.py_get_schemar>       s    ,N2K:D %#.#8#8#= ![* 	HWW\\(Hi;Y`K`aFww~~f% ggll8XyI	 |[+.77>>$mmC$!677	dW	% M	MYYs^FM {FI6FNv&
 ;4G7?  	MD--[D#a&>%ABL	M	M M  NmmC!1T3q6N!BCMNsB   $E/&D7E; 7	E, 'E''E,,E//E8;	F0'F++F0c           
     (   t        | |dt              }d}i }d}d}d}d}	d}
t        j                  j	                  |      rt        j
                  |      }t        j                  |j                        j                         }	t        j                  |j                        j                         }
t        |d      5 }	 |j                         xs |}t        j                  |      }	 ddd       t'        |      rt)        |      }	 |j+                  |       t/        ||||	|
	      S # t        $ r*}t!        j"                  d||t%        |      fz        dd}~ww xY w# 1 sw Y   wxY w# t,        $ r}||t%        |      fz  }d}i }Y d}~td}~ww xY w)
z
    Returns a dictionary containing the raw user settings, the parsed user
    settings, a validation warning for a schema, and file times.
    Fz{}Nz#Failed validating settings (%s): %sz Failed loading settings (%s): %sr   r   r   )rawsettingswarninglast_modifiedcreated)r!   SETTINGS_EXTENSIONr   r   r    stattzutcfromtimestampst_mtime	isoformatst_ctimer#   readjson5loadsr&   r   r"   r'   lenr)   validater   dict)settings_dirr-   r9   r   r@   rA   rB   validation_warningr1   rC   rD   rF   r8   r:   	validators                  r=   _get_user_settingsrU   U   s~   
 {E3EFD
CHG>4KMG	ww~~dwwt}++DMM:DDF%%dmm4>>@$) 	XSXhhj'C ;;s+	X 8}f%		x( (G=Za   XmmCSV7L)LMSWWX		X 	X  	(KQ+@@GCH	sB   <E>)D(E* (	E1%EEEE'*	F3FFc                4   t        | |      }t        j                  j                  t        j                  j	                  |      d   d      }	 t        |d      5 }t        j                  |      }|d   cddd       S # 1 sw Y   yxY w# t        $ r Y yw xY w)zEReturns the package version for a given schema or 'N/A' if not found.r   zpackage.json.origr   r   r<   NzN/A)	r!   r   r   r   splitr#   r$   r%   r&   )r,   r-   r   package_pathr8   packages         r=   r+   r+   }   s     k*D77<<d 3A 68KLL,1 	&SiinG9%	& 	& 	&  s0   B A?5	B ?BB B 	BBc           	        i }i }g }	t         j                  j                  |       s
d| z  g}	g |	fS | dz   |z   }
t        |
d      D cg c]  }| }}|j	                          |D ]  }t         j                  j                  ||       }t         j                  j                  |      \  }}dj                  ||dt        |        g      j                  dd      x}}|rt        |	      ||<   t        | ||d      \  }}| ||      }t        |||      }|d
   r |	j                  |j                  d
             t        d|||d|||<    |@g }|D ]-  }|dz   |z   }
|j                  d t        |
d      D               / |j	                          |D ]  }|j                  t         j                   d      }|j                  d      \  }}t         j                  j                  |      \  }}dj                  ||dt        |        g      j                  dd      x}}||v r|rt        |	      ||<   t        | |||      \  }}t        |||      }|d
   r |	j                  |j                  d
             t        d|||d|||<    |j#                  |       t%        |j'                         d      D cg c]  }||   	 }}||	fS c c}w c c}w )ac  
    Returns a tuple containing:
     - the list of plugins, schemas, and their settings,
       respecting any defaults that may have been overridden if `ids_only=False`,
       otherwise a list of dict containing only the ids of plugins.
     - the list of warnings that were generated when
       validating the user overrides against the schemas.
    z'Settings directory does not exist at %sz/**/*T)	recursiver   N\/)idrB   r^   r9   r<   z/**/schemas/**/*c              3      K   | ]  }|  y wN ).0r   s     r=   	<genexpr>z!_list_settings.<locals>.<genexpr>   s     VVs   zschemas/r/   )reverserb   )r   r   r    r   sortrelpathrW   r   rO   replacerQ   r>   rU   appendpopextendsepupdatesortedkeys)r,   rR   r.   	extensionr/   
translatorids_onlyrA   federated_settingswarningsschema_patternr   schema_pathsschema_pathrel_pathrel_schema_dirschema_base_idr-   r9   r<   user_settingsext_dirschema_path_base_dirkeysettings_lists                              r=   _list_settingsr      s   $  "H)+H77>>+&=KLH~ 7*Y6N%).D%IJTDJLJ# Z77??;<&(ggmmH&=#HH[):C	N?;<

'$
	k  CLHSM)+{ItTOFG%#F+.|[&QMY' 1 1) <= !YCY=YHSM)Z, %) 	WG$'99IENVnPT1UVV	W 	( 	L&..rvvs;K!,!2!2:!>Hh +-''--*A'NK #->I!?@!gdC !C+
 ((*.#,"3'"-iL^# !3<f U +OOM$5$5i$@A +/ +67+>K+"3'7	> OO&'.4X]]_d.STsXc]TMT8$$G KB Us   	K?Kc                    | |v rd||    }|D ]Z  }||d   v r<|d   |   d   }t        |t              rt        |||          n||   }||d   |   d<   Ft        ||         |d   |<   \ |S )z3Override default values in the schema if necessary.
propertiesdefault)r   )
isinstancerQ   r   )r-   r9   r.   defaultsr   new_defaultss         r=   r(   r(      s     i[) 	HCf\**%l3C8ClD1$\8C=A#+C=L7C|$S))4,0#,G|$S)	H M    c           	        d}d}	 |j                  d      \  }}t        j                  j                  | |      }t        j                  j                  |||z         }	|r7t        j                  j                  |      s	 t        j                  |       |	S |	S # t        $ r t        j                  d||z        dw xY w# t        $ r*}
t        j                  d||t        |
      fz        dd}
~
ww xY w)a1  
    Returns the local file system path for a schema name in the given root
    directory. This function can be used to filed user overrides in addition to
    schema files. If the `make_dirs` flag is set to `True` it will create the
    parent directory for the calculated path if it does not exist.
    zSettings not found (%s)z Failed writing settings (%s): %sr   r   Nr   )
rW   r   r   r   r&   r   r"   r    makedirsr'   )root_dirr-   	make_dirsrq   r0   write_errorpackage_dirplugin
parent_dirr   r:   s              r=   r!   r!     s     /N4KI)//4VWW\\(K8
ww||J(:; 
3	TKK
# K4K  ImmC+!=>DHI  	T--[KQ3H%HItS	Ts$   AB ?B? $B<?	C2%C--C2c           	        i d}}t         j                  j                  | d      }t        g t	        t         j                  j                  |d            t	        t         j                  j                  |d                  }|t         j                  j                  | d      t         j                  j                  | d      gz  }|D ]  }t         j                  j                  |      s#t        |d      5 }	 |j                  d	      rt        j                  |      }nt        j                  |      }|j                         D ]!  \  }}	t        |j                  |i       |	       # 	 d
d
d
        t        d      }|j!                  d      j                         D ]!  \  }}	t        |j                  |i       |	       # ||fS # t        $ r}
|
}Y d
}
~
md
}
~
ww xY w# 1 sw Y   "xY w)zGet overrides settings from `app_settings_dir`.

    The ordering of paths is:
    - {app_settings_dir}/overrides.d/*.{json,json5} (many, namespaced by package)
    - {app_settings_dir}/overrides.{json,json5} (singleton, owned by the user)
     zoverrides.dz*.jsonz*.json5zoverrides.jsonzoverrides.json5r   r   z.json5N	labconfig)config_dir_namedefault_setting_overrides)r   r   r   ro   r   r    r#   endswithrM   r%   r$   itemsr   
setdefaultr&   r
   get)app_settings_dirr.   erroroverrides_dall_override_pathsoverrides_pathr8   path_overrides	plugin_idconfigr:   cms               r=   _get_overridesr     s    2uI'',,/?K  	
277<<X67	
277<<Y78	
 
%'78
%'89 
 - ww~~n-.73 		s!**84%*ZZ_N%)YYs^N)7)=)=)? R%Iv$Y%9%9)R%H&QR		 			" 
{	3BVV$?@FFH F	6--i<fEF e  		 		s7   7G9A0G)G	GGGGGG)	c                    i }g }	|t        |       \  }}
|rFt        ||||      \  }}| ||      }t        |||      }|j                  d      g}	|||d|}||	fS t	        ||||||      \  }}	d|i}||	fS )aK  
    Get settings.

    Parameters
    ----------
    app_settings_dir:
        Path to applications settings.
    schemas_dir: str
        Path to schemas.
    settings_dir:
        Path to settings.
    schema_name str, optional
        Schema name. Default is "".
    overrides: dict, optional
        Settings overrides. If not provided, the overrides will be loaded
        from the `app_settings_dir`. Default is None.
    labextensions_path: list, optional
        List of paths to federated labextensions containing their own schema files.
    translator: Callable[[Dict], Dict] or None, optional
        Translate a schema. It requires the schema dictionary and returns its translation

    Returns
    -------
    tuple
        The first item is a dictionary with a list of setting if no `schema_name`
        was provided (only the ids if `ids_only=True`), otherwise it is a dictionary
        with id, raw, scheme, settings and version keys.
        The second item is a list of warnings. Warnings will either be a list of
        i) strings with the warning messages or ii) `None`.
    rB   r_   )r/   rr   rs   rA   )r   r>   rU   rk   r   )r   r,   rR   r-   r.   r/   rr   rs   resultru   _errorr9   r<   r}   r   s                  r=   get_settingsr   R  s    P FH*+;<	6%k;	K]^!'F*<fM!%%i01#v'[][ 8 #11!#
x 
 8r   c                   t        j                  |      }t        | |||      \  }}t        |      }	|	j	                  |       t        ||dt              }
t        |
dd      5 }|j                  |       ddd       y# 1 sw Y   yxY w)a  
    Save ``raw_settings`` settings for ``schema_name``.

    Parameters
    ----------
    schemas_dir: str
        Path to schemas.
    settings_dir: str
        Path to settings.
    schema_name str
        Schema name.
    raw_settings: str
        Raw serialized settings dictionary
    overrides: dict
        Settings overrides.
    labextensions_path: list, optional
        List of paths to federated labextensions containing their own schema files.
    re   Twr   r   N)	rM   rN   r>   r)   rP   r!   rE   r#   write)r,   rR   r-   raw_settingsr.   r/   payloadr9   r4   rT   r   r8   s               r=   save_settingsr     s    4 kk,'G [)@RIFA &!Iw {D2DED	dC'	*  c		,     s   $A??Bc                  J     e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZ xZS )SchemaHandlerz6Base handler for handler requiring access to settings.c                    t        	|   di | d}|st        |      \  }}|| _        || _        || _        || _        || _        |rd}| j                  j                  ||       yy)zInitialize the handler.NzFailed loading overrides: %srb   )
super
initializer   r.   r   r,   rR   r/   logrB   )
selfr   r,   rR   r/   r.   kwargsr   overrides_warning	__class__s
            r=   r   zSchemaHandler.initialize  sw     	$V$-.>?Iu" 0&("4 >HH.6 r   c                   	 t        | j                  | j                  | j                  t        | j
                  | j                        \  }}|j                  di       j                  d      xs t        }|dk(  rt        }t        |      s|t        k7  rt        }|S # t        j                  $ r*}d}| j                  j                  ||       i }Y d}~d}~ww xY w)aQ  
        Get the current locale as specified in the translation-extension settings.

        Returns
        -------
        str
            The current locale string.

        Notes
        -----
        If the locale setting is not available or not valid, it will default to jupyterlab_server.translation_utils.DEFAULT_LOCALE.
        )r-   r.   r/   z4Missing or misshapen translation settings schema:
%sNrA   localer   )r   r   r,   rR   r   r.   r/   r   r"   r   rB   r   r   r   r   r   )r   rA   r4   r:   schema_warningcurrent_locales         r=   get_current_localez SchemaHandler.get_current_locale  s    	&%%  !!,..#'#:#:KHa "j"599(CQzY&'N~.>_3T+N }} 	TNHH^Q/H		s   A
B C/ CCra   )r   r'   r,   r'   rR   r'   r/   list[str] | Noner.   dict[str, Any] | Noner   r   returnNone)r   r'   )__name__
__module____qualname____doc__r   r   __classcell__)r   s   @r=   r   r     sY    @ ,077 7 	7
 -7 )7 7 
70"r   r   )
r,   r'   r-   r'   r.   dict[str, Any]r/   r   r   tuple[dict[str, Any], str])rR   r'   r-   r'   r9   r   r   r   )r,   r'   r-   r'   r   r'   )r   NNF)r,   r'   rR   r'   r.   r   rq   r'   r/   r   rr   r   rs   boolr   ztuple[list[Any], list[Any]])r-   r'   r9   r   r.   r   r   r   )Fr   )
r   r'   r-   r'   r   r   rq   r'   r   r'   )r   r'   r   r   )r   NNNF)r   r'   r,   r'   rR   r'   r-   r'   r.   r   r/   r   rr   r   rs   r   r   z tuple[dict[str, Any], list[Any]]ra   )r,   r'   rR   r'   r-   r'   r   r'   r.   r   r/   r   r   r   )(r   
__future__r   r$   r   r   typingr   rM   
jsonschemar   r)   r   jupyter_serverr   rG   jupyter_server.base.handlersr	   &jupyter_server.services.config.managerr
   r   tornador   translation_utilsr   r   r   r   r   rE   r>   rU   r+   r   r(   r!   r   r   r   r   rb   r   r=   <module>r      s   & #  	    3 & $ 3 R   , 222 2 )	2
  2j%P$ +/^%^%^% ^% 	^%
 )^% ^% ^% !^%B,9G. PW #04IL:0n '++/BBB B 	B
 %B )B B B &BV ,0& & &  &  	& 
 &  )&  
& R=J =r   