14
14
from .._utils import Formatter
15
15
16
16
17
- class AnswerWidget :
17
+ class ExerciseWidget :
18
18
"""
19
19
Any widget inheriting from this class can be (de)serialized
20
20
:py:class:`WidgetStateRegistry`. The serialization offered by ipywidgets
21
21
cannot be loaded out-of-the-box for restarted notebook since the widget IDs change
22
22
23
- :param answer_registry :
24
- the answer registry that registers the answers for this widget
23
+ :param exercise_registry :
24
+ the exercise registry that registers the answers for this widget
25
25
26
- :param answer_key :
26
+ :param exercise_key :
27
27
Identifier for the widget, must be unique for each regestired widget
28
28
29
29
Reference
@@ -34,19 +34,23 @@ class AnswerWidget:
34
34
35
35
def __init__ (
36
36
self ,
37
- answer_registry : Union [None , AnswerRegistry ],
38
- answer_key : Union [None , Hashable ],
37
+ exercise_registry : Union [None , ExerciseRegistry ],
38
+ exercise_key : Union [None , Hashable ],
39
39
):
40
- if answer_registry is not None and answer_key is None :
41
- raise ValueError ("answer registry was given but no answer key was given" )
42
- elif answer_registry is None and answer_key is not None :
43
- raise ValueError ("answer key was given but no answer registry was given" )
40
+ if exercise_registry is not None and exercise_key is None :
41
+ raise ValueError (
42
+ "exercise registry was given but no exercise key was given"
43
+ )
44
+ elif exercise_registry is None and exercise_key is not None :
45
+ raise ValueError (
46
+ "exercise key was given but no exercise registry was given"
47
+ )
44
48
# we need to use a key because self is not persistent on kernel restarts
45
- self ._answer_registry = answer_registry
46
- self ._answer_key = answer_key
49
+ self ._exercise_registry = exercise_registry
50
+ self ._exercise_key = exercise_key
47
51
48
- if self ._answer_registry is not None and answer_key is not None :
49
- self ._answer_registry .register_widget (self , self ._answer_key )
52
+ if self ._exercise_registry is not None and exercise_key is not None :
53
+ self ._exercise_registry .register_widget (self , self ._exercise_key )
50
54
51
55
@property
52
56
def answer (self ) -> dict :
@@ -77,34 +81,34 @@ def handle_load_result(self, result: Union[str, Exception]) -> None:
77
81
raise NotImplementedError ("handle_load_result has not been implemented" )
78
82
79
83
def save (self ) -> Union [str , Exception ]:
80
- if self ._answer_registry is None :
84
+ if self ._exercise_registry is None :
81
85
raise ValueError (
82
- "No answer registry given on initialization, save cannot be used"
86
+ "No exercise registry given on initialization, save cannot be used"
83
87
)
84
- if self ._answer_key is None :
88
+ if self ._exercise_key is None :
85
89
raise ValueError (
86
- "No answer key given on initialization, save cannot be used"
90
+ "No exercise key given on initialization, save cannot be used"
87
91
)
88
- return self ._answer_registry .save_answer (self ._answer_key )
92
+ return self ._exercise_registry .save_answer (self ._exercise_key )
89
93
90
94
def load (self ) -> Union [str , Exception ]:
91
- if self ._answer_registry is None :
95
+ if self ._exercise_registry is None :
92
96
raise ValueError (
93
- "No answer registry given on initialization, load cannot be used"
97
+ "No exercise registry given on initialization, load cannot be used"
94
98
)
95
- if self ._answer_key is None :
99
+ if self ._exercise_key is None :
96
100
raise ValueError (
97
- "No answer key given on initialization, save cannot be used"
101
+ "No exercise key given on initialization, save cannot be used"
98
102
)
99
- return self ._answer_registry .load_answer (self ._answer_key )
103
+ return self ._exercise_registry .load_answer (self ._exercise_key )
100
104
101
105
@property
102
- def answer_registry (self ):
103
- return self ._answer_registry
106
+ def exercise_registry (self ):
107
+ return self ._exercise_registry
104
108
105
109
@property
106
- def answer_key (self ):
107
- return self ._answer_key
110
+ def exercise_key (self ):
111
+ return self ._exercise_key
108
112
109
113
110
114
class FilenameParser :
@@ -152,7 +156,7 @@ def verify_valid_student_name(student_name: str):
152
156
)
153
157
154
158
155
- class AnswerRegistry (VBox ):
159
+ class ExerciseRegistry (VBox ):
156
160
""" """
157
161
158
162
def __init__ (self , filename_prefix : Optional [str ] = None , * args , ** kwargs ):
@@ -268,15 +272,15 @@ def registered_widgets(self):
268
272
def loaded_file_name (self ):
269
273
return self ._loaded_file_name
270
274
271
- def register_widget (self , widget : AnswerWidget , answer_key : Hashable ):
275
+ def register_widget (self , widget : ExerciseWidget , exercise_key : Hashable ):
272
276
"""
273
277
:param widget:
274
278
widget answer is save on click of save button
275
- :param answer_key :
276
- unique answer key for widget to store, so it can be reloaded persistently
279
+ :param exercise_key :
280
+ unique exercise key for widget to store, so it can be reloaded persistently
277
281
after a restart of the python kernel
278
282
"""
279
- self ._widgets [answer_key ] = widget
283
+ self ._widgets [exercise_key ] = widget
280
284
281
285
def create_new_file (self ) -> str :
282
286
FilenameParser .verify_valid_student_name (self ._student_name_text .value )
@@ -314,17 +318,17 @@ def create_new_file(self) -> str:
314
318
self ._loaded_file_name = answers_filename
315
319
return f"File { answers_filename !r} created and loaded."
316
320
317
- def load_answer (self , answer_key : Hashable ) -> str :
321
+ def load_answer (self , exercise_key : Hashable ) -> str :
318
322
"""
319
323
Only works when file has been loaded
320
324
321
- :param answer_key :
322
- unique answer key for widget to store, so it can be reloaded persistently
325
+ :param exercise_key :
326
+ unique exercise key for widget to store, so it can be reloaded persistently
323
327
after a restart of the python kernel
324
328
"""
325
- if answer_key not in self ._widgets .keys ():
329
+ if exercise_key not in self ._widgets .keys ():
326
330
raise KeyError (
327
- f"There is no widget registered with answer key { answer_key !r} ."
331
+ f"There is no widget registered with exercise key { exercise_key !r} ."
328
332
)
329
333
if self ._loaded_file_name is None :
330
334
raise ValueError ("No file has been selected in the dropdown list." )
@@ -340,14 +344,15 @@ def load_answer(self, answer_key: Hashable) -> str:
340
344
answers_filename = self ._answers_files_dropdown .value
341
345
with open (answers_filename , "r" ) as answers_file :
342
346
answers = json .load (answers_file )
343
- if answer_key not in answers .keys ():
347
+ if exercise_key not in answers .keys ():
344
348
raise KeyError (
345
- f"Your file does not contain the answer with answer key { answer_key !r} ."
349
+ "Your file does not contain the answer with exercise key "
350
+ f"{ exercise_key !r} ."
346
351
)
347
352
else :
348
- self ._widgets [answer_key ].answer = answers [answer_key ]
353
+ self ._widgets [exercise_key ].answer = answers [exercise_key ]
349
354
self ._loaded_file_name = answers_filename
350
- return f"Answer has been loaded from file { answers_filename !r} ."
355
+ return f"Exercise has been loaded from file { answers_filename !r} ."
351
356
352
357
def load_file (self ) -> str :
353
358
"""
@@ -376,26 +381,26 @@ def load_file(self) -> str:
376
381
377
382
with open (answers_filename , "r" ) as answers_file :
378
383
answers = json .load (answers_file )
379
- for answer_key , answer in answers .items ():
380
- if answer_key not in self ._widgets .keys ():
384
+ for exercise_key , answer in answers .items ():
385
+ if exercise_key not in self ._widgets .keys ():
381
386
raise ValueError (
382
- f"Your file contains an answer with key { answer_key !r} "
387
+ f"Your file contains an answer with key { exercise_key !r} "
383
388
f"with no corresponding registered widget."
384
389
)
385
390
else :
386
- self ._widgets [answer_key ].answer = answer
391
+ self ._widgets [exercise_key ].answer = answer
387
392
self ._loaded_file_name = answers_filename
388
393
389
394
# only notifiy all widgets when result was successful
390
395
for widget in self ._widgets .values ():
391
- result = f"Answer has been loaded from file { self ._loaded_file_name !r} ."
396
+ result = f"Exercise has been loaded from file { self ._loaded_file_name !r} ."
392
397
widget .handle_load_result (result )
393
398
return f"All answers loaded from file { answers_filename !r} ."
394
399
395
- def save_answer (self , answer_key : Hashable ) -> str :
396
- if not (answer_key in self ._widgets .keys ()):
400
+ def save_answer (self , exercise_key : Hashable ) -> str :
401
+ if not (exercise_key in self ._widgets .keys ()):
397
402
raise KeyError (
398
- f"There is no widget registered with answer key { answer_key !r} ."
403
+ f"There is no widget registered with exercise key { exercise_key !r} ."
399
404
)
400
405
401
406
if self ._loaded_file_name is None :
@@ -411,11 +416,11 @@ def save_answer(self, answer_key: Hashable) -> str:
411
416
else :
412
417
with open (self ._loaded_file_name , "r" ) as answers_file :
413
418
answers = json .load (answers_file )
414
- answers [answer_key ] = self ._widgets [answer_key ].answer
419
+ answers [exercise_key ] = self ._widgets [exercise_key ].answer
415
420
416
421
with open (self ._loaded_file_name , "w" ) as answers_file :
417
422
json .dump (answers , answers_file )
418
- result = f"Answer has been saved in file { self ._loaded_file_name !r} ."
423
+ result = f"Exercise has been saved in file { self ._loaded_file_name !r} ."
419
424
return result
420
425
421
426
def save_all_answers (self ) -> str :
@@ -434,15 +439,15 @@ def save_all_answers(self) -> str:
434
439
else :
435
440
with open (self ._loaded_file_name , "r" ) as answers_file :
436
441
answers = json .load (answers_file )
437
- for answer_key , widget in self ._widgets .items ():
438
- answers [answer_key ] = widget .answer
442
+ for exercise_key , widget in self ._widgets .items ():
443
+ answers [exercise_key ] = widget .answer
439
444
440
445
with open (self ._loaded_file_name , "w" ) as answers_file :
441
446
json .dump (answers , answers_file )
442
447
443
448
# only notifiy all widgets when result was successful
444
449
for widget in self ._widgets .values ():
445
- result = f"Answer has been saved in file { self ._loaded_file_name !r} ."
450
+ result = f"Exercise has been saved in file { self ._loaded_file_name !r} ."
446
451
widget .handle_save_result (result )
447
452
448
453
return f"All answers were saved in file { self ._loaded_file_name !r} ."
0 commit comments