Skip to content

Commit 1fa455b

Browse files
committed
For navset_* functions, also accept Sequence[MetadataNode]
1 parent aa787bf commit 1fa455b

File tree

1 file changed

+30
-16
lines changed

1 file changed

+30
-16
lines changed

shiny/ui/_navs.py

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"nav",
2121
)
2222

23+
import collections.abc
2324
import copy
2425
import re
2526
from typing import Any, Literal, Optional, Sequence, cast
@@ -363,7 +364,7 @@ def nav_menu(
363364

364365

365366
class NavSet:
366-
args: tuple[NavSetArg | MetadataNode, ...]
367+
args: tuple[NavSetArg | MetadataNode | Sequence[MetadataNode], ...]
367368
ul_class: str
368369
id: Optional[str]
369370
selected: Optional[str]
@@ -372,7 +373,7 @@ class NavSet:
372373

373374
def __init__(
374375
self,
375-
*args: NavSetArg | MetadataNode,
376+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
376377
ul_class: str,
377378
id: Optional[str],
378379
selected: Optional[str],
@@ -406,7 +407,7 @@ def layout(self, nav: Tag, content: Tag) -> TagList | Tag:
406407
# -----------------------------------------------------------------------------
407408
@no_example()
408409
def navset_tab(
409-
*args: NavSetArg | MetadataNode,
410+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
410411
id: Optional[str] = None,
411412
selected: Optional[str] = None,
412413
header: TagChild = None,
@@ -463,7 +464,7 @@ def navset_tab(
463464

464465
@no_example()
465466
def navset_pill(
466-
*args: NavSetArg | MetadataNode,
467+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
467468
id: Optional[str] = None,
468469
selected: Optional[str] = None,
469470
header: TagChild = None,
@@ -519,7 +520,7 @@ def navset_pill(
519520

520521
@no_example()
521522
def navset_underline(
522-
*args: NavSetArg | MetadataNode,
523+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
523524
id: Optional[str] = None,
524525
selected: Optional[str] = None,
525526
header: TagChild = None,
@@ -574,7 +575,7 @@ def navset_underline(
574575

575576
@add_example()
576577
def navset_hidden(
577-
*args: NavSetArg | MetadataNode,
578+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
578579
id: Optional[str] = None,
579580
selected: Optional[str] = None,
580581
header: TagChild = None,
@@ -631,7 +632,7 @@ class NavSetCard(NavSet):
631632

632633
def __init__(
633634
self,
634-
*args: NavSetArg | MetadataNode,
635+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
635636
ul_class: str,
636637
id: Optional[str],
637638
selected: Optional[str],
@@ -686,7 +687,7 @@ def layout(self, nav: Tag, content: Tag) -> Tag:
686687

687688
@no_example()
688689
def navset_card_tab(
689-
*args: NavSetArg | MetadataNode,
690+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
690691
id: Optional[str] = None,
691692
selected: Optional[str] = None,
692693
title: Optional[TagChild] = None,
@@ -749,7 +750,7 @@ def navset_card_tab(
749750

750751
@no_example()
751752
def navset_card_pill(
752-
*args: NavSetArg | MetadataNode,
753+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
753754
id: Optional[str] = None,
754755
selected: Optional[str] = None,
755756
title: Optional[TagChild] = None,
@@ -815,7 +816,7 @@ def navset_card_pill(
815816

816817
@no_example()
817818
def navset_card_underline(
818-
*args: NavSetArg | MetadataNode,
819+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
819820
id: Optional[str] = None,
820821
selected: Optional[str] = None,
821822
title: Optional[TagChild] = None,
@@ -884,7 +885,7 @@ class NavSetPillList(NavSet):
884885

885886
def __init__(
886887
self,
887-
*args: NavSetArg | MetadataNode,
888+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
888889
ul_class: str,
889890
id: Optional[str],
890891
selected: Optional[str],
@@ -914,7 +915,7 @@ def layout(self, nav: TagChild, content: TagChild) -> Tag:
914915

915916
@no_example()
916917
def navset_pill_list(
917-
*args: NavSetArg | MetadataNode,
918+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
918919
id: Optional[str] = None,
919920
selected: Optional[str] = None,
920921
header: TagChild = None,
@@ -991,7 +992,7 @@ class NavSetBar(NavSet):
991992

992993
def __init__(
993994
self,
994-
*args: NavSetArg | MetadataNode,
995+
*args: NavSetArg | MetadataNode | Sequence[MetadataNode],
995996
ul_class: str,
996997
title: TagChild,
997998
id: Optional[str],
@@ -1281,7 +1282,7 @@ def navset_bar(
12811282
# Utilities for rendering navs
12821283
# -----------------------------------------------------------------------------\
12831284
def render_navset(
1284-
*items: NavSetArg | MetadataNode,
1285+
*items: NavSetArg | MetadataNode | Sequence[MetadataNode],
12851286
ul_class: str,
12861287
id: Optional[str],
12871288
selected: Optional[str],
@@ -1290,8 +1291,21 @@ def render_navset(
12901291
tabsetid = private_random_int(1000, 10000)
12911292

12921293
# Separate MetadataNodes from NavSetArgs.
1293-
metadata_args = [x for x in items if isinstance(x, MetadataNode)]
1294-
navset_args = [x for x in items if not isinstance(x, MetadataNode)]
1294+
metadata_args: list[MetadataNode] = []
1295+
navset_args: list[NavSetArg] = []
1296+
1297+
for item in items:
1298+
if isinstance(item, MetadataNode):
1299+
metadata_args.append(item)
1300+
elif isinstance(item, collections.abc.Sequence) and all(
1301+
isinstance(x, MetadataNode) for x in item
1302+
):
1303+
# Above we needed to use collections.abc.Sequence for runtime checks, as
1304+
# typing.Sequence does not work for runtime checks.
1305+
metadata_args.extend(item)
1306+
else:
1307+
# pyright needs a little help with type inference here.
1308+
navset_args.append(cast(NavSetArg, item))
12951309

12961310
# If the user hasn't provided a selected value, use the first one
12971311
if selected is None:

0 commit comments

Comments
 (0)