summaryrefslogtreecommitdiff
path: root/lib/loader/plain.py
blob: 5aa4293d24498a00c10d1dc99cbbb9c02dd198ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/env python3

from ..utils import soft_cast_int, soft_cast_float
import re


class CSVfile:
    def __init__(self):
        pass

    def load(self, f):
        observations = list()
        for lineno, line in enumerate(f):
            if lineno == 0:
                param_names = line.split(",")[1:-1]
                attr_names = line.removesuffix("\n").split(",")[-1:]
            else:
                param_values = list(map(soft_cast_int, line.split(",")[1:-1]))
                attr_values = list(
                    map(soft_cast_float, line.removesuffix("\n").split(",")[-1:])
                )
                observations.append(
                    {
                        "name": "CSVFile",
                        "param": dict(zip(param_names, param_values)),
                        "attribute": dict(zip(attr_names, attr_values)),
                    }
                )
        return observations


class Logfile:
    def __init__(self):
        pass

    def kv_to_param(self, kv_str, cast):
        try:
            key, value = kv_str.split("=")
            value = cast(value)
            return key, value
        except ValueError:
            logger.warning(f"Invalid key-value pair: {kv_str}")
            raise

    def kv_to_param_f(self, kv_str):
        return self.kv_to_param(kv_str, soft_cast_float)

    def kv_to_param_i(self, kv_str):
        return self.kv_to_param(kv_str, soft_cast_int)

    def load(self, f):
        observations = list()
        for lineno, line in enumerate(f):
            m = re.search(r"\[::\] *([^|]*?) *[|] *([^|]*?) *[|] *(.*)", line)
            if m:
                name_str = m.group(1)
                param_str = m.group(2)
                attr_str = m.group(3)
                try:
                    param = dict(map(self.kv_to_param_i, param_str.split()))
                    attr = dict(map(self.kv_to_param_f, attr_str.split()))
                    observations.append(
                        {
                            "name": name_str,
                            "param": param,
                            "attribute": attr,
                        }
                    )
                except ValueError:
                    logger.warning(
                        f"Error parsing {f}: invalid key-value pair in line {lineno+1}"
                    )
                    logger.warning(f"Offending entry:\n{line}")
                    raise

        return observations

    def dump(self, observations, f):
        for observation in observations:
            name = observation["name"]
            param = observation["param"]
            attr = observation["attribute"]

            param_str = " ".join(
                map(
                    lambda kv: f"{kv[0]}={kv[1]}",
                    sorted(param.items(), key=lambda kv: kv[0]),
                )
            )
            attr_str = " ".join(
                map(
                    lambda kv: f"{kv[0]}={kv[1]}",
                    sorted(attr.items(), key=lambda kv: kv[0]),
                )
            )

            print(f"[::] {name} | {param_str} | {attr_str}", file=f)