Files
slsDetectorPackage/docs/main_index/render_main_index.py
T
mazzol_a 6df1aba669
Build on RHEL9 docker image / build (push) Successful in 4m42s
Build on RHEL8 docker image / build (push) Successful in 5m2s
Run Simulator Tests on local RHEL9 / build (push) Successful in 19m31s
Run Simulator Tests on local RHEL8 / build (push) Successful in 23m5s
10.1.0/upload documentation workflow (#1617)
* Fix/automate documentation (#1611)

* also update developer

* mofified for testing

* fixed error message

* temporarily disable all workflows

* reference branch with /ref/head

* force cherry-pick

* allow empty commit

* set write permissions

* dont push update when updating version

* Revert "temporarily disable all workflows"

This reverts commit d8c67354d6.

* use indices from relese list

* removed versions.yaml

* always sort the releases

* forgot to use github token (#1616)

* forgot to use github token

* fix for minor version
2026-10-09 09:12:23 +02:00

121 lines
3.7 KiB
Python

"""
Render the index HTML from a Jinja2 template with release data.
The release data is a JSON list as produced by
gh release list --json tagName,publishedAt
Usage:
python render_main_index.py --data releases.json --template index.html.j2 --output index.html
"""
import argparse
import json
from pathlib import Path
from jinja2 import Template
import os
from datetime import date
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
MIN_VERSION = (5, 0, 0) # releases older than this are not listed
MIN_DOCS_VERSION = (9, 0, 0) # releases older than this have no docs
def parse_version(tag: str):
"""Return (major, minor, patch) for a tag like '10.0.1', or None for e.g. '7.0.0.rc1'."""
parts = tag.split('.')
if len(parts) != 3 or not all(p.isdigit() for p in parts):
return None
return tuple(int(p) for p in parts)
def release_type(version):
"""Derive the release type from the version number."""
_, minor, patch = version
if patch != 0:
return "Bug Fix"
if minor != 0:
return "Minor"
return "Major"
def read_release_json(data_path: Path):
"""Load release data from JSON file, newest version first."""
with open(data_path, 'r') as f:
releases = json.load(f)
versions = []
for release in releases:
version = parse_version(release['tagName'])
if version is None or version < MIN_VERSION:
continue
versions.append({
'version': release['tagName'],
'type': release_type(version),
'date': release['publishedAt'].split('T')[0],
'has_docs': version >= MIN_DOCS_VERSION,
'_key': version,
})
versions.sort(key=lambda v: v['_key'], reverse=True)
return versions
def render_template(template_path: Path, output_path: Path, versions : list):
"""Render the Jinja2 template with version data."""
with open(template_path, 'r') as f:
template = Template(f.read())
html = template.render(
versions=versions
)
with open(output_path, 'w') as f:
f.write(html)
print(f"✓ Rendered {output_path}")
def add_version(version: str, versions : list):
"""Add a version to the versions dict if it is not already present."""
tuple_version = parse_version(version)
if version not in versions:
versions.insert(0,{
'version': version,
'type': release_type(tuple_version),
'date': date.today().strftime("%Y-%m-%d"),
'has_docs': tuple_version >= MIN_DOCS_VERSION,
'_key': tuple_version,
})
versions.sort(key=lambda v: v['_key'], reverse=True)
def main():
parser = argparse.ArgumentParser(description='Render main index HTML from release data')
parser.add_argument('--json_releases', type=Path,
help='Path to releases JSON data file')
parser.add_argument('--new_version', type=str,
help='New version to add to the releases data')
# Options for rendering
parser.add_argument('--template', type=Path, default=Path(SCRIPT_DIR + "/index.html.j2"),
help='Path to Jinja2 template file')
parser.add_argument('--output', type=Path, default=Path(SCRIPT_DIR + "/index.html"),
help='Path to output HTML file')
args = parser.parse_args()
versions = read_release_json(args.json_releases)
if args.new_version:
add_version(args.new_version, versions)
# Render template if requested
if args.template and args.output:
render_template(args.template, args.output, versions)
elif args.template or args.output:
parser.error("--template and --output must be used together")
if __name__ == '__main__':
main()