Coverage for src/ensae_teaching_cs/faq/faq_jupyter_helper.py: 50%

32 statements  

« prev     ^ index     » next       coverage.py v7.1.0, created at 2023-04-28 06:23 +0200

1# -*- coding: utf-8 -*- 

2""" 

3@file 

4@brief Helpers for jupyter, inspired from `nbopen.py <https://github.com/takluyver/nbopen/blob/master/nbopen.py>`_ 

5 

6""" 

7 

8import os 

9import os.path 

10import warnings 

11import webbrowser 

12from pyquickhelper.loghelper import fLOG 

13 

14 

15def find_best_server(filename, profile='default'): 

16 """ 

17 Finds existing running server. 

18 

19 @param filename notebook 

20 @param profile profile to use 

21 @return a running server or None if not found 

22 """ 

23 from notebook import notebookapp 

24 kwargs = {} 

25 if profile != 'default': 

26 warnings.warn("Jupyter doesn't have profiles") 

27 kwargs['profile'] = profile 

28 servers = [si for si in notebookapp.list_running_servers(**kwargs) 

29 if filename.startswith(si['notebook_dir'])] 

30 try: 

31 return max(servers, key=lambda si: len(si['notebook_dir'])) 

32 except ValueError: 

33 return None 

34 

35 

36def nb_open(filename, profile='default', open_browser=True, fLOG=fLOG): 

37 """ 

38 Opens a notebook with an existing server, 

39 if no server can be found, it starts a new one 

40 (and the function runs until the server is closed). 

41 

42 @param filename notebook 

43 @param profile profile to use 

44 @param open_browser open browser or not 

45 @param fLOG logging function 

46 @return a running server or None if not found 

47 """ 

48 filename = os.path.abspath(filename) 

49 server_inf = find_best_server(filename, profile) 

50 if server_inf is not None: 

51 from notebook.utils import url_path_join 

52 fLOG("Using existing server at", server_inf['notebook_dir']) 

53 path = os.path.relpath(filename, start=server_inf['notebook_dir']) 

54 url = url_path_join(server_inf['url'], 'notebooks', path) 

55 webbrowser.open(url, new=2) 

56 return server_inf 

57 else: 

58 fLOG("Starting new server") 

59 home_dir = os.path.dirname(filename) 

60 from notebook import notebookapp 

61 server = notebookapp.launch_new_instance(file_to_run=os.path.abspath(filename), 

62 notebook_dir=home_dir, 

63 open_browser=open_browser, 

64 # Avoid it seeing our own argv 

65 argv=[], 

66 ) 

67 return server