summaryrefslogtreecommitdiff
path: root/yaksh/python_assertion_evaluator.py
diff options
context:
space:
mode:
authorPrabhu Ramachandran2016-05-10 20:09:08 +0530
committerPrabhu Ramachandran2016-05-10 20:09:08 +0530
commit5c74697b00ea08a2b78615637d8b322410fca4b0 (patch)
treed5b937e90bc7d3051b9c9128c4e1560b09db1c2c /yaksh/python_assertion_evaluator.py
parentd386d24aaa662f91e4314060926dc9bc02426c7d (diff)
parentc384c60c6d7fb5d30f3f929c518e0b41e084c4c4 (diff)
downloadonline_test-5c74697b00ea08a2b78615637d8b322410fca4b0.tar.gz
online_test-5c74697b00ea08a2b78615637d8b322410fca4b0.tar.bz2
online_test-5c74697b00ea08a2b78615637d8b322410fca4b0.zip
Merge pull request #96 from ankitjavalkar/code-eval-refactor-clean2
Code evaluator refactor
Diffstat (limited to 'yaksh/python_assertion_evaluator.py')
-rw-r--r--yaksh/python_assertion_evaluator.py47
1 files changed, 47 insertions, 0 deletions
diff --git a/yaksh/python_assertion_evaluator.py b/yaksh/python_assertion_evaluator.py
new file mode 100644
index 0000000..bf6a4be
--- /dev/null
+++ b/yaksh/python_assertion_evaluator.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+import sys
+import traceback
+import os
+from os.path import join
+import importlib
+
+# local imports
+from code_evaluator import CodeEvaluator, TimeoutException
+
+
+class PythonAssertionEvaluator(CodeEvaluator):
+ """Tests the Python code obtained from Code Server"""
+
+ def setup(self):
+ super(PythonAssertionEvaluator, self).setup()
+ self.exec_scope = None
+
+ def compile_code(self, user_answer, test_case):
+ if self.exec_scope:
+ return None
+ else:
+ submitted = compile(user_answer, '<string>', mode='exec')
+ self.exec_scope = {}
+ exec submitted in self.exec_scope
+ return self.exec_scope
+
+ def check_code(self, user_answer, test_case):
+ success = False
+ try:
+ tb = None
+ _tests = compile(test_case, '<string>', mode='exec')
+ exec _tests in self.exec_scope
+ except AssertionError:
+ type, value, tb = sys.exc_info()
+ info = traceback.extract_tb(tb)
+ fname, lineno, func, text = info[-1]
+ text = str(test_case).splitlines()[lineno-1]
+ err = "{0} {1} in: {2}".format(type.__name__, str(value), text)
+ except TimeoutException:
+ raise
+ else:
+ success = True
+ err = 'Correct answer'
+
+ del tb
+ return success, err