Files
concrete/frontends/concrete-python/script/actions_utils/generate_versions_json.py
2023-03-08 11:23:21 +01:00

82 lines
2.7 KiB
Python

"""Tool to manage the versions.json file at the root of our docs sites."""
import argparse
import json
from json.decoder import JSONDecodeError
from pathlib import Path
from semver import VersionInfo
def strip_leading_v(version_str: str):
"""Strip leading v of a version which is not SemVer compatible."""
return version_str[1:] if version_str.startswith("v") else version_str
def main(args):
"""Entry point."""
version = args.version
latest = args.latest
prerelease = args.prerelease
if not VersionInfo.isvalid(strip_leading_v(version)):
message = f"Invalid version: {version}"
raise RuntimeError(message)
version_json_file_path = Path(args.versions_json_file).resolve()
try:
with open(version_json_file_path, "r", encoding="utf-8") as f:
version_json = json.loads(f.read())
except JSONDecodeError as err:
message = f"An error occurred while trying to load {str(version_json_file_path)}"
raise RuntimeError(message) from err
# Version json is composed by:
# all: list of all published versions
# menu: list of all available versions (if any entry is not included in "all",
# warning banner with DEV/PRE-RELEASE doc warning will be displayed)
# latest: latest version, if current doc != latest, warning banner is displayed
if "version" not in version_json["menu"]:
version_json["menu"].append(version)
if not prerelease:
version_json["all"].append(version)
if latest:
version_json["latest"] = version
print(version_json)
output_json_path = Path(args.output_json).resolve()
with open(output_json_path, "w", encoding="utf-8") as f:
json.dump(version_json, f, indent=4)
if __name__ == "__main__":
parser = argparse.ArgumentParser("versions.json generator", allow_abbrev=False)
parser.add_argument(
"--add-version",
type=str,
required=True,
dest="version",
help="A single versions to add to versions.json. "
"The link will point to '$VERSION/' and will have text '$VERSION'.",
)
parser.add_argument(
"--versions-json-file", type=str, required=True, help="Path to the versions.json to update."
)
parser.add_argument(
"--prerelease",
action="store_true",
dest="prerelease",
help="set this version as a pre-release documentation.",
)
parser.add_argument(
"--latest",
action="store_true",
dest="latest",
help="set this version as latest available documentation.",
)
parser.add_argument("--output-json", type=str, required=True, help="Output file path.")
cli_args = parser.parse_args()
main(cli_args)