Skip to content

chore(docs): use a builder-portable homepage check in the override template - #455

Merged
lesnik512 merged 1 commit into
mainfrom
chore/portable-homepage-check
Sep 6, 2026
Merged

chore(docs): use a builder-portable homepage check in the override template#455
lesnik512 merged 1 commit into
mainfrom
chore/portable-homepage-check

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Why

page.is_homepage is a MkDocs Page property with no equivalent in Zensical, which the org is
evaluating as a future docs builder (modern-python/.github#60). It fails silently, not loudly:
at Zensical 0.0.59 the property does not exist anywhere in the source, and an undefined name
resolves falsy in MiniJinja — so the home page would fall through to the non-home branch and emit a
wrong og:title / twitter:title with no warning.

nav.homepage is exposed by both builders — MkDocs documents it as homepage: Page | None
(https://www.mkdocs.org/dev-guide/themes/), and Zensical serializes it in
crates/zensical/src/structure/nav/view.rs — so comparing page.url against it is portable.

Part of modern-python/.github#71, which makes the same change in each repo with an
overrides/main.html.

Design

{%- set is_home = nav.homepage and page.url == nav.homepage.url %}, then not is_home where
not page.is_homepage used to be.

  • The nav.homepage and guard is load-bearing: MkDocs types it Page | None. When it is None
    the expression is falsy, which matches is_homepage being False on every page of a site with
    no home page.
  • The {%- left-trim is also load-bearing: without it the new tag adds a blank line to every
    rendered page.

Non-goals

Not a Zensical migration. #60 stays open and stays blocked on unrelated gaps (exclude_docs,
validation.omitted_files). This change is a no-op under MkDocs today and does not depend on that
work landing.

Verification

Full-site build diff with the pinned toolchain, main vs this branch:

uvx --with-requirements docs/requirements.txt mkdocs build --strict -d <dir>
diff -r <before> <after>

--strict passes on both, and the output is byte-identical across all 64 pages — including
index.html's <title>, og:title and twitter:title, which are what this touches.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Details
Benchmark suite Current: 04bcbb3 Previous: 032e8ec Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 2957692.3989288416 iter/sec (stddev: 2.5378540438786837e-8) 2935670.6200734777 iter/sec (stddev: 9.049028353180263e-9) 0.99
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 2929499.3140015826 iter/sec (stddev: 1.7891225783950698e-8) 3112450.5020996616 iter/sec (stddev: 1.5206028604887185e-8) 1.06
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 23808.41377511408 iter/sec (stddev: 0.000006151525991179151) 23839.819437226604 iter/sec (stddev: 0.000004588540112142097) 1.00
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 18404.78696687084 iter/sec (stddev: 0.000004569674415284024) 18456.078963704393 iter/sec (stddev: 0.000004490130347246396) 1.00
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 432.22098216259195 iter/sec (stddev: 0.00005294398545290316) 435.2946231031614 iter/sec (stddev: 0.00006866699102688879) 1.01
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 413.7158856805711 iter/sec (stddev: 0.00003620620868725245) 408.9649108123275 iter/sec (stddev: 0.00007308032184575663) 0.99
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 376.34111477184973 iter/sec (stddev: 0.00003584800394370476) 348.3916838319672 iter/sec (stddev: 0.00027588481773996656) 0.93
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 2217.205548307885 iter/sec (stddev: 0.00003286376206254194) 2273.653614296736 iter/sec (stddev: 0.00002151229093875247) 1.03
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 1703.859022026382 iter/sec (stddev: 0.000034867777768477854) 1687.4341294666815 iter/sec (stddev: 0.00003796638937519399) 0.99
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 1153.8569379702524 iter/sec (stddev: 0.00004286771375870701) 1145.6557397851677 iter/sec (stddev: 0.00003435700941923532) 0.99
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 727834.5758646571 iter/sec (stddev: 4.526478663244454e-8) 757387.5725985781 iter/sec (stddev: 4.141269526957182e-8) 1.04
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 682084.155882815 iter/sec (stddev: 9.138036323416977e-8) 681044.8979009917 iter/sec (stddev: 2.74365998701665e-8) 1.00
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 2264.1707727517382 iter/sec (stddev: 0.00003989416791262109) 2335.685940782144 iter/sec (stddev: 0.000012191155130405179) 1.03
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 57800.17601866104 iter/sec (stddev: 0.0000022986387744473665) 62052.75436745368 iter/sec (stddev: 0.00000217657442190837) 1.07
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 45925.20140456258 iter/sec (stddev: 0.0000017815014821440133) 46420.765922504885 iter/sec (stddev: 0.0000021890985181612635) 1.01
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 1820791.9234034019 iter/sec (stddev: 8.658155068621275e-8) 1937573.7005389982 iter/sec (stddev: 2.2326766002233246e-8) 1.06
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 3284568.7642110977 iter/sec (stddev: 8.14076846546722e-9) 3221184.259857156 iter/sec (stddev: 7.956451943987457e-9) 0.98
benchmarks/test_guard_resolve.py::test_g3_deep_chain 720711.8514187422 iter/sec (stddev: 6.629135006988897e-8) 739670.6701468946 iter/sec (stddev: 3.3881894450057316e-8) 1.03
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 402075.06114195986 iter/sec (stddev: 2.228002445469527e-7) 413484.39598088106 iter/sec (stddev: 8.594346413570085e-8) 1.03
benchmarks/test_guard_resolve.py::test_g5_cross_scope 1588001.3791801294 iter/sec (stddev: 2.478491543601475e-8) 1591235.0319345426 iter/sec (stddev: 2.8409447283230043e-8) 1.00
benchmarks/test_guard_resolve.py::test_g9_context_resolve 844816.3588876746 iter/sec (stddev: 4.137255398274066e-8) 851607.753436972 iter/sec (stddev: 4.2133795400223295e-8) 1.01
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 480586.21522065037 iter/sec (stddev: 6.117008189794466e-8) 495053.38942874945 iter/sec (stddev: 4.746571366710767e-8) 1.03
benchmarks/test_guard_resolve.py::test_g18_alias_hop 2267210.788185624 iter/sec (stddev: 1.403629479555219e-8) 2103271.6917714234 iter/sec (stddev: 2.385135675301081e-8) 0.93
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 27658.656298674017 iter/sec (stddev: 0.000003804398973673808) 27811.285482017563 iter/sec (stddev: 0.0000037031362964937077) 1.01
benchmarks/test_guard_validate.py::test_g11_validate_wide 17184.78733657603 iter/sec (stddev: 0.0000059491180922012215) 17259.77038836002 iter/sec (stddev: 0.000005341312985304498) 1.00

This comment was automatically generated by workflow using github-action-benchmark.

@lesnik512
lesnik512 force-pushed the chore/portable-homepage-check branch from 02e9cf7 to 04bcbb3 Compare September 6, 2026 17:46
@lesnik512

Copy link
Copy Markdown
Member Author

Force-pushed after a rebase onto main. The branch had been cut from a HEAD that already carried docs: drop the local PR template, inheriting the org default, so it was carrying a superseded draft of a change that has since merged to main in its final form. That commit is dropped; the branch is now main plus the single overrides/main.html commit. Re-verified against the new main: mkdocs build --strict on both sides, output diffed recursively, identical.

@lesnik512
lesnik512 merged commit 0e3a8c5 into main Sep 6, 2026
10 checks passed
@lesnik512
lesnik512 deleted the chore/portable-homepage-check branch September 6, 2026 17:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant