base.py
109 lines
| 3.7 KiB
| text/x-python
|
PythonLexer
Matthias BUSSONNIER
|
r9302 | """ | ||
MinRK
|
r11046 | Module that re-groups transformer that would be applied to ipynb files | ||
Matthias BUSSONNIER
|
r9528 | before going through the templating machinery. | ||
Matthias BUSSONNIER
|
r9302 | |||
Jonathan Frederic
|
r10674 | It exposes a convenient class to inherit from to access configurability. | ||
Matthias BUSSONNIER
|
r9302 | """ | ||
Jonathan Frederic
|
r10674 | #----------------------------------------------------------------------------- | ||
# Copyright (c) 2013, the IPython Development Team. | ||||
# | ||||
# Distributed under the terms of the Modified BSD License. | ||||
# | ||||
# The full license is in the file COPYING.txt, distributed with this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
Matthias BUSSONNIER
|
r9302 | |||
Matthias BUSSONNIER
|
r10859 | from ..utils.config import GlobalConfigurable | ||
Jonathan Frederic
|
r11388 | from IPython.utils.traitlets import Bool | ||
Matthias BUSSONNIER
|
r9307 | |||
Jonathan Frederic
|
r10674 | #----------------------------------------------------------------------------- | ||
# Classes and Functions | ||||
#----------------------------------------------------------------------------- | ||||
Matthias BUSSONNIER
|
r10859 | class ConfigurableTransformer(GlobalConfigurable): | ||
Matthias BUSSONNIER
|
r9528 | """ A configurable transformer | ||
Inherit from this class if you wish to have configurability for your | ||||
transformer. | ||||
Any configurable traitlets this class exposed will be configurable in profiles | ||||
using c.SubClassName.atribute=value | ||||
Jonathan Frederic
|
r11367 | you can overwrite transform_cell to apply a transformation independently on each cell | ||
MinRK
|
r11046 | or __call__ if you prefer your own logic. See corresponding docstring for informations. | ||
Jonathan Frederic
|
r11388 | |||
Disabled by default and can be enabled via the config by | ||||
'c.YourTransformerName.enabled = True' | ||||
Matthias BUSSONNIER
|
r9528 | """ | ||
Jonathan Frederic
|
r10772 | |||
Jonathan Frederic
|
r11382 | enabled = Bool(False, config=True) | ||
def __init__(self, **kw): | ||||
Jonathan Frederic
|
r10674 | """ | ||
Public constructor | ||||
Parameters | ||||
---------- | ||||
config : Config | ||||
Configuration file structure | ||||
**kw : misc | ||||
Additional arguments | ||||
""" | ||||
Jonathan Frederic
|
r11382 | super(ConfigurableTransformer, self).__init__(**kw) | ||
Matthias BUSSONNIER
|
r9307 | |||
Jonathan Frederic
|
r10772 | |||
Jonathan Frederic
|
r10674 | def __call__(self, nb, resources): | ||
Jonathan Frederic
|
r11388 | if self.enabled: | ||
return self.call(nb,resources) | ||||
else: | ||||
return nb, resources | ||||
Matthias BUSSONNIER
|
r10834 | |||
def call(self, nb, resources): | ||||
Jonathan Frederic
|
r10674 | """ | ||
Transformation to apply on each notebook. | ||||
You should return modified nb, resources. | ||||
If you wish to apply your transform on each cell, you might want to | ||||
Jonathan Frederic
|
r11367 | overwrite transform_cell method instead. | ||
Jonathan Frederic
|
r10674 | |||
Parameters | ||||
---------- | ||||
nb : NotebookNode | ||||
Notebook being converted | ||||
resources : dictionary | ||||
Additional resources used in the conversion process. Allows | ||||
transformers to pass variables into the Jinja engine. | ||||
Matthias BUSSONNIER
|
r9528 | """ | ||
Matthias BUSSONNIER
|
r9307 | try : | ||
for worksheet in nb.worksheets : | ||||
for index, cell in enumerate(worksheet.cells): | ||||
Jonathan Frederic
|
r11367 | worksheet.cells[index], resources = self.transform_cell(cell, resources, index) | ||
Jonathan Frederic
|
r10674 | return nb, resources | ||
Matthias BUSSONNIER
|
r9491 | except NotImplementedError: | ||
Matthias BUSSONNIER
|
r9307 | raise NotImplementedError('should be implemented by subclass') | ||
Matthias BUSSONNIER
|
r9528 | |||
Jonathan Frederic
|
r11367 | def transform_cell(self, cell, resources, index): | ||
Jonathan Frederic
|
r10674 | """ | ||
Overwrite if you want to apply a transformation on each cell. You | ||||
should return modified cell and resource dictionary. | ||||
Parameters | ||||
---------- | ||||
cell : NotebookNode cell | ||||
Notebook cell being processed | ||||
resources : dictionary | ||||
Additional resources used in the conversion process. Allows | ||||
transformers to pass variables into the Jinja engine. | ||||
index : int | ||||
Index of the cell being processed | ||||
Matthias BUSSONNIER
|
r9307 | """ | ||
Jonathan Frederic
|
r10485 | |||
Matthias BUSSONNIER
|
r9307 | raise NotImplementedError('should be implemented by subclass') | ||
Jonathan Frederic
|
r10674 | return cell, resources | ||
Matthias BUSSONNIER
|
r10834 | |||