test_execute.py
88 lines
| 3.1 KiB
| text/x-python
|
PythonLexer
Julia Evans
|
r17074 | """ | ||
Julia Evans
|
r17075 | Module with tests for the execute preprocessor. | ||
Julia Evans
|
r17074 | """ | ||
# Copyright (c) IPython Development Team. | ||||
# Distributed under the terms of the Modified BSD License. | ||||
import copy | ||||
MinRK
|
r17101 | import glob | ||
Julia Evans
|
r17082 | import os | ||
import re | ||||
Julia Evans
|
r17074 | |||
from IPython.nbformat import current as nbformat | ||||
from .base import PreprocessorTestsBase | ||||
from ..execute import ExecutePreprocessor | ||||
MinRK
|
r17091 | from IPython.nbconvert.filters import strip_ansi | ||
addr_pat = re.compile(r'0x[0-9a-f]{7,9}') | ||||
Julia Evans
|
r17074 | |||
class TestExecute(PreprocessorTestsBase): | ||||
"""Contains test functions for execute.py""" | ||||
Julia Evans
|
r17084 | @staticmethod | ||
MinRK
|
r17092 | def normalize_output(output): | ||
Julia Evans
|
r17084 | """ | ||
MinRK
|
r17092 | Normalizes outputs for comparison. | ||
Julia Evans
|
r17084 | """ | ||
MinRK
|
r17092 | output = dict(output) | ||
if 'metadata' in output: | ||||
del output['metadata'] | ||||
MinRK
|
r18580 | if 'text/plain' in output: | ||
output['text/plain'] = re.sub(addr_pat, '<HEXADDR>', output['text/plain']) | ||||
MinRK
|
r17092 | if 'traceback' in output: | ||
MinRK
|
r17091 | tb = [] | ||
MinRK
|
r17092 | for line in output['traceback']: | ||
MinRK
|
r17091 | tb.append(strip_ansi(line)) | ||
MinRK
|
r17092 | output['traceback'] = tb | ||
MinRK
|
r17091 | |||
MinRK
|
r17092 | return output | ||
Julia Evans
|
r17082 | |||
def assert_notebooks_equal(self, expected, actual): | ||||
MinRK
|
r18580 | expected_cells = expected['cells'] | ||
actual_cells = actual['cells'] | ||||
Julia Evans
|
r17082 | assert len(expected_cells) == len(actual_cells) | ||
Julia Evans
|
r17084 | for expected_cell, actual_cell in zip(expected_cells, actual_cells): | ||
expected_outputs = expected_cell.get('outputs', []) | ||||
actual_outputs = actual_cell.get('outputs', []) | ||||
MinRK
|
r17092 | normalized_expected_outputs = list(map(self.normalize_output, expected_outputs)) | ||
normalized_actual_outputs = list(map(self.normalize_output, actual_outputs)) | ||||
Julia Evans
|
r17084 | assert normalized_expected_outputs == normalized_actual_outputs | ||
Julia Evans
|
r17082 | |||
Jessica B. Hamrick
|
r17823 | expected_prompt_number = expected_cell.get('prompt_number', None) | ||
actual_prompt_number = actual_cell.get('prompt_number', None) | ||||
assert expected_prompt_number == actual_prompt_number | ||||
Julia Evans
|
r17074 | |||
def build_preprocessor(self): | ||||
"""Make an instance of a preprocessor""" | ||||
preprocessor = ExecutePreprocessor() | ||||
preprocessor.enabled = True | ||||
return preprocessor | ||||
Julia Evans
|
r17082 | |||
Julia Evans
|
r17074 | def test_constructor(self): | ||
"""Can a ExecutePreprocessor be constructed?""" | ||||
self.build_preprocessor() | ||||
Julia Evans
|
r17082 | |||
def test_run_notebooks(self): | ||||
"""Runs a series of test notebooks and compares them to their actual output""" | ||||
current_dir = os.path.dirname(__file__) | ||||
MinRK
|
r17101 | input_files = glob.glob(os.path.join(current_dir, 'files', '*.ipynb')) | ||
Julia Evans
|
r17082 | for filename in input_files: | ||
MinRK
|
r17101 | with open(os.path.join(current_dir, 'files', filename)) as f: | ||
Julia Evans
|
r17082 | input_nb = nbformat.read(f, 'ipynb') | ||
res = self.build_resources() | ||||
preprocessor = self.build_preprocessor() | ||||
Jessica B. Hamrick
|
r17823 | cleaned_input_nb = copy.deepcopy(input_nb) | ||
MinRK
|
r18580 | for cell in cleaned_input_nb.cells: | ||
Jessica B. Hamrick
|
r17823 | if 'prompt_number' in cell: | ||
del cell['prompt_number'] | ||||
cell['outputs'] = [] | ||||
output_nb, _ = preprocessor(cleaned_input_nb, res) | ||||
MinRK
|
r17101 | self.assert_notebooks_equal(output_nb, input_nb) | ||