a
    b                     @   s   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
Z
ddlZddlmZ ddlmZ G d	d
 d
eZdddZdd Zdd Zdd Zdd Zdd ZdS )ae  
This module contains a Jupyter Server extension that attempts to
make classic server and notebook extensions work in the new server.

Unfortunately, you'll notice that requires some major monkey-patching.
The goal is that this extension will only be used as a temporary
patch to transition extension authors from classic notebook server to jupyter_server.
    N)wraps)jupyter_config_path)is_trait)ConfigManager   )NotebookAppTraitsc                   @   s   e Zd ZdS )ClassProxyErrorN)__name__
__module____qualname__ r   r   1lib/python3.9/site-packages/nbclassic/nbserver.pyr      s   r   Fc                    s   t | r*|du r*tdj| jjdt tj}t|sTt tkrhtfdd}n&t t	j
rt  fdd}n }t| j| dS )	zARedirects a method, property, or trait from object 1 to object 2.FzZCannot proxy the attribute '{name}' from {cls2} because {cls1} already has this attribute.)nameZcls1Zcls2c                    s
   t  S N)getattrself)r   obj2r   r   <lambda>+       zproxy.<locals>.<lambda>c                    s    |i |S r   r   )r   argskwargs)attrr   r   thing.   s    zproxy.<locals>.thingN)hasattrr   format	__class__r   r   typeproperty
isinstancetypes
MethodTyper   setattr)obj1r   r   Z	overwriteZcls_attrr   r   )r   r   r   r   proxy   s"    
r$   c                 C   s   t | }dd |D S )Nc                 S   s   g | ]\}}| d s|qS )_)
startswith).0mr%   r   r   r   
<listcomp>;   r   z"public_members.<locals>.<listcomp>)inspectZ
getmembers)objmembersr   r   r   public_members9   s    
r-   c                 C   s   t | }t |}t||S )z5Return all attribute names found in obj2 but not obj1)r-   set
difference)r#   r   Zm1Zm2r   r   r   diff_members>   s    r0   c                 C   s,   t | d}|d}|di di }|S )N)read_config_pathZjupyter_notebook_configZNotebookAppnbserver_extensions)r   get)config_dirscmsection
extensionsr   r   r   get_nbserver_extensionsE   s    

r8   c                 C   s(  | j }| j}dd }t||j_z*|jd }|d|  |jd }|j}W n t	yb   t
 }Y n0 t| |}|D ]}t| || qrt }	|	| jg }
t|
}| D ]@\}}||jvr|j||d}|r|dj|d || qdd	 }|tjjj_d
d }t|| j_dd }t||j_d S )Nc                    s4   t  j }|d dg| } fdd|D S )zkDictionary with extension package names as keys
        and an ExtensionPackage objects as values.
        	nbclassicc                    s   i | ]}| j | qS r   )r7   )r'   keyr   r   r   
<dictcomp>^   r   zM_link_jupyter_server_extension.<locals>.sorted_extensions.<locals>.<dictcomp>)sortedr7   keysremove)r   r=   r   r   r   sorted_extensionsV   s    

z9_link_jupyter_server_extension.<locals>.sorted_extensionsr9   zjupyter-nbclassic)enabledzy{name} | extension was found and enabled by nbclassic. Consider moving the extension to Jupyter Server's extension paths.)r   c                 S   s   | j d |S )z1Return the jinja template object for a given nameZnotebook_jinja2_env)Zsettingsget_template)r   r   r   r   r   rA      s    z4_link_jupyter_server_extension.<locals>.get_templatec                 S   s   | j tjtjg S ))return extra paths + the default location)extra_static_pathsjupyter_serverDEFAULT_STATIC_FILES_PATHnotebookr   r   r   r   static_file_path_jupyter_server   s    zG_link_jupyter_server_extension.<locals>.static_file_path_jupyter_serverc                 S   s   | j tjtjdtjg S )rB   rF   )rC   ospathjoinrF   rE   r   r   r   r   static_file_path_nbclassic   s    
zB_link_jupyter_server_extension.<locals>.static_file_path_nbclassic)Zextension_managerlogr   r   r?   r7   Z
link_pointZextension_pointsZapp	Exceptionr   r0   r$   r   Z
config_dirr8   itemsadd_extensioninfor   Zlink_extensionrF   basehandlersZIPythonHandlerrA   Zstatic_file_path)	serverappZmanagerloggerr?   pkgZpointZnbappr,   r(   Zjupyter_pathsr4   r2   r   r@   Z
successfulrA   rG   rK   r   r   r   _link_jupyter_server_extensionL   sF    





rV   c                 C   s*   | j }|j}|dd t D 7 }||_d S )Nc                 S   s   g | ]}t j|d qS )Znbconfig)rH   rI   rJ   )r'   pr   r   r   r)      s   z2_load_jupyter_server_extension.<locals>.<listcomp>)config_managerr1   r   )rS   rX   r1   r   r   r   _load_jupyter_server_extension   s    rY   )F)__doc__rH   r    r*   	functoolsr   Zjupyter_core.pathsr   Ztraitlets.traitletsr   rF   rD   Z&jupyter_server.services.config.managerr   Ztraitsr   rM   r   r$   r-   r0   r8   rV   rY   r   r   r   r   <module>   s"   
]