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.