File: entvalidate.py

package info (click to toggle)
0ad 0.0.26-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 130,460 kB
  • sloc: cpp: 261,824; ansic: 198,392; javascript: 19,067; python: 14,557; sh: 7,629; perl: 4,072; xml: 849; makefile: 741; java: 533; ruby: 229; php: 190; pascal: 30; sql: 21; tcl: 4
file content (44 lines) | stat: -rw-r--r-- 1,785 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
#!/usr/bin/env python3
from os import chdir
from pathlib import Path
from subprocess import run, CalledProcessError
from sys import exit
from xml.etree import ElementTree
from scriptlib import warn, SimulTemplateEntity, find_files


def main():
    root = Path(__file__).resolve().parents[3]
    relaxng_schema = root / 'binaries' / 'system' / 'entity.rng'
    if not relaxng_schema.exists():
        warn(f"""Relax NG schema non existant.
Please create the file {relaxng_schema.relative_to(root)}
You can do that by running 'pyrogenesis -dumpSchema' in the 'system' directory""")
        exit(1)
    if run(['xmllint', '--version'], capture_output=True).returncode != 0:
        warn("xmllint not found in your PATH, please install it (usually in libxml2 package)")
        exit(2)
    vfs_root = root / 'binaries' / 'data' / 'mods'
    simul_templates_path = Path('simulation/templates')
    simul_template_entity = SimulTemplateEntity(vfs_root)
    count = 0
    failed = 0
    for fp, _ in sorted(find_files(vfs_root, ['public'], 'simulation/templates', 'xml')):
        if fp.stem.startswith('template_'):
            continue
        print(f"# {fp}...")
        count += 1
        entity = simul_template_entity.load_inherited(simul_templates_path, str(fp.relative_to(simul_templates_path)), ['public'])
        xmlcontent = ElementTree.tostring(entity, encoding='unicode')
        try:
            run(['xmllint', '--relaxng', str(relaxng_schema.resolve()), '-'], input=xmlcontent, capture_output=True, text=True, check=True)
        except CalledProcessError as e:
            failed += 1
            print(e.stderr)
            print(e.stdout)
    print(f"\nTotal: {count}; failed: {failed}")


if __name__ == '__main__':
    chdir(Path(__file__).resolve().parent)
    main()