forked from tdwojak/Python2017
Homework part 1
This commit is contained in:
parent
8c76a05200
commit
e222ea8023
124
homeworks/main.py
Executable file
124
homeworks/main.py
Executable file
@ -0,0 +1,124 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import logging
|
||||||
|
import git
|
||||||
|
import os
|
||||||
|
import importlib
|
||||||
|
import collections
|
||||||
|
import csv
|
||||||
|
|
||||||
|
logger = logging.getLogger('Homeworks')
|
||||||
|
logger.setLevel(logging.DEBUG)
|
||||||
|
fm = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
ch = logging.StreamHandler()
|
||||||
|
ch.setFormatter(fm)
|
||||||
|
logger.addHandler(ch)
|
||||||
|
|
||||||
|
|
||||||
|
def arg_parse():
|
||||||
|
parser = argparse.ArgumentParser(description='Framework for checking homeworks.')
|
||||||
|
parser.add_argument('-i', '--ids', type=str,
|
||||||
|
help='path to a file with student ids.')
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
def get_ids(path):
|
||||||
|
ids = []
|
||||||
|
with open(path) as _file:
|
||||||
|
for line in _file:
|
||||||
|
ids.append(line.strip().split(' ')[::2])
|
||||||
|
return ids
|
||||||
|
|
||||||
|
|
||||||
|
def clone_repo(username, repo_name):
|
||||||
|
repo = "https://git.wmi.amu.edu.pl/{}/{}.git".format(username, repo_name)
|
||||||
|
dest = "./Python2017-{}".format(username)
|
||||||
|
if os.path.exists(dest):
|
||||||
|
logger.debug("{}: repo exests.".format(username))
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
git.Repo.clone_from(repo, dest)
|
||||||
|
except git.GitCommandError:
|
||||||
|
logger.info("Repository '{}' does not exist".format(repo))
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def check_tasks(username, repo_name, tasks):
|
||||||
|
logger.debug("Marking user: {}".format(username))
|
||||||
|
scores = collections.defaultdict(dict)
|
||||||
|
for lab in tasks:
|
||||||
|
path = os.path.realpath("./Python2017-{}/{}".format(username, lab))
|
||||||
|
for task, fun in tasks[lab]:
|
||||||
|
task_file = path + "/{}". format(task)
|
||||||
|
logger.debug(task_file)
|
||||||
|
package = 'Python2017-{}.{}.{}'.format(username, lab, task)
|
||||||
|
lib = importlib.import_module(package)
|
||||||
|
tested_fun = getattr(lib, fun)
|
||||||
|
tests = getattr(lib, 'tests')
|
||||||
|
try:
|
||||||
|
test_result = tests(tested_fun)
|
||||||
|
except Exception:
|
||||||
|
test_result = "FAILED"
|
||||||
|
|
||||||
|
if test_result == 'TESTS PASSED':
|
||||||
|
scores[lab][task] = 1
|
||||||
|
else:
|
||||||
|
scores[lab][task] = 0
|
||||||
|
return scores
|
||||||
|
|
||||||
|
def get_fieldnames(tasks):
|
||||||
|
fieldnames = ['ID']
|
||||||
|
for lab in tasks:
|
||||||
|
for task, _ in tasks[lab]:
|
||||||
|
fieldnames.append('{}:{}'.format(lab, task))
|
||||||
|
return fieldnames
|
||||||
|
|
||||||
|
def parse_scores(fieldnames, uname, scores):
|
||||||
|
out = {}
|
||||||
|
for name in fieldnames:
|
||||||
|
if name == 'ID':
|
||||||
|
out[name] = uname
|
||||||
|
continue
|
||||||
|
lab, task = name.split(':')
|
||||||
|
out[name] = scores[lab][task]
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def write_scores(scores, filename, tasks):
|
||||||
|
fieldnames = get_fieldnames(tasks)
|
||||||
|
|
||||||
|
with open(filename, 'w') as results:
|
||||||
|
writer = csv.DictWriter(results, fieldnames, restval=0)
|
||||||
|
writer.writeheader()
|
||||||
|
for student in scores:
|
||||||
|
writer.writerow(parse_scores(fieldnames, student, scores[student]))
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
""" main """
|
||||||
|
options = arg_parse()
|
||||||
|
ids = get_ids(options.ids)
|
||||||
|
logger.info("Liczba studentów: {}".format(len(ids)))
|
||||||
|
scores = {}
|
||||||
|
|
||||||
|
tasks = {
|
||||||
|
'labs02' : [
|
||||||
|
('task07', 'char_sum'),
|
||||||
|
('task08', 'sum_div35'),
|
||||||
|
('task09', 'leet_speak'),
|
||||||
|
('task10', 'pokemon_speak'),
|
||||||
|
('task11', 'common_chars')
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
for repo_id in ids:
|
||||||
|
st_uname = repo_id[0]
|
||||||
|
repo_name = repo_id[-1]
|
||||||
|
if clone_repo(st_uname, repo_name):
|
||||||
|
scores[st_uname] = check_tasks(st_uname, repo_name, tasks)
|
||||||
|
write_scores(scores, 'results.csv', tasks)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
24
homeworks/results.md
Normal file
24
homeworks/results.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
ID | labs02:task07 | labs02:task08 | labs02:task09 | labs02:task10 | labs02:task11
|
||||||
|
---------|-----------------|-----------------|-----------------|-----------------|---------------
|
||||||
|
s45168 | 0 | 0 | 0 | 0 | 0
|
||||||
|
s45162 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45158 | 1 | 1 | 0 | 0 | 1
|
||||||
|
szwedek | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45155 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45152 | 1 | 1 | 1 | 0 | 1
|
||||||
|
s45148 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45166 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45151 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45146 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45150 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45452 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45165 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45160 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45153 | 0 | 0 | 0 | 0 | 0
|
||||||
|
s45156 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45157 | 0 | 0 | 1 | 1 | 1
|
||||||
|
s45167 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45147 | 1 | 0 | 0 | 1 | 0
|
||||||
|
s45159 | 0 | 0 | 0 | 0 | 0
|
||||||
|
s45161 | 1 | 1 | 1 | 1 | 1
|
||||||
|
s45164 | 1 | 1 | 0 | 1 | 0
|
Loading…
Reference in New Issue
Block a user