File: test_yaml_files.py

package info (click to toggle)
dials-data 2.4.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 944 kB
  • sloc: python: 647; sh: 31; makefile: 24
file content (68 lines) | stat: -rw-r--r-- 2,325 bytes parent folder | download
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
from __future__ import annotations

import collections
import string

import importlib.resources
import pytest
import yaml

definition_yamls = collections.OrderedDict(
    (fn.name, fn)
    for fn in importlib.resources.files("dials_data").joinpath("definitions").iterdir()
    if fn.suffix != ".MD"
)
hashinfo_yamls = collections.OrderedDict(
    (fn.name, fn)
    for fn in importlib.resources.files("dials_data").joinpath("hashinfo").iterdir()
    if fn.suffix != ".MD"
)


def is_valid_name(fileobj):
    if fileobj.suffix != ".yml" or len(fileobj.stem) <= 1:
        return False
    allowed_characters = frozenset(string.ascii_letters + string.digits + "_")
    return all(c in allowed_characters for c in fileobj.stem)


@pytest.mark.parametrize(
    "yaml_file", list(definition_yamls.values()), ids=list(definition_yamls.keys())
)
def test_yaml_file_is_valid_definition(yaml_file):
    assert is_valid_name(yaml_file)
    definition = yaml.safe_load(yaml_file.read_bytes())
    fields = set(definition)
    required = {"name", "data", "description"}
    optional = {"license", "url", "author"}
    assert fields >= required, "Required fields missing: " + str(
        sorted(required - fields)
    )
    assert fields <= (required | optional), "Unknown fields present: " + str(
        sorted(fields - required - optional)
    )
    assert definition["data"], "Data definition is empty"
    for n, entry in enumerate(definition["data"]):
        assert isinstance(
            entry, dict
        ), f"Data definition #{n+1} contains non-dictionary entry: {entry!r}"
        assert "url" in entry, f"Data definition #{n+1} does not specify a URL"


@pytest.mark.parametrize(
    "yaml_file", list(hashinfo_yamls.values()), ids=list(hashinfo_yamls.keys())
)
def test_yaml_file_is_valid_hashinfo(yaml_file):
    assert is_valid_name(yaml_file)
    assert (
        yaml_file.name in definition_yamls
    ), "hashinfo file present without corresponding definition file"
    hashinfo = yaml.safe_load(yaml_file.read_bytes())
    fields = set(hashinfo)
    required = {"definition", "formatversion", "verify"}
    assert fields >= required, "Required fields missing: " + str(
        sorted(required - fields)
    )
    assert fields <= required, "Unknown fields present: " + str(
        sorted(fields - required)
    )