forked from dgbowl/yadg
-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.py
68 lines (60 loc) · 2.37 KB
/
utils.py
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
import pytest
import os
import json
import yadg.core
def datagram_from_input(input, parser, datadir):
schema = {
"metadata": {
"provenance": "manual",
"schema_version": "0.1",
"timezone": input.get("timezone", "UTC"),
},
"steps": [
{
"parser": parser,
"import": {
"prefix": input.get("prefix", ""),
"suffix": input.get("suffix", ""),
"contains": input.get("contains", ""),
"encoding": input.get("encoding", "utf-8"),
},
"parameters": input.get("parameters", {}),
}
],
}
if "externaldate" in input:
schema["steps"][0]["externaldate"] = input["externaldate"]
if "case" in input:
schema["steps"][0]["import"]["files"] = [input["case"]]
elif "files" in input:
schema["steps"][0]["import"]["files"] = input["files"]
elif "folders" in input:
schema["steps"][0]["import"]["folders"] = input["folders"]
os.chdir(datadir)
assert yadg.core.validators.validate_schema(schema)
return yadg.core.process_schema(schema)
def standard_datagram_test(datagram, testspec):
assert yadg.core.validators.validate_datagram(datagram), "datagram is invalid"
assert len(datagram["steps"]) == testspec["nsteps"], "wrong number of steps"
steps = datagram["steps"][testspec["step"]]["data"]
assert len(steps) == testspec["nrows"], "wrong number of timesteps in a step"
json.dumps(datagram)
def pars_datagram_test(datagram, testspec):
steps = datagram["steps"][testspec["step"]]["data"]
tstep = steps[testspec["point"]]
for tk, tv in testspec["pars"].items():
if tk != "uts":
rd = "raw" if tv.get("raw", True) else "derived"
assert (
len(tstep[rd][tk].keys()) == 3
), "value not in [val, dev, unit] format"
compare_result_dicts(
tstep[rd][tk],
{"n": tv["value"], "s": tv["sigma"], "u": tv["unit"]},
)
else:
assert tstep[tk] == tv["value"], "wrong uts"
def compare_result_dicts(result, reference, atol=1e-6):
assert result["n"] == pytest.approx(reference["n"], abs=atol)
assert result["s"] == pytest.approx(reference["s"], abs=atol)
assert result["u"] == reference["u"]