summaryrefslogtreecommitdiffstats
path: root/src/common/options/validate-options.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xsrc/common/options/validate-options.py49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/common/options/validate-options.py b/src/common/options/validate-options.py
new file mode 100755
index 000000000..5bc5d4d46
--- /dev/null
+++ b/src/common/options/validate-options.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+
+import argparse
+import fileinput
+import sys
+import yaml
+from typing import Any, Dict
+
+
+class ValidationError(Exception):
+ pass
+
+
+OptionType = Dict[str, Any]
+
+
+def validate_see_also(opt: OptionType, opts: Dict[str, OptionType]) -> None:
+ see_also = opt.get('see_also')
+ if see_also is None:
+ return
+ for ref in see_also:
+ if ref not in opts:
+ msg = f'see_also contains "{ref}". But it is not found.'
+ raise ValidationError(msg)
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+ parser.add_argument('yamls', nargs='*')
+ opts = parser.parse_args()
+ options = {}
+ for yaml_file in opts.yamls:
+ with open(yaml_file) as f:
+ yml = yaml.load(f, yaml.SafeLoader)
+ options.update({opt['name']: opt for opt in yml['options']})
+ for name, opt in options.items():
+ try:
+ validate_see_also(opt, options)
+ except ValidationError as e:
+ raise Exception(f'failed to validate "{name}": {e}')
+
+
+if __name__ == '__main__':
+ try:
+ main()
+ except Exception as e:
+ print(e, file=sys.stderr)
+ sys.exit(1)