Skip to content

marimo

numerous.experimental.marimo

Marimo-related functionality.

Field

Bases: Field, State[Union[str, float, int]]

Source code in numerous/experimental/marimo/_field.py
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
class Field(BaseField, MoState[Union[str, float, int]]):
    def __init__(
        self,
        default: Union[str, float, None] = None,
        annotation: Union[type, None] = None,
        **kwargs: dict[str, Any],
    ) -> None:
        """
        Field with a state that can be used in a Marimo app.

        Args:
            default: The default value for the field.
            annotation: The type annotation for the field.
            kwargs: Additional keyword arguments for the field.

        """
        BaseField.__init__(self, default=default, annotation=annotation, **kwargs)
        MoState.__init__(self, self.value)

    def _number_ui(
        self,
        ui_cls: Type[T],
        step: float = 1,
        label: Union[str, None] = None,
    ) -> T:
        if not hasattr(self, "field_info"):
            error_msg = "The field_info attribute is not defined."
            raise AttributeError(error_msg)
        _min = self.field_info.metadata[0].ge
        _max = self.field_info.metadata[1].le

        return ui_cls(
            _min,
            _max,
            value=float(self.get()),
            on_change=self.set,
            label=_auto_label(self.name, label),
            step=step,
        )

    def slider(
        self,
        step: float = 1,
        label: Union[str, None] = None,
    ) -> mo.ui.slider:
        """
        Create a slider UI element.

        Args:
            step: The step size for the slider.
            label: The label for the slider.

        Returns:
            The created slider UI element.

        """
        return self._number_ui(mo.ui.slider, step, label)

    def number(
        self,
        step: float = 1,
        label: Union[str, None] = None,
    ) -> mo.ui.number:
        """
        Create a number UI element.

        Args:
            step: The step value for the number UI element.
            label: The label for the number UI element.

        Returns:
            The created number UI element.

        """
        number_ui = self._number_ui(mo.ui.number, step, label)

        if isinstance(number_ui, mo.ui.number):
            return number_ui

        error_msg = "The number UI element is not an instance of mo.ui.number."
        raise TypeError(error_msg)

    def text(self, label: Union[str, None] = None) -> mo.ui.text:
        """
        Return a text field widget.

        Args:
            label: The label for the text field. Defaults to None.

        Returns:
            The text field widget.

        """
        return mo.ui.text(
            value=str(self.get()),
            on_change=self.set,
            label=_auto_label(self.name, label),
        )

    def set(self, value: Any) -> None:  # noqa: ANN401
        """
        Set the value of the Marimo object.

        Args:
            value: The value to be set. It can be an integer or a string.

        Overrides the set method to call the mo state set_value and then calls the super
        class's set method.

        """
        self._set_value(value)
        super().set(value)

__init__(default=None, annotation=None, **kwargs)

Field with a state that can be used in a Marimo app.

Parameters:

Name Type Description Default
default Union[str, float, None]

The default value for the field.

None
annotation Union[type, None]

The type annotation for the field.

None
kwargs dict[str, Any]

Additional keyword arguments for the field.

{}
Source code in numerous/experimental/marimo/_field.py
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
def __init__(
    self,
    default: Union[str, float, None] = None,
    annotation: Union[type, None] = None,
    **kwargs: dict[str, Any],
) -> None:
    """
    Field with a state that can be used in a Marimo app.

    Args:
        default: The default value for the field.
        annotation: The type annotation for the field.
        kwargs: Additional keyword arguments for the field.

    """
    BaseField.__init__(self, default=default, annotation=annotation, **kwargs)
    MoState.__init__(self, self.value)

number(step=1, label=None)

Create a number UI element.

Parameters:

Name Type Description Default
step float

The step value for the number UI element.

1
label Union[str, None]

The label for the number UI element.

None

Returns:

Type Description
number

The created number UI element.

Source code in numerous/experimental/marimo/_field.py
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
def number(
    self,
    step: float = 1,
    label: Union[str, None] = None,
) -> mo.ui.number:
    """
    Create a number UI element.

    Args:
        step: The step value for the number UI element.
        label: The label for the number UI element.

    Returns:
        The created number UI element.

    """
    number_ui = self._number_ui(mo.ui.number, step, label)

    if isinstance(number_ui, mo.ui.number):
        return number_ui

    error_msg = "The number UI element is not an instance of mo.ui.number."
    raise TypeError(error_msg)

set(value)

Set the value of the Marimo object.

Parameters:

Name Type Description Default
value Any

The value to be set. It can be an integer or a string.

required

Overrides the set method to call the mo state set_value and then calls the super class's set method.

Source code in numerous/experimental/marimo/_field.py
145
146
147
148
149
150
151
152
153
154
155
156
157
def set(self, value: Any) -> None:  # noqa: ANN401
    """
    Set the value of the Marimo object.

    Args:
        value: The value to be set. It can be an integer or a string.

    Overrides the set method to call the mo state set_value and then calls the super
    class's set method.

    """
    self._set_value(value)
    super().set(value)

slider(step=1, label=None)

Create a slider UI element.

Parameters:

Name Type Description Default
step float

The step size for the slider.

1
label Union[str, None]

The label for the slider.

None

Returns:

Type Description
slider

The created slider UI element.

Source code in numerous/experimental/marimo/_field.py
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
def slider(
    self,
    step: float = 1,
    label: Union[str, None] = None,
) -> mo.ui.slider:
    """
    Create a slider UI element.

    Args:
        step: The step size for the slider.
        label: The label for the slider.

    Returns:
        The created slider UI element.

    """
    return self._number_ui(mo.ui.slider, step, label)

text(label=None)

Return a text field widget.

Parameters:

Name Type Description Default
label Union[str, None]

The label for the text field. Defaults to None.

None

Returns:

Type Description
text

The text field widget.

Source code in numerous/experimental/marimo/_field.py
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
def text(self, label: Union[str, None] = None) -> mo.ui.text:
    """
    Return a text field widget.

    Args:
        label: The label for the text field. Defaults to None.

    Returns:
        The text field widget.

    """
    return mo.ui.text(
        value=str(self.get()),
        on_change=self.set,
        label=_auto_label(self.name, label),
    )

Add a middleware that enables accessing cookies in marimo apps.

Parameters:

Name Type Description Default
app FastAPI

The FastAPI app to add the middleware on.

required
session_ident Callable[[], str] | None

The identity function which must return a unique value for each session.

None
cookies_dir Path | None

Path to the directory where cookies are stored.

None
Source code in numerous/experimental/marimo/_cookies/fastapi.py
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def add_marimo_cookie_middleware(
    app: FastAPI,
    session_ident: t.Callable[[], str] | None = None,
    cookies_dir: Path | None = None,
) -> None:
    """
    Add a middleware that enables accessing cookies in marimo apps.

    Args:
        app: The FastAPI app to add the middleware on.
        session_ident: The identity function which must return a unique value for each
            session.
        cookies_dir: Path to the directory where cookies are stored.

    """
    cookies_dir = cookies_dir or Path(
        tempfile.mkdtemp(prefix="numerous_marimo_cookies")
    )
    cookies = FileCookieStorage(cookies_dir, session_ident or _ident)
    use_cookie_storage(cookies)

    @app.middleware("http")  # type: ignore[misc, unused-ignore]
    async def middleware(
        request: Request,
        call_next: t.Callable[[Request], t.Awaitable[Response]],
    ) -> Response:
        cookies.set(request.cookies)
        return await call_next(request)