File: creationgraph.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 (48 lines) | stat: -rw-r--r-- 2,387 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
#!/usr/bin/env python3
from os import chdir
from pathlib import Path
from re import split
from subprocess import run
from sys import exit
from scriptlib import warn, SimulTemplateEntity, find_files


def find_entities(vfs_root):
    base = vfs_root / 'public' / 'simulation' / 'templates'
    return [str(fp.relative_to(base).with_suffix('')) for (_, fp) in find_files(vfs_root, ['public'], 'simulation/templates', 'xml')]


def main():
    vfs_root = Path(__file__).resolve().parents[3] / 'binaries' / 'data' / 'mods'
    simul_templates_path = Path('simulation/templates')
    simul_template_entity = SimulTemplateEntity(vfs_root)
    with open('creation.dot', 'w') as dot_f:
        dot_f.write('digraph G {\n')
        files = sorted(find_entities(vfs_root))
        for f in files:
            if f.startswith('template_'):
                continue
            print(f"# {f}...")
            entity = simul_template_entity.load_inherited(simul_templates_path, f, ['public'])
            if entity.find('Builder') is not None and entity.find('Builder').find('Entities') is not None:
                entities = entity.find('Builder').find('Entities').text.replace('{civ}', entity.find('Identity').find('Civ').text)
                builders = split(r'\s+', entities.strip())
                for builder in builders:
                    if Path(builder) in files:
                        warn(f"Invalid Builder reference: {f} -> {builder}")
                    dot_f.write(f'"{f}" -> "{builder}" [color=green];\n')
            if entity.find('TrainingQueue') is not None and entity.find('TrainingQueue').find('Entities') is not None:
                entities = entity.find('TrainingQueue').find('Entities').text.replace('{civ}', entity.find('Identity').find('Civ').text)
                training_queues = split(r'\s+', entities.strip())
                for training_queue in training_queues:
                    if Path(training_queue) in files:
                        warn(f"Invalid TrainingQueue reference: {f} -> {training_queue}")
                    dot_f.write(f'"{f}" -> "{training_queue}" [color=blue];\n')
        dot_f.write('}\n')
    if run(['dot', '-V'], capture_output=True).returncode == 0:
        exit(run(['dot', '-Tpng', 'creation.dot', '-o', 'creation.png'], text=True).returncode)


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