Skip to content
This repository was archived by the owner on Jun 5, 2025. It is now read-only.

Commit 59ad0a7

Browse files
committed
refactor(version endpoint): use requests instead of httpx + ThreadPoolExecutor
1 parent 28aede4 commit 59ad0a7

File tree

2 files changed

+12
-26
lines changed

2 files changed

+12
-26
lines changed

src/codegate/dashboard/dashboard.py

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import asyncio
2-
from concurrent.futures import ThreadPoolExecutor
32
import json
43
from typing import AsyncGenerator, List, Optional
54

6-
from httpx import AsyncClient, HTTPStatusError
5+
import requests
76
import structlog
8-
from fastapi import APIRouter, Depends, FastAPI, HTTPException
7+
from fastapi import APIRouter, Depends, FastAPI
98
from fastapi.responses import StreamingResponse
109
from codegate import __version__
1110

@@ -27,25 +26,17 @@ def get_db_reader():
2726
db_reader = DbReader()
2827
return db_reader
2928

30-
def get_http_client() -> AsyncClient:
31-
return AsyncClient()
32-
33-
async def fetch_latest_version(client: AsyncClient) -> str:
29+
def fetch_latest_version() -> str:
3430
url = "https://api.github.com/repos/stacklok/codegate/releases/latest"
3531
headers = {
3632
"Accept": "application/vnd.github+json",
3733
"X-GitHub-Api-Version": "2022-11-28"
3834
}
39-
response = await client.get(url, headers=headers)
35+
response = requests.get(url, headers=headers)
4036
response.raise_for_status()
4137
data = response.json()
4238
return data.get("tag_name", "unknown")
4339

44-
def fetch_latest_version_sync(client: AsyncClient) -> str:
45-
loop = asyncio.new_event_loop()
46-
asyncio.set_event_loop(loop)
47-
return loop.run_until_complete(fetch_latest_version(client))
48-
4940
@dashboard_router.get("/dashboard/messages")
5041
def get_messages(db_reader: DbReader = Depends(get_db_reader)) -> List[Conversation]:
5142
"""
@@ -82,10 +73,9 @@ async def stream_sse():
8273
return StreamingResponse(generate_sse_events(), media_type="text/event-stream")
8374

8475
@dashboard_router.get("/dashboard/version")
85-
def version_check(client: AsyncClient = Depends(get_http_client)):
76+
def version_check():
8677
try:
87-
with ThreadPoolExecutor() as executor:
88-
latest_version = executor.submit(fetch_latest_version_sync, client).result()
78+
latest_version = fetch_latest_version()
8979

9080
# normalize the versions as github will return them with a 'v' prefix
9181
current_version = __version__.lstrip('v')
@@ -99,13 +89,13 @@ def version_check(client: AsyncClient = Depends(get_http_client)):
9989
"is_latest": is_latest,
10090
"error": None,
10191
}
102-
except HTTPException as e:
103-
logger.error(f"HTTPException: {e.detail}")
92+
except requests.RequestException as e:
93+
logger.error(f"RequestException: {str(e)}")
10494
return {
10595
"current_version": __version__,
10696
"latest_version": "unknown",
10797
"is_latest": None,
108-
"error": "Failed to fetch the latest version"
98+
"error": "An error occurred while fetching the latest version"
10999
}
110100
except Exception as e:
111101
logger.error(f"Unexpected error: {str(e)}")
@@ -115,8 +105,6 @@ def version_check(client: AsyncClient = Depends(get_http_client)):
115105
"is_latest": None,
116106
"error": "An unexpected error occurred"
117107
}
118-
finally:
119-
client.aclose()
120108

121109

122110
def generate_openapi():

tests/test_server.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,19 +81,17 @@ def test_health_check(test_client: TestClient) -> None:
8181
assert response.status_code == 200
8282
assert response.json() == {"status": "healthy"}
8383

84-
@pytest.mark.usefixtures("test_client")
85-
@patch("codegate.dashboard.dashboard.fetch_latest_version", new_callable=AsyncMock)
86-
def test_version_endpoint(mock_fetch_latest_version, test_client) -> None:
84+
@patch("codegate.dashboard.dashboard.fetch_latest_version", return_value="foo")
85+
def test_version_endpoint(mock_fetch_latest_version, test_client: TestClient) -> None:
8786
"""Test the version endpoint."""
88-
mock_fetch_latest_version.return_value = "foo"
89-
9087
response = test_client.get("/dashboard/version")
9188
assert response.status_code == 200
9289

9390
response_data = response.json()
9491

9592
assert response_data["current_version"] == __version__.lstrip('v')
9693
assert response_data["latest_version"] == "foo"
94+
assert isinstance(response_data["is_latest"], bool)
9795
assert response_data["is_latest"] is False
9896

9997
@patch("codegate.pipeline.secrets.manager.SecretsManager")

0 commit comments

Comments
 (0)