Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: Solara 2.0 #946

Draft
wants to merge 6 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions solara/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ def _using_solara_server():
use_state,
use_state_widget,
)
from reacton.core import Element
from .core import component
from reacton.core import Element as Element
from .core import component as component

try:
import ipyvuetify.components as v # type: ignore
Expand All @@ -57,14 +57,13 @@ def _using_solara_server():
from .cache import memoize
from . import cache

# TODO: components re-exports v, we should use __all__ in components/misc.py
from .components import * # type: ignore
from .components import _component_vue

from .routing import use_route, use_router, use_route_level, find_route, use_pathname, resolve_path
from .autorouting import generate_routes, generate_routes_directory, RenderPage, RoutingProvider, DefaultLayout
from .checks import check_jupyter
from .scope import get_kernel_id, get_session_id
from .tasks import task, use_task, Task, TaskResult


def display(*objs, **kwargs):
Expand Down
214 changes: 164 additions & 50 deletions solara/components/__init__.py
Original file line number Diff line number Diff line change
@@ -1,60 +1,82 @@
# isort: skip_file
from .button import Button # noqa: F401
from .style import Style # noqa: F401 F403
from .misc import * # noqa: F401 F403
from .alert import Warning, Info, Error, Success # noqa: F401 F403
from .checkbox import Checkbox # noqa: F401 F403
from .cross_filter import ( # noqa: F401
from .button import Button
from .style import Style
from .misc import (
Navigator,
GridDraggable,
GridLayout,
ListItem,
ui_dropdown,
ui_text,
ui_checkbox,
ui_slider,
Text,
Div,
Preformatted,
IconButton,
HTML,
VBox,
HBox,
Row,
Column,
GridFixed,
Padding,
FigurePlotly,
Code,
)
from .alert import Warning, Info, Error, Success
from .checkbox import Checkbox
from .cross_filter import (
CrossFilterDataFrame,
CrossFilterReport,
CrossFilterSelect,
CrossFilterSlider,
)
from .datatable import DataTable, DataFrame # noqa: F401 F403
from .details import Details # noqa: F401 F403
from .file_browser import FileBrowser # noqa: F401 F403
from .image import Image # noqa: F401 F403
from .markdown import Markdown, MarkdownIt # noqa: F401 F403
from .slider import ( # noqa: F401 F403
DateSlider, # noqa: F401 F403
FloatSlider, # noqa: F401 F403
IntSlider, # noqa: F401 F403
ValueSlider, # noqa: F401 F403
SliderDate, # noqa: F401 F403
SliderFloat, # noqa: F401 F403
SliderInt, # noqa: F401 F403
SliderValue, # noqa: F401 F403
SliderRangeInt, # noqa: F401 F403
SliderRangeFloat, # noqa: F401 F403
) # noqa: F401 F403
from .sql_code import SqlCode # noqa: F401 F403
from .togglebuttons import ( # noqa: F401 F403
from .datatable import DataTable, DataFrame
from .details import Details
from .file_browser import FileBrowser
from .image import Image
from .markdown import Markdown, MarkdownIt
from .slider import (
DateSlider,
FloatSlider,
IntSlider,
ValueSlider,
SliderDate,
SliderFloat,
SliderInt,
SliderValue,
SliderRangeInt,
SliderRangeFloat,
)
from .sql_code import SqlCode
from .togglebuttons import (
ToggleButtonsMultiple,
ToggleButtonsSingle,
)
from .input import InputText, InputFloat, InputInt # noqa: F401 F403
from .input_text_area import InputTextArea # noqa: F401 F403
from .pivot_table import PivotTableView, PivotTable, PivotTableCard # noqa: F401 F403
from .head import Head # noqa: F401 F403
from .title import Title # noqa: F401 F403
from .link import Link # noqa: F401 F403
from .applayout import AppLayout, Sidebar, AppBar, AppBarTitle # noqa: F401 F403
from .tab_navigation import TabNavigation # noqa: F401 F403
from .markdown_editor import MarkdownEditor # noqa: F401 F403
from .select import Select, SelectMultiple # noqa: F401 F403
from .matplotlib import FigureMatplotlib # noqa: F401 F403
from .echarts import FigureEcharts # noqa: F401 F403
from .figure_altair import FigureAltair, AltairChart # noqa: F401 F403
from .meta import Meta # noqa: F401 F403
from .columns import Columns, ColumnsResponsive # noqa: F401 F403
from .file_drop import FileDrop, FileDropMultiple # noqa: F401 F403
from .file_download import FileDownload # noqa: F401 F403
from .tooltip import Tooltip # noqa: F401 F403
from .card import Card, CardActions # noqa: F401 F403
from .spinner import SpinnerSolara # noqa: F401 F403
from .switch import Switch # noqa: F401 F403
from .progress import ProgressLinear # noqa: F401 F403
from .component_vue import _component_vue, component_vue # noqa: F401 F403
from .input import InputText, InputFloat, InputInt
from .input_text_area import InputTextArea
from .pivot_table import PivotTableView, PivotTable, PivotTableCard
from .head import Head
from .title import Title
from .link import Link
from .applayout import AppLayout, Sidebar, AppBar, AppBarTitle
from .tab_navigation import TabNavigation
from .markdown_editor import MarkdownEditor
from .select import Select, SelectMultiple
from .matplotlib import FigureMatplotlib
from .echarts import FigureEcharts
from .figure_altair import FigureAltair, AltairChart
from .meta import Meta
from .columns import Columns, ColumnsResponsive
from .file_drop import FileDrop, FileDropMultiple
from .file_download import FileDownload
from .tooltip import Tooltip
from .card import Card, CardActions
from .spinner import SpinnerSolara
from .switch import Switch
from .progress import ProgressLinear
from .component_vue import _component_vue, component_vue
import reacton.core

try:
Expand All @@ -65,6 +87,99 @@
import logging
from ..settings import main


__all__ = [
"Button",
"Style",
"Navigator",
"GridDraggable",
"GridLayout",
"ListItem",
"ui_dropdown",
"ui_text",
"ui_checkbox",
"ui_slider",
"Text",
"Div",
"Preformatted",
"IconButton",
"HTML",
"VBox",
"HBox",
"Row",
"Column",
"GridFixed",
"Padding",
"FigurePlotly",
"Code",
"Warning",
"Info",
"Error",
"Success",
"Checkbox",
"CrossFilterDataFrame",
"CrossFilterReport",
"CrossFilterSelect",
"CrossFilterSlider",
"DataTable",
"DataFrame",
"Details",
"FileBrowser",
"Image",
"Markdown",
"MarkdownIt",
"DateSlider",
"FloatSlider",
"IntSlider",
"ValueSlider",
"SliderDate",
"SliderFloat",
"SliderInt",
"SliderValue",
"SliderRangeInt",
"SliderRangeFloat",
"SqlCode",
"ToggleButtonsMultiple",
"ToggleButtonsSingle",
"InputText",
"InputFloat",
"InputInt",
"InputTextArea",
"PivotTableView",
"PivotTable",
"PivotTableCard",
"Head",
"Title",
"Link",
"AppLayout",
"Sidebar",
"AppBar",
"AppBarTitle",
"TabNavigation",
"MarkdownEditor",
"Select",
"SelectMultiple",
"FigureMatplotlib",
"FigureEcharts",
"FigureAltair",
"AltairChart",
"Meta",
"Columns",
"ColumnsResponsive",
"FileDrop",
"FileDropMultiple",
"FileDownload",
"Tooltip",
"Card",
"CardActions",
"SpinnerSolara",
"Switch",
"ProgressLinear",
"_component_vue",
"component_vue",
]


_container = None

if main.default_container in globals():
Expand All @@ -73,5 +188,4 @@
logger = logging.getLogger("solara.components")
logger.warning(f"Default container {main.default_container} not found in solara.components. Defaulting to Column.")

# TODO: When Solara 2.0 releases Column should be replaced with Fragment
reacton.core._default_container = _container or Column # noqa: F405
reacton.core._default_container = _container or Fragment # noqa: F405
3 changes: 2 additions & 1 deletion solara/components/head_tag.vue
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<template><span></span></template>
<template>
</template>

<script>
module.exports = {
Expand Down
26 changes: 26 additions & 0 deletions solara/components/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,32 @@
GridLayout = GridDraggable


# re-export components for typing to pick them up correctly
__all__ = [
"Navigator",
"GridDraggable",
"GridLayout",
"ListItem",
"ui_dropdown",
"ui_text",
"ui_checkbox",
"ui_slider",
"Text",
"Div",
"Preformatted",
"IconButton",
"HTML",
"VBox",
"HBox",
"Row",
"Column",
"GridFixed",
"Padding",
"FigurePlotly",
"Code",
]


@solara.component
def ListItem(title, icon_name: str = None, children=[], value=None):
if value is None:
Expand Down
3 changes: 2 additions & 1 deletion solara/hooks/use_thread.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@

import solara
from solara.datatypes import Result, ResultState
from solara.util import cancel_guard, nullcontext
from solara.util import cancel_guard, nullcontext, deprecated

SOLARA_ALLOW_OTHER_TRACER = os.environ.get("SOLARA_ALLOW_OTHER_TRACER", False) in (True, "True", "true", "1")
T = TypeVar("T")
logger = logging.getLogger("solara.hooks.use_thread")


@deprecated("`use_thread` is deprecated, use the more modern and performant `use_task` or `Task` instead", category=FutureWarning)
def use_thread(
callback: Union[
Callable[[threading.Event], T],
Expand Down
74 changes: 69 additions & 5 deletions solara/lab/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,73 @@
# isort: skip_file
from .components import * # noqa: F401, F403
from .utils import cookies, headers # noqa: F401, F403
from ..lifecycle import on_kernel_start # noqa: F401
from ..tasks import task, use_task, Task, TaskResult # noqa: F401, F403
from ..toestand import computed # noqa: F401
from .components import (
ChatBox,
ChatInput,
ChatMessage,
ConfirmationDialog,
InputDate,
InputDateRange,
InputTime,
ClickMenu,
ContextMenu,
Menu,
Tab,
Tabs,
ThemeToggle,
theme,
use_dark_effective,
)
from .utils import cookies, headers
from ..lifecycle import on_kernel_start
from ..tasks import task as _task, use_task as _use_task, Task as _Task, TaskResult as _TaskResult
from ..toestand import computed
from ..util import deprecated


__all__ = [
"ChatBox",
"ChatInput",
"ChatMessage",
"ConfirmationDialog",
"InputDate",
"InputDateRange",
"InputTime",
"ClickMenu",
"ContextMenu",
"Menu",
"Tab",
"Tabs",
"ThemeToggle",
"theme",
"use_dark_effective",
"cookies",
"headers",
"on_kernel_start",
"task",
"use_task",
"Task",
"TaskResult",
"computed",
]


@deprecated("solara.lab.task has been moved out of the lab namespace, use solara.task instead")
def task(*args, **kwargs):
_task(*args, **kwargs)


@deprecated("solara.lab.use_task has been moved out of the lab namespace, use solara.use_task instead")
def use_task(*args, **kwargs):
return _use_task(*args, **kwargs)


@deprecated("solara.lab.Task has been moved out of the lab namespace, use solara.Task instead")
class Task(_Task):
pass


@deprecated("solara.lab.TaskResult has been moved out of the lab namespace, use solara.TaskResult instead")
class TaskResult(_TaskResult):
pass


def __getattr__(name):
Expand Down
Loading
Loading