• Fixed total score printout for the use of the points_possible configuration


  • Added NotebookMetadataTestFile for reading tests from Jupyter Notebook metadata

  • Added optional storage of tests in notebook metadata for Otter Assign (default-off until v3)

  • Removed deprecated tool Otter Service

  • Added printout of total score to autograder output


  • Added show_all_public configuration for grading


  • Added metadata for each test case to Otter Assign format

  • Added success and failure messages for test cases

  • Added Gmail notifications plugin

  • Added timestamps to otter.Notebook.export filenames


  • Changed grouping of results to be per-question rather than per-test case


  • Fixed bug in total score calculation when the grade override plugin is used


  • Swapped IPython.core.inputsplitter.IPythonInputSplitter for IPython.core.inputtransformer2.TransformerManager in otter.execute.execute_notebook


  • Fixed try/except statements in tests per #228

  • Added error handling in GoogleSheetsGradeOverride plugin for when the Google API hits a rate-limit error


  • Added custom environment.yml files in autograder per #103

  • Set display.max_rows to None for pandas to print all rows in summary per #224


  • Added otter.utils.nullcontext to be compatible with Python<3.7


  • Added the notebook_export plugin event

  • Fixed plugin bug resulting from running tests in Otter Assign

  • Added creation of plugin collection resulting from Otter Generate for running tests in Otter Assign


  • Added otter.Notebook.export format support for Otter Grade

  • Fixed tutorial in documentation

  • Added force_save argument to otter.Notebook.export to make notebook force-save optional


  • Fixed UnboundLocalError with log in


  • Added nb_conda_kernels to template environment.yml

  • Fixed duplicate token calls when using Otter Assign to call Otter Generate

  • Updated grading image to Miniconda 4.9.2 with Python 3.8

  • Changed Otter conda environment name to otter-env

  • Added warnings import to otter.check.notebook


  • Passed plugin collection while running tests in Otter Assign

  • Fixed adding directories in files with Otter Generate


  • Changed scripts to entry_points in for Windows compatibility and removed bin/otter

  • Added otter.check.utils.save_notebook for autosaving notebooks on export calls

  • Updated OK format to allow points key to be a list of length equal to the number of test cases


  • Fixed requirements not found error for R notebooks in Otter Assign

  • Removed use of re in overriding Notebook test directory override in otter.execute.execute_notebook by adding otter.Notebook._test_dir_override


  • Fixed NoneType issue in PluginCollection.generate_report


  • Added ignoreable lines in Otter Assign

  • Added error handling for log deserialization per #190

  • Added plugin data storage per #191


  • Fixed positional arg count in otter.plugins.builtin.GoogleSheetsGradeOverride

  • Fixed working directory in otter.plugins.builtin.GoogleSheetsGradeOverride during Otter Assign



  • Added the each key to points in question metadata for Otter Assign


  • Changed granularity of results to be test case-by-test case rather than by file

  • Added ability to list requirements directly in assignment metadata w/out requirements.txt file

  • Unified assignment grading workflow and converted local grading to container-per-submission

  • Exposed grading internals for non-containerized grading via otter run and otter.api

  • Added plugins for altering grades and execution, incl. built-in plugins

  • Added ignorable cells to Otter Assign

  • Added autograder_files configuration for Otter Assign

  • Added passdown of assignment configurations to Otter Generate from Otter Assign

  • Fixed whitespace bug in Assign solution parsing

  • Resolved conflicts with nbconvert>=6.0.0, removed version pin

  • Added otter.assign.utils.patch_copytree as a patch for shutil.copytee on WSL

  • Refactored Otter Generate to use zipfile to generate zips

  • Refactored CLI to allow creation of programmatic API

  • Changed otter generate autograder to otter generate

  • Removed otter generate token as all interaction with otter.generate.token.APIClient can be handled elsewhere

  • Added intercell seeding for R Jupyter Notebooks

  • Added ValueError on unexpected config in otter.assign.assignment.Assignment

  • Added --username, --password flags to Otter Assign and Otter Generate

  • Added support for Python files

  • Removed FutureWarning for deprecated global hidden key of OK tests

  • Add missing file specifier in environment template


  • Fixed ZeroDivisionError when an assignment has 0 points total


  • Fixed error in parsing requirements when using Otter Grade


  • Fixed KeyError when kernelspec unparsable from notebook in Otter Assign


  • Changed Rmd code prompt to NULL # YOUR CODE HERE for assignment statements and # YOUR CODE HERE for whole-line and block removal


  • Made requirements specification always throw an error if a user-specified path is not found

  • Pinned nbconvert<6.0.0 as a temporary measure due to new templating issues in that release


  • Fixed handling variable name collisions with already-tested test files

  • Added --no-pdfs flag to Otter Assign


  • Moved Gradescope grading to inside conda env within container due to change in Gradescope’s grading image

  • Added ability to specify additional tests to be run in cell metadata without need of explicit Notebook.check cells


  • Fixed bug with specification of overwriting requirements in Otter Generate


  • Changed structure of CLI into six main commands: otter assign, otter check, otter export, otter generate, otter grade, and otter service

  • Added R autograding integrations with autograding package ottr

  • Added Otter Assign, a forked version of jassign that works with Otter

  • Added Otter Export, a forked version of nb2pdf and gsExport for generating PDFs of notebooks

  • Added Otter Service, a deployable grading service that students can POST their submissions to

  • Added logging to otter.Notebook and Otter Check, incl. environment serialization for grading

  • Changed filenames inside the package so that names match commands (e.g. otter/ is now otter/

  • Added intercell seeding

  • Moved all argparse calls into otter.argparser and the logic for routing Otter commands to

  • Made several fixes to otter check, incl. ability to grade notebooks with it

  • otter generate and otter grade now remove tmp directories on failure

  • Fixed otter.ok_parser.CheckCallWrapper finding and patching instances of otter.Notebook

  • Changed behavior of hidden test cases to use individual case "hidden" key instead of global "hidden" key

  • Made use of metadata files in otter grade optional

  • Added otter_ignore cell tag to flag a cell to be ignored during notebook execution


  • added import of IPython.display.display to otter/

  • patched Gradescope metadata parser for group submissions


  • fix relative import issue on Gradescope (again, sigh)

v0.4.6: re-release of v0.4.5


  • added missing patch of otter.Notebook.export in otter/

  • added __version__ global in otter/

  • fixed relative import issue when running on Gradescope

  • fixed not finding/rerunning tests on Gradescope with otter.Notebook.check


  • fixed template escape bug in otter/


  • fixed dead link in docs/

  • updated to Python 3.7 in for Gradescope

  • made otter and otter gen CLIs find ./requirements.txt automatically if it exists

  • fix bug where GS generator fails if no -r flag specified