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 8c02fb7  Rename the API endpoint to announce a release
8c02fb7 is described below

commit 8c02fb7d0c136981daf13a252d6f93ace31ad233
Author: Sean B. Palmer <[email protected]>
AuthorDate: Tue Jul 29 14:17:54 2025 +0100

    Rename the API endpoint to announce a release
---
 atr/blueprints/api/api.py | 74 +++++++++++++++++++++++------------------------
 atr/models/api.py         | 42 +++++++++++++--------------
 2 files changed, 58 insertions(+), 58 deletions(-)

diff --git a/atr/blueprints/api/api.py b/atr/blueprints/api/api.py
index 6e5c005..26401e4 100644
--- a/atr/blueprints/api/api.py
+++ b/atr/blueprints/api/api.py
@@ -64,43 +64,6 @@ import atr.util as util
 DictResponse = tuple[dict[str, Any], int]
 
 
[email protected]("/announce", methods=["POST"])
[email protected]
-@quart_schema.security_scheme([{"BearerAuth": []}])
-@quart_schema.validate_request(models.api.AnnounceArgs)
-@quart_schema.validate_response(models.api.AnnounceResults, 201)
-async def announce_post(data: models.api.AnnounceArgs) -> DictResponse:
-    """
-    Announce a release to the public, making it final.
-
-    After a vote on a release has passed, if everything is in order and all
-    paths are correct, the release can be announced. This will send an email to
-    the specified announement address, and promote the release to the finished
-    release phase.
-    """
-    asf_uid = _jwt_asf_uid()
-
-    try:
-        await announce.announce(
-            data.project,
-            data.version,
-            data.revision,
-            data.email_to,
-            data.subject,
-            data.body,
-            data.path_suffix,
-            asf_uid,
-            asf_uid,
-        )
-    except announce.AnnounceError as e:
-        raise exceptions.BadRequest(str(e))
-
-    return models.api.AnnounceResults(
-        endpoint="/announce",
-        success="Announcement sent",
-    ).model_dump(), 201
-
-
 @api.BLUEPRINT.route("/checks/list/<project>/<version>")
 @quart_schema.validate_response(models.api.ChecksListResults, 200)
 async def checks_list(project: str, version: str) -> DictResponse:
@@ -558,6 +521,43 @@ async def projects_releases(name: str) -> DictResponse:
     ).model_dump(), 200
 
 
[email protected]("/release/announce", methods=["POST"])
[email protected]
+@quart_schema.security_scheme([{"BearerAuth": []}])
+@quart_schema.validate_request(models.api.ReleaseAnnounceArgs)
+@quart_schema.validate_response(models.api.ReleaseAnnounceResults, 201)
+async def release_announce(data: models.api.ReleaseAnnounceArgs) -> 
DictResponse:
+    """
+    Announce a release to the public, making it final.
+
+    After a vote on a release has passed, if everything is in order and all
+    paths are correct, the release can be announced. This will send an email to
+    the specified announement address, and promote the release to the finished
+    release phase.
+    """
+    asf_uid = _jwt_asf_uid()
+
+    try:
+        await announce.announce(
+            data.project,
+            data.version,
+            data.revision,
+            data.email_to,
+            data.subject,
+            data.body,
+            data.path_suffix,
+            asf_uid,
+            asf_uid,
+        )
+    except announce.AnnounceError as e:
+        raise exceptions.BadRequest(str(e))
+
+    return models.api.ReleaseAnnounceResults(
+        endpoint="/release/announce",
+        success=True,
+    ).model_dump(), 201
+
+
 @api.BLUEPRINT.route("/releases")
 @quart_schema.validate_querystring(models.api.ReleasesQuery)
 @quart_schema.validate_response(models.api.ReleasesResults, 200)
diff --git a/atr/models/api.py b/atr/models/api.py
index 61c82cc..f6d0906 100644
--- a/atr/models/api.py
+++ b/atr/models/api.py
@@ -34,24 +34,6 @@ class ResultsTypeError(TypeError):
     pass
 
 
-class AnnounceArgs(schema.Strict):
-    project: str = schema.Field(..., **example("example"))
-    version: str = schema.Field(..., **example("1.0.0"))
-    revision: str = schema.Field(..., **example("00005"))
-    email_to: str = schema.Field(..., **example("[email protected]"))
-    subject: str = schema.Field(..., **example("[ANNOUNCE] Apache Example 
1.0.0 release"))
-    body: str = schema.Field(
-        ...,
-        **example("The Apache Example team is pleased to announce the release 
of Example 1.0.0..."),
-    )
-    path_suffix: str = schema.Field(..., **example("example/1.0.0"))
-
-
-class AnnounceResults(schema.Strict):
-    endpoint: Literal["/announce"] = schema.Field(alias="endpoint")
-    success: str = schema.Field(..., **example("Announcement sent"))
-
-
 class ChecksListResults(schema.Strict):
     endpoint: Literal["/checks/list"] = schema.Field(alias="endpoint")
     checks: Sequence[sql.CheckResult]
@@ -200,6 +182,24 @@ class ProjectsReleasesResults(schema.Strict):
     releases: Sequence[sql.Release]
 
 
+class ReleaseAnnounceArgs(schema.Strict):
+    project: str = schema.Field(..., **example("example"))
+    version: str = schema.Field(..., **example("1.0.0"))
+    revision: str = schema.Field(..., **example("00005"))
+    email_to: str = schema.Field(..., **example("[email protected]"))
+    subject: str = schema.Field(..., **example("[ANNOUNCE] Apache Example 
1.0.0 release"))
+    body: str = schema.Field(
+        ...,
+        **example("The Apache Example team is pleased to announce the release 
of Example 1.0.0..."),
+    )
+    path_suffix: str = schema.Field(..., **example("example/1.0.0"))
+
+
+class ReleaseAnnounceResults(schema.Strict):
+    endpoint: Literal["/release/announce"] = schema.Field(alias="endpoint")
+    success: bool = schema.Field(..., **example(True))
+
+
 @dataclasses.dataclass
 class ReleasesQuery:
     offset: int = 0
@@ -400,8 +400,7 @@ class VerifyProvenanceResults(schema.Strict):
 # This is for *Results classes only
 # We do NOT put *Args classes here
 Results = Annotated[
-    AnnounceResults
-    | ChecksListResults
+    ChecksListResults
     | ChecksOngoingResults
     | CommitteesGetResults
     | CommitteesKeysResults
@@ -417,6 +416,7 @@ Results = Annotated[
     | ProjectsGetResults
     | ProjectsListResults
     | ProjectsReleasesResults
+    | ReleaseAnnounceResults
     | ReleasesResults
     | ReleasesCreateResults
     | ReleasesDeleteResults
@@ -451,7 +451,6 @@ def validator[T](t: type[T]) -> Callable[[Any], T]:
     return validate
 
 
-validate_announce = validator(AnnounceResults)
 validate_checks_list = validator(ChecksListResults)
 validate_checks_ongoing = validator(ChecksOngoingResults)
 validate_committees_get = validator(CommitteesGetResults)
@@ -468,6 +467,7 @@ validate_keys_user = validator(KeysUserResults)
 validate_projects_get = validator(ProjectsGetResults)
 validate_projects_list = validator(ProjectsListResults)
 validate_projects_releases = validator(ProjectsReleasesResults)
+validate_release_announce = validator(ReleaseAnnounceResults)
 validate_releases = validator(ReleasesResults)
 validate_releases_create = validator(ReleasesCreateResults)
 validate_releases_delete = validator(ReleasesDeleteResults)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to