Skip to content

Commit 507c514

Browse files
committed
update
1 parent 99810dc commit 507c514

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1413
-0
lines changed

Diff for: Applications/Pacman/Notes/1 - Vectors.md

+2
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,5 @@ That's not terribly useful, it just tells you where that object is in memory. So
106106
def __str__(self):
107107
return "<"+str(self.x)+", "+str(self.y)+">"
108108
```
109+
110+
Reference: [Website](https://pacmancode.com/)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Write your solution to exercise 1 here

Diff for: course-submission-files/hy-adv-course-in-prog-exam-15062024/Exam15062024-Exercise1/test/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from .points import points
2+
from .runner import TMCTestRunner
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from unittest import TestProgram
2+
from .runner import TMCTestRunner
3+
import sys
4+
5+
django_defined = False
6+
try:
7+
with open('.tmcproject.yml') as f:
8+
for line in f:
9+
try:
10+
(key, value) = line.split(":")
11+
if key.strip().lower() == "django":
12+
django_defined = str(value.strip().lower())
13+
except ValueError:
14+
pass
15+
except FileNotFoundError:
16+
pass
17+
18+
if django_defined:
19+
import os
20+
import django
21+
import django.conf
22+
from django.test.utils import get_runner
23+
from django.conf import settings
24+
os.environ['DJANGO_SETTINGS_MODULE'] = django_defined + '.config.settings'
25+
django.setup()
26+
27+
if sys.argv.__len__() > 1 and sys.argv[1] == 'available_points':
28+
TMCTestRunner().available_points()
29+
sys.exit()
30+
31+
if django_defined:
32+
settings.TEST_RUNNER = 'tmc.django.TMCDiscoverRunner'
33+
TestRunner = get_runner(settings)
34+
test_runner = TestRunner()
35+
failures = test_runner.run_tests(["test"])
36+
sys.exit(bool(failures))
37+
38+
main = TestProgram
39+
main(testRunner=TMCTestRunner, module=None, failfast=False, buffer=True)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.test.runner import DiscoverRunner
2+
from tmc import runner
3+
4+
5+
class TMCDiscoverRunner(DiscoverRunner):
6+
test_runner = runner.TMCTestRunner
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from inspect import isclass, isfunction
2+
from collections import defaultdict
3+
4+
point_register = {'suite': defaultdict(list), 'test': defaultdict(list)}
5+
6+
7+
def qualifier(test):
8+
return "%s.%s" % (test.__module__, test.__qualname__)
9+
10+
11+
def save_points(o, points, dst):
12+
q = qualifier(o)
13+
dst[q] += filter(lambda point: point not in dst[q], points)
14+
15+
16+
def points(*points):
17+
18+
def points_wrapper(o):
19+
if isclass(o):
20+
save_points(o, points, point_register['suite'])
21+
elif isfunction(o):
22+
save_points(o, points, point_register['test'])
23+
else:
24+
raise Exception("Expected decorator object '%s' type to be Class or Function but was %s." % (o, type(o)))
25+
return o
26+
27+
if not points:
28+
raise Exception("You need to define at least one point in the points decorator declaration")
29+
for point in points:
30+
if type(point) is not str:
31+
msg = "Points decorator argument '%s' needs to be a string, but was %s." % (point, type(point).__name__)
32+
raise Exception(msg)
33+
return points_wrapper
34+
35+
36+
def _parse_points(test):
37+
name = _name_test(test)
38+
testPoints = point_register['test']
39+
points = testPoints[name]
40+
key = name[:name.rfind('.')]
41+
suitePoints = point_register['suite'][key]
42+
points += suitePoints
43+
return points
44+
45+
46+
def _name_test(test):
47+
module = test.__module__
48+
classname = test.__class__.__name__
49+
testName = test._testMethodName
50+
return module + '.' + classname + '.' + testName
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import importlib
2+
3+
class Reflect:
4+
def __init__(self, modulename:str = "", classname:str = ""):
5+
self.__classname = classname
6+
self.__modulename = modulename
7+
self.__cls = None
8+
9+
def load_class(self):
10+
try:
11+
self.__cls = getattr(importlib.import_module(self.__modulename), self.__classname)
12+
return self.__cls
13+
except Exception as e:
14+
return None
15+
16+
def load_object(self, *params):
17+
try:
18+
if not self.__cls:
19+
self.load_class()
20+
self.__obj = self.cls(*params)
21+
return self.__obj
22+
except Exception as e:
23+
print(e)
24+
return None
25+
26+
def set_object(self, obj):
27+
self.__obj = obj
28+
29+
@property
30+
def cls(self):
31+
return self.__cls
32+
33+
@property
34+
def object(self):
35+
return self.__obj
36+
37+
def list_attributes(self, filter_builtin = False):
38+
if filter_builtin:
39+
return [x for x in dir(self.__obj) if not x.startswith("__")]
40+
return dir(self.__obj)
41+
42+
def has_attribute(self, attribute: str):
43+
if attribute in dir(self.__obj):
44+
return True
45+
if ("_" + self.__classname + attribute) in dir(self.__obj):
46+
return True
47+
return False
48+
49+
def get_attribute(self, attribute: str):
50+
if attribute in dir(self.__obj):
51+
return getattr(self.__obj, attribute)
52+
elif ("_" + self.__classname + attribute) in dir(self.__obj):
53+
return getattr(self.__obj, "_" + self.__classname + attribute)
54+
return None
55+
56+
def list_public_members(self):
57+
return [x for x in dir(self.__obj) if not x.startswith("_")]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from unittest.runner import TextTestResult
2+
from .points import _parse_points, _name_test
3+
import atexit
4+
import json
5+
import traceback
6+
7+
results = []
8+
9+
10+
class TMCResult(TextTestResult):
11+
12+
def __init__(self, stream, descriptions, verbosity):
13+
super(TMCResult, self).__init__(stream, descriptions, verbosity)
14+
15+
def startTest(self, test):
16+
super(TMCResult, self).startTest(test)
17+
18+
def addSuccess(self, test):
19+
super(TMCResult, self).addSuccess(test)
20+
self.addResult(test, 'passed')
21+
22+
def addFailure(self, test, err):
23+
super(TMCResult, self).addFailure(test, err)
24+
self.addResult(test, 'failed', err)
25+
26+
def addError(self, test, err):
27+
super(TMCResult, self).addError(test, err)
28+
self.addResult(test, 'errored', err)
29+
30+
def addResult(self, test, status, err=None):
31+
points = _parse_points(test)
32+
message = ""
33+
backtrace = []
34+
if err is not None:
35+
message = str(err[1])
36+
backtrace = traceback.format_tb(err[2])
37+
38+
details = {
39+
'name': _name_test(test),
40+
'status': status,
41+
'message': message,
42+
'passed': status == 'passed',
43+
'points': points,
44+
'backtrace': backtrace
45+
}
46+
results.append(details)
47+
48+
# TODO: Do not do this if not using TMCTestRunner
49+
@atexit.register
50+
def write_output():
51+
with open('.tmc_test_results.json', 'w', encoding='utf8') as f:
52+
json.dump(results, f, ensure_ascii=False)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from unittest import TextTestRunner, TestLoader
2+
from .result import TMCResult
3+
from .points import _parse_points, _name_test
4+
from itertools import chain
5+
import json
6+
7+
8+
class TMCTestRunner(TextTestRunner):
9+
"""A test runner for TMC exercises.
10+
"""
11+
12+
resultclass = TMCResult
13+
14+
def __init__(self, *args, **kwargs):
15+
super(TMCTestRunner, self).__init__(*args, **kwargs)
16+
17+
def run(self, test):
18+
print('Running tests with some TMC magic...')
19+
return super(TMCTestRunner, self).run(test)
20+
21+
def available_points(self):
22+
testLoader = TestLoader()
23+
tests = testLoader.discover('.', 'test*.py', None)
24+
try:
25+
tests = list(chain(*chain(*tests._tests)))
26+
except Exception as error:
27+
print("Received following Exception:", error)
28+
tests.debug()
29+
30+
points = map(_parse_points, tests)
31+
names = map(_name_test, tests)
32+
33+
result = dict(zip(names, points))
34+
35+
with open('.available_points.json', 'w') as f:
36+
json.dump(result, f, ensure_ascii=False)

0 commit comments

Comments
 (0)