This is an automated email from the ASF dual-hosted git repository.
sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-release.git
The following commit(s) were added to refs/heads/main by this push:
new 2b9175b Add a discriminator to API specific outputs
2b9175b is described below
commit 2b9175ba94b352f8b61fe06a4f76b446b8a54a4a
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Jul 14 19:36:13 2025 +0100
Add a discriminator to API specific outputs
---
atr/blueprints/api/api.py | 4 ++--
atr/models/api.py | 31 +++++++++++++++++++++++++++----
atr/models/results.py | 4 ++--
3 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/atr/blueprints/api/api.py b/atr/blueprints/api/api.py
index f50661f..d59236c 100644
--- a/atr/blueprints/api/api.py
+++ b/atr/blueprints/api/api.py
@@ -91,7 +91,7 @@ async def checks_list_project_version_revision(project: str,
version: str, revis
@api.BLUEPRINT.route("/checks/ongoing/<project>/<version>")
@api.BLUEPRINT.route("/checks/ongoing/<project>/<version>/<revision>")
-@quart_schema.validate_response(models.api.ResultCount, 200)
+@quart_schema.validate_response(models.api.Count, 200)
async def checks_ongoing_project_version(
project: str,
version: str,
@@ -113,7 +113,7 @@ async def checks_ongoing_project_version(
# Iterator[bytes],
# Iterator[str],
# ]
- return models.api.ResultCount(count=ongoing_tasks_count).model_dump(), 200
+ return models.api.Count(kind="count",
count=ongoing_tasks_count).model_dump(), 200
@api.BLUEPRINT.route("/committees")
diff --git a/atr/models/api.py b/atr/models/api.py
index bb668ac..1662806 100644
--- a/atr/models/api.py
+++ b/atr/models/api.py
@@ -16,10 +16,17 @@
# under the License.
import dataclasses
+from typing import Annotated, Any, Literal
+
+import pydantic
from . import schema
+class ResultsTypeError(TypeError):
+ pass
+
+
@dataclasses.dataclass
class Pagination:
offset: int = 0
@@ -43,6 +50,11 @@ class AsfuidPat(schema.Strict):
pat: str
+class Count(schema.Strict):
+ kind: Literal["count"] = schema.Field(alias="kind")
+ count: int
+
+
class ProjectVersion(schema.Strict):
project: str
version: str
@@ -55,10 +67,6 @@ class ProjectVersionRelpathContent(schema.Strict):
content: str
-class ResultCount(schema.Strict):
- count: int
-
-
class VoteStart(schema.Strict):
project: str
version: str
@@ -67,3 +75,18 @@ class VoteStart(schema.Strict):
vote_duration: int
subject: str
body: str
+
+
+Results = Annotated[
+ Count,
+ schema.Field(discriminator="kind"),
+]
+
+ResultsAdapter = pydantic.TypeAdapter(Results)
+
+
+def validate_count(value: Any) -> Count:
+ count = ResultsAdapter.validate_python(value)
+ if not isinstance(count, Count):
+ raise ResultsTypeError(f"Invalid API response: {value}")
+ return count
diff --git a/atr/models/results.py b/atr/models/results.py
index 5f6c6f6..0f9bee0 100644
--- a/atr/models/results.py
+++ b/atr/models/results.py
@@ -17,7 +17,7 @@
from typing import Annotated, Literal
-from pydantic import TypeAdapter
+import pydantic
from . import schema
@@ -70,4 +70,4 @@ Results = Annotated[
schema.Field(discriminator="kind"),
]
-ResultsAdapter = TypeAdapter(Results)
+ResultsAdapter = pydantic.TypeAdapter(Results)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]