def test_notebook(ipynb): with open(ipynb, encoding='utf-8') as f: nb = nbformat.reads_json(f.read()) km = KernelManager() # Do not save the history to disk, as it can yield spurious lock errors. # See https://github.com/ipython/ipython/issues/2845 km.start_kernel(extra_arguments=['--HistoryManager.hist_file=:memory:']) kc = km.client() kc.start_channels() try: kc.wait_for_ready() except AttributeError: _wait_for_ready_backport(kc) successes = 0 failures = 0 errors = 0 for i, cell in enumerate(nb.cells): if cell.cell_type != 'code' or cell.source.startswith('%timeit'): continue try: outs = run_cell(kc, cell) except Exception as e: print("failed to run cell:", repr(e)) print(cell.input) errors += 1 continue failed = False if len(outs) != len(cell.outputs): print("output length mismatch (expected {}, got {})".format( len(cell.outputs), len(outs))) failed = True if not compare_outputs(outs, cell.outputs): failed = True print("cell %d: " % i, end="") if failed: print("FAIL") failures += 1 else: print("OK") successes += 1 print("tested notebook %s" % ipynb) print(" %3i cells successfully replicated" % successes) if failures: print(" %3i cells mismatched output" % failures) if errors: print(" %3i cells failed to complete" % errors) kc.stop_channels() km.shutdown_kernel() del km if failures | errors: sys.exit(1)
def write_from_json(self, notebook_json): notebook = v4.reads_json(notebook_json) return self.write(notebook)
def test_notebook(ipynb): print('\nTesting notebook {}'.format(ipynb)) global_ignores = [] with open(ipynb) as f: nb = formatter.reads_json(f.read()) log('test_notebook: create KernelManager', level=2) km = KernelManager() # Do not save the history to disk, as it can yield spurious lock errors. # See https://github.com/ipython/ipython/issues/2845 log('test_notebook: start_kernel', level=2) km.start_kernel(extra_arguments=['--HistoryManager.hist_file=:memory:'], stderr=subprocess.DEVNULL) kc = km.client() log('test_notebook: start_channels', level=2) kc.start_channels() try: log('test_notebook: wait_for_ready', level=2) kc.wait_for_ready() log('test_notebook: wait_for_ready: done', level=2) except Exception as e: SKIP('cannot start Jupyter kernel:', repr(e)) exit(0) nerror = 0 for i, cell in enumerate(nb['cells']): if cell['cell_type'] != 'code': continue # i counts all the cells (included those without code), n # counts only the executable cells. n = cell['execution_count'] print('cell [{}] ({}): '.format(n, i)) source = cell['source'] # `%timeit`s shall count in execution count but its result # cannot be compared. if source.startswith('%timeit'): run_cell(kc, 'pass') continue if 'VCSN_SEED' in source and not is_libcpp(): SKIP('random number generation not on libc++') # Of course, we can't run the remainder as we certainly # have skipped definitions used later in the notebook. exit(0) # Adjust the paths to files used in the notebooks. source = source.replace('../../tests/demo', os.environ['abs_top_srcdir'] + '/tests/demo') # Check if there are neutralization patterns to apply. global_ignores += re.findall('^# global ignore: (.*)$', source, re.M) ignores = global_ignores + re.findall('^# ignore: (.*)$', source, re.M) log('Ignores: ', ignores) try: outs = run_cell(kc, source) except Empty: print( 'Failed to run cell [{}] ({}):'.format(n, i), ' Kernel Client is Empty; this is most likely due to a', ' timeout issue. Check with `vcsn ps` or run the notebook', ' manually, then retry.', sep='\n') print('Source was:\n', source) FAIL('failed to run cell [{}]'.format(n)) nerror += 1 continue except Exception as e: print('Failed to run cell [{}] ({}):'.format(n, i), repr(e)) print('Source was:', source, sep='\n') FAIL('failed to run cell [{}]'.format(n)) nerror += 1 continue if re.search('^# ignore cell$', source, re.M): SKIP('ignore cell request') continue check_outputs(cell.outputs, outs, ignores) print("Tested notebook {}".format(ipynb)) print(" {:3} cells successfully replicated".format(num_pass())) if num_fail(): print(" {:3} cells mismatched output".format(num_fail())) if nerror: print(" {:3} cells failed to complete".format(nerror)) if num_test() == 0: # The TAP protocol does not like empty test suite. PASS('no test') log('test_notebook: stop_channels', level=2) kc.stop_channels() log('test_notebook: shutdown_kernel', level=2) km.shutdown_kernel() del km log('test_notebook: return', level=2) return False if nfail or nerror else True
parser = optparse.OptionParser(usage=usage) (opts, args) = parser.parse_args() if len(args) != 1: print parser.get_usage() exit() pyfile = args[0] # with open(pyfile) as fpin: # text = fpin.read() if os.path.splitext(pyfile)[1] != '.ipynb': print "please input ipynb file" exit() f = codecs.open(pyfile, 'r', encoding='utf-8') text = f.read() nbook = v4.reads_json(text) nbook = v4.downgrade(nbook) # downgrade v4 to v3 pyform = v3.writes_py(nbook) filename = pyfile.replace('.ipynb', ".py") if glob.glob(filename): os.system('mv {} {}.bak'.format(filename, filename)) with open(filename, "w") as fpout: fpout.write(pyform.encode('utf-8'))