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 f9488a9  Move navigation rendering to the appropriate module
f9488a9 is described below

commit f9488a904e1c2a3392073af6df41afdbde898fec
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Dec 29 16:20:02 2025 +0000

    Move navigation rendering to the appropriate module
---
 atr/get/announce.py        |  3 +--
 atr/get/checklist.py       |  4 ++--
 atr/get/checks.py          |  3 ++-
 atr/get/distribution.py    |  5 +++--
 atr/get/file.py            |  4 ++--
 atr/get/finish.py          |  3 ++-
 atr/get/manual.py          |  3 ++-
 atr/get/sbom.py            |  3 ++-
 atr/get/upload.py          |  3 ++-
 atr/get/vote.py            |  3 ++-
 atr/get/voting.py          |  2 +-
 atr/render.py              | 53 ++++++++++++++++++++++++++++++++++++++++++++
 atr/shared/distribution.py | 55 ----------------------------------------------
 13 files changed, 74 insertions(+), 70 deletions(-)

diff --git a/atr/get/announce.py b/atr/get/announce.py
index d2395db..a24f60a 100644
--- a/atr/get/announce.py
+++ b/atr/get/announce.py
@@ -29,7 +29,6 @@ import atr.models.sql as sql
 import atr.post as post
 import atr.render as render
 import atr.shared as shared
-import atr.shared.distribution as distribution
 import atr.template as template
 import atr.util as util
 import atr.web as web
@@ -167,7 +166,7 @@ async def _render_page(
     """
     page.style[markupsafe.Markup(page_styles)]
 
-    distribution.html_nav_phase(page, release.project.name, release.version, 
staging=False)
+    render.html_nav_phase(page, release.project.name, release.version, 
staging=False)
 
     page.h1[
         "Announce ",
diff --git a/atr/get/checklist.py b/atr/get/checklist.py
index 5cdf004..d33db17 100644
--- a/atr/get/checklist.py
+++ b/atr/get/checklist.py
@@ -25,7 +25,7 @@ import atr.db as db
 import atr.db.interaction as interaction
 import atr.get.vote as vote
 import atr.htm as htm
-import atr.shared.distribution as distribution
+import atr.render as render
 import atr.template as template
 import atr.util as util
 import atr.web as web
@@ -67,7 +67,7 @@ async def selected(session: web.Committer | None, 
project_name: str, version_nam
     checklist_html = 
markupsafe.Markup(cmarkgfm.github_flavored_markdown_to_html(substituted_markdown))
 
     page = htm.Block()
-    distribution.html_nav(
+    render.html_nav(
         page,
         back_url=util.as_url(vote.selected, project_name=project_name, 
version_name=version_name),
         back_anchor=f"Vote on {project.short_display_name} {version_name}",
diff --git a/atr/get/checks.py b/atr/get/checks.py
index 6363b25..1781b2f 100644
--- a/atr/get/checks.py
+++ b/atr/get/checks.py
@@ -35,6 +35,7 @@ import atr.get.vote as vote
 import atr.htm as htm
 import atr.models.sql as sql
 import atr.post as post
+import atr.render as render
 import atr.shared as shared
 import atr.shared.draft as draft
 import atr.storage as storage
@@ -493,7 +494,7 @@ def _render_file_row(
 
 
 def _render_header(page: htm.Block, release: sql.Release) -> None:
-    shared.distribution.html_nav(
+    render.html_nav(
         page,
         back_url=util.as_url(vote.selected, project_name=release.project.name, 
version_name=release.version),
         back_anchor=f"Vote on {release.project.short_display_name} 
{release.version}",
diff --git a/atr/get/distribution.py b/atr/get/distribution.py
index 28985fe..4f166a9 100644
--- a/atr/get/distribution.py
+++ b/atr/get/distribution.py
@@ -22,6 +22,7 @@ import atr.form as form
 import atr.htm as htm
 import atr.models.sql as sql
 import atr.post as post
+import atr.render as render
 import atr.shared as shared
 import atr.template as template
 import atr.util as util
@@ -39,7 +40,7 @@ async def list_get(session: web.Committer, project: str, 
version: str) -> str:
 
     release = await shared.distribution.release_validated(project, version, 
staging=None)
     staging = release.phase == sql.ReleasePhase.RELEASE_CANDIDATE_DRAFT
-    shared.distribution.html_nav_phase(block, project, version, staging)
+    render.html_nav_phase(block, project, version, staging)
 
     record_a_distribution = htm.a(
         ".btn.btn-primary",
@@ -123,7 +124,7 @@ async def _record_form_page(project: str, version: str, 
staging: bool) -> str:
     await shared.distribution.release_validated(project, version, 
staging=staging)
 
     block = htm.Block()
-    shared.distribution.html_nav_phase(block, project, version, 
staging=staging)
+    render.html_nav_phase(block, project, version, staging=staging)
 
     title = "Record a staging distribution" if staging else "Record a manual 
distribution"
     block.h1[title]
diff --git a/atr/get/file.py b/atr/get/file.py
index 165f42e..b4f968f 100644
--- a/atr/get/file.py
+++ b/atr/get/file.py
@@ -24,7 +24,7 @@ import atr.get.finish as finish
 import atr.get.vote as vote
 import atr.htm as htm
 import atr.models.sql as sql
-import atr.shared.distribution as distribution
+import atr.render as render
 import atr.template as template
 import atr.util as util
 import atr.web as web
@@ -57,7 +57,7 @@ async def selected(session: web.Committer, project_name: str, 
version_name: str)
     nav_info = _get_navigation_info(release)
     if nav_info:
         back_url, back_label, phase_label = nav_info
-        distribution.html_nav(block, back_url, back_label, phase_label)
+        render.html_nav(block, back_url, back_label, phase_label)
 
     block.h1["Files in ", htm.strong[release.project.short_display_name], " ", 
htm.em[release.version]]
 
diff --git a/atr/get/finish.py b/atr/get/finish.py
index 386098d..921bf83 100644
--- a/atr/get/finish.py
+++ b/atr/get/finish.py
@@ -40,6 +40,7 @@ import atr.get.root as root
 import atr.htm as htm
 import atr.mapping as mapping
 import atr.models.sql as sql
+import atr.render as render
 import atr.shared as shared
 import atr.template as template
 import atr.util as util
@@ -250,7 +251,7 @@ async def _render_page(
     """Render the finish page using htm.py."""
     page = htm.Block()
 
-    shared.distribution.html_nav(
+    render.html_nav(
         page,
         back_url=util.as_url(root.index),
         back_anchor="Select a release",
diff --git a/atr/get/manual.py b/atr/get/manual.py
index 2919f1c..ee88a1e 100644
--- a/atr/get/manual.py
+++ b/atr/get/manual.py
@@ -24,6 +24,7 @@ import atr.get.vote as vote
 import atr.htm as htm
 import atr.models.sql as sql
 import atr.post as post
+import atr.render as render
 import atr.shared as shared
 import atr.template as template
 import atr.util as util
@@ -90,7 +91,7 @@ async def _render_page(release, revision: str) -> htm.Element:
         project_name=release.project.name,
         version_name=release.version,
     )
-    shared.distribution.html_nav(
+    render.html_nav(
         page,
         back_link_url,
         f"Compose {release.short_display_name}",
diff --git a/atr/get/sbom.py b/atr/get/sbom.py
index f605224..b65fc11 100644
--- a/atr/get/sbom.py
+++ b/atr/get/sbom.py
@@ -32,6 +32,7 @@ import atr.get.vote as vote
 import atr.htm as htm
 import atr.models.results as results
 import atr.models.sql as sql
+import atr.render as render
 import atr.sbom as sbom
 import atr.sbom.models.osv as osv
 import atr.shared as shared
@@ -70,7 +71,7 @@ async def report(session: web.Committer, project: str, 
version: str, file_path:
             back_anchor = f"Vote on {release.project.short_display_name} 
{release.version}"
             phase = "VOTE"
 
-    shared.distribution.html_nav(
+    render.html_nav(
         block,
         back_url=back_url,
         back_anchor=back_anchor,
diff --git a/atr/get/upload.py b/atr/get/upload.py
index 4a86c1b..05c8280 100644
--- a/atr/get/upload.py
+++ b/atr/get/upload.py
@@ -27,6 +27,7 @@ import atr.get.compose as compose
 import atr.get.keys as keys
 import atr.htm as htm
 import atr.models.sql as sql
+import atr.render as render
 import atr.shared as shared
 import atr.template as template
 import atr.util as util
@@ -43,7 +44,7 @@ async def selected(session: web.Committer, project_name: str, 
version_name: str)
 
     block = htm.Block()
 
-    shared.distribution.html_nav(
+    render.html_nav(
         block,
         util.as_url(compose.selected, project_name=release.project.name, 
version_name=release.version),
         f"Compose {release.short_display_name}",
diff --git a/atr/get/vote.py b/atr/get/vote.py
index f5e4d20..b243e25 100644
--- a/atr/get/vote.py
+++ b/atr/get/vote.py
@@ -37,6 +37,7 @@ import atr.htm as htm
 import atr.mapping as mapping
 import atr.models.sql as sql
 import atr.post as post
+import atr.render as render
 import atr.shared as shared
 import atr.storage as storage
 import atr.template as template
@@ -303,7 +304,7 @@ def _render_checklist_card(page: htm.Block, release: 
sql.Release) -> None:
 
 
 def _render_header(page: htm.Block, release: sql.Release, 
show_resolve_section: bool) -> None:
-    shared.distribution.html_nav(
+    render.html_nav(
         page,
         back_url=util.as_url(root.index),
         back_anchor="Select a release",
diff --git a/atr/get/voting.py b/atr/get/voting.py
index c41d6f9..f12b7a0 100644
--- a/atr/get/voting.py
+++ b/atr/get/voting.py
@@ -120,7 +120,7 @@ async def _render_page(
         project_name=release.project.name,
         version_name=release.version,
     )
-    shared.distribution.html_nav(
+    render.html_nav(
         page,
         back_link_url,
         f"Compose {release.short_display_name}",
diff --git a/atr/render.py b/atr/render.py
index f1fab17..5e9b3c5 100644
--- a/atr/render.py
+++ b/atr/render.py
@@ -15,9 +15,15 @@
 # specific language governing permissions and limitations
 # under the License.
 
+from typing import Literal
+
 import htpy
 
+import atr.get as get
 import atr.htm as htm
+import atr.util as util
+
+type Phase = Literal["COMPOSE", "VOTE", "FINISH"]
 
 
 def body_tabs(
@@ -71,6 +77,53 @@ def body_tabs(
     return htm.div[tabs.collect(), tab_content]
 
 
+def html_nav(container: htm.Block, back_url: str, back_anchor: str, phase: 
Phase) -> None:
+    classes = ".d-flex.justify-content-between.align-items-center"
+    block = htm.Block(htm.p, classes=classes)
+    block.a(".atr-back-link", href=back_url)[f"← Back to {back_anchor}"]
+    span = htm.Block(htm.span)
+
+    def _phase(actual: Phase, expected: Phase) -> None:
+        match expected:
+            case "COMPOSE":
+                symbol = "①"
+            case "VOTE":
+                symbol = "②"
+            case "FINISH":
+                symbol = "③"
+        if actual == expected:
+            span.strong(f".atr-phase-{actual}.atr-phase-symbol")[symbol]
+            span.span(f".atr-phase-{actual}.atr-phase-label")[actual]
+        else:
+            span.span(".atr-phase-symbol-other")[symbol]
+
+    _phase(phase, "COMPOSE")
+    span.span(".atr-phase-arrow")["→"]
+    _phase(phase, "VOTE")
+    span.span(".atr-phase-arrow")["→"]
+    _phase(phase, "FINISH")
+
+    block.append(span.collect(separator=" "))
+    container.append(block)
+
+
+def html_nav_phase(block: htm.Block, project: str, version: str, staging: 
bool) -> None:
+    label: Phase
+    route, label = (get.compose.selected, "COMPOSE")
+    if not staging:
+        route, label = (get.finish.selected, "FINISH")
+    html_nav(
+        block,
+        util.as_url(
+            route,
+            project_name=project,
+            version_name=version,
+        ),
+        back_anchor=f"{label.title()} {project} {version}",
+        phase=label,
+    )
+
+
 def _variables_tab(
     tab_id_prefix: str,
     template_variables: list[tuple[str, str]],
diff --git a/atr/shared/distribution.py b/atr/shared/distribution.py
index 4c2d6ad..444d066 100644
--- a/atr/shared/distribution.py
+++ b/atr/shared/distribution.py
@@ -18,19 +18,14 @@
 from __future__ import annotations
 
 import enum
-from typing import Literal
 
 import pydantic
 
 import atr.db as db
 import atr.form as form
-import atr.get as get
 import atr.htm as htm
 import atr.models.distribution as distribution
 import atr.models.sql as sql
-import atr.util as util
-
-type Phase = Literal["COMPOSE", "VOTE", "FINISH"]
 
 
 class DistributionPlatform(enum.Enum):
@@ -118,56 +113,6 @@ class DistributeForm(form.Form):
         return self
 
 
-# TODO: Move this to an appropriate module
-def html_nav(container: htm.Block, back_url: str, back_anchor: str, phase: 
Phase) -> None:
-    classes = ".d-flex.justify-content-between.align-items-center"
-    block = htm.Block(htm.p, classes=classes)
-    block.a(".atr-back-link", href=back_url)[f"← Back to {back_anchor}"]
-    span = htm.Block(htm.span)
-
-    def _phase(actual: Phase, expected: Phase) -> None:
-        # nonlocal span
-        match expected:
-            case "COMPOSE":
-                symbol = "①"
-            case "VOTE":
-                symbol = "②"
-            case "FINISH":
-                symbol = "③"
-        if actual == expected:
-            span.strong(f".atr-phase-{actual}.atr-phase-symbol")[symbol]
-            span.span(f".atr-phase-{actual}.atr-phase-label")[actual]
-        else:
-            span.span(".atr-phase-symbol-other")[symbol]
-
-    _phase(phase, "COMPOSE")
-    span.span(".atr-phase-arrow")["→"]
-    _phase(phase, "VOTE")
-    span.span(".atr-phase-arrow")["→"]
-    _phase(phase, "FINISH")
-
-    block.append(span.collect(separator=" "))
-    container.append(block)
-
-
-# TODO: Move this to a more appropriate module
-def html_nav_phase(block: htm.Block, project: str, version: str, staging: 
bool) -> None:
-    label: Phase
-    route, label = (get.compose.selected, "COMPOSE")
-    if not staging:
-        route, label = (get.finish.selected, "FINISH")
-    html_nav(
-        block,
-        util.as_url(
-            route,
-            project_name=project,
-            version_name=version,
-        ),
-        back_anchor=f"{label.title()} {project} {version}",
-        phase=label,
-    )
-
-
 def html_submitted_values_table(block: htm.Block, dd: distribution.Data) -> 
None:
     tbody = htm.tbody[
         html_tr("Platform", dd.platform.name),


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

Reply via email to