summaryrefslogtreecommitdiffstats
path: root/Smarker/mark.py
diff options
context:
space:
mode:
Diffstat (limited to 'Smarker/mark.py')
-rw-r--r--Smarker/mark.py105
1 files changed, 105 insertions, 0 deletions
diff --git a/Smarker/mark.py b/Smarker/mark.py
new file mode 100644
index 0000000..e8070f8
--- /dev/null
+++ b/Smarker/mark.py
@@ -0,0 +1,105 @@
+from dataclasses import dataclass
+import jinja_helpers
+import configparser
+import misc_classes
+import subprocess
+import argparse
+import tempfile
+import zipfile
+import reflect
+import jinja2
+import shutil
+import yaml
+import json
+import os
+
+def main(**kwargs):
+ student_no = os.path.splitext(os.path.split(args["submission"])[-1])[0]
+
+ with misc_classes.ExtractZipToTempDir(args["submission"]) as submission_files:
+ with open(kwargs["assessment"], "r") as f:
+ assessment_struct = yaml.safe_load(f)
+
+ with misc_classes.FileDependencies(assessment_struct):
+ output = reflect.gen_reflection_report(submission_files, assessment_struct, student_no, kwargs, args["submission"])
+ output_file = kwargs["out"]
+
+ if kwargs["format"] == "yaml":
+ strout = yaml.dump(output)
+ elif kwargs["format"] == "json":
+ strout = json.dumps(output, indent = 4)
+ else:
+ fp = os.path.join(os.path.split(__file__)[0], "templates", "%s.jinja2" % kwargs["format"])
+ if kwargs["format"] in ("tex", "pdf"):
+ jinja_template = misc_classes.latex_jinja_env.get_template("tex.jinja2")
+ else:
+ with open(fp, "r") as f:
+ jinja_template = jinja2.Template(f.read())
+
+ strout = jinja_template.render(**output, **jinja_helpers._get_helpers(), **kwargs)
+
+ if output_file == "stdout":
+ print(strout)
+ # input("\n\n[tempdir: %s] Press any key to close..." % tempdir)
+ exit()
+
+ if output_file == "auto":
+ output_file = "%s_report.%s" % (student_no, kwargs["format"])
+
+ with open(output_file, "w") as f:
+ f.write(strout)
+
+ if kwargs["format"] == "pdf":
+ os.environ["TEXINPUTS"] = os.path.join(os.path.split(__file__)[0], "python-latex-highlighting") + ":"
+
+ os.rename(output_file, os.path.splitext(output_file)[0] + ".tex")
+ output_file = os.path.splitext(output_file)[0] + ".tex"
+ subprocess.run(["pdflatex", output_file])
+
+ os.remove(os.path.splitext(output_file)[0] + ".tex")
+ os.remove(os.path.splitext(output_file)[0] + ".log")
+ os.remove(os.path.splitext(output_file)[0] + ".aux")
+
+ # input("\n\n[tempdir: %s] Press any key to close..." % tempdir)
+
+if __name__ == "__main__":
+ config = configparser.ConfigParser()
+ config.read(os.path.join(os.path.split(__file__)[0], "smarker.conf"))
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "-a", "--assessment",
+ help = "Path to an assessment .yml file",
+ type = os.path.abspath,
+ required = True
+ )
+ parser.add_argument(
+ "-s", "--submission",
+ help = "Path to a zip of a student's code",
+ type = os.path.abspath,
+ required = True
+ )
+ parser.add_argument(
+ "-f", "--format",
+ help = "Output format type",
+ type = str,
+ choices = ["yaml", "json", "pdf"] + [os.path.splitext(f)[0] for f in os.listdir(os.path.join(os.path.split(__file__)[0], "templates"))],
+ default = "txt"
+ )
+ parser.add_argument(
+ "-o", "--out",
+ help = "Path to write the output to, or, by default write to stdout. 'auto' automatically generates a file name.",
+ default = "stdout",
+ )
+
+ for section in config.sections():
+ for option in config.options(section):
+ parser.add_argument(
+ "--%s_%s" % (section, option),
+ default = config.get(section, option),
+ help = "Optional argument inherited from config file. Read smarker.conf for details."
+ )
+
+ args = vars(parser.parse_args())
+ main(**args)
+ \ No newline at end of file