summaryrefslogtreecommitdiffstats
path: root/misc_classes.py
blob: 6ac5897e7a6a101b8474a5f7a94827995423c339 (plain)
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
80
81
82
83
84
from dataclasses import dataclass
import tempfile
import zipfile
import shutil
import os

@dataclass
class ExtractZipToTempDir(tempfile.TemporaryDirectory):
    zip_file:str

    def __post_init__(self):
        super().__init__()

    def __enter__(self):
        return self.extract()

    def __exit__(self, exc, value, tb):
        self.cleanup()

    def extract(self):
        with zipfile.ZipFile(self.zip_file) as z:
            z.extractall(self.name)

        # some zipping applications make a folder inside the zip with the files in that folder.
        # try to deal with this here.
        submission_files = self.name
        if os.path.isdir(
            os.path.join(submission_files, os.listdir(submission_files)[0])
        ) and len(os.listdir(submission_files)) == 1:
            submission_files = os.path.join(submission_files, os.listdir(submission_files)[0])

        return submission_files

@dataclass
class FileDependencies:
    assessment_struct:dict
    to_:str=str(os.getcwd())

    def __enter__(self):
        self.get_deps()

    def __exit__(self, type, value, traceback):
        self.rm_deps()

    def get_deps(self):
        try:
            for file_dep in self.assessment_struct["dependencies"]["files"]:
                if os.path.isfile(file_dep):
                    shutil.copy(file_dep, os.path.join(self.to_, os.path.split(file_dep)[-1]))
                else:
                    shutil.copytree(file_dep, os.path.join(self.to_, os.path.split(file_dep)[-1]))
        except KeyError:
            pass

    def rm_deps(self):
        stuff_to_remove = []
        try:
            stuff_to_remove += [os.path.split(f)[-1] for f in self.assessment_struct["dependencies"]["files"]]
        except KeyError:
            pass
        try:
            stuff_to_remove += self.assessment_struct["produced_files"]
        except KeyError:
            pass

        for file_dep in stuff_to_remove:
            file_dep = os.path.join(self.to_, file_dep)
            # print("rm: ", file_dep)
            if os.path.exists(file_dep):
                if os.path.isfile(file_dep):
                    os.remove(file_dep)
                else:
                    shutil.rmtree(file_dep)

@dataclass
class ChangeDirectory:
    target:str
    cwd:str=str(os.getcwd())

    def __enter__(self):
        os.chdir(self.target)

    def __exit__(self, type, value, traceback):
        os.chdir(self.cwd)