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
« 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"""
3# Copyright (c) Jupyter Development Team.
4# Distributed under the terms of the Modified BSD License.
5import sys
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
13from .base import get_exporter
14from .templateexporter import TemplateExporter
17class ScriptExporter(TemplateExporter):
18 """A script exporter."""
20 # Caches of already looked-up and instantiated exporters for delegation:
21 _exporters = Dict()
22 _lang_exporters = Dict()
23 export_from_notebook = "Script"
25 @default("template_file")
26 def _template_file_default(self):
27 return "script.j2"
29 @default("template_name")
30 def _template_name_default(self):
31 return "script"
33 def _get_language_exporter(self, lang_name):
34 """Find an exporter for the language name from notebook metadata.
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]
50 def from_notebook_node(self, nb, resources=None, **kw):
51 """Convert from notebook node."""
52 langinfo = nb.metadata.get("language_info", {})
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)
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)
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)