def add_footer_to_template(coursedir, path, footer_source): presetmodel = PresetModel(coursedir) nb = nbformat.read(path, as_version=nbformat.NO_CONVERT) footer_cells = presetmodel.get_template_preset("Footer") footer_cells[0].source = footer_source nb.cells.extend(footer_cells) nbformat.write(nb, path) return path
def add_template_with_header(coursedir, name, header_source): templatemodel = TemplateModel(coursedir) presetmodel = PresetModel(coursedir) res = templatemodel.new(name=name) nb = nbformat.read(res["path"], as_version=nbformat.NO_CONVERT) header_cells = presetmodel.get_template_preset("Header") header_cells[0].source = header_source nb.cells = header_cells nbformat.write(nb, res["path"]) return res["path"]
def add_question_to_task(coursedir, path, question_type, grade_id=None, points=0): presetmodel = PresetModel(coursedir) nb = nbformat.read(path, as_version=nbformat.NO_CONVERT) cells = presetmodel.get_question_preset(question_type) if grade_id is not None: for cell in cells: cell.metadata.nbgrader.grade_id = cell.metadata.nbgrader.grade_id.replace( "task", grade_id) if is_grade(cell): cell.metadata.nbgrader.points = points nb.cells.extend(cells) nbformat.write(nb, path) return path
class TestExtraCells(unittest.TestCase): def setUp(self): tmp_dir, coursedir = create_temp_course() self.tmp_dir = tmp_dir self.model = PresetModel(coursedir) self.multiplechoice = "Multiple Choice" def test_extra_cell(self): assert not is_extra_cell(nbformat.v4.new_code_cell()) cells = self.model.get_question_preset(self.multiplechoice) assert is_extra_cell(cells[0]) def test_multiplechoice_cell(self): cells = self.model.get_question_preset(self.multiplechoice) assert is_multiplechoice(cells[0]) def test_singlechoice_cell(self): cells = self.model.get_question_preset("Single Choice") assert is_singlechoice(cells[0]) def test_get_choices(self): cells = self.model.get_question_preset(self.multiplechoice) assert len(get_choices(cells[0])) == 0 cells[0].metadata.extended_cell.choice = [1, 2, 3] assert len(get_choices(cells[0])) == 3 assert all([i in get_choices(cells[0]) for i in [1, 2, 3]]) def test_get_num_of_choices(self): cells = self.model.get_question_preset("Single Choice") assert get_num_of_choices(cells[0]) is None cells = self.model.get_question_preset(self.multiplechoice) assert get_num_of_choices(cells[0]) == 3 def test_clear_choices(self): cells = self.model.get_question_preset(self.multiplechoice) cells[0].metadata.extended_cell.choice = [1, 2, 3] clear_choices(cells[0]) assert len(get_choices(cells[0])) == 0 def test_has_solution(self): cells = self.model.get_question_preset(self.multiplechoice) assert not has_solution(cells[0]) def tearDown(self): self.tmp_dir.cleanup()
def setUp(self): tmp_dir, coursedir = create_temp_course() self.nb = new_notebook() self.nb.cells = PresetModel(coursedir).get_question_preset("Single Choice") tmp_dir.cleanup()
def test_is_description_cell(self): model = PresetModel(self.coursedir) freetext = model.get_question_preset("Freetext") assert is_description(freetext[0]) assert not is_description(freetext[1])
def setUp(self): tmp_dir, coursedir = create_temp_course() self.tmp_dir = tmp_dir self.model = PresetModel(coursedir) self.multiplechoice = "Multiple Choice"
class TestPresetModel(unittest.TestCase): def setUp(self): tmp_dir, coursedir = create_temp_course() self.tmp_dir = tmp_dir self.model = PresetModel(coursedir) def test_list_question_presets(self): presets = [ "Code (Autograded)", "Code (Manual)", "Freetext", "Multiple Choice", "Single Choice", ] questions = self.model.list_question_presets() for preset in presets: assert preset in questions, f"Preset {preset} not found" def test_get_question_preset(self): question_presets = self.model.list_question_presets() for preset in question_presets: question_cells = self.model.get_question_preset(preset) assert all( [ isinstance(cell, nbformat.notebooknode.NotebookNode) for cell in question_cells ] ) def test_list_template_presets(self): presets = ["Header", "Footer", "Group Info", "Student Info"] template_presets = self.model.list_template_presets() for preset in presets: assert preset in template_presets, f"Preset {preset} not found" def test_get_template_preset(self): template_presets = self.model.list_template_presets() for preset in template_presets: template_cells = self.model.get_template_preset(preset) assert all( [ isinstance(cell, nbformat.notebooknode.NotebookNode) for cell in template_cells ] ) def test_get_invalid_preset(self): assert self.model.get_question_preset("Invalid Name") is None assert self.model.get_template_preset("Invalid Name") is None def test_custom_template_preset_path(self): nbformat.write( nbformat.v4.new_notebook(), pjoin(self.tmp_dir.name, "MyPreset.ipynb") ) self.model.template_preset_path = self.tmp_dir.name assert len(self.model.list_template_presets()) == 1 assert "MyPreset" in self.model.list_template_presets() def test_custom_task_preset_path(self): nbformat.write( nbformat.v4.new_notebook(), pjoin(self.tmp_dir.name, "MyPreset.ipynb") ) self.model.task_preset_path = self.tmp_dir.name assert len(self.model.list_question_presets()) == 1 assert "MyPreset" in self.model.list_question_presets() def tearDown(self): self.tmp_dir.cleanup()
def setUp(self): tmp_dir, coursedir = create_temp_course() self.tmp_dir = tmp_dir self.model = PresetModel(coursedir)