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]

Reply via email to