Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/nbconvert/exporters/script.py: 36%

45 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-07-01 06:54 +0000

1"""Generic script exporter class for any kernel language""" 

2 

3# Copyright (c) Jupyter Development Team. 

4# Distributed under the terms of the Modified BSD License. 

5import sys 

6 

7if sys.version_info < (3, 10): 

8 from importlib_metadata import entry_points 

9else: 

10 from importlib.metadata import entry_points 

11from traitlets import Dict, default 

12 

13from .base import get_exporter 

14from .templateexporter import TemplateExporter 

15 

16 

17class ScriptExporter(TemplateExporter): 

18 """A script exporter.""" 

19 

20 # Caches of already looked-up and instantiated exporters for delegation: 

21 _exporters = Dict() 

22 _lang_exporters = Dict() 

23 export_from_notebook = "Script" 

24 

25 @default("template_file") 

26 def _template_file_default(self): 

27 return "script.j2" 

28 

29 @default("template_name") 

30 def _template_name_default(self): 

31 return "script" 

32 

33 def _get_language_exporter(self, lang_name): 

34 """Find an exporter for the language name from notebook metadata. 

35 

36 Uses the nbconvert.exporters.script group of entry points. 

37 Returns None if no exporter is found. 

38 """ 

39 if lang_name not in self._lang_exporters: 

40 try: 

41 exporters = entry_points(group="nbconvert.exporters.script") 

42 exporter = [e for e in exporters if e.name == lang_name][0].load() 

43 except (KeyError, IndexError): 

44 self._lang_exporters[lang_name] = None 

45 else: 

46 # TODO: passing config is wrong, but changing this revealed more complicated issues 

47 self._lang_exporters[lang_name] = exporter(config=self.config, parent=self) 

48 return self._lang_exporters[lang_name] 

49 

50 def from_notebook_node(self, nb, resources=None, **kw): 

51 """Convert from notebook node.""" 

52 langinfo = nb.metadata.get("language_info", {}) 

53 

54 # delegate to custom exporter, if specified 

55 exporter_name = langinfo.get("nbconvert_exporter") 

56 if exporter_name and exporter_name != "script": 

57 self.log.debug("Loading script exporter: %s", exporter_name) 

58 if exporter_name not in self._exporters: 

59 exporter = get_exporter(exporter_name) 

60 # TODO: passing config is wrong, but changing this revealed more complicated issues 

61 self._exporters[exporter_name] = exporter(config=self.config, parent=self) 

62 exporter = self._exporters[exporter_name] 

63 return exporter.from_notebook_node(nb, resources, **kw) 

64 

65 # Look up a script exporter for this notebook's language 

66 lang_name = langinfo.get("name") 

67 if lang_name: 

68 self.log.debug("Using script exporter for language: %s", lang_name) 

69 exporter = self._get_language_exporter(lang_name) 

70 if exporter is not None: 

71 return exporter.from_notebook_node(nb, resources, **kw) 

72 

73 # Fall back to plain script export 

74 self.file_extension = langinfo.get("file_extension", ".txt") 

75 self.output_mimetype = langinfo.get("mimetype", "text/plain") 

76 return super().from_notebook_node(nb, resources, **kw)