diff options
author | maheshgudi | 2016-06-02 16:03:21 +0530 |
---|---|---|
committer | adityacp | 2016-07-27 22:52:23 +0530 |
commit | cf52baf30e5902c2f3c79cfbd8df88789ccd09ce (patch) | |
tree | 3a5d7f41c60d65b19da0b37dfabccc9f7b534da4 | |
parent | de63766dad6ed0755af0171cdfdae916e0e8676b (diff) | |
download | online_test-cf52baf30e5902c2f3c79cfbd8df88789ccd09ce.tar.gz online_test-cf52baf30e5902c2f3c79cfbd8df88789ccd09ce.tar.bz2 online_test-cf52baf30e5902c2f3c79cfbd8df88789ccd09ce.zip |
added python stdio evaluator
-rw-r--r-- | yaksh/python_stdio_evaluator.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/yaksh/python_stdio_evaluator.py b/yaksh/python_stdio_evaluator.py new file mode 100644 index 0000000..5db80f5 --- /dev/null +++ b/yaksh/python_stdio_evaluator.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +import sys +import traceback +import os +from os.path import join +import importlib +from contextlib import contextmanager +from ast import literal_eval +# local imports +from code_evaluator import CodeEvaluator +from StringIO import StringIO + + +@contextmanager +def redirect_stdout(): + new_target = StringIO() + + old_target, sys.stdout = sys.stdout, new_target # replace sys.stdout + try: + yield new_target # run some code with the replaced stdout + finally: + sys.stdout = old_target # restore to the previous value + + +class PythonStdioEvaluator(CodeEvaluator): + """Tests the Python code obtained from Code Server""" + + def compile_code(self, user_answer, expected_input, expected_output): + submitted = compile(user_answer, '<string>', mode='exec') + if expected_input: + input_buffer = StringIO() + try: + literal_input = literal_eval(expected_input.split("\n")) + except ValueError: + literal_input = expected_input.split("\n") + for inputs in literal_input: + input_buffer.write(str(inputs)+'\n') + input_buffer.seek(0) + sys.stdin = input_buffer + + with redirect_stdout() as output_buffer: + exec_scope = {} + exec submitted in exec_scope + self.output_value = output_buffer.getvalue().rstrip("\n") + return self.output_value + + def check_code(self, user_answer, expected_input, expected_output): + success = False + + tb = None + if expected_output in user_answer: + success = False + err = ("Incorrect Answer: Please avoid " + "printing the expected output directly" + ) + elif self.output_value == expected_output: + + success = True + err = "Correct Answer" + + else: + success = False + err = """Incorrect Answer:\nExpected output - {0} + and your output - {1}"""\ + .format(expected_output, self.output_value) + + del tb + return success, err |