def test_add_remove_extra_notebooks(self, db): """Are extra notebooks added and removed?""" gb = Gradebook(db) assignment = gb.add_assignment("ps1") self._copy_file("files/test.ipynb", "source/ps1/test.ipynb") run_command('nbgrader assign ps1 --db="{}"'.format(db)) gb.db.refresh(assignment) assert len(assignment.notebooks) == 1 notebook1 = gb.find_notebook("test", "ps1") self._copy_file("files/test.ipynb", "source/ps1/test2.ipynb") run_command('nbgrader assign ps1 --db="{}" --force'.format(db)) gb.db.refresh(assignment) assert len(assignment.notebooks) == 2 gb.db.refresh(notebook1) notebook2 = gb.find_notebook("test2", "ps1") os.remove("source/ps1/test2.ipynb") run_command('nbgrader assign ps1 --db="{}" --force'.format(db)) gb.db.refresh(assignment) assert len(assignment.notebooks) == 1 gb.db.refresh(notebook1) with pytest.raises(InvalidRequestError): gb.db.refresh(notebook2)
def test_add_remove_extra_notebooks(self, db): """Are extra notebooks added and removed?""" gb = Gradebook(db) assignment = gb.add_assignment("ps1") self._copy_file("files/test.ipynb", "source/ps1/test.ipynb") run_command(["nbgrader", "assign", "ps1", "--db", db]) gb.db.refresh(assignment) assert len(assignment.notebooks) == 1 notebook1 = gb.find_notebook("test", "ps1") self._copy_file("files/test.ipynb", "source/ps1/test2.ipynb") run_command(["nbgrader", "assign", "ps1", "--db", db, "--force"]) gb.db.refresh(assignment) assert len(assignment.notebooks) == 2 gb.db.refresh(notebook1) notebook2 = gb.find_notebook("test2", "ps1") os.remove("source/ps1/test2.ipynb") run_command(["nbgrader", "assign", "ps1", "--db", db, "--force"]) gb.db.refresh(assignment) assert len(assignment.notebooks) == 1 gb.db.refresh(notebook1) with pytest.raises(InvalidRequestError): gb.db.refresh(notebook2)
def init_assignment(self, assignment_id, student_id): super(AutogradeApp, self).init_assignment(assignment_id, student_id) # try to get the student from the database, and throw an error if it # doesn't exist gb = Gradebook(self.db_url) try: gb.find_student(student_id) except MissingEntry: if self.create_student: self.log.warning("Creating student with ID '%s'", student_id) gb.add_student(student_id) else: self.fail("No student with ID '%s' exists in the database", student_id) # try to read in a timestamp from file src_path = self._format_source(assignment_id, student_id) timestamp = self._get_existing_timestamp(src_path) if timestamp: submission = gb.update_or_create_submission( assignment_id, student_id, timestamp=timestamp) self.log.info("%s submitted at %s", submission, timestamp) # if the submission is late, print out how many seconds late it is if timestamp and submission.total_seconds_late > 0: self.log.warning("%s is %s seconds late", submission, submission.total_seconds_late) else: submission = gb.update_or_create_submission(assignment_id, student_id) # copy files over from the source directory self.log.info("Overwriting files with master versions from the source directory") dest_path = self._format_dest(assignment_id, student_id) source_path = self.directory_structure.format( nbgrader_step=self.source_directory, student_id='.', assignment_id=assignment_id) source_files = utils.find_all_files(source_path, self.ignore + ["*.ipynb"]) # copy them to the build directory for filename in source_files: dest = os.path.join(dest_path, os.path.relpath(filename, source_path)) ensure_dir_exists(os.path.dirname(dest)) if not os.path.normpath(dest) == os.path.normpath(filename): self.log.info("Linking %s -> %s", filename, dest) link_or_copy(filename, dest) # ignore notebooks that aren't in the database notebooks = [] for notebook in self.notebooks: notebook_id = os.path.splitext(os.path.basename(notebook))[0] try: gb.find_notebook(notebook_id, assignment_id) except MissingEntry: self.log.warning("Skipping unknown notebook: %s", notebook) continue else: notebooks.append(notebook) self.notebooks = notebooks
def test_find_nonexistant_notebook(gradebook: Gradebook) -> None: # check that it doesn't find it when there is nothing in the db with pytest.raises(MissingEntry): gradebook.find_notebook('p1', 'foo') # check that it doesn't find it even if the assignment exists gradebook.add_assignment('foo') with pytest.raises(MissingEntry): gradebook.find_notebook('p1', 'foo')
def test_save_cells(self, db): """Ensure cells are saved into the database""" self._copy_file("files/test.ipynb", "source/ps1/test.ipynb") gb = Gradebook(db) gb.add_assignment("ps1") run_command('nbgrader assign ps1 --db="{}"'.format(db)) notebook = gb.find_notebook("test", "ps1") assert len(notebook.grade_cells) == 8
def test_save_cells(self, db): """Ensure cells are saved into the database""" self._copy_file("files/test.ipynb", "source/ps1/test.ipynb") gb = Gradebook(db) gb.add_assignment("ps1") run_command(["nbgrader", "assign", "ps1", "--db", db]) notebook = gb.find_notebook("test", "ps1") assert len(notebook.grade_cells) == 6
def test_save_cells(self): """Ensure cells are saved into the database""" with self._temp_cwd(["files/test.ipynb"]): os.makedirs('source/ps1') shutil.move("test.ipynb", "source/ps1/test.ipynb") dbpath = self._init_db() gb = Gradebook(dbpath) gb.add_assignment("ps1") self._run_command('nbgrader assign ps1 --db="{}"'.format(dbpath)) notebook = gb.find_notebook("test", "ps1") assert_equal(len(notebook.grade_cells), 8)
def init_assignment(self, assignment_id, student_id): super(AutogradeApp, self).init_assignment(assignment_id, student_id) # try to get the student from the database, and throw an error if it # doesn't exist gb = Gradebook(self.db_url) try: gb.find_student(student_id) except MissingEntry: if self.create_student: self.log.warning("Creating student with ID '%s'", student_id) gb.add_student(student_id) else: self.fail("No student with ID '%s' exists in the database", student_id) # try to read in a timestamp from file src_path = self._format_source(assignment_id, student_id) timestamp = self._get_existing_timestamp(src_path) if timestamp: submission = gb.update_or_create_submission(assignment_id, student_id, timestamp=timestamp) self.log.info("%s submitted at %s", submission, timestamp) # if the submission is late, print out how many seconds late it is if timestamp and submission.total_seconds_late > 0: self.log.warning("%s is %s seconds late", submission, submission.total_seconds_late) else: submission = gb.update_or_create_submission( assignment_id, student_id) # copy files over from the source directory self.log.info( "Overwriting files with master versions from the source directory") dest_path = self._format_dest(assignment_id, student_id) source_path = self.directory_structure.format( nbgrader_step=self.source_directory, student_id='.', assignment_id=assignment_id) source_files = utils.find_all_files(source_path, self.ignore + ["*.ipynb"]) # copy them to the build directory for filename in source_files: dest = os.path.join(dest_path, os.path.relpath(filename, source_path)) ensure_dir_exists(os.path.dirname(dest)) if not os.path.normpath(dest) == os.path.normpath(filename): self.log.info("Linking %s -> %s", filename, dest) link_or_copy(filename, dest) # ignore notebooks that aren't in the database notebooks = [] for notebook in self.notebooks: notebook_id = os.path.splitext(os.path.basename(notebook))[0] try: gb.find_notebook(notebook_id, assignment_id) except MissingEntry: self.log.warning("Skipping unknown notebook: %s", notebook) continue else: notebooks.append(notebook) self.notebooks = notebooks