##// END OF EJS Templates
Merge pull request #3914 from jdfreder/trans_tests...
Brian E. Granger -
r12144:05c7b0a3 merge
parent child Browse files
Show More
1 NO CONTENT: new file 100644
@@ -0,0 +1,53
1 """
2 Module with utility functions for transformer tests
3 """
4
5 #-----------------------------------------------------------------------------
6 # Copyright (c) 2013, the IPython Development Team.
7 #
8 # Distributed under the terms of the Modified BSD License.
9 #
10 # The full license is in the file COPYING.txt, distributed with this software.
11 #-----------------------------------------------------------------------------
12
13 #-----------------------------------------------------------------------------
14 # Imports
15 #-----------------------------------------------------------------------------
16
17 from IPython.nbformat import current as nbformat
18
19 from ...tests.base import TestsBase
20 from ...exporters.exporter import ResourcesDict
21
22 #-----------------------------------------------------------------------------
23 # Class
24 #-----------------------------------------------------------------------------
25
26 class TransformerTestsBase(TestsBase):
27 """Contains test functions transformer tests"""
28
29
30 def build_notebook(self):
31 """Build a notebook in memory for use with transformer tests"""
32
33 outputs = [nbformat.new_output(output_type="stream", stream="stdout", output_text="a"),
34 nbformat.new_output(output_type="text", output_text="b"),
35 nbformat.new_output(output_type="stream", stream="stdout", output_text="c"),
36 nbformat.new_output(output_type="stream", stream="stdout", output_text="d"),
37 nbformat.new_output(output_type="stream", stream="stderr", output_text="e"),
38 nbformat.new_output(output_type="stream", stream="stderr", output_text="f"),
39 nbformat.new_output(output_type="png", output_png=b'Zw==')] #g
40
41 cells=[nbformat.new_code_cell(input="$ e $", prompt_number=1,outputs=outputs),
42 nbformat.new_text_cell('markdown', source="$ e $")]
43 worksheets = [nbformat.new_worksheet(name="worksheet1", cells=cells)]
44
45 return nbformat.new_notebook(name="notebook1", worksheets=worksheets)
46
47
48 def build_resources(self):
49 """Build an empty resources dictionary."""
50
51 res = ResourcesDict()
52 res['metadata'] = ResourcesDict()
53 return res No newline at end of file
@@ -0,0 +1,38
1 """
2 Module with tests for the coalescestreams transformer
3 """
4
5 #-----------------------------------------------------------------------------
6 # Copyright (c) 2013, the IPython Development Team.
7 #
8 # Distributed under the terms of the Modified BSD License.
9 #
10 # The full license is in the file COPYING.txt, distributed with this software.
11 #-----------------------------------------------------------------------------
12
13 #-----------------------------------------------------------------------------
14 # Imports
15 #-----------------------------------------------------------------------------
16
17 from .base import TransformerTestsBase
18 from ..coalescestreams import coalesce_streams
19
20
21 #-----------------------------------------------------------------------------
22 # Class
23 #-----------------------------------------------------------------------------
24
25 class TestCoalesceStreams(TransformerTestsBase):
26 """Contains test functions for coalescestreams.py"""
27
28 def test_coalesce_streams(self):
29 """coalesce_streams transformer output test"""
30 nb = self.build_notebook()
31 res = self.build_resources()
32 nb, res = coalesce_streams(nb, res)
33 outputs = nb.worksheets[0].cells[0].outputs
34 self.assertEqual(outputs[0].text, "a")
35 self.assertEqual(outputs[1].output_type, "text")
36 self.assertEqual(outputs[2].text, "cd")
37 self.assertEqual(outputs[3].text, "ef")
38 No newline at end of file
@@ -0,0 +1,47
1 """
2 Module with tests for the csshtmlheader transformer
3 """
4
5 #-----------------------------------------------------------------------------
6 # Copyright (c) 2013, the IPython Development Team.
7 #
8 # Distributed under the terms of the Modified BSD License.
9 #
10 # The full license is in the file COPYING.txt, distributed with this software.
11 #-----------------------------------------------------------------------------
12
13 #-----------------------------------------------------------------------------
14 # Imports
15 #-----------------------------------------------------------------------------
16
17 from .base import TransformerTestsBase
18 from ..csshtmlheader import CSSHTMLHeaderTransformer
19
20
21 #-----------------------------------------------------------------------------
22 # Class
23 #-----------------------------------------------------------------------------
24
25 class TestCSSHTMLHeader(TransformerTestsBase):
26 """Contains test functions for csshtmlheader.py"""
27
28
29 def build_transformer(self):
30 """Make an instance of a transformer"""
31 transformer = CSSHTMLHeaderTransformer()
32 transformer.enabled = True
33 return transformer
34
35
36 def test_constructor(self):
37 """Can a CSSHTMLHeaderTransformer be constructed?"""
38 self.build_transformer()
39
40
41 def test_output(self):
42 """Test the output of the CSSHTMLHeaderTransformer"""
43 nb = self.build_notebook()
44 res = self.build_resources()
45 transformer = self.build_transformer()
46 nb, res = transformer(nb, res)
47 assert 'css' in res['inlining'] No newline at end of file
@@ -0,0 +1,62
1 """
2 Module with tests for the extractoutput transformer
3 """
4
5 #-----------------------------------------------------------------------------
6 # Copyright (c) 2013, the IPython Development Team.
7 #
8 # Distributed under the terms of the Modified BSD License.
9 #
10 # The full license is in the file COPYING.txt, distributed with this software.
11 #-----------------------------------------------------------------------------
12
13 #-----------------------------------------------------------------------------
14 # Imports
15 #-----------------------------------------------------------------------------
16
17 from .base import TransformerTestsBase
18 from ..extractoutput import ExtractOutputTransformer
19
20
21 #-----------------------------------------------------------------------------
22 # Class
23 #-----------------------------------------------------------------------------
24
25 class TestExtractOutput(TransformerTestsBase):
26 """Contains test functions for extractoutput.py"""
27
28
29 def build_transformer(self):
30 """Make an instance of a transformer"""
31 transformer = ExtractOutputTransformer()
32 transformer.enabled = True
33 return transformer
34
35
36 def test_constructor(self):
37 """Can a ExtractOutputTransformer be constructed?"""
38 self.build_transformer()
39
40
41 def test_output(self):
42 """Test the output of the ExtractOutputTransformer"""
43 nb = self.build_notebook()
44 res = self.build_resources()
45 transformer = self.build_transformer()
46 nb, res = transformer(nb, res)
47
48 # Check if text was extracted.
49 assert 'text_filename' in nb.worksheets[0].cells[0].outputs[1]
50 text_filename = nb.worksheets[0].cells[0].outputs[1]['text_filename']
51
52 # Check if png was extracted.
53 assert 'png_filename' in nb.worksheets[0].cells[0].outputs[6]
54 png_filename = nb.worksheets[0].cells[0].outputs[6]['png_filename']
55
56 # Verify text output
57 assert text_filename in res['outputs']
58 self.assertEqual(res['outputs'][text_filename], b'b')
59
60 # Verify png output
61 assert png_filename in res['outputs']
62 self.assertEqual(res['outputs'][png_filename], b'g')
@@ -0,0 +1,51
1 """
2 Module with tests for the latex transformer
3 """
4
5 #-----------------------------------------------------------------------------
6 # Copyright (c) 2013, the IPython Development Team.
7 #
8 # Distributed under the terms of the Modified BSD License.
9 #
10 # The full license is in the file COPYING.txt, distributed with this software.
11 #-----------------------------------------------------------------------------
12
13 #-----------------------------------------------------------------------------
14 # Imports
15 #-----------------------------------------------------------------------------
16
17 from .base import TransformerTestsBase
18 from ..latex import LatexTransformer
19
20
21 #-----------------------------------------------------------------------------
22 # Class
23 #-----------------------------------------------------------------------------
24
25 class TestLatex(TransformerTestsBase):
26 """Contains test functions for latex.py"""
27
28
29 def build_transformer(self):
30 """Make an instance of a transformer"""
31 transformer = LatexTransformer()
32 transformer.enabled = True
33 return transformer
34
35 def test_constructor(self):
36 """Can a LatexTransformer be constructed?"""
37 self.build_transformer()
38
39
40 def test_output(self):
41 """Test the output of the LatexTransformer"""
42 nb = self.build_notebook()
43 res = self.build_resources()
44 transformer = self.build_transformer()
45 nb, res = transformer(nb, res)
46
47 # Make sure the code cell wasn't modified.
48 self.assertEqual(nb.worksheets[0].cells[0].input, '$ e $')
49
50 # Verify that the markdown cell was processed.
51 self.assertEqual(nb.worksheets[0].cells[1].source, '$e$')
@@ -0,0 +1,94
1 """
2 Module with tests for the revealhelp transformer
3 """
4
5 #-----------------------------------------------------------------------------
6 # Copyright (c) 2013, the IPython Development Team.
7 #
8 # Distributed under the terms of the Modified BSD License.
9 #
10 # The full license is in the file COPYING.txt, distributed with this software.
11 #-----------------------------------------------------------------------------
12
13 #-----------------------------------------------------------------------------
14 # Imports
15 #-----------------------------------------------------------------------------
16
17 from IPython.nbformat import current as nbformat
18
19 from .base import TransformerTestsBase
20 from ..revealhelp import RevealHelpTransformer
21
22
23 #-----------------------------------------------------------------------------
24 # Class
25 #-----------------------------------------------------------------------------
26
27 class Testrevealhelp(TransformerTestsBase):
28 """Contains test functions for revealhelp.py"""
29
30 def build_notebook(self):
31 """Build a reveal slides notebook in memory for use with tests.
32 Overrides base in TransformerTestsBase"""
33
34 outputs = [nbformat.new_output(output_type="stream", stream="stdout", output_text="a")]
35
36 slide_metadata = {'slideshow' : {'slide_type': 'slide'}}
37 subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}}
38
39 cells=[nbformat.new_code_cell(input="", prompt_number=1, outputs=outputs),
40 nbformat.new_text_cell('markdown', source="", metadata=slide_metadata),
41 nbformat.new_code_cell(input="", prompt_number=2, outputs=outputs),
42 nbformat.new_text_cell('markdown', source="", metadata=slide_metadata),
43 nbformat.new_text_cell('markdown', source="", metadata=subslide_metadata)]
44 worksheets = [nbformat.new_worksheet(name="worksheet1", cells=cells)]
45
46 return nbformat.new_notebook(name="notebook1", worksheets=worksheets)
47
48
49 def build_transformer(self):
50 """Make an instance of a transformer"""
51 transformer = RevealHelpTransformer()
52 transformer.enabled = True
53 return transformer
54
55
56 def test_constructor(self):
57 """Can a RevealHelpTransformer be constructed?"""
58 self.build_transformer()
59
60
61 def test_reveal_attribute(self):
62 """Make sure the reveal url_prefix resources is set"""
63 nb = self.build_notebook()
64 res = self.build_resources()
65 transformer = self.build_transformer()
66 nb, res = transformer(nb, res)
67 assert 'reveal' in res
68 assert 'url_prefix' in res['reveal']
69
70
71 def test_reveal_output(self):
72 """Make sure that the reveal transformer """
73 nb = self.build_notebook()
74 res = self.build_resources()
75 transformer = self.build_transformer()
76 nb, res = transformer(nb, res)
77 cells = nb.worksheets[0].cells
78
79 # Make sure correct metadata tags are available on every cell.
80 for cell in cells:
81 assert 'slide_type' in cell.metadata
82 assert 'align_type' in cell.metadata
83
84 # Make sure slide end is only applied to the cells preceeding slide
85 # cells.
86 assert 'slide_helper' not in cells[1].metadata
87
88 # Verify 'slide-end'
89 assert 'slide_helper' in cells[0].metadata
90 self.assertEqual(cells[0].metadata['slide_helper'], 'slide_end')
91 assert 'slide_helper' in cells[2].metadata
92 self.assertEqual(cells[2].metadata['slide_helper'], 'slide_end')
93 assert 'slide_helper' in cells[3].metadata
94 self.assertEqual(cells[3].metadata['slide_helper'], 'subslide_end')
@@ -0,0 +1,57
1 """
2 Module with tests for the sphinx transformer
3 """
4
5 #-----------------------------------------------------------------------------
6 # Copyright (c) 2013, the IPython Development Team.
7 #
8 # Distributed under the terms of the Modified BSD License.
9 #
10 # The full license is in the file COPYING.txt, distributed with this software.
11 #-----------------------------------------------------------------------------
12
13 #-----------------------------------------------------------------------------
14 # Imports
15 #-----------------------------------------------------------------------------
16
17 from .base import TransformerTestsBase
18 from ..sphinx import SphinxTransformer
19
20
21 #-----------------------------------------------------------------------------
22 # Class
23 #-----------------------------------------------------------------------------
24
25 class TestSphinx(TransformerTestsBase):
26 """Contains test functions for sphinx.py"""
27
28
29 def build_transformer(self):
30 """Make an instance of a transformer"""
31 transformer = SphinxTransformer()
32 transformer.enabled = True
33 return transformer
34
35
36 def test_constructor(self):
37 """Can a SphinxTransformer be constructed?"""
38 self.build_transformer()
39
40
41 def test_resources(self):
42 """Make sure the SphinxTransformer adds the appropriate resources to the
43 resources dict."""
44 nb = self.build_notebook()
45 res = self.build_resources()
46 transformer = self.build_transformer()
47 nb, res = transformer(nb, res)
48 assert "author" in res['sphinx']
49 assert "version" in res['sphinx']
50 assert "release" in res['sphinx']
51 assert "date" in res['sphinx']
52 assert "chapterstyle" in res['sphinx']
53 assert "outputstyle" in res['sphinx']
54 assert "centeroutput" in res['sphinx']
55 assert "header" in res['sphinx']
56 assert "texinputs" in res['sphinx']
57 assert "pygment_definitions" in res['sphinx']
@@ -0,0 +1,90
1 """
2 Module with tests for the svg2pdf transformer
3 """
4
5 #-----------------------------------------------------------------------------
6 # Copyright (c) 2013, the IPython Development Team.
7 #
8 # Distributed under the terms of the Modified BSD License.
9 #
10 # The full license is in the file COPYING.txt, distributed with this software.
11 #-----------------------------------------------------------------------------
12
13 #-----------------------------------------------------------------------------
14 # Imports
15 #-----------------------------------------------------------------------------
16
17 from IPython.testing import decorators as dec
18 from IPython.nbformat import current as nbformat
19
20 from .base import TransformerTestsBase
21 from ..svg2pdf import SVG2PDFTransformer
22
23
24 #-----------------------------------------------------------------------------
25 # Class
26 #-----------------------------------------------------------------------------
27
28 class Testsvg2pdf(TransformerTestsBase):
29 """Contains test functions for svg2pdf.py"""
30
31 simple_svg = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
32 <!-- Created with Inkscape (http://www.inkscape.org/) -->
33 <svg
34 xmlns:svg="http://www.w3.org/2000/svg"
35 xmlns="http://www.w3.org/2000/svg"
36 version="1.0"
37 x="0.00000000"
38 y="0.00000000"
39 width="500.00000"
40 height="500.00000"
41 id="svg2">
42 <defs
43 id="defs4" />
44 <g
45 id="layer1">
46 <rect
47 width="300.00000"
48 height="300.00000"
49 x="100.00000"
50 y="100.00000"
51 style="opacity:1.0000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:8.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000"
52 id="rect5719" />
53 </g>
54 </svg>"""
55
56 def build_notebook(self):
57 """Build a reveal slides notebook in memory for use with tests.
58 Overrides base in TransformerTestsBase"""
59
60 outputs = [nbformat.new_output(output_type="svg", output_svg=self.simple_svg)]
61
62 slide_metadata = {'slideshow' : {'slide_type': 'slide'}}
63 subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}}
64
65 cells=[nbformat.new_code_cell(input="", prompt_number=1, outputs=outputs)]
66 worksheets = [nbformat.new_worksheet(name="worksheet1", cells=cells)]
67
68 return nbformat.new_notebook(name="notebook1", worksheets=worksheets)
69
70
71 def build_transformer(self):
72 """Make an instance of a transformer"""
73 transformer = SVG2PDFTransformer()
74 transformer.enabled = True
75 return transformer
76
77
78 def test_constructor(self):
79 """Can a SVG2PDFTransformer be constructed?"""
80 self.build_transformer()
81
82
83 @dec.onlyif_cmds_exist('inkscape')
84 def test_output(self):
85 """Test the output of the SVG2PDFTransformer"""
86 nb = self.build_notebook()
87 res = self.build_resources()
88 transformer = self.build_transformer()
89 nb, res = transformer(nb, res)
90 assert 'svg' in nb.worksheets[0].cells[0].outputs[0]
@@ -1,112 +1,108
1 1 """
2 2 Module with tests for exporter.py
3 3 """
4 4
5 5 #-----------------------------------------------------------------------------
6 6 # Copyright (c) 2013, the IPython Development Team.
7 7 #
8 8 # Distributed under the terms of the Modified BSD License.
9 9 #
10 10 # The full license is in the file COPYING.txt, distributed with this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 from IPython.config import Config
18 18
19 19 from .base import ExportersTestsBase
20 20 from .cheese import CheeseTransformer
21 21 from ..exporter import Exporter
22 22
23 23
24 24 #-----------------------------------------------------------------------------
25 25 # Class
26 26 #-----------------------------------------------------------------------------
27 27
28 28 class TestExporter(ExportersTestsBase):
29 29 """Contains test functions for exporter.py"""
30 30
31 31
32 32 def test_constructor(self):
33 33 """
34 34 Can an Exporter be constructed?
35 35 """
36 36 Exporter()
37 37
38 38
39 39 def test_export(self):
40 40 """
41 41 Can an Exporter export something?
42 42 """
43 43 exporter = self._make_exporter()
44 44 (output, resources) = exporter.from_filename(self._get_notebook())
45 45 assert len(output) > 0
46 46
47 47
48 48 def test_extract_outputs(self):
49 49 """
50 50 If the ExtractOutputTransformer is enabled, are outputs extracted?
51 51 """
52 52 config = Config({'ExtractOutputTransformer': {'enabled': True}})
53 53 exporter = self._make_exporter(config=config)
54 54 (output, resources) = exporter.from_filename(self._get_notebook())
55 55 assert resources is not None
56 assert 'outputs' in resources
56 assert isinstance(resources['outputs'], dict)
57 57 assert len(resources['outputs']) > 0
58 58
59 59
60 60 def test_transformer_class(self):
61 61 """
62 62 Can a transformer be added to the transformers list by class type?
63 63 """
64 64 config = Config({'Exporter': {'transformers': [CheeseTransformer]}})
65 65 exporter = self._make_exporter(config=config)
66 66 (output, resources) = exporter.from_filename(self._get_notebook())
67 67 assert resources is not None
68 assert 'cheese' in resources
69 68 assert resources['cheese'] == 'real'
70 69
71 70
72 71 def test_transformer_instance(self):
73 72 """
74 73 Can a transformer be added to the transformers list by instance?
75 74 """
76 75 config = Config({'Exporter': {'transformers': [CheeseTransformer()]}})
77 76 exporter = self._make_exporter(config=config)
78 77 (output, resources) = exporter.from_filename(self._get_notebook())
79 78 assert resources is not None
80 assert 'cheese' in resources
81 79 assert resources['cheese'] == 'real'
82 80
83 81
84 82 def test_transformer_dottedobjectname(self):
85 83 """
86 84 Can a transformer be added to the transformers list by dotted object name?
87 85 """
88 86 config = Config({'Exporter': {'transformers': ['IPython.nbconvert.exporters.tests.cheese.CheeseTransformer']}})
89 87 exporter = self._make_exporter(config=config)
90 88 (output, resources) = exporter.from_filename(self._get_notebook())
91 89 assert resources is not None
92 assert 'cheese' in resources
93 90 assert resources['cheese'] == 'real'
94 91
95 92
96 93 def test_transformer_via_method(self):
97 94 """
98 95 Can a transformer be added via the Exporter convenience method?
99 96 """
100 97 exporter = self._make_exporter()
101 98 exporter.register_transformer(CheeseTransformer, enabled=True)
102 99 (output, resources) = exporter.from_filename(self._get_notebook())
103 100 assert resources is not None
104 assert 'cheese' in resources
105 101 assert resources['cheese'] == 'real'
106 102
107 103
108 104 def _make_exporter(self, config=None):
109 105 #Create the exporter instance, make sure to set a template name since
110 106 #the base Exporter doesn't have a template associated with it.
111 107 exporter = Exporter(config=config, template_file='python')
112 108 return exporter No newline at end of file
@@ -1,101 +1,102
1 1 """Module containing a transformer that extracts all of the outputs from the
2 2 notebook file. The extracted outputs are returned in the 'resources' dictionary.
3 3 """
4 4 #-----------------------------------------------------------------------------
5 5 # Copyright (c) 2013, the IPython Development Team.
6 6 #
7 7 # Distributed under the terms of the Modified BSD License.
8 8 #
9 9 # The full license is in the file COPYING.txt, distributed with this software.
10 10 #-----------------------------------------------------------------------------
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Imports
14 14 #-----------------------------------------------------------------------------
15 15
16 16 import base64
17 17 import sys
18 18 import os
19 19
20 20 from IPython.utils.traitlets import Unicode
21 21 from .base import Transformer
22 22 from IPython.utils import py3compat
23 23
24 24 #-----------------------------------------------------------------------------
25 25 # Classes
26 26 #-----------------------------------------------------------------------------
27 27
28 28 class ExtractOutputTransformer(Transformer):
29 29 """
30 30 Extracts all of the outputs from the notebook file. The extracted
31 31 outputs are returned in the 'resources' dictionary.
32 32 """
33 33
34 34 output_filename_template = Unicode(
35 35 "{unique_key}_{cell_index}_{index}.{extension}", config=True)
36 36
37 37
38 38 def transform_cell(self, cell, resources, cell_index):
39 39 """
40 40 Apply a transformation on each cell,
41 41
42 42 Parameters
43 43 ----------
44 44 cell : NotebookNode cell
45 45 Notebook cell being processed
46 46 resources : dictionary
47 47 Additional resources used in the conversion process. Allows
48 48 transformers to pass variables into the Jinja engine.
49 49 cell_index : int
50 50 Index of the cell being processed (see base.py)
51 51 """
52 52
53 53 #Get the unique key from the resource dict if it exists. If it does not
54 54 #exist, use 'output' as the default. Also, get files directory if it
55 55 #has been specified
56 56 unique_key = resources.get('unique_key', 'output')
57 57 output_files_dir = resources.get('output_files_dir', None)
58 58
59 59 #Make sure outputs key exists
60 if not 'outputs' in resources:
60 if not isinstance(resources['outputs'], dict):
61 61 resources['outputs'] = {}
62 62
63 63 #Loop through all of the outputs in the cell
64 64 for index, out in enumerate(cell.get('outputs', [])):
65 65
66 66 #Get the output in data formats that the template is interested in.
67 67 for out_type in self.display_data_priority:
68 68 if out.hasattr(out_type):
69 69 data = out[out_type]
70 70
71 71 #Binary files are base64-encoded, SVG is already XML
72 72 if out_type in ('png', 'jpg', 'jpeg', 'pdf'):
73
73 74 # data is b64-encoded as text (str, unicode)
74 75 # decodestring only accepts bytes
75 76 data = py3compat.cast_bytes(data)
76 77 data = base64.decodestring(data)
77 78 elif sys.platform == 'win32':
78 79 data = data.replace('\n', '\r\n').encode("UTF-8")
79 80 else:
80 81 data = data.encode("UTF-8")
81 82
82 83 #Build an output name
83 84 filename = self.output_filename_template.format(
84 85 unique_key=unique_key,
85 86 cell_index=cell_index,
86 87 index=index,
87 88 extension=out_type)
88 89
89 90 #On the cell, make the figure available via
90 91 # cell.outputs[i].svg_filename ... etc (svg in example)
91 92 # Where
92 93 # cell.outputs[i].svg contains the data
93 94 if output_files_dir is not None:
94 95 filename = os.path.join(output_files_dir, filename)
95 96 out[out_type + '_filename'] = filename
96 97
97 98 #In the resources, make the figure available via
98 99 # resources['outputs']['filename'] = data
99 100 resources['outputs'][filename] = data
100 101
101 102 return cell, resources
@@ -1,61 +1,61
1 1 """Module that pre-processes the notebook for export via Reveal.
2 2 """
3 3 #-----------------------------------------------------------------------------
4 4 # Copyright (c) 2013, the IPython Development Team.
5 5 #
6 6 # Distributed under the terms of the Modified BSD License.
7 7 #
8 8 # The full license is in the file COPYING.txt, distributed with this software.
9 9 #-----------------------------------------------------------------------------
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Imports
13 13 #-----------------------------------------------------------------------------
14 14
15 15 from .base import Transformer
16 16 from IPython.utils.traitlets import Unicode
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Classes and functions
20 20 #-----------------------------------------------------------------------------
21 21
22 22 class RevealHelpTransformer(Transformer):
23 23
24 24 url_prefix = Unicode('//cdn.jsdelivr.net/reveal.js/2.4.0',
25 25 config=True,
26 26 help="""If you want to use a local reveal.js library,
27 27 use 'url_prefix':'reveal.js' in your config object.""")
28 28
29 29 def call(self, nb, resources):
30 30 """
31 31 Called once to 'transform' contents of the notebook.
32 32
33 33 Parameters
34 34 ----------
35 35 nb : NotebookNode
36 36 Notebook being converted
37 37 resources : dictionary
38 38 Additional resources used in the conversion process. Allows
39 39 transformers to pass variables into the Jinja engine.
40 40 """
41 41
42 42 for worksheet in nb.worksheets :
43 43 for index, cell in enumerate(worksheet.cells):
44 44
45 45 #Make sure the cell has slideshow metadata.
46 46 cell.metadata.align_type = cell.get('metadata', {}).get('slideshow', {}).get('align_type', 'Left')
47 47 cell.metadata.slide_type = cell.get('metadata', {}).get('slideshow', {}).get('slide_type', '-')
48 48
49 49 #Get the slide type. If type is start of subslide or slide,
50 50 #end the last subslide/slide.
51 51 if cell.metadata.slide_type in ['slide']:
52 52 worksheet.cells[index - 1].metadata.slide_helper = 'slide_end'
53 53 if cell.metadata.slide_type in ['subslide']:
54 54 worksheet.cells[index - 1].metadata.slide_helper = 'subslide_end'
55 55
56 56
57 if 'reveal' not in resources:
57 if not isinstance(resources['reveal'], dict):
58 58 resources['reveal'] = {}
59 59 resources['reveal']['url_prefix'] = self.url_prefix
60 60
61 61 return nb, resources
@@ -1,264 +1,264
1 1 """Module that allows custom Sphinx parameters to be set on the notebook and
2 2 on the 'other' object passed into Jinja. Called prior to Jinja conversion
3 3 process.
4 4 """
5 5 #-----------------------------------------------------------------------------
6 6 # Copyright (c) 2013, the IPython Development Team.
7 7 #
8 8 # Distributed under the terms of the Modified BSD License.
9 9 #
10 10 # The full license is in the file COPYING.txt, distributed with this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 from __future__ import print_function, absolute_import
18 18
19 19 # Stdlib imports
20 20 import os.path
21 21
22 22 # Used to set the default date to today's date
23 23 from datetime import date
24 24
25 25 # Third-party imports
26 26 # Needed for Pygments latex definitions.
27 27 from pygments.formatters import LatexFormatter
28 28
29 29 # Our own imports
30 30 # Configurable traitlets
31 31 from IPython.utils.traitlets import Unicode, Bool
32 32
33 33 # Needed to override transformer
34 34 from .base import (Transformer)
35 35
36 36 from IPython.nbconvert.utils import console
37 37
38 38 #-----------------------------------------------------------------------------
39 39 # Classes and functions
40 40 #-----------------------------------------------------------------------------
41 41
42 42 class SphinxTransformer(Transformer):
43 43 """
44 44 Sphinx utility transformer.
45 45
46 46 This transformer is used to set variables needed by the latex to build
47 47 Sphinx stylized templates.
48 48 """
49 49
50 50 interactive = Bool(False, config=True, help="""
51 51 Allows you to define whether or not the Sphinx exporter will prompt
52 52 you for input during the conversion process. If this is set to false,
53 53 the author, version, release, date, and chapter_style traits should
54 54 be set.
55 55 """)
56 56
57 57 author = Unicode("Unknown Author", config=True, help="Author name")
58 58
59 59 version = Unicode("", config=True, help="""
60 60 Version number
61 61 You can leave this blank if you do not want to render a version number.
62 62 Example: "1.0.0"
63 63 """)
64 64
65 65 release = Unicode("", config=True, help="""
66 66 Release name
67 67 You can leave this blank if you do not want to render a release name.
68 68 Example: "Rough Draft"
69 69 """)
70 70
71 71 publish_date = Unicode("", config=True, help="""
72 72 Publish date
73 73 This is the date to render on the document as the publish date.
74 74 Leave this blank to default to todays date.
75 75 Example: "June 12, 1990"
76 76 """)
77 77
78 78 chapter_style = Unicode("Bjarne", config=True, help="""
79 79 Sphinx chapter style
80 80 This is the style to use for the chapter headers in the document.
81 81 You may choose one of the following:
82 82 "Bjarne" (default)
83 83 "Lenny"
84 84 "Glenn"
85 85 "Conny"
86 86 "Rejne"
87 87 "Sonny" (used for international documents)
88 88 """)
89 89
90 90 output_style = Unicode("notebook", config=True, help="""
91 91 Nbconvert Ipython
92 92 notebook input/output formatting style.
93 93 You may choose one of the following:
94 94 "simple (recommended for long code segments)"
95 95 "notebook" (default)
96 96 """)
97 97
98 98 center_output = Bool(False, config=True, help="""
99 99 Optional attempt to center all output. If this is false, no additional
100 100 formatting is applied.
101 101 """)
102 102
103 103 use_headers = Bool(True, config=True, help="""
104 104 Whether not a header should be added to the document.
105 105 """)
106 106
107 107 #Allow the user to override the title of the notebook (useful for
108 108 #fancy document titles that the file system doesn't support.)
109 109 overridetitle = Unicode("", config=True, help="")
110 110
111 111
112 112 def call(self, nb, resources):
113 113 """
114 114 Sphinx transformation to apply on each notebook.
115 115
116 116 Parameters
117 117 ----------
118 118 nb : NotebookNode
119 119 Notebook being converted
120 120 resources : dictionary
121 121 Additional resources used in the conversion process. Allows
122 122 transformers to pass variables into the Jinja engine.
123 123 """
124 124 # import sphinx here, so that sphinx is not a dependency when it's not used
125 125 import sphinx
126 126
127 127 # TODO: Add versatile method of additional notebook metadata. Include
128 128 # handling of multiple files. For now use a temporay namespace,
129 129 # '_draft' to signify that this needs to change.
130 if not "sphinx" in resources:
130 if not isinstance(resources["sphinx"], dict):
131 131 resources["sphinx"] = {}
132 132
133 133 if self.interactive:
134 134
135 135 # Prompt the user for additional meta data that doesn't exist currently
136 136 # but would be usefull for Sphinx.
137 137 resources["sphinx"]["author"] = self._prompt_author()
138 138 resources["sphinx"]["version"] = self._prompt_version()
139 139 resources["sphinx"]["release"] = self._prompt_release()
140 140 resources["sphinx"]["date"] = self._prompt_date()
141 141
142 142 # Prompt the user for the document style.
143 143 resources["sphinx"]["chapterstyle"] = self._prompt_chapter_title_style()
144 144 resources["sphinx"]["outputstyle"] = self._prompt_output_style()
145 145
146 146 # Small options
147 147 resources["sphinx"]["centeroutput"] = console.prompt_boolean("Do you want to center the output? (false)", False)
148 148 resources["sphinx"]["header"] = console.prompt_boolean("Should a Sphinx document header be used? (true)", True)
149 149 else:
150 150
151 151 # Try to use the traitlets.
152 152 resources["sphinx"]["author"] = self.author
153 153 resources["sphinx"]["version"] = self.version
154 154 resources["sphinx"]["release"] = self.release
155 155
156 156 # Use todays date if none is provided.
157 157 if self.publish_date:
158 158 resources["sphinx"]["date"] = self.publish_date
159 159 elif len(resources['metadata']['modified_date'].strip()) == 0:
160 160 resources["sphinx"]["date"] = date.today().strftime("%B %-d, %Y")
161 161 else:
162 162 resources["sphinx"]["date"] = resources['metadata']['modified_date']
163 163
164 164 # Sphinx traitlets.
165 165 resources["sphinx"]["chapterstyle"] = self.chapter_style
166 166 resources["sphinx"]["outputstyle"] = self.output_style
167 167 resources["sphinx"]["centeroutput"] = self.center_output
168 168 resources["sphinx"]["header"] = self.use_headers
169 169
170 170 # Find and pass in the path to the Sphinx dependencies.
171 171 resources["sphinx"]["texinputs"] = os.path.realpath(os.path.join(sphinx.package_dir, "texinputs"))
172 172
173 173 # Generate Pygments definitions for Latex
174 174 resources["sphinx"]["pygment_definitions"] = self._generate_pygments_latex_def()
175 175
176 176 if not (self.overridetitle == None or len(self.overridetitle.strip()) == 0):
177 177 resources['metadata']['name'] = self.overridetitle
178 178
179 179 # End
180 180 return nb, resources
181 181
182 182
183 183 def _generate_pygments_latex_def(self):
184 184 """
185 185 Generate the pygments latex definitions that allows pygments
186 186 to work in latex.
187 187 """
188 188
189 189 return LatexFormatter().get_style_defs()
190 190
191 191
192 192 def _prompt_author(self):
193 193 """
194 194 Prompt the user to input an Author name
195 195 """
196 196 return console.input("Author name: ")
197 197
198 198
199 199 def _prompt_version(self):
200 200 """
201 201 prompt the user to enter a version number
202 202 """
203 203 return console.input("Version (ie ""1.0.0""): ")
204 204
205 205
206 206 def _prompt_release(self):
207 207 """
208 208 Prompt the user to input a release name
209 209 """
210 210
211 211 return console.input("Release Name (ie ""Rough draft""): ")
212 212
213 213
214 214 def _prompt_date(self, resources):
215 215 """
216 216 Prompt the user to enter a date
217 217 """
218 218
219 219 if resources['metadata']['modified_date']:
220 220 default_date = resources['metadata']['modified_date']
221 221 else:
222 222 default_date = date.today().strftime("%B %-d, %Y")
223 223
224 224 user_date = console.input("Date (deafults to \"" + default_date + "\"): ")
225 225 if len(user_date.strip()) == 0:
226 226 user_date = default_date
227 227 return user_date
228 228
229 229
230 230 def _prompt_output_style(self):
231 231 """
232 232 Prompts the user to pick an IPython output style.
233 233 """
234 234
235 235 # Dictionary of available output styles
236 236 styles = {1: "simple",
237 237 2: "notebook"}
238 238
239 239 #Append comments to the menu when displaying it to the user.
240 240 comments = {1: "(recommended for long code segments)",
241 241 2: "(default)"}
242 242
243 243 return console.prompt_dictionary(styles, default_style=2, menu_comments=comments)
244 244
245 245
246 246 def _prompt_chapter_title_style(self):
247 247 """
248 248 Prompts the user to pick a Sphinx chapter style
249 249 """
250 250
251 251 # Dictionary of available Sphinx styles
252 252 styles = {1: "Bjarne",
253 253 2: "Lenny",
254 254 3: "Glenn",
255 255 4: "Conny",
256 256 5: "Rejne",
257 257 6: "Sonny"}
258 258
259 259 #Append comments to the menu when displaying it to the user.
260 260 comments = {1: "(default)",
261 261 6: "(for international documents)"}
262 262
263 263 return console.prompt_dictionary(styles, menu_comments=comments)
264 264
@@ -1,42 +1,42
1 1 """
2 2 Contains debug writer.
3 3 """
4 4 #-----------------------------------------------------------------------------
5 5 #Copyright (c) 2013, the IPython Development Team.
6 6 #
7 7 #Distributed under the terms of the Modified BSD License.
8 8 #
9 9 #The full license is in the file COPYING.txt, distributed with this software.
10 10 #-----------------------------------------------------------------------------
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Imports
14 14 #-----------------------------------------------------------------------------
15 15
16 16 from .base import WriterBase
17 17 from pprint import pprint
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Classes
21 21 #-----------------------------------------------------------------------------
22 22
23 23 class DebugWriter(WriterBase):
24 24 """Consumes output from nbconvert export...() methods and writes usefull
25 25 debugging information to the stdout. The information includes a list of
26 26 resources that were extracted from the notebook(s) during export."""
27 27
28 28
29 29 def write(self, output, resources, notebook_name='notebook', **kw):
30 30 """
31 31 Consume and write Jinja output.
32 32
33 33 See base for more...
34 34 """
35 35
36 if 'outputs' in resources:
36 if isinstance(resources['outputs'], dict):
37 37 print("outputs extracted from %s" % notebook_name)
38 38 print('-' * 80)
39 39 pprint(resources['outputs'], indent=2, width=70)
40 40 else:
41 41 print("no outputs extracted from %s" % notebook_name)
42 42 print('=' * 80)
General Comments 0
You need to be logged in to leave comments. Login now