]>
Commit | Line | Data |
---|---|---|
20effc67 TL |
1 | #!/usr/bin/env python3 |
2 | ||
3 | import argparse | |
4 | import fileinput | |
5 | import sys | |
6 | import yaml | |
7 | from typing import Any, Dict | |
8 | ||
9 | ||
10 | class ValidationError(Exception): | |
11 | pass | |
12 | ||
13 | ||
14 | OptionType = Dict[str, Any] | |
15 | ||
16 | ||
17 | def validate_see_also(opt: OptionType, opts: Dict[str, OptionType]) -> None: | |
18 | see_also = opt.get('see_also') | |
19 | if see_also is None: | |
20 | return | |
21 | for ref in see_also: | |
22 | if ref not in opts: | |
23 | msg = f'see_also contains "{ref}". But it is not found.' | |
24 | raise ValidationError(msg) | |
25 | ||
26 | ||
27 | def main() -> None: | |
28 | parser = argparse.ArgumentParser( | |
29 | formatter_class=argparse.ArgumentDefaultsHelpFormatter) | |
30 | parser.add_argument('yamls', nargs='*') | |
31 | opts = parser.parse_args() | |
32 | options = {} | |
33 | for yaml_file in opts.yamls: | |
34 | with open(yaml_file) as f: | |
35 | yml = yaml.load(f, yaml.SafeLoader) | |
36 | options.update({opt['name']: opt for opt in yml['options']}) | |
37 | for name, opt in options.items(): | |
38 | try: | |
39 | validate_see_also(opt, options) | |
40 | except ValidationError as e: | |
41 | raise Exception(f'failed to validate "{name}": {e}') | |
42 | ||
43 | ||
44 | if __name__ == '__main__': | |
45 | try: | |
46 | main() | |
47 | except Exception as e: | |
48 | print(e, file=sys.stderr) | |
49 | sys.exit(1) |