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]]
                }))
예제 #2
0
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)
예제 #3
0
    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)