autograder.util.grading
1import os 2import typing 3 4import edq.util.dirent 5import edq.util.gzip 6import edq.util.json 7 8def output_grading_result(result: typing.Dict[str, typing.Any], base_dir: str = '.', short_id: bool = False) -> str: 9 """ 10 Write out an API grading result (model.GradingResult) to a directory inside the given base directory. 11 Any existing directory will be removed (and re-created). 12 Return the path to the created directory. 13 """ 14 15 if (short_id): 16 out_dir = os.path.join(base_dir, result['info']['short-id']) 17 else: 18 long_id = result['info']['id'] 19 20 # Windows doesn't like colons in filenames. 21 if (os.name == 'nt'): 22 long_id = long_id.replace(':', '_') 23 24 out_dir = os.path.join(base_dir, long_id) 25 26 edq.util.dirent.remove(out_dir) 27 edq.util.dirent.mkdir(out_dir) 28 29 stdout_path = os.path.join(out_dir, 'stdout.txt') 30 edq.util.dirent.write_file(stdout_path, result['stdout']) 31 32 stderr_path = os.path.join(out_dir, 'stderr.txt') 33 edq.util.dirent.write_file(stderr_path, result['stderr']) 34 35 result_path = os.path.join(out_dir, 'info.json') 36 edq.util.json.dump_path(result['info'], result_path, indent = 4) 37 38 grading_input_dir = os.path.join(out_dir, 'input') 39 _output_grading_result_dir(grading_input_dir, result['input-files-gzip']) 40 41 grading_output_dir = os.path.join(out_dir, 'output') 42 _output_grading_result_dir(grading_output_dir, result['output-files-gzip']) 43 44 return out_dir 45 46def _output_grading_result_dir(out_dir: str, files: typing.Dict[str, str]) -> None: 47 """ Write a collection of gzipped (base64) files to a directory. """ 48 49 edq.util.dirent.mkdir(out_dir) 50 51 for (relpath, gzip_contents) in files.items(): 52 path = os.path.join(out_dir, *relpath.split('/')) 53 edq.util.dirent.mkdir(os.path.dirname(path)) 54 55 contents = edq.util.gzip.uncompress_base64(gzip_contents) 56 edq.util.dirent.write_file_bytes(path, contents)
def
output_grading_result( result: Dict[str, Any], base_dir: str = '.', short_id: bool = False) -> str:
9def output_grading_result(result: typing.Dict[str, typing.Any], base_dir: str = '.', short_id: bool = False) -> str: 10 """ 11 Write out an API grading result (model.GradingResult) to a directory inside the given base directory. 12 Any existing directory will be removed (and re-created). 13 Return the path to the created directory. 14 """ 15 16 if (short_id): 17 out_dir = os.path.join(base_dir, result['info']['short-id']) 18 else: 19 long_id = result['info']['id'] 20 21 # Windows doesn't like colons in filenames. 22 if (os.name == 'nt'): 23 long_id = long_id.replace(':', '_') 24 25 out_dir = os.path.join(base_dir, long_id) 26 27 edq.util.dirent.remove(out_dir) 28 edq.util.dirent.mkdir(out_dir) 29 30 stdout_path = os.path.join(out_dir, 'stdout.txt') 31 edq.util.dirent.write_file(stdout_path, result['stdout']) 32 33 stderr_path = os.path.join(out_dir, 'stderr.txt') 34 edq.util.dirent.write_file(stderr_path, result['stderr']) 35 36 result_path = os.path.join(out_dir, 'info.json') 37 edq.util.json.dump_path(result['info'], result_path, indent = 4) 38 39 grading_input_dir = os.path.join(out_dir, 'input') 40 _output_grading_result_dir(grading_input_dir, result['input-files-gzip']) 41 42 grading_output_dir = os.path.join(out_dir, 'output') 43 _output_grading_result_dir(grading_output_dir, result['output-files-gzip']) 44 45 return out_dir
Write out an API grading result (model.GradingResult) to a directory inside the given base directory. Any existing directory will be removed (and re-created). Return the path to the created directory.