-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_shim.py
79 lines (64 loc) · 2.44 KB
/
test_shim.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# -*- coding: UTF-8 -*-
"""Run tests on a specific repo.
This file is called by marking_puller.py
Its job is to be set up and torn down for every student so that there is no
namespace pollution. Its run as a subprocess. The args are where the tests are,
and where the repo is. In almost all cases the tests are the teacher tests, and
the repo changes for each student.
"""
import importlib.util
import json
import os
import sys
from time import sleep
def do_the_test(repo_path: str) -> dict[str, str | int]:
"""Run tests on a student's repo."""
try:
spec = importlib.util.spec_from_file_location("tests", TEST_PATH)
if spec is None or spec.loader is None:
raise ImportError("The specified module could not be found.")
test = importlib.util.module_from_spec(spec)
spec.loader.exec_module(test)
print("about to test", repo_path)
r = test.theTests(repo_path)
r["localError"] = ":)"
return r
except Exception as e:
return {
"of_total": 0,
"mark": 0,
"localError": str(e).replace(",", "~"), # the comma messes with the csv
}
def get_results(repo_path: str) -> dict[str, str | int]:
"""Save the results to a temporary json file."""
these_results = do_the_test(repo_path)
these_results["repo_owner"] = OWNER
print("\nresults:", json.dumps(these_results, indent=2), "\n")
return these_results
# __name__ == "__main__": <= this is going to be true always because of the way,
# that this file is loaded, but if it's being loaded in debug, i.e. from this
# file, then argv will be missing the extra info
if len(sys.argv) == 1:
# 0:'C:\\Users\\ben\\Anaconda3\\python.exe'
OWNER = "Chaldea8820"
TEST_PATH = os.path.normpath(os.path.abspath("../course/set3/tests.py"))
REPO_PATH = os.path.normpath(os.path.abspath(f"../StudentRepos/{OWNER}"))
else:
TEST_PATH = os.path.normpath(sys.argv[1])
REPO_PATH = os.path.normpath(sys.argv[2])
OWNER = sys.argv[3]
print("\n In the shim\n◹◸◹◸◹◸◹◸◹◸◹◸\n\nsys.argv:")
for i, a in list(enumerate(sys.argv)):
print(f"{i}: {a}")
print(
f"""
TEST_PATH: {TEST_PATH}
REPO_PATH: {os.path.normpath(os.path.abspath(REPO_PATH))}
OWNER: {OWNER}
"""
)
path = os.path.join("temp", "temp_results.json")
results = get_results(REPO_PATH)
with open(path, "w", encoding="utf-8") as temp_results:
json.dump(results, temp_results, indent=2)
sleep(2)