From ee73604a41aae2dfddf64a3d716da64f0caf644b Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 29 Jul 2022 14:14:21 +1000 Subject: [PATCH] Automatically generate release information (#335) * Pull InvenTree release information from GitHub * Cache API results to file - Prevents rate limiting during testing * Add 'include' file for auto-generating release notes table * Add entry for 0.8.x --- .gitignore | 3 + _includes/release_table.html | 41 +++++++++++++ docs/hooks.py | 104 +++++++++++++++++++++++++++++++-- docs/releases/release_notes.md | 65 ++++----------------- 4 files changed, 152 insertions(+), 61 deletions(-) create mode 100644 _includes/release_table.html diff --git a/.gitignore b/.gitignore index e6f7042..d75949c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,7 @@ env/ *.pyd *.pyc +# Temp files +releases.json + .vscode \ No newline at end of file diff --git a/_includes/release_table.html b/_includes/release_table.html new file mode 100644 index 0000000..eef618b --- /dev/null +++ b/_includes/release_table.html @@ -0,0 +1,41 @@ + +
+
+ + + + + + + + + + + {% for release in config.releases %} + {% if release.prefix == prefix %} + + + + + + + {% endif %} + {% endfor %} + +
Release Date GitHub Docker
+ {% if release.local_path %} + {{ release.tag_name }} + {% else %} + {{ release.tag_name }} + {% endif %} + {{ release.date }} + {{ release.tag_name }} + + {% if release.docker %} + inventree/inventree:{{ release.tag_name }} + {% else %} + Not available for this release + {% endif %} +
+
+
\ No newline at end of file diff --git a/docs/hooks.py b/docs/hooks.py index 1bd9fff..b097fae 100644 --- a/docs/hooks.py +++ b/docs/hooks.py @@ -2,8 +2,64 @@ Custom mkdocs hooks, using the mkdocs-simple-hooks plugin """ +import json import os +import re +from datetime import datetime +from urllib import request + + +def get_release_data(): + """Return InvenTree release information. + + - First look to see if 'releases.json' file exists + - If data does not exist in this file, request via the github API + """ + + json_file = os.path.join(os.path.dirname(__file__), 'releases.json') + + releases = [] + + if os.path.exists(json_file): + # Release information has been cached to file + + print("Loading release information from 'releases.json'") + with open(json_file) as f: + releases = json.loads(f.read()) + else: + + # Download release information via the GitHub API + print("Fetching InvenTree release information from api.github.com:") + releases = [] + + # Keep making API requests until we run out of results + page = 1 + + while 1: + url = f"https://api.github.com/repos/inventree/inventree/releases?page={page}&per_page=150" + + print(f" - {url}") + + response = request.urlopen(url, timeout=30) + assert(response.status == 200) + + data = json.loads(response.read().decode()) + + if len(data) == 0: + break + + for item in data: + releases.append(item) + + page += 1 + + # Cache these results to file + with open(json_file, 'w') as f: + print("Saving release information to 'releases.json'") + f.write(json.dumps(releases)) + + return releases def on_config(config, *args, **kwargs): """ @@ -68,17 +124,53 @@ def on_config(config, *args, **kwargs): print(f"config.site_url = '{site_url}'") print(f"config.assets_dir = '{assets_dir}'") - return config + release_data = get_release_data() + + releases = [] + for item in release_data: -def my_cfg(config, *args, **kwargs): + # Ignore draft releases + if item['draft']: + continue + + tag = item['tag_name'] - # print(config.keys()) + # Check that the tag is formatted correctly + re.match('^\d+\.\d+\.\d+$', tag) - for k in config.keys(): - print(f"- {k}") + if not re.match: + print(f"Found badly formatted release: {tag}") + continue - print(config['site_url']) + # Check if there is a local file with release information + local_path = os.path.join( + os.path.dirname(__file__), + 'releases', + f'{tag}.md', + ) + + if os.path.exists(local_path): + item['local_path'] = local_path + + # Extract the date + item['date'] = item['published_at'].split('T')[0] + + date = datetime.fromisoformat(item['date']) + + # First tagged docker release was 2021-04-18 + if date > datetime(year=2021, month=4, day=17): + item['docker'] = True + + # Add a "prefix" so we can split by sub version + item['prefix'] = '.'.join(tag.split('.')[:-1]) + + releases.append(item) + + print(f"- found {len(releases)} releases.") + + # Sort releases by descending date + config['releases'] = sorted(releases, key=lambda it: it['date'], reverse=True) return config diff --git a/docs/releases/release_notes.md b/docs/releases/release_notes.md index 5f0df73..017ba39 100644 --- a/docs/releases/release_notes.md +++ b/docs/releases/release_notes.md @@ -27,74 +27,29 @@ Specific tagged releases are shown below. Click on the release notes for each ve !!! info "Release Notes" Starting from v0.7.2, release notes have been migrated to GitHub. Release notes for older versions are available at the links below. -### 0.7.x -| Release | Date | GitHub | Docker | -| --- | --- | --- | --- | -| 0.7.7 | 2022-07-26 | [0.7.7](https://github.com/inventree/InvenTree/releases/tag/0.7.7) | inventree:0.7.7 | -| 0.7.6 | 2022-07-22 | [0.7.6](https://github.com/inventree/InvenTree/releases/tag/0.7.6) | inventree:0.7.6 | -| 0.7.5 | 2022-07-15 | [0.7.5](https://github.com/inventree/InvenTree/releases/tag/0.7.5) | inventree:0.7.5 | -| 0.7.4 | 2022-06-23 | [0.7.4](https://github.com/inventree/InvenTree/releases/tag/0.7.4) | inventree:0.7.4 | -| 0.7.3 | 2022-06-16 | [0.7.3](https://github.com/inventree/InvenTree/releases/tag/0.7.3) | inventree:0.7.3 | -| 0.7.2 | 2022-06-15 | [0.7.2](https://github.com/inventree/InvenTree/releases/tag/0.7.2) | inventree:0.7.2 | -| [0.7.1](./0.7.1.md) | 2022-06-02 | [0.7.1](https://github.com/inventree/InvenTree/releases/tag/0.7.1) | [inventree:0.7.1](https://hub.docker.com/layers/inventree/inventree/inventree/0.7.1/images/sha256-5da112efd1aa43d2e22df7053e6344e884d094aaddcf6401f0ccbaac245e61da?context=explore) | -| [0.7.0](./0.7.0.md) | 2022-05-24 | [0.7.0](https://github.com/inventree/InvenTree/releases/tag/0.7.0) | [inventree:0.7.0](https://hub.docker.com/layers/inventree/inventree/inventree/0.7.0/images/sha256-b15d2970e1577cc8e2429487636f07576912cec8d3c7ee0227c3e51711f0042a?context=explore) | +### 0.8.x +{% with prefix="0.8" %}{% include "release_table.html" %}{% endwith %} +### 0.7.x +{% with prefix="0.7" %}{% include "release_table.html" %}{% endwith %} ### 0.6.x -| Release | Date | GitHub | Docker | -| --- | --- | --- | --- | -| [0.6.4](./0.6.4.md) | 2022-05-10 | [0.6.4](https://github.com/inventree/InvenTree/releases/tag/0.6.4) | [inventree:0.6.4](https://hub.docker.com/layers/inventree/inventree/inventree/0.6.4/images/sha256-9b89052490e6b43edc541f2a0856397db85742749fa8f2a262a0654b0532f7a9?context=explore) | -| [0.6.3](./0.6.3.md) | 2022-03-30 | [0.6.3](https://github.com/inventree/InvenTree/releases/tag/0.6.3) | [inventree:0.6.3](https://hub.docker.com/layers/inventree/inventree/inventree/0.6.3/images/sha256-dc583301371686a30c919a25dd68e5101ea9ecb8cb63dde617fa8b2c44c27ff6?context=explore) | -| [0.6.2](./0.6.2.md) | 2022-03-10 | [0.6.2](https://github.com/inventree/InvenTree/releases/tag/0.6.2) | [inventree:0.6.2](https://hub.docker.com/layers/inventree/inventree/0.6.2/images/sha256-09e8a4a95285906b4d1d5dbd2274f56595f0b402c296d59eca2c8534c0242257?context=explore) | -| [0.6.1](./0.6.1.md) | 2022-03-04 | [0.6.1](https://github.com/inventree/InvenTree/releases/tag/0.6.1) | [inventree:0.6.1](https://hub.docker.com/layers/inventree/inventree/0.6.1/images/sha256-7586a9feaa50e2928742ea4b0a6441505984b196105a7f84b70b845d42e4af75?context=explore) | -| [0.6.0](./0.6.0.md) | 2022-02-21 | [0.6.0](https://github.com/inventree/InvenTree/releases/tag/0.6.0) | [inventree:0.6.0](https://hub.docker.com/layers/inventree/inventree/0.6.0/images/sha256-7f4d936d8647ee107a04752f13265687c580c89d5afdd4565e7073f2c32b357a?context=explore) | +{% with prefix="0.6" %}{% include "release_table.html" %}{% endwith %} ### 0.5.x - -| Release | Date | GitHub | Docker | -| --- | --- | --- | --- | -| [0.5.4](./0.5.4.md) | 2021-11-3 | [0.5.4](https://github.com/inventree/InvenTree/releases/tag/0.5.4) | [inventree:0.5.4](https://hub.docker.com/layers/inventree/inventree/0.5.4/images/sha256-35512b55ea1f78a802c915d3ea920bb8e1ef0c8f3f1b68ec1941d2a6a1141bd3?context=explore) | -| [0.5.3](./0.5.3.md) | 2021-10-19 | [0.5.3](https://github.com/inventree/InvenTree/releases/tag/0.5.3) | [inventree:0.5.3](https://hub.docker.com/layers/inventree/inventree/0.5.3/images/sha256-ecdfbd2906241b2495cee3c5acc12bdec5ed66b2d32ab146dbc2b71131a73a7a?context=explore) | -| [0.5.2](./0.5.2.md) | 2021-10-19 | [0.5.2](https://github.com/inventree/InvenTree/releases/tag/0.5.2) | [inventree:0.5.2](https://hub.docker.com/layers/inventree/inventree/0.5.2/images/sha256-ff4f435df894c5aa5ea18ee7f3637e81a29ed356ed82dba70ecbd28da3e3d965?context=explore) | -| [0.5.1](./0.5.1.md) | 2021-10-11 | [0.5.1](https://github.com/inventree/InvenTree/releases/tag/0.5.1) | [inventree:0.5.1](https://hub.docker.com/layers/inventree/inventree/0.5.1/images/sha256-3dbfb2e1bc73a0ff2bf537b56f7151c98097923cf77f5313a2a914586ab75973?context=explore) | -| [0.5.0](./0.5.0.md) | 2021-10-1 | [0.5.0](https://github.com/inventree/InvenTree/releases/tag/0.5.0) | [inventree:0.5.0](https://hub.docker.com/layers/inventree/inventree/0.5.0/images/sha256-eed8b5df1512d4f1f8596d782d894f8e582c0978d0109020da3ee852bb9326ee?context=explore) | +{% with prefix="0.5" %}{% include "release_table.html" %}{% endwith %} ### 0.4.x - -| Release | Date | GitHub | Docker | -| --- | --- | --- | --- | -| [0.4.5](./0.4.5.md) | 2021-08-10 | [0.4.5](https://github.com/inventree/InvenTree/releases/tag/0.4.5) | [inventree:0.4.5](https://hub.docker.com/layers/inventree/inventree/0.4.5/images/sha256-87c84512b31b9a5a0810c79fcb9a9f4515395d0c610619017e41d28b52946eaa?context=explore) | -| [0.4.4](./0.4.4.md) | 2021-08-09 | [0.4.4](https://github.com/inventree/InvenTree/releases/tag/0.4.4) | [inventree:0.4.4](https://hub.docker.com/layers/inventree/inventree/0.4.4/images/sha256-adf5f8515a1a1f8b35404e1bb634ef31572baf9472fd5e6920327953c822e477?context=explore) | -| [0.4.3](./0.4.3.md) | 2021-08-05 | [0.4.3](https://github.com/inventree/InvenTree/releases/tag/0.4.3) | [inventree:0.4.3](https://hub.docker.com/layers/inventree/inventree/0.4.3/images/sha256-441af7821e59c1f96e012fe3060497aa8da9d085701513d1eab3a45c42297fc8?context=explore) | -| [0.4.2](./0.4.2.md) | 2021-08-02 | [0.4.2](https://github.com/inventree/InvenTree/releases/tag/0.4.2) | [inventree:0.4.2](https://hub.docker.com/layers/inventree/inventree/0.4.2/images/sha256-987c656ec21cc8f8dc1c1d74d5443368161b6ef27cb823edcbcddd5aa28ccf6c?context=explore) | -| [0.4.1](./0.4.1.md) | 2021-07-31 | [0.4.1](https://github.com/inventree/InvenTree/releases/tag/0.4.1) | [inventree:0.4.1](https://hub.docker.com/layers/inventree/inventree/0.4.1/images/sha256-fa0560d4b1fa99c5e49f8d1b1f78893ef0361db7a05f92aed08d1a405fe715c4?context=explore) | -| [0.4.0](./0.4.0.md) | 2021-07-28 | [0.4.0](https://github.com/inventree/InvenTree/releases/tag/0.4.0) | [inventree:0.4.0](https://hub.docker.com/layers/inventree/inventree/0.4.0/images/sha256-475cbd226b4a2ac2a23106e33d84497642b1e373a9d7521e6773c1ea4d0b32c9?context=explore) | +{% with prefix="0.4" %}{% include "release_table.html" %}{% endwith %} ### 0.3.x - -| Release | Date | GitHub | Docker | -| --- | --- | --- | --- | -| [0.3.0](./0.3.0.md) | 2021-07-15 | [0.3.0](https://github.com/inventree/InvenTree/releases/tag/0.3.0) | [inventree:0.3.0](https://hub.docker.com/layers/inventree/inventree/0.3.0/images/sha256-b442a236fbc4b91e1e5fdbba2a080655e30447422aaa2e32cd6053571900b2c3?context=explore) | +{% with prefix="0.3" %}{% include "release_table.html" %}{% endwith %} ### 0.2.x - -| Release | Date | GitHub | Docker | -| --- | --- | --- | --- | -| [0.2.4](./0.2.4.md) | 2021-06-27 | [0.2.4](https://github.com/inventree/InvenTree/releases/tag/0.2.4) | [inventree:0.2.4](https://hub.docker.com/layers/inventree/inventree/0.2.4/images/sha256-a7a9f860d4ef47cda83ca79edc147a6b7d4c86860cd92d37e5e4fc5bec95da82?context=explore) | -| [0.2.3](./0.2.3.md) | 2021-06-16 | [0.2.3](https://github.com/inventree/InvenTree/releases/tag/0.2.3) | [inventree:0.2.3](https://hub.docker.com/layers/inventree/inventree/0.2.3/images/sha256-527c78eb7e32cbf67f82ba5226f9a9486c1de58c03057c7c9edc7626f6127f02?context=explore) | -| [0.2.2](./0.2.2.md) | 2021-05-29 | [0.2.2](https://github.com/inventree/InvenTree/releases/tag/0.2.2) | [inventree:0.2.2](https://hub.docker.com/layers/inventree/inventree/0.2.2/images/sha256-cd6f13de516ceae53dbe9e4d1ff014a040f71f5651e7099e9299f2e678a51209?context=explore) | -| [0.2.1](./0.2.1.md) | 2021-04-18 | [0.2.1](https://github.com/inventree/InvenTree/releases/tag/0.2.1) | [inventree:0.2.1](https://hub.docker.com/layers/inventree/inventree/0.2.1/images/sha256-ea6932dd19864df2a7918f244ec5e5b3eeb06d2c9e4892bdcc7d4b491721b4e6?context=explore) | -| [0.2.0](./0.2.0.md) | 2021-04-11 | [0.2.0](https://github.com/inventree/InvenTree/releases/tag/0.2.0) | - | +{% with prefix="0.2" %}{% include "release_table.html" %}{% endwith %} ### 0.1.x - -| Release | Date | GitHub | Docker | -| --- | --- | --- | --- | -| [0.1.8](./0.1.8.md) | 2021-04-10 | [0.1.8](https://github.com/inventree/InvenTree/releases/tag/0.1.8) | - | -| [0.1.7](./0.1.7.md) | 2021-03-04 | [0.1.7](https://github.com/inventree/InvenTree/releases/tag/0.1.7) | - | -| [0.1.6](./0.1.6.md) | 2021-02-21 | [0.1.6](https://github.com/inventree/InvenTree/releases/tag/0.1.6) | - | -| [0.1.5](./0.1.5.md) | 2021-01-19 | [0.1.5](https://github.com/inventree/InvenTree/releases/tag/0.1.5) | - | -| [0.1.4](./0.1.4.md) | 2020-11-15 | [0.1.4](https://github.com/inventree/InvenTree/releases/tag/0.1.4) | - | +{% with prefix="0.1" %}{% include "release_table.html" %}{% endwith %} ## Upcoming Features