def export_subtasks(self): vp.print("Exporting subtasks...") try: subtasks_tests = tu.get_subtasks_tests_dict_from_tests_dir( TESTS_DIR) except tu.MalformedTestsException as e: raise ExportFailureException(str(e)) self.create_directory(self.SUBTASKS_DIR_NAME) SUBTASKS_JSON = os.environ.get('SUBTASKS_JSON') subtasks_json_data = load_json(SUBTASKS_JSON) subtasks_data = dict( navigate_json(subtasks_json_data, 'subtasks', SUBTASKS_JSON)) for subtask_name, subtask_data in subtasks_data.items(): vp.print("Export subtask: {}".format(subtask_name)) self.write_to_file( os.path.join( self.SUBTASKS_DIR_NAME, "{subtask_index:02}-{subtask_name}.json".format( subtask_index=subtask_data['index'], subtask_name=subtask_name)), json.dumps({ "score": subtask_data['score'], "testcases": [make_clean_name(t) for t in subtasks_tests[subtask_name]] }))
def get_test_validators(test_name, tests_dir): try: test_subtasks = tu.get_test_subtasks_from_tests_dir( test_name, tests_dir) except tu.MalformedTestsException as e: sys.stderr.write("{}\n".format(e)) sys.exit(3) if len(test_subtasks) == 0: log_warning("Test '%s' is in no subtasks." % test_name) data = load_json(SUBTASKS_JSON) global_validators = data.get('global_validators', []) subtask_sensitive_validators = data.get('subtask_sensitive_validators', []) def check_subtask_sensitive_validators(subtask_sensitive_validators): subtask_placeholder_var = "subtask" subtask_placeholder_test_substitute = "___SUBTASK_PLACEHOLDER_SUBSTITUTE___" for subtask_sensitive_validator in subtask_sensitive_validators: try: subtask_validator_substituted = subtask_sensitive_validator.format( **{ subtask_placeholder_var: subtask_placeholder_test_substitute }) except KeyError as e: sys.stderr.write( 'Subtask-sensitive validator "{}" contains unknown placeholder {{{}}}.\n' .format(subtask_sensitive_validator, e.args[0])) sys.exit(3) else: if subtask_placeholder_test_substitute not in subtask_validator_substituted: log_warning( 'Subtask-sensitive validator "{}" does not contain the subtask placeholder {{{}}}.' .format(subtask_sensitive_validator, subtask_placeholder_var)) check_subtask_sensitive_validators(subtask_sensitive_validators) test_validators = list(global_validators) for subtask in test_subtasks: test_validators += [ validator.format(subtask=subtask) for validator in subtask_sensitive_validators ] test_validators += navigate_json(data, 'subtasks/%s' % subtask, SUBTASKS_JSON).get('validators', []) if len(test_validators) == 0: log_warning("There is no validator for test {}.".format(test_name)) def unify_list(l): seen = [] for e in l: if e not in seen: seen.append(e) return seen return unify_list(test_validators)
return subtasks if __name__ == '__main__': if len(sys.argv) != 3: usage() test_name = sys.argv[1] mapping_file = sys.argv[2] test_subtasks = get_test_subtasks(mapping_file, test_name) if len(test_subtasks) == 0: log_warning("Test '%s' is in no subtasks." % test_name) data = load_json(SUBTASKS_JSON) test_validators = data.get('global_validators', []) if len(test_validators) == 0: log_warning("There is no global validator for the problem.") for subtask in test_subtasks: test_validators += navigate_json(data, 'subtasks/%s' % subtask, SUBTASKS_JSON).get('validators', []) seen = set() for validator in test_validators: if validator not in seen: seen.add(validator) print(validator)