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

41 statements  

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

1"""A qt exporter.""" 

2import os 

3import sys 

4import tempfile 

5 

6from traitlets import default 

7 

8from .html import HTMLExporter 

9 

10 

11class QtExporter(HTMLExporter): 

12 """A qt exporter.""" 

13 

14 paginate = None 

15 format = "" # noqa 

16 

17 @default("file_extension") 

18 def _file_extension_default(self): 

19 return ".html" 

20 

21 def _check_launch_reqs(self): 

22 if sys.platform.startswith("win") and self.format == "png": 

23 msg = "Exporting to PNG using Qt is currently not supported on Windows." 

24 raise RuntimeError(msg) 

25 from .qt_screenshot import QT_INSTALLED 

26 

27 if not QT_INSTALLED: 

28 msg = ( 

29 f"PyQtWebEngine is not installed to support Qt {self.format.upper()} conversion. " 

30 f"Please install `nbconvert[qt{self.format}]` to enable." 

31 ) 

32 raise RuntimeError(msg) 

33 from .qt_screenshot import QtScreenshot 

34 

35 return QtScreenshot 

36 

37 def _run_pyqtwebengine(self, html): 

38 ext = ".html" 

39 temp_file = tempfile.NamedTemporaryFile(suffix=ext, delete=False) 

40 filename = f"{temp_file.name[:-len(ext)]}.{self.format}" 

41 with temp_file: 

42 temp_file.write(html.encode("utf-8")) 

43 try: 

44 QtScreenshot = self._check_launch_reqs() # noqa 

45 s = QtScreenshot() 

46 s.capture(f"file://{temp_file.name}", filename, self.paginate) 

47 finally: 

48 # Ensure the file is deleted even if pyqtwebengine raises an exception 

49 os.unlink(temp_file.name) 

50 return s.data 

51 

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

53 """Convert from notebook node.""" 

54 self._check_launch_reqs() 

55 html, resources = super().from_notebook_node(nb, resources=resources, **kw) 

56 

57 self.log.info(f"Building {self.format.upper()}") 

58 data = self._run_pyqtwebengine(html) 

59 self.log.info(f"{self.format.upper()} successfully created") 

60 

61 # convert output extension 

62 # the writer above required it to be html 

63 resources["output_extension"] = f".{self.format}" 

64 

65 return data, resources