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-releases.git
The following commit(s) were added to refs/heads/main by this push:
new 85f65fa Fix function order in GET route modules
85f65fa is described below
commit 85f65fa2a48aa566672713abd9b67c64fe25ec3f
Author: Sean B. Palmer <[email protected]>
AuthorDate: Tue Dec 23 18:51:12 2025 +0000
Fix function order in GET route modules
---
atr/get/announce.py | 116 ++++++++++++++++++++++++++--------------------------
atr/get/file.py | 34 +++++++--------
atr/get/finish.py | 20 ++++-----
atr/get/manual.py | 38 ++++++++---------
atr/get/root.py | 10 ++---
atr/get/start.py | 72 ++++++++++++++++----------------
atr/get/voting.py | 10 ++---
7 files changed, 150 insertions(+), 150 deletions(-)
diff --git a/atr/get/announce.py b/atr/get/announce.py
index 1025aee..d2395db 100644
--- a/atr/get/announce.py
+++ b/atr/get/announce.py
@@ -86,6 +86,64 @@ async def selected(session: web.Committer, project_name:
str, version_name: str)
)
+def _render_body_tabs(default_body: str) -> htm.Element:
+ """Render the tabbed interface for body editing and preview."""
+ return render.body_tabs("announce-body", default_body,
construct.announce_template_variables())
+
+
+def _render_download_path_field(default_value: str, description: str) ->
htm.Element:
+ """Render the download path suffix field with custom help text."""
+ base_text = description.split(" plus this suffix")[0] if (" plus this
suffix" in description) else description
+ return htm.div[
+ htpy.input(
+ "#download_path_suffix.form-control",
+ type="text",
+ name="download_path_suffix",
+ value=default_value,
+ ),
+ htpy.div(".form-text.text-muted.mt-2",
data_base_text=base_text)[description],
+ ]
+
+
+def _render_mailing_list_with_warning(choices: list[tuple[str, str]],
default_value: str) -> htm.Element:
+ """Render the mailing list radio buttons with a warning card."""
+ container = htm.Block(htm.div)
+
+ # Radio buttons
+ radio_container = htm.div(".d-flex.flex-wrap.gap-2.mb-3")
+ radio_buttons = []
+ for value, label in choices:
+ radio_id = f"mailing_list_{value}"
+ radio_attrs = {
+ "type": "radio",
+ "name": "mailing_list",
+ "value": value,
+ }
+ if value == default_value:
+ radio_attrs["checked"] = ""
+
+ radio_buttons.append(
+ htm.div(".form-check")[
+ htpy.input(f"#{radio_id}.form-check-input", **radio_attrs),
+ htpy.label(".form-check-label", for_=radio_id)[label],
+ ]
+ )
+ container.append(radio_container[radio_buttons])
+
+ # Warning card
+ warning_card = htm.div(".card.bg-warning-subtle.mb-3")[
+ htm.span(".card-body.p-3")[
+ htpy.i(".bi.bi-exclamation-triangle.me-1"),
+ htm.strong["TODO: "],
+ "The limited options above are provided for testing purposes. In
the finished version of ATR, "
+ "you will be able to send to your own specified mailing lists.",
+ ]
+ ]
+ container.append(warning_card)
+
+ return container.collect()
+
+
async def _render_page(
release: sql.Release,
mailing_list_choices: list[tuple[str, str]],
@@ -172,61 +230,3 @@ def _render_release_card(release: sql.Release) ->
htm.Element:
],
]
return card
-
-
-def _render_body_tabs(default_body: str) -> htm.Element:
- """Render the tabbed interface for body editing and preview."""
- return render.body_tabs("announce-body", default_body,
construct.announce_template_variables())
-
-
-def _render_mailing_list_with_warning(choices: list[tuple[str, str]],
default_value: str) -> htm.Element:
- """Render the mailing list radio buttons with a warning card."""
- container = htm.Block(htm.div)
-
- # Radio buttons
- radio_container = htm.div(".d-flex.flex-wrap.gap-2.mb-3")
- radio_buttons = []
- for value, label in choices:
- radio_id = f"mailing_list_{value}"
- radio_attrs = {
- "type": "radio",
- "name": "mailing_list",
- "value": value,
- }
- if value == default_value:
- radio_attrs["checked"] = ""
-
- radio_buttons.append(
- htm.div(".form-check")[
- htpy.input(f"#{radio_id}.form-check-input", **radio_attrs),
- htpy.label(".form-check-label", for_=radio_id)[label],
- ]
- )
- container.append(radio_container[radio_buttons])
-
- # Warning card
- warning_card = htm.div(".card.bg-warning-subtle.mb-3")[
- htm.span(".card-body.p-3")[
- htpy.i(".bi.bi-exclamation-triangle.me-1"),
- htm.strong["TODO: "],
- "The limited options above are provided for testing purposes. In
the finished version of ATR, "
- "you will be able to send to your own specified mailing lists.",
- ]
- ]
- container.append(warning_card)
-
- return container.collect()
-
-
-def _render_download_path_field(default_value: str, description: str) ->
htm.Element:
- """Render the download path suffix field with custom help text."""
- base_text = description.split(" plus this suffix")[0] if (" plus this
suffix" in description) else description
- return htm.div[
- htpy.input(
- "#download_path_suffix.form-control",
- type="text",
- name="download_path_suffix",
- value=default_value,
- ),
- htpy.div(".form-text.text-muted.mt-2",
data_base_text=base_text)[description],
- ]
diff --git a/atr/get/file.py b/atr/get/file.py
index 225f892..165f42e 100644
--- a/atr/get/file.py
+++ b/atr/get/file.py
@@ -175,23 +175,6 @@ async def selected_path(session: web.Committer,
project_name: str, version_name:
)
-def _render_file_content(block: htm.Block, content: str, is_text: bool,
is_truncated: bool, max_view_size: int) -> None:
- card = htm.Block(htm.div, classes=".card.mb-4")
- card.div(".card-header")[htm.h3(".mb-0")["File content" + (" (Hexdump)" if
(not is_text) else "")]]
-
- if is_text:
-
card.div(".card-body.p-0")[htm.pre(".bg-light.p-4.rounded-bottom.mb-0.text-break")[content]]
- else:
-
card.div(".card-body.p-0")[htm.pre(".bg-light.p-4.rounded-bottom.mb-0.text-break")[htm.code[content]]]
-
- if is_truncated:
- card.div(".card-footer.text-muted.small")[
- f"Note: File content truncated to the first
{util.format_file_size(max_view_size)}."
- ]
-
- block.append(card.collect())
-
-
def _get_navigation_info(release: sql.Release) -> tuple[str, str, Phase] |
None:
"""Get back URL, back label, and phase label based on release phase."""
if release.phase == sql.ReleasePhase.RELEASE_CANDIDATE_DRAFT:
@@ -226,3 +209,20 @@ def _phase_display_name(phase: sql.ReleasePhase) -> str:
elif phase == sql.ReleasePhase.RELEASE:
return "release"
return "release"
+
+
+def _render_file_content(block: htm.Block, content: str, is_text: bool,
is_truncated: bool, max_view_size: int) -> None:
+ card = htm.Block(htm.div, classes=".card.mb-4")
+ card.div(".card-header")[htm.h3(".mb-0")["File content" + (" (Hexdump)" if
(not is_text) else "")]]
+
+ if is_text:
+
card.div(".card-body.p-0")[htm.pre(".bg-light.p-4.rounded-bottom.mb-0.text-break")[content]]
+ else:
+
card.div(".card-body.p-0")[htm.pre(".bg-light.p-4.rounded-bottom.mb-0.text-break")[htm.code[content]]]
+
+ if is_truncated:
+ card.div(".card-footer.text-muted.small")[
+ f"Note: File content truncated to the first
{util.format_file_size(max_view_size)}."
+ ]
+
+ block.append(card.collect())
diff --git a/atr/get/finish.py b/atr/get/finish.py
index 880dfe5..386098d 100644
--- a/atr/get/finish.py
+++ b/atr/get/finish.py
@@ -344,6 +344,16 @@ async def _render_page(
)
+def _render_rc_preview_table(affected_paths: list[tuple[str, str]]) ->
htm.Element:
+ """Render the RC tags preview table."""
+ rows = [htm.tr[htm.td[original], htm.td[stripped]] for original, stripped
in affected_paths]
+
+ return htm.div[
+ htm.p(".mb-2")["Preview of changes:"],
+
htm.table(".table.table-sm.table-striped.border.mt-3")[htm.tbody[rows]],
+ ]
+
+
def _render_rc_tags_section(rc_analysis: RCTagAnalysisResult) -> htm.Element:
"""Render the remove RC tags section."""
section = htm.Block()
@@ -371,16 +381,6 @@ def _render_rc_tags_section(rc_analysis:
RCTagAnalysisResult) -> htm.Element:
return section.collect()
-def _render_rc_preview_table(affected_paths: list[tuple[str, str]]) ->
htm.Element:
- """Render the RC tags preview table."""
- rows = [htm.tr[htm.td[original], htm.td[stripped]] for original, stripped
in affected_paths]
-
- return htm.div[
- htm.p(".mb-2")["Preview of changes:"],
-
htm.table(".table.table-sm.table-striped.border.mt-3")[htm.tbody[rows]],
- ]
-
-
def _render_release_card(release: sql.Release) -> htm.Element:
"""Render the release information card."""
card = htm.div(".card.mb-4.shadow-sm", id=release.name)[
diff --git a/atr/get/manual.py b/atr/get/manual.py
index e83f0c8..2919f1c 100644
--- a/atr/get/manual.py
+++ b/atr/get/manual.py
@@ -54,25 +54,6 @@ async def resolve_selected(session: web.Committer,
project_name: str, version_na
)
-def _render_resolve_page(release: sql.Release) -> htm.Element:
- page = htm.Block()
-
- back_url = util.as_url(vote.selected, project_name=release.project.name,
version_name=release.version)
- page.p[htm.a(".atr-back-link", href=back_url)[f"← Back to Vote for
{release.short_display_name}"]]
-
- page.h1[f"Resolve vote for {release.short_display_name}"]
- page.p["This is a manual vote resolution."]
-
- form.render_block(
- page,
- model_cls=shared.manual.ResolveVoteForm,
- form_classes=".atr-canary.py-4.px-5.mb-4.border.rounded",
- submit_label="Resolve vote",
- )
-
- return page.collect()
-
-
@get.committer("/manual/start/<project_name>/<version_name>/<revision>")
async def start_selected_revision(
session: web.Committer, project_name: str, version_name: str, revision: str
@@ -152,3 +133,22 @@ async def _render_page(release, revision: str) ->
htm.Element:
page.append(manual_form)
return page.collect()
+
+
+def _render_resolve_page(release: sql.Release) -> htm.Element:
+ page = htm.Block()
+
+ back_url = util.as_url(vote.selected, project_name=release.project.name,
version_name=release.version)
+ page.p[htm.a(".atr-back-link", href=back_url)[f"← Back to Vote for
{release.short_display_name}"]]
+
+ page.h1[f"Resolve vote for {release.short_display_name}"]
+ page.p["This is a manual vote resolution."]
+
+ form.render_block(
+ page,
+ model_cls=shared.manual.ResolveVoteForm,
+ form_classes=".atr-canary.py-4.px-5.mb-4.border.rounded",
+ submit_label="Resolve vote",
+ )
+
+ return page.collect()
diff --git a/atr/get/root.py b/atr/get/root.py
index 299026b..808680f 100644
--- a/atr/get/root.py
+++ b/atr/get/root.py
@@ -139,6 +139,11 @@ async def index(session: web.Committer | None) ->
quart_response.Response | str:
return await template.render("index-public.html")
[email protected]("/policies")
+async def policies(session: web.Committer | None) -> str:
+ return await template.blank("Policies", content=_POLICIES)
+
+
@get.public("/miscellaneous/resolved.json")
async def resolved_json(session: web.Committer | None) ->
quart_response.Response:
json_path = pathlib.Path(config.get().PROJECT_ROOT) / "atr" / "static" /
"json" / "resolved.json"
@@ -147,11 +152,6 @@ async def resolved_json(session: web.Committer | None) ->
quart_response.Respons
return quart_response.Response(content, mimetype="application/json")
[email protected]("/policies")
-async def policies(session: web.Committer | None) -> str:
- return await template.blank("Policies", content=_POLICIES)
-
-
@get.committer("/tutorial")
async def tutorial(session: web.Committer) -> str:
"""Tutorial page."""
diff --git a/atr/get/start.py b/atr/get/start.py
index 0c8ec90..25c5ffc 100644
--- a/atr/get/start.py
+++ b/atr/get/start.py
@@ -48,6 +48,42 @@ async def selected(session: web.Committer, project_name:
str) -> str:
)
+def _existing_releases(ul: htm.Block, releases: list[sql.Release],
max_revisions: int = 18) -> None:
+ for i, release in enumerate(releases):
+ if i >= max_revisions:
+ break
+
+ phase_symbol = _get_phase_symbol(release.phase)
+ ul.li(".col-6.col-sm-4.col-md-3.col-lg-2")[
+ htm.div(".text-nowrap")[
+ htm.span(class_="atr-phase-symbol fs-6")[phase_symbol],
+ " ",
+ release.version,
+ ]
+ ]
+
+ if len(releases) > max_revisions:
+ ul.li(".col-6.col-sm-4.col-md-3.col-lg-2")[
+ htm.div(".text-center")[
+ htm.strong["..."],
+ " ",
+ htm.span(".text-muted.ms-1")[f"{len(releases) - max_revisions}
more"],
+ ]
+ ]
+
+
+def _get_phase_symbol(phase: sql.ReleasePhase) -> str:
+ match phase:
+ case sql.ReleasePhase.RELEASE_CANDIDATE_DRAFT:
+ return "①"
+ case sql.ReleasePhase.RELEASE_CANDIDATE:
+ return "②"
+ case sql.ReleasePhase.RELEASE_PREVIEW:
+ return "③"
+ case sql.ReleasePhase.RELEASE:
+ return "Ⓡ"
+
+
async def _render_page(project: sql.Project, releases: list[sql.Release]) ->
htm.Element:
page = htm.Block()
@@ -91,39 +127,3 @@ async def _render_page(project: sql.Project, releases:
list[sql.Release]) -> htm
".",
]
return page.collect()
-
-
-def _existing_releases(ul: htm.Block, releases: list[sql.Release],
max_revisions: int = 18) -> None:
- for i, release in enumerate(releases):
- if i >= max_revisions:
- break
-
- phase_symbol = _get_phase_symbol(release.phase)
- ul.li(".col-6.col-sm-4.col-md-3.col-lg-2")[
- htm.div(".text-nowrap")[
- htm.span(class_="atr-phase-symbol fs-6")[phase_symbol],
- " ",
- release.version,
- ]
- ]
-
- if len(releases) > max_revisions:
- ul.li(".col-6.col-sm-4.col-md-3.col-lg-2")[
- htm.div(".text-center")[
- htm.strong["..."],
- " ",
- htm.span(".text-muted.ms-1")[f"{len(releases) - max_revisions}
more"],
- ]
- ]
-
-
-def _get_phase_symbol(phase: sql.ReleasePhase) -> str:
- match phase:
- case sql.ReleasePhase.RELEASE_CANDIDATE_DRAFT:
- return "①"
- case sql.ReleasePhase.RELEASE_CANDIDATE:
- return "②"
- case sql.ReleasePhase.RELEASE_PREVIEW:
- return "③"
- case sql.ReleasePhase.RELEASE:
- return "Ⓡ"
diff --git a/atr/get/voting.py b/atr/get/voting.py
index 6c095d3..c41d6f9 100644
--- a/atr/get/voting.py
+++ b/atr/get/voting.py
@@ -100,6 +100,11 @@ async def _check_keys_warning(committee: sql.Committee) ->
bool:
return not await aiofiles.os.path.isfile(keys_file_path)
+def _render_body_tabs(default_body: str) -> htm.Element:
+ """Render the tabbed interface for body editing and preview."""
+ return render.body_tabs("vote-body", default_body,
construct.vote_template_variables())
+
+
async def _render_page(
release,
permitted_recipients: list[str],
@@ -176,8 +181,3 @@ async def _render_page(
page.append(htpy.div("#vote-config.d-none", data_preview_url=preview_url,
data_min_hours=str(min_hours)))
return page.collect()
-
-
-def _render_body_tabs(default_body: str) -> htm.Element:
- """Render the tabbed interface for body editing and preview."""
- return render.body_tabs("vote-body", default_body,
construct.vote_template_variables())
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]