From 9e099f97d95525b1b6ce50d32c15a312ce45500f Mon Sep 17 00:00:00 2001 From: Martin Gano Date: Thu, 6 Aug 2020 16:58:47 +0200 Subject: [PATCH 1/2] add script with support parsing releases from git --- docs/chart.png | Bin 0 -> 63342 bytes docs/en/versions.rst | 2 + generate_chart.py | 265 +++++++++++++++++++++++++++++++++++++++++++ idf_versions.js | 96 ++++++++++++++++ 4 files changed, 363 insertions(+) create mode 100644 docs/chart.png create mode 100644 generate_chart.py create mode 100644 idf_versions.js diff --git a/docs/chart.png b/docs/chart.png new file mode 100644 index 0000000000000000000000000000000000000000..25475313af7cd1cec59038271c5fa82e67d9f3d4 GIT binary patch literal 63342 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 literal 0 HcmV?d00001 diff --git a/docs/en/versions.rst b/docs/en/versions.rst index b289cc7c7f..6abec3dabf 100644 --- a/docs/en/versions.rst +++ b/docs/en/versions.rst @@ -70,6 +70,8 @@ As a general guideline: - If possible, periodically update the project to a new major or minor ESP-IDF version (for example, once a year.) The update process should be straightforward for Minor updates, but may require some planning and checking of the release notes for Major updates. - Always plan to update to a newer release before the release you are using becomes End of Life. +.. image:: ../chart.png + Checking the Current Version ---------------------------- diff --git a/generate_chart.py b/generate_chart.py new file mode 100644 index 0000000000..d1f61743dc --- /dev/null +++ b/generate_chart.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python +import datetime as dt +import requests +import json +import os +import re + +import matplotlib.dates +import matplotlib.font_manager as font_manager +import matplotlib.patches as mpatches +import matplotlib.pyplot as plt +import numpy as np +from dateutil import parser +from dateutil.relativedelta import relativedelta +from matplotlib.dates import WEEKLY, DateFormatter, RRuleLocator, rrulewrapper + + +class Version(object): + def __init__(self, version_name, + explicit_start_date=None, + explicit_end_date=None, + explicit_end_service_date=None, + is_lts=None): + self.version_name = version_name + + self.is_lts = is_lts or self.is_version_lts() + + self.is_major_minor = Version.is_minor_major_version(self.version_name) + + self._start_date = parser.parse( + explicit_start_date) if explicit_start_date is not None else self._retrieve_start_date() + self._end_of_life_date = parser.parse( + explicit_end_date) if explicit_end_date is not None else self._retrieve_end_of_life_date() + self._end_service_date = parser.parse( + explicit_end_service_date) if explicit_end_service_date is not None else self.get_end_service_date() + + self.start_date_matplotlib_format = matplotlib.dates.date2num(self._start_date) + self.end_of_life_date_matplotlib_format = matplotlib.dates.date2num(self._end_of_life_date) + + self.end_service_date_matplotlib_format = matplotlib.dates.date2num( + self._end_service_date) if self._end_service_date is not None else None + + @staticmethod + def get_config(config_path): + return json.load(open(config_path)) + + @staticmethod + def add_months(source_date, months): + return source_date + relativedelta(months=+months) + + @staticmethod + def is_minor_major_version(version_name): + return True if len(version_name.split(".")) <= 2 else False + + def is_version_lts(self): + version = self.version_name + return version >= 'v4.1' + + def get_start_date(self): + return self._start_date + + def get_end_of_life_date(self): + return self._end_of_life_date + + def _retrieve_start_date(self): + return parser.parse(os.popen("git log -1 --format=%ai " + self.version_name)) + + def _retrieve_end_of_life_date(self): + return self.add_months(self._start_date, 30 if self.is_lts else 18) + + def get_end_service_date(self): + return self.add_months(self._start_date, 12) + + +class ChartVersions(object): + def __init__(self): + self.all_versions = self.get_all_versions_from_git() + + self._releases = self._get_releases_from_url(url="https://dl.espressif.com/dl/esp-idf/idf_versions.js") + self._patches = self._get_patches_from_url(url="https://dl.espressif.com/dl/esp-idf/idf_versions.js") + + self.sorted_releases_supported = sorted(self.filter_old_versions(self._releases), key=lambda x: x.version_name) + self.patches_supported = self.filter_old_versions(self._patches) + + # TODO test higher versions + # self.sorted_releases_supported.append(Version(version_name='v4.1', explicit_start_date="28-9-2020")) + # self.sorted_releases_supported.append(Version(version_name='v4.2', explicit_start_date="28-5-2021")) + + def get_releases_as_json(self): + return { + x.version_name: { + "start_date": x.get_start_date().strftime("%Y-%m-%d"), + "end_date": x.get_end_of_life_date().strftime("%Y-%m-%d"), + "is_lts": x.is_lts + } for x in self.sorted_releases_supported + self.patches_supported + } + + @staticmethod + def parse_chart_releases_from_js(js_as_string): + return json.loads(js_as_string[js_as_string.find("RELEASES: ") + len("RELEASES: "):js_as_string.rfind("};")]) + + def _get_all_version_from_url(self, url=None, filename=None): + releases_file = requests.get(url).text if url is not None else "".join(open(filename).readlines()) + return self.parse_chart_releases_from_js(releases_file) + + def _get_releases_from_url(self, url=None, filename=None): + all_versions = self._get_all_version_from_url(url, filename) + return [ + Version(version_name=x, + explicit_start_date=all_versions[x]['start_date'], + explicit_end_date=all_versions[x]['end_date'] if 'end_date' in all_versions[x].keys() else None, + explicit_end_service_date=all_versions[x]['end_service'] if 'end_service' in all_versions[x].keys() else None) + for x in all_versions.keys() if Version.is_minor_major_version(x) + ] + + def _get_patches_from_url(self, url=None, filename=None): + all_versions = self._get_all_version_from_url(url, filename) + return [ + Version(version_name=x, + explicit_start_date=all_versions[x]['start_date'], + explicit_end_date=all_versions[x]['end_date'] if 'end_date' in all_versions[x].keys() else None, + is_lts=all_versions[x]['new_policy'] if 'new_policy' in all_versions[x].keys() else None) + for x in all_versions.keys() if not Version.is_minor_major_version(x) + ] + + def _get_releases(self, all_versions): + return [Version(release) for release in self._get_releases_names(all_versions)] + + def _get_patches(self, all_versions): + return [Version(patch, explicit_end_date=self.get_super_end_date_as_string(patch), + is_lts=self.get_super_lts_state(patch)) for patch in self._get_patches_names(all_versions)] + + @staticmethod + def _get_releases_names(all_versions): + return list(filter(lambda x: Version.is_minor_major_version(x), all_versions)) + + @staticmethod + def _get_patches_names(all_versions): + return list(filter(lambda x: not Version.is_minor_major_version(x), all_versions)) + + def get_super_version(self, patch): + return list(filter(lambda x: x.version_name == self.get_super_version_name(patch), self._releases))[0] + + def get_super_end_date_as_string(self, patch): + return self.get_super_version(patch).get_end_of_life_date().strftime("%m/%d/%Y, %H:%M:%S") + + def get_super_lts_state(self, patch): + return self.get_super_version(patch).is_lts + + @staticmethod + def get_all_versions_from_git(): + """ + :returns: list of string variables meaning name of the versions or patches (e.g. v4.1, v3.3.1, etc.) + """ + all_git_tags = os.popen("git tag") + stable_releases_regex = "(?:^|)(v\d+\.\d+(?:\.\d+){0,1})(?=\n|$)" + + results = [re.match(stable_releases_regex, line) for line in all_git_tags] + all_versions = [regex_result.group(1) for regex_result in results if regex_result is not None] + return all_versions + + @staticmethod + def filter_old_versions(versions): + return list( + filter(lambda x: x.get_end_of_life_date() >= dt.datetime.now(x.get_end_of_life_date().tzinfo), versions)) + + @staticmethod + def get_super_version_name(version_name): + return ".".join(version_name.split(".")[:2]) + + def create_chart(self, + figure_size=(20, 8), + subplot=111, + step_size=0.5, + bar_height=0.3, + version_alpha=0.8, + patch_width=1, + lts_service_color='darkred', + lts_maintenance_color='red', + bar_align='center', + patch_color='black', + patch_alpha=1, + date_interval=10, + output_chart_name='docs/chart', + output_chart_extension='.png', + months_surrounding_chart=5): + fig = plt.figure(figsize=figure_size) + ax = fig.add_subplot(subplot) + + labels_count = len(self.sorted_releases_supported) + + pos = np.arange(step_size, labels_count * step_size + step_size, step_size) + mapping_releases_index = {release.version_name: i for release, i in + zip(self.sorted_releases_supported, range(labels_count))} + + for release, i in zip(self.sorted_releases_supported, range(labels_count)): + start_date = release.start_date_matplotlib_format + end_of_service_date = release.end_service_date_matplotlib_format + + end_date = release.end_of_life_date_matplotlib_format + + ax.barh((i * step_size) + step_size, (end_of_service_date or end_date) - start_date, left=start_date, + height=bar_height, align=bar_align, + color=lts_service_color, + alpha=version_alpha, + edgecolor=lts_service_color) + if end_of_service_date is not None: + ax.barh((i * step_size) + step_size, end_date - end_of_service_date, left=end_of_service_date, + height=bar_height, align=bar_align, + color=lts_maintenance_color, alpha=version_alpha, edgecolor=lts_maintenance_color) + + for patch, i in zip(self.patches_supported, range(len(self.patches_supported))): + start_date = patch.start_date_matplotlib_format + + ax.barh(mapping_releases_index[self.get_super_version_name(patch.version_name)] * step_size + step_size, + patch_width, left=start_date, height=bar_height, align=bar_align, color=patch_color, + alpha=patch_alpha, + edgecolor=patch_color) + ax.text(start_date - 5, mapping_releases_index[ + self.get_super_version_name(patch.version_name)] * step_size + step_size - 0.2, + patch.version_name.split('.')[-1], + fontsize='xx-small', color='darkred') + + plt.setp(plt.yticks(pos, map(lambda x: x.version_name, self.sorted_releases_supported))[1], fontsize=14) + + ax.set_ylim(bottom=0, ymax=labels_count * step_size + step_size) + + ax.set_xlim( + xmin=Version.add_months( + min(self.sorted_releases_supported, + key=lambda version: version.get_start_date().replace(tzinfo=None)).get_start_date(), + -months_surrounding_chart), + xmax=Version.add_months( + max(self.sorted_releases_supported, + key=lambda version: version.get_end_of_life_date().replace(tzinfo=None)).get_end_of_life_date(), + months_surrounding_chart)) + + ax.grid(color='g', linestyle=':') + ax.xaxis_date() + + rule = rrulewrapper(WEEKLY, interval=date_interval) + loc = RRuleLocator(rule) + formatter = DateFormatter("%d-%b '%y") + + ax.xaxis.set_major_locator(loc) + ax.xaxis.set_major_formatter(formatter) + x_labels = ax.get_xticklabels() + plt.setp(x_labels, rotation=30, fontsize=10) + + ax.legend(loc=1, prop=font_manager.FontProperties(size='small')) + + ax.invert_yaxis() + fig.autofmt_xdate() + + darkred_patch = mpatches.Patch(color='darkred', label='Service period (Recommended for new designs)') + red_patch = mpatches.Patch(color='red', label='Maintenance period') + + plt.legend(handles=[darkred_patch, red_patch], prop={'size': 6}) + fig.set_size_inches(10, 5, forward=True) + plt.savefig(output_chart_name + output_chart_extension) + plt.show() + + +if __name__ == '__main__': + ChartVersions().create_chart() diff --git a/idf_versions.js b/idf_versions.js new file mode 100644 index 0000000000..d36ec3182c --- /dev/null +++ b/idf_versions.js @@ -0,0 +1,96 @@ +var DOCUMENTATION_VERSIONS = { + DEFAULTS: { + has_targets: false, + supported_targets: ["esp32"] + }, + VERSIONS: [{ + name: "latest", + has_targets: true, + supported_targets: ["esp32", "esp32s2"] + }, + { + name: "v4.1-rc", + pre_release: true + }, + { + name: "v4.0.1", + old: false + }, + { + name: "v4.0", + old: true + }, + { + name: "v3.3.2" + }, + { + name: "v3.3.1", + old: true + }, + { + name: "v3.3", + old: true + }, + { + name: "v3.2.3", + old: false + }, + { + name: "v3.1.7", + old: false + }, + { + name: "v3.1.6", + old: true + }, + { + name: "v3.0.9", + old: true + }, + { + name: "release-v4.2", + pre_release: true, + has_targets: true, + supported_targets: ["esp32", "esp32s2"] + }, + { + name: "release-v4.1", + pre_release: true + }, + { + name: "release-v4.0", + pre_release: true + }, + { + name: "release-v3.3", + pre_release: true + }, + { + name: "release-v3.2", + pre_release: true + }, + { + name: "release-v3.1", + pre_release: true + } + ], + RELEASES: { + "v3.1": { + "start_date": "2018-09-07", + "end_date": "2020-10-31" + }, + "v3.2": { + "start_date": "2019-04-11", + "end_date": "2020-10-31" + }, + "v3.3": { + "start_date": "2019-09-05", + "end_date": "2022-03-31" + }, + "v4.0": { + "start_date": "2020-02-11", + "end_service": "2021-02-11", + "end_date": "2021-10-31" + } + } +}; From 7a9abe3ec5295ff31aa7b164a3998bb0e429512a Mon Sep 17 00:00:00 2001 From: "martin.gano" Date: Tue, 8 Sep 2020 15:11:16 +0200 Subject: [PATCH 2/2] add chart of version support to version.rst --- .gitlab-ci.yml | 2 +- SUPPORT_POLICY.md | 2 +- docs/chart.png | Bin 63342 -> 0 bytes docs/conf_common.py | 1 + docs/en/versions.rst | 44 ++++++- docs/generate_chart.py | 216 +++++++++++++++++++++++++++++++++ docs/requirements.txt | 5 + generate_chart.py | 265 ----------------------------------------- idf_versions.js | 96 --------------- 9 files changed, 267 insertions(+), 364 deletions(-) delete mode 100644 docs/chart.png create mode 100644 docs/generate_chart.py delete mode 100644 generate_chart.py delete mode 100644 idf_versions.js diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7fbceeb1fa..4c74067585 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,7 +46,7 @@ variables: CI_TARGET_TEST_CONFIG_FILE: "$CI_PROJECT_DIR/tools/ci/config/target-test.yml" # Versioned esp-idf-doc env image to use for all document building jobs - ESP_IDF_DOC_ENV_IMAGE: "$CI_DOCKER_REGISTRY/esp-idf-doc-env:v5" + ESP_IDF_DOC_ENV_IMAGE: "$CI_DOCKER_REGISTRY/esp-idf-doc-env:v6" # before each job, we need to check if this job is filtered by bot stage/job filter diff --git a/SUPPORT_POLICY.md b/SUPPORT_POLICY.md index eed44025da..ec8a68e29e 100644 --- a/SUPPORT_POLICY.md +++ b/SUPPORT_POLICY.md @@ -25,7 +25,7 @@ reserved for features which are needed to meet particular regulatory requirements or standards for new products, and which carry a very low risk of introducing regressions.) -During the Maintenace period, the version is still supported but only bugfixes +During the Maintenance period, the version is still supported but only bugfixes for high severity issues or security issues will be applied. Using an “In Service” version is recommended when starting a new project. diff --git a/docs/chart.png b/docs/chart.png deleted file mode 100644 index 25475313af7cd1cec59038271c5fa82e67d9f3d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63342 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 diff --git a/docs/conf_common.py b/docs/conf_common.py index dd4cc9ee20..61024719ef 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -54,6 +54,7 @@ extensions = ['breathe', 'sphinxcontrib.nwdiag', 'sphinxcontrib.rackdiag', 'sphinxcontrib.packetdiag', + 'sphinxcontrib.cairosvgconverter', 'extensions.html_redirects', 'extensions.toctree_filter', diff --git a/docs/en/versions.rst b/docs/en/versions.rst index 6abec3dabf..b2b6730050 100644 --- a/docs/en/versions.rst +++ b/docs/en/versions.rst @@ -70,7 +70,49 @@ As a general guideline: - If possible, periodically update the project to a new major or minor ESP-IDF version (for example, once a year.) The update process should be straightforward for Minor updates, but may require some planning and checking of the release notes for Major updates. - Always plan to update to a newer release before the release you are using becomes End of Life. -.. image:: ../chart.png +Each ESP-IDF major and minor release (V4.1, V4.2, etc) is supported for +30 months after the initial stable release date. + +Supported means that the ESP-IDF team will continue to apply bug fixes, +security fixes, etc to the release branch on GitHub, and periodically +make new bugfix releases as needed. + +Support period is divided into "Service" and "Maintenance" period: + ++-------------+--------------+---------------------------------------+ +| Period | Duration | Recommended for new projects? | ++=============+==============+=======================================+ +| Service | 12 months | Yes | ++-------------+--------------+---------------------------------------+ +| Maintenance | 18 months | No | ++-------------+--------------+---------------------------------------+ + +During the Service period, bugfixes releases are more frequent. In some cases, +support for new features may be added during the Service period (this is +reserved for features which are needed to meet particular regulatory +requirements or standards for new products, and which carry a very low risk of +introducing regressions.) + +During the Maintenance period, the version is still supported but only bugfixes +for high severity issues or security issues will be applied. + +Using an “In Service” version is recommended when starting a new project. + +Users are encouraged to upgrade all projects to a newer ESP-IDF release before +the support period finishes and the release becomes End of Life (EOL). It is our +policy to not continue fixing bugs in End of Life releases. + +Pre-release versions (betas, previews, `-rc` and `-dev` versions, etc) +are not covered by any support period. Sometimes a particular feature is +marked as "Preview" in a release, which means it is also not covered +by the support period. + +The ESP-IDF Programming Guide has information about the +`different versions of ESP-IDF `_ +(major, minor, bugfix, etc). + + +.. image:: https://dl.espressif.com/dl/esp-idf/support-periods.svg Checking the Current Version diff --git a/docs/generate_chart.py b/docs/generate_chart.py new file mode 100644 index 0000000000..6d855b53cd --- /dev/null +++ b/docs/generate_chart.py @@ -0,0 +1,216 @@ +#!/usr/bin/env python + +# Copyright 2020 Espressif Systems (Shanghai) PTE LTD +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import argparse +import datetime as dt +import json + +import numpy as np +import requests +import matplotlib.dates +import matplotlib.patches as mpatches +import matplotlib.pyplot as plt +from matplotlib.dates import MONTHLY, DateFormatter, RRuleLocator, rrulewrapper +from dateutil import parser +from dateutil.relativedelta import relativedelta + + +class Version(object): + def __init__(self, version_name, explicit_start_date, explicit_end_date, explicit_end_service_date=None): + self.version_name = version_name + + self._start_date = parser.parse(explicit_start_date) + self._end_of_life_date = parser.parse(explicit_end_date) + self._end_service_date = parser.parse( + explicit_end_service_date) if explicit_end_service_date is not None else self.compute_end_service_date() + + self.start_date_matplotlib_format = matplotlib.dates.date2num(self._start_date) + self.end_of_life_date_matplotlib_format = matplotlib.dates.date2num(self._end_of_life_date) + + self.end_service_date_matplotlib_format = matplotlib.dates.date2num(self._end_service_date) + + @staticmethod + def add_months(source_date, months): + return source_date + relativedelta(months=+months) + + def get_start_date(self): + return self._start_date + + def get_end_of_life_date(self): + return self._end_of_life_date + + def get_end_service_date(self): + return self._end_service_date + + def compute_end_service_date(self): + return self.add_months(self._start_date, 12) + + +class ChartVersions(object): + def __init__(self, url=None, filename=None): + self._releases = self._get_releases_from_url(url=url, filename=filename) + self.sorted_releases_supported = sorted(self.filter_old_versions(self._releases), key=lambda x: x.version_name, + reverse=True) + + def get_releases_as_json(self): + return { + x.version_name: { + "start_date": x.get_start_date().strftime("%Y-%m-%d"), + "end_service": x.get_end_service_date().strftime("%Y-%m-%d"), + "end_date": x.get_end_of_life_date().strftime("%Y-%m-%d") + } for x in self.sorted_releases_supported + } + + @staticmethod + def parse_chart_releases_from_js(js_as_string): + return json.loads(js_as_string[js_as_string.find("RELEASES: ") + len("RELEASES: "):js_as_string.rfind("};")]) + + def _get_all_version_from_url(self, url=None, filename=None): + releases_file = requests.get(url).text if url is not None else "".join(open(filename).readlines()) + return self.parse_chart_releases_from_js(releases_file) + + def _get_releases_from_url(self, url=None, filename=None): + all_versions = self._get_all_version_from_url(url, filename) + return [ + Version(version_name=x, + explicit_start_date=all_versions[x]['start_date'], + explicit_end_date=all_versions[x]['end_date'] if 'end_date' in all_versions[x].keys() else None, + explicit_end_service_date=all_versions[x]['end_service'] if 'end_service' in all_versions[ + x].keys() else None) + for x in all_versions.keys() + ] + + @staticmethod + def filter_old_versions(versions): + return list( + filter(lambda x: x.get_end_of_life_date() >= dt.datetime.now(x.get_end_of_life_date().tzinfo), versions)) + + @staticmethod + def months_timedelta(datetime_1, datetime2): + datetime_1, datetime2 = (datetime2, datetime_1) if datetime_1 > datetime2 else (datetime_1, datetime2) + return (datetime2.year * 12 + datetime2.month) - (datetime_1.year * 12 + datetime_1.month) + + @staticmethod + def find_next_multiple_of_power_two(number, initial=3): + """ + Computes the next multiple of the number by some power of two. + >>> ChartVersions.find_next_multiple_of_power_two(7, 3) + 12 + """ + msb = number.bit_length() + return 3 if number <= 1 else initial << msb - 2 << (1 & number >> msb - 2) + + def find_nearest_multiple_of_power_two(self, number, initial=3, prefer_next=False): + next_num = self.find_next_multiple_of_power_two(number=number - 1, initial=initial) + previous_num = next_num >> 1 + return next_num if abs(next_num - number) < (abs(previous_num - number) + int(prefer_next)) else previous_num + + def create_chart(self, + figure_size=(41.8330013267, 16.7332005307), + subplot=111, + step_size=0.5, + bar_height=0.3, + version_alpha=0.8, + lts_service_color='darkred', + lts_maintenance_color='red', + bar_align='center', + date_interval=None, + output_chart_name='docs/chart', + output_chart_extension='.png', + months_surrounding_chart=4, + service_period_label='Service period (Recommended for new designs)', + maintenance_period_text='Maintenance period'): + fig = plt.figure(figsize=figure_size) + ax = fig.add_subplot(subplot) + + labels_count = len(self.sorted_releases_supported) + + pos = np.arange(step_size, labels_count * step_size + step_size, step_size) + + for release, i in zip(self.sorted_releases_supported, range(labels_count)): + start_date = release.start_date_matplotlib_format + end_of_service_date = release.end_service_date_matplotlib_format + + end_date = release.end_of_life_date_matplotlib_format + + ax.barh((i * step_size) + step_size, (end_of_service_date or end_date) - start_date, left=start_date, + height=bar_height, align=bar_align, + color=lts_service_color, + alpha=version_alpha, + edgecolor=lts_service_color) + if end_of_service_date is not None: + ax.barh((i * step_size) + step_size, end_date - end_of_service_date, left=end_of_service_date, + height=bar_height, align=bar_align, + color=lts_maintenance_color, alpha=version_alpha, edgecolor=lts_maintenance_color) + + ax.set_ylim(bottom=0, ymax=labels_count * step_size + step_size) + + max_ax_date = Version.add_months( + max(self.sorted_releases_supported, + key=lambda version: version.get_end_of_life_date().replace(tzinfo=None)).get_end_of_life_date(), + months_surrounding_chart + 1).replace(day=1) + + min_ax_date = Version.add_months( + min(self.sorted_releases_supported, + key=lambda version: version.get_start_date().replace(tzinfo=None)).get_start_date(), + -months_surrounding_chart).replace(day=1) + + x_ax_interval = date_interval or self.find_nearest_multiple_of_power_two( + self.months_timedelta(max_ax_date, min_ax_date) // 10) + + ax.set_xlim(xmin=min_ax_date, xmax=max_ax_date) + + ax.grid(color='g', linestyle=':') + ax.xaxis_date() + + rule = rrulewrapper(MONTHLY, interval=x_ax_interval) + loc = RRuleLocator(rule) + formatter = DateFormatter("%b %Y") + + ax.xaxis.set_major_locator(loc) + ax.xaxis.set_major_formatter(formatter) + x_labels = ax.get_xticklabels() + plt.ylabel('ESP-IDF Release', size=12) + + ax.invert_yaxis() + fig.autofmt_xdate() + + darkred_patch = mpatches.Patch(color=lts_service_color, label=service_period_label) + red_patch = mpatches.Patch(color=lts_maintenance_color, label=maintenance_period_text) + + plt.setp(plt.yticks(pos, map(lambda x: x.version_name, self.sorted_releases_supported))[1], rotation=0, + fontsize=10, family='Tahoma') + plt.setp(x_labels, rotation=30, fontsize=11, family='Tahoma') + plt.legend(handles=[darkred_patch, red_patch], prop={'size': 10, 'family': 'Tahoma'}, + bbox_to_anchor=(1.01, 1.165), loc='upper right') + fig.set_size_inches(11, 5, forward=True) + plt.savefig(output_chart_name + output_chart_extension, bbox_inches='tight') + print("Saved into " + output_chart_name + output_chart_extension) + + +if __name__ == '__main__': + arg_parser = argparse.ArgumentParser( + description="Create chart of version support. Set the url or filename with versions." + "If you set both filename and url the script will prefer filename.") + arg_parser.add_argument("--url", metavar="URL", default="https://dl.espressif.com/dl/esp-idf/idf_versions.js") + arg_parser.add_argument("--filename", + help="Set the name of the source file, if is set, the script ignores the url.") + arg_parser.add_argument("--output-format", help="Set the output format of the image.", default="svg") + arg_parser.add_argument("--output-file", help="Set the name of the output file.", default="docs/chart") + args = arg_parser.parse_args() + + ChartVersions(url=args.url if args.filename is None else None, filename=args.filename).create_chart( + output_chart_extension="." + args.output_format.lower()[-3:], output_chart_name=args.output_file) diff --git a/docs/requirements.txt b/docs/requirements.txt index 5b0b97b4c0..1a331e7c98 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,6 +1,10 @@ # This is a list of python packages used to generate documentation. This file is used with pip: # pip install --user -r requirements.txt # +# matplotlib is currently required only by the script generate_chart.py +matplotlib==3.3.1 ; python_version>="3" +matplotlib==2.0.1 ; python_version=="2.7" +cairosvg==2.4.2 # required by sphinxcontrib-svg2pdfconverter[CairoSVG] sphinx==2.3.1 breathe==4.14.1 sphinx-copybutton==0.3.0 @@ -10,6 +14,7 @@ sphinxcontrib-seqdiag==2.0.0 sphinxcontrib-actdiag==2.0.0 sphinxcontrib-nwdiag==2.0.0 sphinxcontrib-wavedrom==2.0.0 +sphinxcontrib-svg2pdfconverter[CairoSVG]==1.1.0 nwdiag==2.0.0 recommonmark future>=0.16.0 # for ../tools/gen_esp_err_to_name.py diff --git a/generate_chart.py b/generate_chart.py deleted file mode 100644 index d1f61743dc..0000000000 --- a/generate_chart.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env python -import datetime as dt -import requests -import json -import os -import re - -import matplotlib.dates -import matplotlib.font_manager as font_manager -import matplotlib.patches as mpatches -import matplotlib.pyplot as plt -import numpy as np -from dateutil import parser -from dateutil.relativedelta import relativedelta -from matplotlib.dates import WEEKLY, DateFormatter, RRuleLocator, rrulewrapper - - -class Version(object): - def __init__(self, version_name, - explicit_start_date=None, - explicit_end_date=None, - explicit_end_service_date=None, - is_lts=None): - self.version_name = version_name - - self.is_lts = is_lts or self.is_version_lts() - - self.is_major_minor = Version.is_minor_major_version(self.version_name) - - self._start_date = parser.parse( - explicit_start_date) if explicit_start_date is not None else self._retrieve_start_date() - self._end_of_life_date = parser.parse( - explicit_end_date) if explicit_end_date is not None else self._retrieve_end_of_life_date() - self._end_service_date = parser.parse( - explicit_end_service_date) if explicit_end_service_date is not None else self.get_end_service_date() - - self.start_date_matplotlib_format = matplotlib.dates.date2num(self._start_date) - self.end_of_life_date_matplotlib_format = matplotlib.dates.date2num(self._end_of_life_date) - - self.end_service_date_matplotlib_format = matplotlib.dates.date2num( - self._end_service_date) if self._end_service_date is not None else None - - @staticmethod - def get_config(config_path): - return json.load(open(config_path)) - - @staticmethod - def add_months(source_date, months): - return source_date + relativedelta(months=+months) - - @staticmethod - def is_minor_major_version(version_name): - return True if len(version_name.split(".")) <= 2 else False - - def is_version_lts(self): - version = self.version_name - return version >= 'v4.1' - - def get_start_date(self): - return self._start_date - - def get_end_of_life_date(self): - return self._end_of_life_date - - def _retrieve_start_date(self): - return parser.parse(os.popen("git log -1 --format=%ai " + self.version_name)) - - def _retrieve_end_of_life_date(self): - return self.add_months(self._start_date, 30 if self.is_lts else 18) - - def get_end_service_date(self): - return self.add_months(self._start_date, 12) - - -class ChartVersions(object): - def __init__(self): - self.all_versions = self.get_all_versions_from_git() - - self._releases = self._get_releases_from_url(url="https://dl.espressif.com/dl/esp-idf/idf_versions.js") - self._patches = self._get_patches_from_url(url="https://dl.espressif.com/dl/esp-idf/idf_versions.js") - - self.sorted_releases_supported = sorted(self.filter_old_versions(self._releases), key=lambda x: x.version_name) - self.patches_supported = self.filter_old_versions(self._patches) - - # TODO test higher versions - # self.sorted_releases_supported.append(Version(version_name='v4.1', explicit_start_date="28-9-2020")) - # self.sorted_releases_supported.append(Version(version_name='v4.2', explicit_start_date="28-5-2021")) - - def get_releases_as_json(self): - return { - x.version_name: { - "start_date": x.get_start_date().strftime("%Y-%m-%d"), - "end_date": x.get_end_of_life_date().strftime("%Y-%m-%d"), - "is_lts": x.is_lts - } for x in self.sorted_releases_supported + self.patches_supported - } - - @staticmethod - def parse_chart_releases_from_js(js_as_string): - return json.loads(js_as_string[js_as_string.find("RELEASES: ") + len("RELEASES: "):js_as_string.rfind("};")]) - - def _get_all_version_from_url(self, url=None, filename=None): - releases_file = requests.get(url).text if url is not None else "".join(open(filename).readlines()) - return self.parse_chart_releases_from_js(releases_file) - - def _get_releases_from_url(self, url=None, filename=None): - all_versions = self._get_all_version_from_url(url, filename) - return [ - Version(version_name=x, - explicit_start_date=all_versions[x]['start_date'], - explicit_end_date=all_versions[x]['end_date'] if 'end_date' in all_versions[x].keys() else None, - explicit_end_service_date=all_versions[x]['end_service'] if 'end_service' in all_versions[x].keys() else None) - for x in all_versions.keys() if Version.is_minor_major_version(x) - ] - - def _get_patches_from_url(self, url=None, filename=None): - all_versions = self._get_all_version_from_url(url, filename) - return [ - Version(version_name=x, - explicit_start_date=all_versions[x]['start_date'], - explicit_end_date=all_versions[x]['end_date'] if 'end_date' in all_versions[x].keys() else None, - is_lts=all_versions[x]['new_policy'] if 'new_policy' in all_versions[x].keys() else None) - for x in all_versions.keys() if not Version.is_minor_major_version(x) - ] - - def _get_releases(self, all_versions): - return [Version(release) for release in self._get_releases_names(all_versions)] - - def _get_patches(self, all_versions): - return [Version(patch, explicit_end_date=self.get_super_end_date_as_string(patch), - is_lts=self.get_super_lts_state(patch)) for patch in self._get_patches_names(all_versions)] - - @staticmethod - def _get_releases_names(all_versions): - return list(filter(lambda x: Version.is_minor_major_version(x), all_versions)) - - @staticmethod - def _get_patches_names(all_versions): - return list(filter(lambda x: not Version.is_minor_major_version(x), all_versions)) - - def get_super_version(self, patch): - return list(filter(lambda x: x.version_name == self.get_super_version_name(patch), self._releases))[0] - - def get_super_end_date_as_string(self, patch): - return self.get_super_version(patch).get_end_of_life_date().strftime("%m/%d/%Y, %H:%M:%S") - - def get_super_lts_state(self, patch): - return self.get_super_version(patch).is_lts - - @staticmethod - def get_all_versions_from_git(): - """ - :returns: list of string variables meaning name of the versions or patches (e.g. v4.1, v3.3.1, etc.) - """ - all_git_tags = os.popen("git tag") - stable_releases_regex = "(?:^|)(v\d+\.\d+(?:\.\d+){0,1})(?=\n|$)" - - results = [re.match(stable_releases_regex, line) for line in all_git_tags] - all_versions = [regex_result.group(1) for regex_result in results if regex_result is not None] - return all_versions - - @staticmethod - def filter_old_versions(versions): - return list( - filter(lambda x: x.get_end_of_life_date() >= dt.datetime.now(x.get_end_of_life_date().tzinfo), versions)) - - @staticmethod - def get_super_version_name(version_name): - return ".".join(version_name.split(".")[:2]) - - def create_chart(self, - figure_size=(20, 8), - subplot=111, - step_size=0.5, - bar_height=0.3, - version_alpha=0.8, - patch_width=1, - lts_service_color='darkred', - lts_maintenance_color='red', - bar_align='center', - patch_color='black', - patch_alpha=1, - date_interval=10, - output_chart_name='docs/chart', - output_chart_extension='.png', - months_surrounding_chart=5): - fig = plt.figure(figsize=figure_size) - ax = fig.add_subplot(subplot) - - labels_count = len(self.sorted_releases_supported) - - pos = np.arange(step_size, labels_count * step_size + step_size, step_size) - mapping_releases_index = {release.version_name: i for release, i in - zip(self.sorted_releases_supported, range(labels_count))} - - for release, i in zip(self.sorted_releases_supported, range(labels_count)): - start_date = release.start_date_matplotlib_format - end_of_service_date = release.end_service_date_matplotlib_format - - end_date = release.end_of_life_date_matplotlib_format - - ax.barh((i * step_size) + step_size, (end_of_service_date or end_date) - start_date, left=start_date, - height=bar_height, align=bar_align, - color=lts_service_color, - alpha=version_alpha, - edgecolor=lts_service_color) - if end_of_service_date is not None: - ax.barh((i * step_size) + step_size, end_date - end_of_service_date, left=end_of_service_date, - height=bar_height, align=bar_align, - color=lts_maintenance_color, alpha=version_alpha, edgecolor=lts_maintenance_color) - - for patch, i in zip(self.patches_supported, range(len(self.patches_supported))): - start_date = patch.start_date_matplotlib_format - - ax.barh(mapping_releases_index[self.get_super_version_name(patch.version_name)] * step_size + step_size, - patch_width, left=start_date, height=bar_height, align=bar_align, color=patch_color, - alpha=patch_alpha, - edgecolor=patch_color) - ax.text(start_date - 5, mapping_releases_index[ - self.get_super_version_name(patch.version_name)] * step_size + step_size - 0.2, - patch.version_name.split('.')[-1], - fontsize='xx-small', color='darkred') - - plt.setp(plt.yticks(pos, map(lambda x: x.version_name, self.sorted_releases_supported))[1], fontsize=14) - - ax.set_ylim(bottom=0, ymax=labels_count * step_size + step_size) - - ax.set_xlim( - xmin=Version.add_months( - min(self.sorted_releases_supported, - key=lambda version: version.get_start_date().replace(tzinfo=None)).get_start_date(), - -months_surrounding_chart), - xmax=Version.add_months( - max(self.sorted_releases_supported, - key=lambda version: version.get_end_of_life_date().replace(tzinfo=None)).get_end_of_life_date(), - months_surrounding_chart)) - - ax.grid(color='g', linestyle=':') - ax.xaxis_date() - - rule = rrulewrapper(WEEKLY, interval=date_interval) - loc = RRuleLocator(rule) - formatter = DateFormatter("%d-%b '%y") - - ax.xaxis.set_major_locator(loc) - ax.xaxis.set_major_formatter(formatter) - x_labels = ax.get_xticklabels() - plt.setp(x_labels, rotation=30, fontsize=10) - - ax.legend(loc=1, prop=font_manager.FontProperties(size='small')) - - ax.invert_yaxis() - fig.autofmt_xdate() - - darkred_patch = mpatches.Patch(color='darkred', label='Service period (Recommended for new designs)') - red_patch = mpatches.Patch(color='red', label='Maintenance period') - - plt.legend(handles=[darkred_patch, red_patch], prop={'size': 6}) - fig.set_size_inches(10, 5, forward=True) - plt.savefig(output_chart_name + output_chart_extension) - plt.show() - - -if __name__ == '__main__': - ChartVersions().create_chart() diff --git a/idf_versions.js b/idf_versions.js deleted file mode 100644 index d36ec3182c..0000000000 --- a/idf_versions.js +++ /dev/null @@ -1,96 +0,0 @@ -var DOCUMENTATION_VERSIONS = { - DEFAULTS: { - has_targets: false, - supported_targets: ["esp32"] - }, - VERSIONS: [{ - name: "latest", - has_targets: true, - supported_targets: ["esp32", "esp32s2"] - }, - { - name: "v4.1-rc", - pre_release: true - }, - { - name: "v4.0.1", - old: false - }, - { - name: "v4.0", - old: true - }, - { - name: "v3.3.2" - }, - { - name: "v3.3.1", - old: true - }, - { - name: "v3.3", - old: true - }, - { - name: "v3.2.3", - old: false - }, - { - name: "v3.1.7", - old: false - }, - { - name: "v3.1.6", - old: true - }, - { - name: "v3.0.9", - old: true - }, - { - name: "release-v4.2", - pre_release: true, - has_targets: true, - supported_targets: ["esp32", "esp32s2"] - }, - { - name: "release-v4.1", - pre_release: true - }, - { - name: "release-v4.0", - pre_release: true - }, - { - name: "release-v3.3", - pre_release: true - }, - { - name: "release-v3.2", - pre_release: true - }, - { - name: "release-v3.1", - pre_release: true - } - ], - RELEASES: { - "v3.1": { - "start_date": "2018-09-07", - "end_date": "2020-10-31" - }, - "v3.2": { - "start_date": "2019-04-11", - "end_date": "2020-10-31" - }, - "v3.3": { - "start_date": "2019-09-05", - "end_date": "2022-03-31" - }, - "v4.0": { - "start_date": "2020-02-11", - "end_service": "2021-02-11", - "end_date": "2021-10-31" - } - } -};