Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 41 additions & 26 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,33 +31,48 @@ jobs:
git config --global user.email "github-actions[bot]@users.noreply.github.com"

- name: Fetch gh-pages branch (if exists)
run: git fetch origin gh-pages:gh-pages || echo "gh-pages does not exist yet"

- name: Deploy documentation
run: |
if [[ "${GITHUB_REF}" == refs/heads/master ]]; then
echo "→ Deploying latest"
mike deploy latest --push --update-aliases
mike set-default latest --push
elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then
VERSION="${GITHUB_REF#refs/tags/}"
echo "→ Deploying version $VERSION"
mike deploy "$VERSION" --push --update-aliases
mike set-default --push stable
run: git fetch origin gh-pages:gh-pages || echo "gh-pages does not exist yet"

- name: Extract versions.json
run: |
if git show origin/gh-pages:versions.json > versions.json 2>/dev/null; then
echo "Extracted versions.json from gh-pages"
else
echo '{"versions": []}' > versions.json
echo "Created empty versions.json because gh-pages does not exist yet"
fi

- name: Copy and commit CNAME file (if exists)
run: |
git checkout gh-pages
if git checkout master -- docs/CNAME 2>/dev/null; then
mv docs/CNAME .
git add CNAME
if ! git diff --cached --quiet; then
git commit -m "Update CNAME file"
git push origin gh-pages
else
echo "No changes to commit for CNAME"
fi
- name: Filter versions
run: |
python scripts/filter_versions.py versions.json > version_filter_output.json
Comment on lines +45 to +47

- name: Deploy version from tag (if tag triggered)
if: startsWith(github.ref, 'refs/tags/')
run: |
version="v${GITHUB_REF#refs/tags/}"
echo "Deploying version from tag: $version"
mike deploy --push "$version"

Comment on lines +52 to +55
- name: Deploy visible versions
run: |
for v in $(jq -r '.visible[]' version_filter_output.json); do
mike deploy --push $v
done

- name: Deploy hidden versions
run: |
for v in $(jq -r '.hidden[]' version_filter_output.json); do
mike deploy --push --hidden $v
done
Comment on lines +56 to +66

- name: Set default version
run: |
latest=$(jq -r '.visible[0]' version_filter_output.json)
if [ "$latest" = "null" ] || [ -z "$latest" ]; then
echo "No visible versions found — skipping set-default"
else
echo "No CNAME file found in master branch"
mike set-default --push "$latest"
fi
Comment on lines +68 to 75



5 changes: 5 additions & 0 deletions docs/archive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Version Archive

This page lists all TM1py documentation versions.

Older versions are accessible here even if they’re hidden from the version selector.
Comment on lines +1 to +5
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ nav:
- How to Contribute: how-to-contribute.md
- Links: links.md
- API Reference: reference/
- Archive: archive.md

exclude_docs: |
README.md
Expand Down
79 changes: 79 additions & 0 deletions scripts/filter_versions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import json
import re
import sys
from packaging.version import Version
Comment on lines +1 to +4

def parse_version(v):
"""Convert 'v2.1.3' → Version('2.1.3')"""
return Version(v.lstrip("v"))

def load_versions(path):
with open(path, "r") as f:
data = json.load(f)
return [entry["version"] for entry in data["versions"]]

def group_versions(versions):
parsed = [parse_version(v) for v in versions]
parsed.sort(reverse=True)
Comment on lines +15 to +17

# Group by major.minor
groups = {}
for v in parsed:
key = f"{v.major}.{v.minor}"
groups.setdefault(key, []).append(v)

return parsed, groups

def select_visible(parsed, groups):
visible = []

# 1. Previous major version (e.g., v2.x if current is v3.x)
current_major = parsed[0].major
previous_major = current_major - 1

for v in parsed:
if v.major == previous_major:
visible.append(v)
break # only latest patch of previous major

# 2. Last 3 minor versions of current major
current_minor_groups = [
g for g in groups.keys()
if g.startswith(f"{current_major}.")
]
current_minor_groups.sort(reverse=True)
last_three = current_minor_groups[:3]

for minor in last_three:
latest_patch = groups[minor][0] # sorted desc
visible.append(latest_patch)

return visible
Comment on lines +27 to +51

def main():
path = sys.argv[1] if len(sys.argv) > 1 else "versions.json"
versions = load_versions(path)

# In case of first run case as no versions exist yet
if not versions:
output = {
"visible": [],
"hidden": []
}
print(json.dumps(output, indent=2))
return

parsed, groups = group_versions(versions)
visible = select_visible(parsed, groups)
visible_strings = [f"v{v.public}" for v in visible]
hidden_strings = [v for v in versions if v not in visible_strings]

Comment on lines +66 to +70
output = {
"visible": visible_strings,
"hidden": hidden_strings
}

print(json.dumps(output, indent=2))

if __name__ == "__main__":
main()