File size: 6,445 Bytes
05c9ac2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
"""
Generate the "Releases" table on the main readme. Update the versions lists, run this script, and copy the output
into the markdown file.
"""
from distutils.version import LooseVersion, StrictVersion
from datetime import datetime
from typing import NamedTuple
from collections import Counter

MAX_DAYS = 150  # do not print releases older than this many days


def table_line(version_info, bold=False):
    bold_str = "**" if bold else ""

    cells = [
        f"**{version_info.display_name}**",
        f"{bold_str}{version_info.release_date}{bold_str}",
        f"{bold_str}[source]({version_info.source_link}){bold_str}",
        f"{bold_str}[docs]({version_info.doc_link}){bold_str}",
        f"{bold_str}[download]({version_info.download_link}){bold_str}",
    ]
    if version_info.is_main:
        cells.append("--")  # python
        cells.append("--")  # Unity
    else:
        cells.append(
            f"{bold_str}[{version_info.python_verion}]({version_info.pypi_link}){bold_str}"
        )
        cells.append(
            f"{bold_str}[{version_info.csharp_version}]({version_info.package_link}){bold_str}"
        )
    joined_cells = " | ".join(cells)
    return f"| {joined_cells} |"


class ReleaseInfo(NamedTuple):
    release_tag: str
    csharp_version: str
    python_verion: str
    release_date: str
    is_verified: bool = False

    @property
    def loose_version(self) -> LooseVersion:
        return LooseVersion(self.python_verion)

    @property
    def is_main(self) -> bool:
        return self.release_tag == "main"

    @property
    def release_datetime(self) -> datetime:
        if self.is_main:
            return datetime.today()
        return datetime.strptime(self.release_date, "%B %d, %Y")

    @property
    def elapsed_days(self) -> int:
        """
        Days since this version was released.
        :return:
        """
        return (datetime.today() - self.release_datetime).days

    @property
    def display_name(self) -> str:
        """
        Clean up the tag name for display, e.g. "release_1" -> "Release 1"
        :return:
        """
        if self.is_verified:
            return f"Verified Package {self.csharp_version}"
        elif self.is_main:
            return "main (unstable)"
        else:
            return self.release_tag.replace("_", " ").title()

    @property
    def source_link(self):
        if self.is_verified:
            return f"https://github.com/Unity-Technologies/ml-agents/tree/com.unity.ml-agents_{self.csharp_version}"
        else:
            return f"https://github.com/Unity-Technologies/ml-agents/tree/{self.release_tag}"

    @property
    def download_link(self):
        if self.is_verified:
            tag = f"com.unity.ml-agents_{self.csharp_version}"
        else:
            tag = self.release_tag
        return f"https://github.com/Unity-Technologies/ml-agents/archive/{tag}.zip"

    @property
    def doc_link(self):
        if self.is_verified:
            return "https://github.com/Unity-Technologies/ml-agents/blob/release_2_verified_docs/docs/Readme.md"

        # For release_X branches, docs are on a separate tag.
        if self.release_tag.startswith("release"):
            docs_name = self.release_tag + "_docs"
        else:
            docs_name = self.release_tag
        return f"https://github.com/Unity-Technologies/ml-agents/tree/{docs_name}/docs/Readme.md"

    @property
    def package_link(self):
        try:
            v = StrictVersion(self.csharp_version).version
            return f"https://docs.unity3d.com/Packages/com.unity.ml-agents@{v[0]}.{v[1]}/manual/index.html"
        except ValueError:
            return "--"

    @property
    def pypi_link(self):
        return f"https://pypi.org/project/mlagents/{self.python_verion}/"


versions = [
    ReleaseInfo("main", "main", "main", "--"),
    ReleaseInfo("release_1", "1.0.0", "0.16.0", "April 30, 2020"),
    ReleaseInfo("release_2", "1.0.2", "0.16.1", "May 20, 2020"),
    ReleaseInfo("release_3", "1.1.0", "0.17.0", "June 10, 2020"),
    ReleaseInfo("release_4", "1.2.0", "0.18.0", "July 15, 2020"),
    ReleaseInfo("release_5", "1.2.1", "0.18.1", "July 31, 2020"),
    ReleaseInfo("release_6", "1.3.0", "0.19.0", "August 12, 2020"),
    ReleaseInfo("release_7", "1.4.0", "0.20.0", "September 16, 2020"),
    ReleaseInfo("release_8", "1.5.0", "0.21.0", "October 14, 2020"),
    ReleaseInfo("release_9", "1.5.0", "0.21.1", "November 4, 2020"),
    ReleaseInfo("release_10", "1.6.0", "0.22.0", "November 18, 2020"),
    ReleaseInfo("release_11", "1.7.0", "0.23.0", "December 21, 2020"),
    ReleaseInfo("release_12", "1.7.2", "0.23.0", "December 22, 2020"),
    ReleaseInfo("release_13", "1.8.0", "0.24.0", "February 17, 2021"),
    ReleaseInfo("release_14", "1.8.1", "0.24.1", "March 5, 2021"),
    ReleaseInfo("release_15", "1.9.0", "0.25.0", "March 17, 2021"),
    ReleaseInfo("release_16", "1.9.1", "0.25.1", "April 13, 2021"),
    ReleaseInfo("release_17", "2.0.0", "0.26.0", "April 22, 2021"),
    ReleaseInfo("release_18", "2.1.0", "0.27.0", "June 9, 2021"),
    ReleaseInfo("release_19", "2.2.1", "0.28.0", "January 14, 2022"),
    ReleaseInfo("release_20", "2.3.0", "0.30.0", "November 21, 2022"),
    # Verified releases
    ReleaseInfo("", "1.0.8", "0.16.1", "May 26, 2021", is_verified=True),
    ReleaseInfo("", "1.0.7", "0.16.1", "March 8, 2021", is_verified=True),
    ReleaseInfo("", "1.0.6", "0.16.1", "November 16, 2020", is_verified=True),
    ReleaseInfo("", "1.0.5", "0.16.1", "September 23, 2020", is_verified=True),
    ReleaseInfo("", "1.0.4", "0.16.1", "August 20, 2020", is_verified=True),
]

sorted_versions = sorted(versions, key=lambda x: x.release_datetime, reverse=True)

highlight_versions = set()
# Highlight the most recent verified version
highlight_versions.add([v for v in sorted_versions if v.is_verified][0])
# Highlight the most recent regular version
highlight_versions.add(
    [v for v in sorted_versions if (not v.is_verified and not v.is_main)][0]
)

count_by_verified = Counter()

for version_info in sorted_versions:
    highlight = version_info in highlight_versions
    if version_info.elapsed_days > MAX_DAYS:
        # Make sure we always have at least regular and one verified entry
        if count_by_verified[version_info.is_verified] > 0:
            continue
    print(table_line(version_info, highlight))
    count_by_verified[version_info.is_verified] += 1

print("\n\n")