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]