2
2
3
3
import sys
4
4
5
- from traitlets import default
5
+ from traitlets import default , Bool
6
+ from textwrap import dedent
6
7
7
8
from .baseapp import NbGrader , nbgrader_aliases , nbgrader_flags
8
- from ..converters import BaseConverter , GenerateAssignment , NbGraderException
9
+ from ..converters import BaseConverter , GenerateAssignment , NbGraderException , GenerateSourceWithTests
9
10
from traitlets .traitlets import MetaHasTraits
10
11
from typing import List , Any
11
12
from traitlets .config .loader import Config
51
52
{'BaseConverter' : {'force' : True }},
52
53
"Overwrite an assignment/submission if it already exists."
53
54
),
55
+ 'source_with_tests' : (
56
+ {'GenerateAssignmentApp' : {'source_with_tests' : True }},
57
+ "Generate intermediate notebooks that contain both the autogenerated test code and the solutions. "
58
+ "Results will be saved in the source_with_tests/ folder. "
59
+ "This is useful for instructors to debug problematic autogenerated test code."
60
+ ),
54
61
})
55
62
56
63
@@ -62,6 +69,17 @@ class GenerateAssignmentApp(NbGrader):
62
69
aliases = aliases
63
70
flags = flags
64
71
72
+ source_with_tests = Bool (
73
+ False ,
74
+ help = dedent (
75
+ """
76
+ Generate intermediate notebooks that contain both the autogenerated test code and the solutions.
77
+ Results will be saved in the source_with_tests/ folder.
78
+ This is useful for instructors to debug issues in autogenerated test code.
79
+ """
80
+ )
81
+ ).tag (config = True )
82
+
65
83
examples = """
66
84
Produce the version of the assignment that is intended to be released to
67
85
students. This performs several modifications to the original assignment:
@@ -112,7 +130,7 @@ class GenerateAssignmentApp(NbGrader):
112
130
@default ("classes" )
113
131
def _classes_default (self ) -> List [MetaHasTraits ]:
114
132
classes = super (GenerateAssignmentApp , self )._classes_default ()
115
- classes .extend ([BaseConverter , GenerateAssignment ])
133
+ classes .extend ([BaseConverter , GenerateAssignment , GenerateSourceWithTests ])
116
134
return classes
117
135
118
136
def _load_config (self , cfg : Config , ** kwargs : Any ) -> None :
@@ -141,6 +159,14 @@ def start(self) -> None:
141
159
elif len (self .extra_args ) == 1 :
142
160
self .coursedir .assignment_id = self .extra_args [0 ]
143
161
162
+
163
+ if self .source_with_tests :
164
+ converter = GenerateSourceWithTests (coursedir = self .coursedir , parent = self )
165
+ try :
166
+ converter .start ()
167
+ except NbGraderException :
168
+ sys .exit (1 )
169
+
144
170
converter = GenerateAssignment (coursedir = self .coursedir , parent = self )
145
171
try :
146
172
converter .start ()
0 commit comments