AnnaMats/ppo-Pyramids-Training
0110
1#!/usr/bin/env python32 3import os4import json5import sys6from typing import Dict, Optional7import argparse8 9VERSION_LINE_START = "__version__ = "10 11DIRECTORIES = ["ml-agents/mlagents/trainers", "ml-agents-envs/mlagents_envs"]12 13MLAGENTS_PACKAGE_JSON_PATH = "com.unity.ml-agents/package.json"14MLAGENTS_EXTENSIONS_PACKAGE_JSON_PATH = "com.unity.ml-agents.extensions/package.json"15 16ACADEMY_PATH = "com.unity.ml-agents/Runtime/Academy.cs"17 18PYTHON_VERSION_FILE_TEMPLATE = """# Version of the library that will be used to upload to pypi19__version__ = {version}20 21# Git tag that will be checked to determine whether to trigger upload to pypi22__release_tag__ = {release_tag}23"""24 25 26def _escape_non_none(s: Optional[str]) -> str:27 """28 Returns s escaped in quotes if it is non-None, else "None"29 :param s:30 :return:31 """32 if s is not None:33 return f'"{s}"'34 else:35 return "None"36 37 38def extract_version_string(filename):39 with open(filename) as f:40 for line in f.readlines():41 if line.startswith(VERSION_LINE_START):42 return line.replace(VERSION_LINE_START, "").strip()43 return None44 45 46def check_versions() -> bool:47 version_by_dir: Dict[str, str] = {}48 for directory in DIRECTORIES:49 path = os.path.join(directory, "__init__.py")50 version = extract_version_string(path)51 print(f"Found version {version} for {directory}")52 version_by_dir[directory] = version53 54 # Make sure we have exactly one version, and it's not none55 versions = set(version_by_dir.values())56 if len(versions) != 1 or None in versions:57 print("Each setup.py must have the same VERSION string.")58 return False59 return True60 61 62def set_version(63 python_version: str,64 csharp_version: str,65 csharp_extensions_version: str,66 release_tag: Optional[str],67) -> None:68 # Sanity check - make sure test tags have a test or dev version69 if release_tag and "test" in release_tag:70 if not ("dev" in python_version or "test" in python_version):71 raise RuntimeError('Test tags must use a "test" or "dev" version.')72 73 new_contents = PYTHON_VERSION_FILE_TEMPLATE.format(74 version=_escape_non_none(python_version),75 release_tag=_escape_non_none(release_tag),76 )77 for directory in DIRECTORIES:78 path = os.path.join(directory, "__init__.py")79 print(f"Setting {path} to version {python_version}")80 with open(path, "w") as f:81 f.write(new_contents)82 83 if csharp_version is not None:84 package_version = f"{csharp_version}-exp.1"85 if csharp_extensions_version is not None:86 # since this has never been promoted we need to keep87 # it in preview forever or CI will fail88 extension_version = f"{csharp_extensions_version}-preview"89 print(90 f"Setting package version to {package_version} in {MLAGENTS_PACKAGE_JSON_PATH}"91 f" and {MLAGENTS_EXTENSIONS_PACKAGE_JSON_PATH}"92 )93 set_package_version(package_version)94 set_extension_package_version(package_version, extension_version)95 print(f"Setting package version to {package_version} in {ACADEMY_PATH}")96 set_academy_version_string(package_version)97 98 99def set_package_version(new_version: str) -> None:100 with open(MLAGENTS_PACKAGE_JSON_PATH) as f:101 package_json = json.load(f)102 if "version" in package_json:103 package_json["version"] = new_version104 with open(MLAGENTS_PACKAGE_JSON_PATH, "w") as f:105 json.dump(package_json, f, indent=2)106 f.write("\n")107 108 109def set_extension_package_version(110 new_dependency_version: str, new_extension_version111) -> None:112 with open(MLAGENTS_EXTENSIONS_PACKAGE_JSON_PATH) as f:113 package_json = json.load(f)114 package_json["dependencies"]["com.unity.ml-agents"] = new_dependency_version115 if new_extension_version is not None:116 package_json["version"] = new_extension_version117 with open(MLAGENTS_EXTENSIONS_PACKAGE_JSON_PATH, "w") as f:118 json.dump(package_json, f, indent=2)119 f.write("\n")120 121 122def set_academy_version_string(new_version):123 needle = "internal const string k_PackageVersion"124 found = 0125 with open(ACADEMY_PATH) as f:126 lines = f.readlines()127 for i, l in enumerate(lines):128 if needle in l:129 left, right = l.split(" = ")130 right = f' = "{new_version}";\n'131 lines[i] = left + right132 found += 1133 if found != 1:134 raise RuntimeError(135 f'Expected to find search string "{needle}" exactly once, but found it {found} times'136 )137 with open(ACADEMY_PATH, "w") as f:138 f.writelines(lines)139 140 141def print_release_tag_commands(142 python_version: str, csharp_version: str, release_tag: str143):144 python_tag = f"python-packages_{python_version}"145 csharp_tag = f"com.unity.ml-agents_{csharp_version}"146 docs_tag = f"{release_tag}_docs"147 print(148 f"""149###150Use these commands to create the tags after the release:151###152git checkout {release_tag}153git tag -f latest_release154git push -f origin latest_release155git tag -f {docs_tag}156git push -f origin {docs_tag}157git tag {python_tag}158git push -f origin {python_tag}159git tag {csharp_tag}160git push -f origin {csharp_tag}161"""162 )163 164 165if __name__ == "__main__":166 parser = argparse.ArgumentParser()167 parser.add_argument("--python-version", default=None)168 parser.add_argument("--csharp-version", default=None)169 parser.add_argument("--csharp-extensions-version", default=None)170 parser.add_argument("--release-tag", default=None)171 # unused, but allows precommit to pass filenames172 parser.add_argument("files", nargs="*")173 args = parser.parse_args()174 175 if args.python_version:176 print(f"Updating python library to version {args.python_version}")177 if args.csharp_version:178 print(f"Updating C# package to version {args.csharp_version}")179 if args.csharp_extensions_version:180 print(181 f"Updating C# extensions package to version {args.csharp_extensions_version}"182 )183 set_version(184 args.python_version,185 args.csharp_version,186 args.csharp_extensions_version,187 args.release_tag,188 )189 if args.release_tag is not None:190 print_release_tag_commands(191 args.python_version, args.csharp_version, args.release_tag192 )193 else:194 ok = check_versions()195 return_code = 0 if ok else 1196 sys.exit(return_code)197 