def grade(q, task, verbose, callback): '''Sets up a file-based submission for grading, then calls a callback for grading. Sets up a sandbox directory, compiles the program, and calls the callback function for grading.''' correct = False metadata = {} try: sandbox_dir = tempfile.mkdtemp(prefix='proco') os.chdir(sandbox_dir) if verbose: utils.progress('Using temporary directory: %s' % sandbox_dir) payload = task['payload'] team_filebase = task['alias'] team_extension = task['run_metadata']['extension'] team_filename = team_filebase + '.' + team_extension utils.compile(payload, team_filebase, team_extension, team_filename) correct = callback(task, team_filebase, team_extension, team_filename, metadata, verbose) except GradingException, e: utils.progress(e.message) metadata['error'] = e.message
def _run_tests(task, team_filebase, team_extension, team_filename, metadata, verbose): '''Compile interactive grader, and execute judge test cases.''' if not task['problem_metadata']['grader']['valid']: utils.progress('No grader found.') raise Exception('No interactive grader found!') try: payload = task['problem_metadata']['grader']['src'] grader_filebase = task['problem_metadata']['grader']['filebase'] grader_extension = task['problem_metadata']['grader']['extension'] grader_filename = grader_filebase + '.' + grader_extension utils.compile(payload, grader_filebase, grader_extension, grader_filename) except Exception, e: utils.progress('Internal error when compiling grader') raise
def _run_tests(task, team_select, team_correct, team_wrong, verbose): '''Compile judge and run both test cases on the judge. ''' payload = task['problem_metadata']['grader']['src'] grader_filebase = task['problem_metadata']['grader']['filebase'] grader_extension = task['problem_metadata']['grader']['extension'] grader_filename = grader_filebase + '.' + grader_extension utils.compile(payload, grader_filebase, grader_extension, grader_filename) grader_executer_cmd = utils.languages[grader_extension]['executer'].substitute(src_filebase=grader_filebase, src_filename=grader_filename).split() actual_type = task['division_metadata']['type'] if actual_type == 'correct' or actual_type == 'sometimes': utils.progress('Testing team good input') if not _run_test(grader_executer_cmd, team_correct, 100, verbose): return False if actual_type == 'wrong' or actual_type == 'sometimes': utils.progress('Testing team bad input') if not _run_test(grader_executer_cmd, team_wrong, 200, verbose): return False return True