Compare commits

...

5 commits

Author SHA1 Message Date
Kévin Commaille 90e764dd56
Merge 73b1936dae into 7fd49a2808 2025-03-21 16:05:43 +00:00
Kévin Commaille 7fd49a2808
Set room version 11 as the default (#2105)
Some checks failed
Spec / 🔎 Validate OpenAPI specifications (push) Has been cancelled
Spec / 🔎 Check Event schema examples (push) Has been cancelled
Spec / 🔎 Check OpenAPI definitions examples (push) Has been cancelled
Spec / 🔎 Check JSON Schemas inline examples (push) Has been cancelled
Spec / ⚙️ Calculate baseURL for later jobs (push) Has been cancelled
Spec / 📢 Run towncrier for changelog (push) Has been cancelled
Spell Check / Spell Check with Typos (push) Has been cancelled
Spec / 🐍 Build OpenAPI definitions (push) Has been cancelled
Spec / 📖 Build the spec (push) Has been cancelled
Spec / 🔎 Validate generated HTML (push) Has been cancelled
Spec / 📖 Build the historical backup spec (push) Has been cancelled
* Set room version 11 as the default

As per MSC4239

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>

* Add changelog

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>

---------

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
2025-03-20 12:00:33 -06:00
Kévin Commaille 73b1936dae
Upgrade Python in CI
Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
2025-02-25 18:35:51 +01:00
Kévin Commaille 8602a1ae8f
Add changelog
Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
2025-02-25 18:31:12 +01:00
Kévin Commaille 41de0b1bf7
Replace Hugo shortcodes in OpenAPI output
Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
2025-02-25 18:27:06 +01:00
5 changed files with 115 additions and 11 deletions

View file

@ -2,6 +2,7 @@ name: "Spec"
env: env:
HUGO_VERSION: 0.139.0 HUGO_VERSION: 0.139.0
PYTHON_VERSION: 3.13
on: on:
push: push:
@ -40,7 +41,7 @@ jobs:
- name: " Setup Python" - name: " Setup Python"
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip' cache: 'pip'
cache-dependency-path: scripts/requirements.txt cache-dependency-path: scripts/requirements.txt
- name: " Install dependencies" - name: " Install dependencies"
@ -59,7 +60,7 @@ jobs:
- name: " Setup Python" - name: " Setup Python"
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip' cache: 'pip'
cache-dependency-path: scripts/requirements.txt cache-dependency-path: scripts/requirements.txt
- name: " Install dependencies" - name: " Install dependencies"
@ -78,7 +79,7 @@ jobs:
- name: " Setup Python" - name: " Setup Python"
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip' cache: 'pip'
cache-dependency-path: scripts/requirements.txt cache-dependency-path: scripts/requirements.txt
- name: " Install dependencies" - name: " Install dependencies"
@ -120,7 +121,7 @@ jobs:
- name: " Setup Python" - name: " Setup Python"
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip' cache: 'pip'
cache-dependency-path: scripts/requirements.txt cache-dependency-path: scripts/requirements.txt
- name: " Install dependencies" - name: " Install dependencies"
@ -172,7 +173,7 @@ jobs:
- name: " Setup Python" - name: " Setup Python"
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: ${{ env.PYTHON_VERSION }}
- name: " Install towncrier" - name: " Install towncrier"
run: "pip install 'towncrier'" run: "pip install 'towncrier'"
- name: "Generate changelog" - name: "Generate changelog"

View file

@ -0,0 +1 @@
Replace Hugo shortcodes in OpenAPI output.

View file

@ -0,0 +1 @@
Update the default room version to 11, as per [MSC4239](https://github.com/matrix-org/matrix-spec-proposals/pull/4239).

View file

@ -52,7 +52,7 @@ stable and unstable periodically for a variety of reasons, including
discovered security vulnerabilities and age. discovered security vulnerabilities and age.
Clients should not ask room administrators to upgrade their rooms if the Clients should not ask room administrators to upgrade their rooms if the
room is running a stable version. Servers SHOULD use **room version 10** as room is running a stable version. Servers SHOULD use **room version 11** as
the default room version when creating new rooms. the default room version when creating new rooms.
The available room versions are: The available room versions are:

View file

@ -32,6 +32,29 @@ import yaml
scripts_dir = os.path.dirname(os.path.abspath(__file__)) scripts_dir = os.path.dirname(os.path.abspath(__file__))
api_dir = os.path.join(os.path.dirname(scripts_dir), "data", "api") api_dir = os.path.join(os.path.dirname(scripts_dir), "data", "api")
# Finds a Hugo shortcode in a string.
#
# A shortcode is defined as (newlines and whitespaces for presentation purpose):
#
# {{%
# <one or more whitespaces>
# <name of shortcode>
# <one or more whitespaces>
# (optional <list of parameters><one or more whitespaces>)
# %}}
#
# With:
#
# * <name of shortcode>: any word character and `-` and `/`.
# * <list of parameters>: any character except `}`, must not start or end with a
# whitespace.
shortcode_regex = re.compile(r"\{\{\%\s+(?P<name>[\w\/-]+)\s+(?:(?P<params>[^\s\}][^\}]+[^\s\}])\s+)?\%\}\}", re.ASCII)
# Parses the parameters of a Hugo shortcode.
#
# For simplicity, this currently only supports the `key="value"` format.
shortcode_params_regex = re.compile(r"(?P<key>\w+)=\"(?P<value>[^\"]+)\"", re.ASCII)
def prefix_absolute_path_references(text, base_url): def prefix_absolute_path_references(text, base_url):
"""Adds base_url to absolute-path references. """Adds base_url to absolute-path references.
@ -44,17 +67,95 @@ def prefix_absolute_path_references(text, base_url):
""" """
return text.replace("](/", "]({}/".format(base_url)) return text.replace("](/", "]({}/".format(base_url))
def edit_links(node, base_url): def replace_match(text, match, replacement):
"""Finds description nodes and makes any links in them absolute.""" """Replaces the regex match by the replacement in the text."""
return text[:match.start()] + replacement + text[match.end():]
def replace_shortcode(text, shortcode):
"""Replaces the shortcode by a Markdown fallback in the text.
The supported shortcodes are:
* boxes/note, boxes/rationale, boxes/warning
* added-in, changed-in
"""
if shortcode['name'].startswith("/"):
# This is the end of the shortcode, just remove it.
return replace_match(text, shortcode['match'], "")
match shortcode['name']:
case "boxes/note":
text = replace_match(text, shortcode['match'], "**NOTE:** ")
case "boxes/rationale":
text = replace_match(text, shortcode['match'], "**RATIONALE:** ")
case "boxes/warning":
text = replace_match(text, shortcode['match'], "**WARNING:** ")
case "added-in":
version = shortcode['params']['v']
if not version:
raise ValueError("Missing parameter `v` for `added-in` shortcode")
text = replace_match(text, shortcode['match'], f"**[Added in `v{version}`]** ")
case "changed-in":
version = shortcode['params']['v']
if not version:
raise ValueError("Missing parameter `v` for `changed-in` shortcode")
text = replace_match(text, shortcode['match'], f"**[Changed in `v{version}`]** ")
case _:
raise ValueError("Unknown shortcode", shortcode['name'])
return text
def find_and_replace_shortcodes(text):
"""Finds Hugo shortcodes and replaces them by a Markdown fallback.
The supported shortcodes are:
* boxes/note, boxes/rationale, boxes/warning
* added-in, changed-in
"""
# We use a `while` loop with `search` instead of a `for` loop with
# `finditer`, because as soon as we start replacing text, the
# indices of the match are invalid.
while match := shortcode_regex.search(text):
# Parse the parameters of the shortcode
params = {}
if match['params']:
for param in shortcode_params_regex.finditer(match['params']):
if param['key']:
params[param['key']] = param['value']
shortcode = {
'name': match['name'],
'params': params,
'match': match,
}
text = replace_shortcode(text, shortcode)
return text
def edit_descriptions(node, base_url):
"""Finds description nodes and apply fixes to them.
The fixes that are applied are:
* Make links absolute
* Replace shortcodes
"""
if isinstance(node, dict): if isinstance(node, dict):
for key in node: for key in node:
if isinstance(node[key], str): if isinstance(node[key], str):
node[key] = prefix_absolute_path_references(node[key], base_url) node[key] = prefix_absolute_path_references(node[key], base_url)
node[key] = find_and_replace_shortcodes(node[key])
else: else:
edit_links(node[key], base_url) edit_descriptions(node[key], base_url)
elif isinstance(node, list): elif isinstance(node, list):
for item in node: for item in node:
edit_links(item, base_url) edit_descriptions(item, base_url)
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
"dump-openapi.py - assemble the OpenAPI specs into a single JSON file" "dump-openapi.py - assemble the OpenAPI specs into a single JSON file"
@ -164,7 +265,7 @@ for filename in os.listdir(selected_api_dir):
if untagged != 0: if untagged != 0:
print("{} untagged operations, you may want to look into fixing that.".format(untagged)) print("{} untagged operations, you may want to look into fixing that.".format(untagged))
edit_links(output, base_url) edit_descriptions(output, base_url)
print("Generating %s" % output_file) print("Generating %s" % output_file)