diff options
| author | snermolaev <[email protected]> | 2025-11-12 09:41:08 +0300 |
|---|---|---|
| committer | snermolaev <[email protected]> | 2025-11-12 10:00:49 +0300 |
| commit | 258ea8c8a7aa0e4225d78065a4dd48bc43084896 (patch) | |
| tree | e9396e006fac90d4bdbe8f4d8aaa16230902b527 /build/scripts | |
| parent | 97d54a51ead338eaa9bf95913642ecb59a8d9be2 (diff) | |
docs.manifest
commit_hash:650c7d56fe7044ca181cce3e6feac7b7f28b4e41
Diffstat (limited to 'build/scripts')
| -rw-r--r-- | build/scripts/docs_manifest.py | 113 | ||||
| -rw-r--r-- | build/scripts/ya.make | 1 |
2 files changed, 114 insertions, 0 deletions
diff --git a/build/scripts/docs_manifest.py b/build/scripts/docs_manifest.py new file mode 100644 index 00000000000..8945ceff928 --- /dev/null +++ b/build/scripts/docs_manifest.py @@ -0,0 +1,113 @@ +import argparse +import json +import os +import sys + + +def parse_args(argv): + parser = argparse.ArgumentParser() + parser.add_argument("--output", type=str, required=True) + parser.add_argument("--type", type=str, choices=["yfm"], default="yfm") + parser.add_argument("--version", type=str, default="1.0") + parser.add_argument("items", nargs='*', default=[]) + return parser.parse_args(argv) + + +def generate_manifest(args): + if not args.output or os.path.isdir(args.output): + raise Exception(f"Output path '{args.output}' is a directory") + output_dir = os.path.dirname(args.output) + if output_dir: + os.makedirs(output_dir, exist_ok=True) + + kvs = {} + for item in args.items: + try: + key, value = item.split("=", 1) + except Exception: + raise Exception(f"Invalid data format [{item}], expected `key=value`") + if not key or not value: + raise Exception(f"Invalid data format [{item}], both `key` and `value` must be non-empty") + if key not in ("html", "preprocessed"): + raise Exception(f"Unexpected `key`: [{item}]") + if key in kvs: + raise Exception(f"Duplicate `key` [{key}]") + + kvs[key] = value + + return json.dumps({"version": args.version, "type": args.type, "map": kvs}) + + +def main(): + args = parse_args(sys.argv[1:]) + try: + content = generate_manifest(args) + except Exception as e: + print(f"Error: {e}", file=sys.stderr, flush=True) + sys.exit(1) + with open(args.output, "w") as f: + f.write(content) + + +def test_manifest(): + args = parse_args(['--output', 'docs.manifest', 'html=html.tar.gz', 'preprocessed=preprocessed.tar.gz']) + content = generate_manifest(args) + assert json.loads(content) == json.loads( + '{"type": "yfm", "map": {"preprocessed": "preprocessed.tar.gz", "html": "html.tar.gz"}, "version": "1.0"}' + ) + + +def test_invald_input(): + # invalid output + args = parse_args(['--output', '', 'html=html.tar.gz', 'preprocessed=preprocessed.tar.gz']) + try: + generate_manifest(args) + assert False + except Exception: + pass + + # invalid output + args = parse_args(['--output', 'oops/', 'html=html.tar.gz', 'preprocessed=preprocessed.tar.gz']) + try: + generate_manifest(args) + assert False + except Exception: + pass + + # invalid format + args = parse_args(['--output', 'docs.manifest', 'html=', 'preprocessed=preprocessed.tar.gz']) + try: + generate_manifest(args) + assert False + except Exception: + pass + + # invalid format + args = parse_args(['--output', 'docs.manifest', 'html=html-docs.tar.gz', 'preprocessed:preprocessed.tar.gz']) + try: + generate_manifest(args) + assert False + except Exception: + pass + + # duplicate keys + args = parse_args( + ['--output', 'docs.manifest', 'html=html-docs.tar.gz', 'preprocessed=preprocessed.tar.gz', 'html=html.tar.gz'] + ) + try: + generate_manifest(args) + assert False + except Exception: + pass + + # unexpected key + args = parse_args(['--output', 'docs.manifest', 'html=html-docs.tar.gz', '_preprocessed=preprocessed.tar.gz']) + try: + generate_manifest(args) + assert False + except Exception: + pass + + +if __name__ == '__main__': + main() diff --git a/build/scripts/ya.make b/build/scripts/ya.make index 961c31889c6..3995b8f6ac4 100644 --- a/build/scripts/ya.make +++ b/build/scripts/ya.make @@ -61,6 +61,7 @@ ELSEIF (PYTHON3) copy_to_dir.py cpp_flatc_wrapper.py decimal_md5.py + docs_manifest.py docs_proto_wrapper.py error.py extract_asrc.py |
