Skip to content

Commit 417b687

Browse files
committed
rename daemon to run_in_thread + misc
1 parent 0a05d59 commit 417b687

File tree

6 files changed

+39
-19
lines changed

6 files changed

+39
-19
lines changed

scripts/live_docs.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def new_builder():
3838

3939
server = PerClientStateServer(main.component, {"cors": True})
4040
_running_idom_servers.append(server)
41-
server.daemon("127.0.0.1", 5555, debug=True)
41+
server.run_in_thread("127.0.0.1", 5555, debug=True)
4242
old_builder()
4343

4444
return new_builder

src/idom/server/base.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ class AbstractRenderServer(Generic[_App, _Config], abc.ABC):
1818
standalone and as an extension to an existing application.
1919
2020
Standalone usage:
21-
:meth:`AbstractServerExtension.run` or :meth:`AbstractServerExtension.daemon`
21+
:meth:`~AbstractServerExtension.run` or :meth:`~AbstractServerExtension.run_in_thread`
2222
Register an extension:
23-
:meth:`AbstractServerExtension.register`
23+
:meth:`~AbstractServerExtension.register`
2424
"""
2525

2626
def __init__(
@@ -54,7 +54,7 @@ def run(self, host: str, port: int, *args: Any, **kwargs: Any) -> None:
5454
self._config, app, host, port, args, kwargs
5555
)
5656

57-
def daemon(self, *args: Any, **kwargs: Any) -> Thread:
57+
def run_in_thread(self, *args: Any, **kwargs: Any) -> Thread:
5858
"""Run the standalone application in a seperate thread."""
5959
self._daemon_thread = thread = Thread(
6060
target=lambda: self.run(*args, **kwargs), daemon=True
@@ -67,6 +67,8 @@ def daemon(self, *args: Any, **kwargs: Any) -> Thread:
6767

6868
def register(self: _Self, app: Optional[_App]) -> _Self:
6969
"""Register this as an extension."""
70+
if self._app is not None:
71+
raise RuntimeError(f"Already registered {self._app}")
7072
self._setup_application(self._config, app)
7173
self._setup_application_did_start_event(
7274
self._config, app, self._server_did_start
@@ -84,10 +86,12 @@ def wait_until_server_start(self, timeout: float = 3.0) -> None:
8486
@abc.abstractmethod
8587
def stop(self) -> None:
8688
"""Stop a currently running application"""
89+
raise NotImplementedError()
8790

8891
@abc.abstractmethod
8992
def _create_config(self, config: Optional[_Config]) -> _Config:
9093
"""Return the default configuration options."""
94+
raise NotImplementedError()
9195

9296
@abc.abstractmethod
9397
def _default_application(self, config: _Config) -> _App:

src/idom/server/prefab.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@ def run(
4141
server_config:
4242
Options passed to configure the server.
4343
run_kwargs:
44-
Keyword arguments passed to the :meth:`~AbstractRenderServer.daemon`
45-
or :meth:`~AbstractRenderServer.run` method of the server
44+
Keyword arguments passed to the :meth:`AbstractRenderServer.run`
45+
or :meth:`AbstractRenderServer.run_in_thread` methods of the server
46+
depending on whether ``daemon`` is set or not.
4647
app:
4748
Register the server to an existing application and run that.
4849
daemon:
@@ -64,7 +65,7 @@ def run(
6465
if app is not None: # pragma: no cover
6566
server.register(app)
6667

67-
run_server = server.run if not daemon else server.daemon
68+
run_server = server.run if not daemon else server.run_in_thread
6869
run_server(host, port, **(run_kwargs or {})) # type: ignore
6970

7071
return server
@@ -89,7 +90,7 @@ def multiview_server(
8990
host: The server hostname
9091
port: The server port number
9192
server_config: Value passed to :meth:`AbstractRenderServer.configure`
92-
run_kwargs: Keyword args passed to :meth:`AbstractRenderServer.daemon`
93+
run_kwargs: Keyword args passed to :meth:`AbstractRenderServer.run_in_thread`
9394
app: Optionally provide a prexisting application to register to
9495
9596
Returns:
@@ -132,7 +133,7 @@ def hotswap_server(
132133
host: The server hostname
133134
port: The server port number
134135
server_config: Value passed to :meth:`AbstractRenderServer.configure`
135-
run_kwargs: Keyword args passed to :meth:`AbstractRenderServer.daemon`
136+
run_kwargs: Keyword args passed to :meth:`AbstractRenderServer.run_in_thread`
136137
app: Optionally provide a prexisting application to register to
137138
sync_views: Whether to update all displays with newly mounted components
138139

src/idom/server/utils.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,18 @@
44
from typing import Any, List, Type
55

66

7+
_SUPPORTED_PACKAGES = [
8+
"sanic",
9+
"fastapi",
10+
"flask",
11+
"tornado",
12+
]
13+
14+
715
def find_builtin_server_type(type_name: str) -> Type[Any]:
816
"""Find first installed server implementation"""
9-
supported_packages = ["sanic", "flask", "tornado"]
10-
1117
installed_builtins: List[str] = []
12-
for name in supported_packages:
18+
for name in _SUPPORTED_PACKAGES:
1319
try:
1420
import_module(name)
1521
except ImportError: # pragma: no cover
@@ -24,7 +30,7 @@ def find_builtin_server_type(type_name: str) -> Type[Any]:
2430
else: # pragma: no cover
2531
if not installed_builtins:
2632
raise RuntimeError(
27-
f"Found none of the following builtin server implementations {supported_packages}"
33+
f"Found none of the following builtin server implementations {_SUPPORTED_PACKAGES}"
2834
)
2935
else:
3036
raise ImportError(

src/idom/widgets/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def hotswap(shared: bool = False) -> Tuple[MountFunc, ComponentConstructor]:
3030
import idom
3131
3232
show, root = idom.hotswap()
33-
PerClientState(root).daemon("localhost", 8765)
33+
PerClientStateServer(root).run_in_thread("localhost", 8765)
3434
3535
@idom.component
3636
def DivOne(self):

tests/test_server/test_base.py

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
import pytest
2+
import sanic
23

34
import idom
5+
from idom.server.sanic import PerClientStateServer
46
from idom.server.utils import find_builtin_server_type
57

68

7-
def test_no_application_until_running():
8-
@idom.component
9-
def AnyComponent():
10-
pass
9+
@idom.component
10+
def AnyComponent():
11+
pass
1112

12-
server = find_builtin_server_type("PerClientStateServer")(AnyComponent)
1313

14+
def test_no_application_until_running():
15+
server = find_builtin_server_type("PerClientStateServer")(AnyComponent)
1416
with pytest.raises(RuntimeError, match="No application"):
1517
server.application
18+
19+
20+
def test_cannot_register_app_twice():
21+
server = PerClientStateServer(AnyComponent)
22+
server.register(sanic.Sanic())
23+
with pytest.raises(RuntimeError, match="Already registered"):
24+
server.register(sanic.Sanic())

0 commit comments

Comments
 (0)