Team Ai
Modelpublic

AnnaMats/ppo-Pyramids-Training

sourceHugging Faceupdated 3y agoView on Hugging Face
0likes110downloads
validate_versions.py197 linesDownload Raw Back to utils
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