Exemplo n.º 1
0
def main(rulepath,
         datapath,
         detailed=False,
         name_filter=None,
         is_student=False):
    ruleset = rules.parse_file(rulepath)
    exported = aaps.read_exported_kattis_file(datapath)

    def handle_student(student):
        kattis = aaps.KattisResult()
        if is_student:
            kattis.resolve_sessions_with_input()
        add_sub = lambda sub: kattis.add_submission(sub)
        util.map_now(add_sub, student.submissions)
        context = resolver.make_context()
        plugins = kattis.get_plugins()
        add_plugin = lambda c, r: resolver.context_add_plugin(context, c, r)
        util.starmap_now(add_plugin, plugins)
        result = resolver.resolve(ruleset, context)
        return make_student_result(student, ruleset, kattis, context, result)

    def name_match(student):
        return name_filter.lower() in student.name or \
            name_filter.lower() in student.username

    students = util.filter_now(name_match, exported.students)
    student_results = util.map_now(handle_student, students)

    print_result = lambda result: print_student_result(result, detailed)
    util.map_now(print_result, student_results)
Exemplo n.º 2
0
def test_resolve_with_ordering():
    rule_path = get_rule_file('test_resolve_with_ordering.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 5

    context = resolver.make_context()
    result = resolver.resolve(ruleset, context)
    assert len(result.goals) == 5
    assert all(goal.points == 1 for goal in result.goals)
Exemplo n.º 3
0
def test_only_towards_necessary():
    rule_path = get_rule_file('test_only_towards_necessary.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 1

    rule = ruleset.rules[0]
    assert rule.towards == 'only-towards-necessary'
    assert rule.points
    assert rule.needs
Exemplo n.º 4
0
def test_resolve_basic():
    rule_path = get_rule_file('test_resolve_basic.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 1

    context = resolver.make_context()
    result = resolver.resolve(ruleset, context)
    assert any(goal.name == 'resolve-basic-goal' and goal.points == 1
               for goal in result.goals)
    assert len(result.goals) == 1
Exemplo n.º 5
0
def test_resolve_two_to_same():
    rule_path = get_rule_file('test_resolve_two_to_same.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 2

    context = resolver.make_context()
    result = resolver.resolve(ruleset, context)
    assert len(result.goals) == 1
    goal = result.goals[0]
    assert goal.name == 'resolve-two-of-same' and goal.points == 2 and \
        len(goal.resolved_rules) == 2 and len(goal.non_resolved_rules) == 0
Exemplo n.º 6
0
def test_inspect_simple_rule():
    rule_path = get_rule_file('test_inspect_simple_rule.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 1

    rule = ruleset.rules[0]
    assert rule.needs == "inspect-need"
    assert rule.towards == "inspect-towards"
    assert rule.points == 1
    assert rule.deadline == "01-01-2017 08:00"
    assert rule.name == "Inspect Rule"
    assert rule.late == "halved"
Exemplo n.º 7
0
def test_custom_plugin():
    def checker(context, tree):
        return isinstance(tree, dict) and 'identity' in tree

    def handler(context, tree):
        return tree['identity']

    rule_path = get_rule_file('test_custom_plugin.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 1

    context = resolver.make_context()
    resolver.context_add_plugin(context, checker, handler)
    result = resolver.resolve(ruleset, context)
    assert len(result.goals) == 1
    assert all(goal.points == 42 for goal in result.goals)
Exemplo n.º 8
0
def test_inspect_complex_rule():
    rule_path = get_rule_file('test_inspect_complex_rule.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 1

    need_expression = {
        "OR": [
            False, {
                "positive": {
                    "get": "some-other-goal"
                }
            }, {
                ">": {
                    "lhs": 4,
                    "rhs": 2
                }
            }
        ]
    }

    value_expression = {
        "+": [
            1, 2, 3, {
                "*": [4, 2]
            }, {
                "-": [4, 3, 1]
            }, {
                "/": [42, 21]
            }, {
                "get": "another-goal"
            }, {
                "MAX": [1, 2, 1]
            }
        ]
    }

    rule = ruleset.rules[0]
    assert rule.needs == need_expression
    assert rule.towards == "inspect-complex-towards"
    assert rule.points == value_expression
Exemplo n.º 9
0
            def before(self, node, rule):
                lbl = self.labels[node.idx]

                if len(lbl) == 0:
                    lbl = '{}: '.format(node.op)

                if not lbl.endswith(': '):
                    lbl += ' + '
                lbl += '{}#{}'.format(rule.lhs, rule.idx)

                self.labels[node.idx] = lbl

            def after(self, node, rule):
                pass

        return Helper(self)


if __name__ == '__main__':
    rs = rules.parse_file(os.path.join(os.path.dirname(__file__), '../config/rules.txt'))
    print('Rules:')
    print(rs)
    tb = TableBuilder(rs)
    tb.build()

    t = optree.parse_file(sys.argv[1])
    matcher = Matcher(tb, t)
    matcher.match()
    graphivz.show_obj(matcher.all_matches())
    graphivz.show_obj(matcher.apply_matches())
Exemplo n.º 10
0
def get_ruleset_from_file(fpath):
    rule_path = get_rule_file(fpath)
    return rules.parse_file(rule_path.as_posix())
Exemplo n.º 11
0
def test_circular_include():
    rule_path = get_rule_file('test_load_circular_import_1.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 2
Exemplo n.º 12
0
def test_load_json_with_include():
    rule_path = get_rule_file('test_load_json_with_include_rules_1.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 1
Exemplo n.º 13
0
def test_load_json_from_file():
    rule_path = get_rule_file('test_load_json_from_file_rules.json')
    ruleset = rules.parse_file(rule_path.as_posix())
    assert len(ruleset.rules) == 1