<jupyter_start><jupyter_text>nosebook[![Build Status][build_svg]][build_status] [![PyPI][pypi_svg]][pypi] [![BSD][license_svg]][license]a [nose](http://nose.readthedocs.org/) plugin for finding and running IPython 2/3 notebooks as nose tests.What it can't do in terms of `setup` and `tearDown`, `nosebook` makes up for in simplicity: there is no `%%nose` magic, no metadata required: the notebook on disk is the "gold master".This makes it ideal for decreasing the burden of keeping documentation up to date with tests by making a single set of notebooks into both rich, multi-format documentation and a simple part of your test suite.[build_svg]: https://travis-ci.org/bollwyvl/nosebook.svg?branch=master[build_status]: https://travis-ci.org/bollwyvl/nosebook[pypi_svg]: https://pypip.in/version/nosebook/badge.svg?style=flat[pypi]: https://pypi.python.org/pypi/nosebook[license_svg]: https://pypip.in/license/nose-watcher/badge.svg[license]: ./LICENSE  How does it work?Each notebook found according to [`nosebook-match`](nosebook-match) is started with a fresh kernel, based on the kernel specified in the notebook. If the kernel is not installed, no tests will be run and the error will be logged.Each `code` cell that matches [`nosebook-match-cell`](nosebook-match-cell) will be executed against the kernel in the order in which it appears in the notebook: other cells e.g. `markdown`, `raw`, are ignored.The number and content of outputs has to __match exactly__, with the following parts of each output stripped:- execution/prompt numbers, i.e. `[1]:`- tracebacksNon-deterministic output, such as with `_repr_` methods that include the memory location of the instance, will obviously not match every time. You can use [`nosebook-scrub`](nosebook-scrub) to rewrite or remove offending content.  Related work- [`ipython_nose`](http://github.com/taavi/ipython_nose) allows you to use a notebook as a nose runner, with traditional `test_whatever` methods. You can sort of emulate this behavior with [`nosebook-match-cell`](nosebook-match-cel)... as long as you check in passing tests!  Configuring `nosetests` to use `nosebook`These options can be specified in your [nose config file](./.noserc), or as long-form command line arguments, i.e. `--with-nosebook`.  `with-nosebook``nosetests` will look for notebooks that seem like tests, as configured with [`nosebook-match`](nosebook-match). _Default: False_<jupyter_code># Basic usage
!nosetests --with-nosebook<jupyter_output><empty_output><jupyter_text>`nosebook-match`A regular expression that tells nosebook what should be a testable notebook._Default: `.*[Tt]est.*.ipynb$`_<jupyter_code># Run against all notebooks... probably not a good idea, but maybe a great idea
!nosetests --with-nosebook --nosebook-match .*.ipynb<jupyter_output><empty_output><jupyter_text>`nosebook-match-cell`A regular expression that will be replaced throughout the expected outputs and generated outputs._Default: None_<jupyter_code># will run cells where tests are defined... but you should probably run them, too
!nosetests --with-nosebook --nosebook-match .*Simple.* --nosebook-match-cell '(def|class).*[Tt]est'<jupyter_output><empty_output><jupyter_text>`nosebook-scrub`A regular expression that will be replaced throughout the expected outputs and generated outputs._Default: None_<jupyter_code># you can't fail if you don't try
!nosetests --with-nosebook --nosebook-scrub .+<jupyter_output><empty_output><jupyter_text>For multiple scrub values, you can pass a JSON-formatted list of regular expressions or object of pattern-replacement pairs that will be replaced. When passed in via the command line, you'll have to escape special characters: using a `.noserc` config file makes this easier.<jupyter_code># there are only 10 kinds of tests...
!nosetests --with-nosebook --nosebook-scrub='["0", "1"]'
# 0 is equally good
!nosetests --with-nosebook --nosebook-scrub='{"\\d+": "0"}'<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11063291139240507, 'fraction_numerical': 0.002278481012658228, 'mean_word_length': 5.56312292358804, 'pattern_counts': {'":': 1, '<': 21, '<?xml version=': 0, '>': 21, 'https://': 5, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '442134', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 1224, 'n_tokens_neox': 1157, 'n_words': 433, 'path': 'README.ipynb', 'repo_name': 'bgruening/nosebook', 'size': '3950'}