|
1 | 1 | import base64 |
2 | 2 | import dataclasses |
3 | 3 | import os |
| 4 | +import subprocess |
4 | 5 | import sys |
5 | 6 | import typing as t |
6 | 7 | import warnings |
7 | 8 | from pathlib import Path |
| 9 | +from typing import List, Optional |
8 | 10 |
|
9 | 11 | import docspec |
10 | 12 | import requests |
| 13 | +from packaging.version import Version |
11 | 14 | from pydoc_markdown.contrib.renderers.markdown import MarkdownRenderer |
12 | 15 | from pydoc_markdown.interfaces import Context, Renderer |
13 | 16 |
|
@@ -145,3 +148,65 @@ def _doc_version(self) -> str: |
145 | 148 | Returns the hardcoded docs version 2.0. |
146 | 149 | """ |
147 | 150 | return "v2.0" |
| 151 | + |
| 152 | + |
| 153 | +@dataclasses.dataclass |
| 154 | +class ReadmeCoreRenderer(ReadmeRenderer): |
| 155 | + """ |
| 156 | + This custom Renderer behaves just like the ReadmeRenderer but gets the version from `hatch`. |
| 157 | + This is meant to be used by the Haystack core repository. |
| 158 | + """ |
| 159 | + |
| 160 | + def _doc_version(self) -> str: |
| 161 | + """ |
| 162 | + Returns the docs version. |
| 163 | + """ |
| 164 | + # We're assuming hatch is installed and working |
| 165 | + res = subprocess.run(["hatch", "version"], capture_output=True, check=True) |
| 166 | + res.check_returncode() |
| 167 | + full_version = res.stdout.decode().strip() |
| 168 | + major, minor = full_version.split(".")[:2] |
| 169 | + if "rc0" in full_version: |
| 170 | + return f"v{major}.{minor}-unstable" |
| 171 | + return f"v{major}.{minor}" |
| 172 | + |
| 173 | + |
| 174 | +@dataclasses.dataclass |
| 175 | +class ReadmeIntegrationRenderer(ReadmeRenderer): |
| 176 | + """ |
| 177 | + This custom Renderer behaves just like the ReadmeRenderer but get the latest stable Haystack version released. |
| 178 | + This is meant to be used by the Haystack integration repository. |
| 179 | + """ |
| 180 | + |
| 181 | + def _get_latest_stable_version(self, versions: List[Version]) -> Optional[Version]: |
| 182 | + latest_version = None |
| 183 | + for version in versions: |
| 184 | + if version.pre or version.dev: |
| 185 | + # Skip pre-releases, we only want stable ones |
| 186 | + continue |
| 187 | + if latest_version is None or version > latest_version: |
| 188 | + latest_version = version |
| 189 | + return latest_version |
| 190 | + |
| 191 | + def _doc_version(self) -> str: |
| 192 | + """ |
| 193 | + Returns the docs version. |
| 194 | + """ |
| 195 | + # Get the Haystack data from PyPI |
| 196 | + res = requests.get( |
| 197 | + "https://pypi.org/simple/haystack-ai", |
| 198 | + headers={"Accept": "application/vnd.pypi.simple.v1+json"}, |
| 199 | + timeout=30, |
| 200 | + ) |
| 201 | + res.raise_for_status() |
| 202 | + |
| 203 | + data = res.json() |
| 204 | + versions = [Version(v) for v in data["versions"]] |
| 205 | + |
| 206 | + latest_version = self._get_latest_stable_version(versions) |
| 207 | + if latest_version is None: |
| 208 | + msg = "No stable version found" |
| 209 | + raise ValueError(msg) |
| 210 | + |
| 211 | + major, minor = latest_version.major, latest_version.minor |
| 212 | + return f"v{major}.{minor}" |
0 commit comments