Skip to content

Commit 22b1db3

Browse files
cpsievertwch
andauthored
Smarter, lazier, and more complete page default/api for express (#893)
Co-authored-by: Winston Chang <[email protected]>
1 parent b6451fd commit 22b1db3

File tree

14 files changed

+217
-380
lines changed

14 files changed

+217
-380
lines changed

docs/_quartodoc.yml

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ quartodoc:
1919
- ui.page_fluid
2020
- ui.page_fixed
2121
- ui.page_bootstrap
22+
- ui.page_auto
23+
- ui.page_output
2224
- title: UI Layouts
2325
desc: Control the layout of multiple UI components.
2426
contents:
@@ -290,7 +292,6 @@ quartodoc:
290292
desc: ""
291293
flatten: true
292294
contents:
293-
- express.ui.set_page
294295
- express.ui.sidebar
295296
- express.ui.layout_sidebar
296297
- express.ui.layout_column_wrap
@@ -315,11 +316,15 @@ quartodoc:
315316
- express.ui.panel_conditional
316317
- express.ui.panel_fixed
317318
- express.ui.panel_absolute
318-
- express.ui.page_fluid
319-
- express.ui.page_fixed
320-
- express.ui.page_fillable
321-
- express.ui.page_sidebar
322-
- express.ui.page_navbar
319+
contents:
320+
- kind: page
321+
path: PageFunctions
322+
summary:
323+
name: "Page functions"
324+
desc: ""
325+
flatten: true
326+
contents:
327+
- express.ui.page_opts
323328
- title: Deprecated
324329
desc: ""
325330
contents:

examples/express/plot_app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import matplotlib.pyplot as plt
22
import numpy as np
33

4-
from shiny import render, ui
5-
from shiny.express import input
4+
from shiny import render
5+
from shiny.express import input, ui
66

77
ui.input_slider("n", "N", 1, 100, 50)
88

shiny/express/_recall_context.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@ def __init__(
1919
self,
2020
fn: Callable[..., R],
2121
*,
22-
default_page: RecallContextManager[Tag] | None = None,
2322
args: tuple[object, ...] | None = None,
2423
kwargs: Mapping[str, object] | None = None,
2524
):
2625
self.fn = fn
27-
self.default_page = default_page
2826
if args is None:
2927
args = tuple()
3028
if kwargs is None:
@@ -33,11 +31,6 @@ def __init__(
3331
self.kwargs: dict[str, object] = dict(kwargs)
3432

3533
def __enter__(self) -> None:
36-
if self.default_page is not None:
37-
from . import _run
38-
39-
_run.replace_top_level_recall_context_manager(self.default_page)
40-
4134
self._prev_displayhook = sys.displayhook
4235
# Collect each of the "printed" values in the args list.
4336
sys.displayhook = wrap_displayhook_handler(self.args.append)

shiny/express/_run.py

Lines changed: 3 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
from htmltools import Tag, TagList
1010

11-
from .. import ui
1211
from .._app import App
1312
from ..session import Inputs, Outputs, Session
1413
from ._recall_context import RecallContextManager
@@ -20,8 +19,6 @@
2019

2120
__all__ = ("wrap_express_app",)
2221

23-
_DEFAULT_PAGE_FUNCTION = ui.page_fixed
24-
2522

2623
def wrap_express_app(file: Path) -> App:
2724
"""Wrap a Shiny Express mode app into a Shiny `App` object.
@@ -133,64 +130,14 @@ def set_result(x: object):
133130

134131

135132
_top_level_recall_context_manager: RecallContextManager[Tag]
136-
_top_level_recall_context_manager_has_been_replaced = False
137133

138134

139135
def reset_top_level_recall_context_manager() -> None:
136+
from .ui._page import page_auto_cm
137+
140138
global _top_level_recall_context_manager
141-
global _top_level_recall_context_manager_has_been_replaced
142-
_top_level_recall_context_manager = RecallContextManager(_DEFAULT_PAGE_FUNCTION)
143-
_top_level_recall_context_manager_has_been_replaced = False
139+
_top_level_recall_context_manager = page_auto_cm()
144140

145141

146142
def get_top_level_recall_context_manager() -> RecallContextManager[Tag]:
147143
return _top_level_recall_context_manager
148-
149-
150-
def replace_top_level_recall_context_manager(
151-
cm: RecallContextManager[Tag],
152-
force: bool = False,
153-
) -> RecallContextManager[Tag]:
154-
"""
155-
Replace the current top level RecallContextManager with another one.
156-
157-
This transfers the `args` and `kwargs` from the previous RecallContextManager to the
158-
new one. Normally it will only have an effect the first time it's run; it only
159-
replace the previous one if has not already been replaced. To override this
160-
behavior, this use `force=True`.
161-
162-
Parameters
163-
----------
164-
cm
165-
The RecallContextManager to replace the previous one.
166-
force
167-
If `False` (the default) and the top level RecallContextManager has already been
168-
replaced, return with no chnages. If `True`, this will aways replace.
169-
170-
Returns
171-
-------
172-
:
173-
The previous top level RecallContextManager.
174-
"""
175-
global _top_level_recall_context_manager
176-
global _top_level_recall_context_manager_has_been_replaced
177-
178-
old_cm = _top_level_recall_context_manager
179-
180-
if force is False and _top_level_recall_context_manager_has_been_replaced:
181-
return old_cm
182-
183-
args = old_cm.args.copy()
184-
args.extend(cm.args)
185-
cm.args = args
186-
187-
kwargs = old_cm.kwargs.copy()
188-
kwargs.update(cm.kwargs)
189-
cm.kwargs = kwargs
190-
191-
old_cm.__exit__(BaseException, None, None)
192-
cm.__enter__()
193-
_top_level_recall_context_manager = cm
194-
_top_level_recall_context_manager_has_been_replaced = True
195-
196-
return old_cm

shiny/express/ui/__init__.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@
107107
)
108108

109109
from ._cm_components import (
110-
set_page,
111110
sidebar,
112111
layout_sidebar,
113112
layout_column_wrap,
@@ -134,11 +133,10 @@
134133
panel_conditional,
135134
panel_fixed,
136135
panel_absolute,
137-
page_fluid,
138-
page_fixed,
139-
page_fillable,
140-
page_sidebar,
141-
page_navbar,
136+
)
137+
138+
from ._page import (
139+
page_opts,
142140
)
143141

144142
__all__ = (
@@ -245,7 +243,6 @@
245243
"output_data_frame",
246244
"value_box_theme",
247245
# Imports from ._cm_components
248-
"set_page",
249246
"sidebar",
250247
"layout_sidebar",
251248
"layout_column_wrap",
@@ -272,11 +269,8 @@
272269
"panel_conditional",
273270
"panel_fixed",
274271
"panel_absolute",
275-
"page_fluid",
276-
"page_fixed",
277-
"page_fillable",
278-
"page_sidebar",
279-
"page_navbar",
272+
# Imports from ._page
273+
"page_opts",
280274
)
281275

282276

@@ -290,6 +284,12 @@
290284
"navset_pill_card", # Deprecated
291285
"navset_tab_card", # Deprecated
292286
"page_bootstrap",
287+
"page_fixed",
288+
"page_sidebar",
289+
"page_fillable",
290+
"page_navbar",
291+
"page_fluid",
292+
"page_auto",
293293
"page_output",
294294
"panel_main", # Deprecated
295295
"panel_sidebar", # Deprecated
@@ -301,5 +301,5 @@
301301
"tooltip",
302302
),
303303
# Items from shiny.express.ui that don't have a counterpart in shiny.ui
304-
"shiny.express.ui": ("set_page",),
304+
"shiny.express.ui": ("page_opts",),
305305
}

0 commit comments

Comments
 (0)