Source code for edutest

from edutest.utils import *
import os.path
import types
import importlib
import edutest.contexts 
from edutest.contexts import ForbiddenInputError

CANT_FIND_FUNCTION="Can't find function {name}"
CANT_IMPORT_MODULE_WITH_INPUT="Can't import {file} as module, because it tried to read input"

_testable_script = None

[docs]def get_testable_script(): if _testable_script is None: # TODO: try to detect the module from available files raise RuntimeError("Testable module is not set") else: return _testable_script
[docs]def set_testable_script(path): global _testable_script _testable_script = path
[docs]def import_module(name, package=None): """Works like :func:`importlib.import_module` but throws error instead of blocking when module tries to read from stdin. """ try: with edutest.contexts.ForbiddenInput: return importlib.import_module(name, package) except ForbiddenInputError: raise ImportError(CANT_IMPORT_MODULE_WITH_INPUT)
[docs]def get_function(name, scope=None): """Tries to locate given function ...""" assert isinstance(name, str) if scope is None: if "." in name: scope, name = name.rsplit(".", maxsplit=1) else: scope = get_testable_script() if isinstance(scope, str): scope = import_module(scope) if isinstance(scope, types.ModuleType): scope = vars(scope) assert isinstance(scope, dict) assert name in scope, CANT_FIND_FUNCTION.format(name=name) return scope[name]
[docs]def check_function( name_or_object, arguments=[], kw_args={}, expected_result=None, inputs=[], expected_output=""): if isinstance(name_or_object, str): function = get_function(name_or_object) elif hasattr(function, "__call__"): function = name_or_object else: raise TypeError("Can't interpret {} as function", name_or_object) # def test_function( # name, # arguments, # expected_result, # expected_output="") # # class BasicIOTester: # def create_environment_description # # def test_io( # script_name=None, # arguments=[], # provided_files={}, # inputs=[], # expected_output=None, # expected_last_output=None, # expected_files={}, # text_file_encoding="UTF-8" # ): # # if script_name is None: # script_name = infer_script_name() # # instance = ScriptInstance(script_name) # try: # try: # instance.run(arguments, provided_files, inputs) # except: # raise # # finally: # # delete files # for path in provided_files.keys().union(expected_files.keys()): # if os.path.exists(path): # os.remove(path) # # def infer_script_name(): # return None # # def generate_io_test( # script_name=None, # taken from argv # arguments=[], # inputs=["sisendid"], # expected_output=oodatav_väljund, # None, kui ei soovi väljundit kontrollida # expected_trimmed_output=None, # output_strictness="trim", # provided_files={"filename.txt" : "content"}, # expected_files={"filename.txt" : "content"}, # description=None, # ): # pass #