summaryrefslogtreecommitdiffstats
path: root/build/scripts
diff options
context:
space:
mode:
authorsnermolaev <[email protected]>2025-11-12 09:41:08 +0300
committersnermolaev <[email protected]>2025-11-12 10:00:49 +0300
commit258ea8c8a7aa0e4225d78065a4dd48bc43084896 (patch)
treee9396e006fac90d4bdbe8f4d8aaa16230902b527 /build/scripts
parent97d54a51ead338eaa9bf95913642ecb59a8d9be2 (diff)
docs.manifest
commit_hash:650c7d56fe7044ca181cce3e6feac7b7f28b4e41
Diffstat (limited to 'build/scripts')
-rw-r--r--build/scripts/docs_manifest.py113
-rw-r--r--build/scripts/ya.make1
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