Skip to content

Commit 13aefd3

Browse files
authored
Clean up (#210)
1 parent 2ec4c6d commit 13aefd3

File tree

14 files changed

+82
-81
lines changed

14 files changed

+82
-81
lines changed

resonate/conventions/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

3+
from .base import Base
34
from .default import Default
45
from .sleep import Sleep
56

6-
__all__ = ["Default", "Sleep"]
7+
__all__ = ["Base", "Default", "Sleep"]

resonate/message_sources/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
from .local import LocalMessageSource
34
from .poller import Poller
45

5-
__all__ = ["Poller"]
6+
__all__ = ["LocalMessageSource", "Poller"]

resonate/message_sources/local.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from __future__ import annotations
2+
3+
import threading
4+
from typing import TYPE_CHECKING
5+
6+
if TYPE_CHECKING:
7+
from resonate.models.message import Mesg
8+
from resonate.models.message_source import MessageQ
9+
from resonate.stores import LocalStore
10+
11+
12+
class LocalMessageSource:
13+
def __init__(self, group: str, id: str, store: LocalStore) -> None:
14+
self._group = group
15+
self._id = id
16+
self._store = store
17+
self._thread: threading.Thread | None = None
18+
self._stop_event = threading.Event()
19+
20+
@property
21+
def unicast(self) -> str:
22+
return f"poll://{self._group}/{self._id}"
23+
24+
@property
25+
def anycast(self) -> str:
26+
return f"poll://{self._group}/{self._id}"
27+
28+
def start(self, mq: MessageQ) -> None:
29+
if self._thread is not None:
30+
return
31+
32+
self._stop_event.clear()
33+
self._thread = threading.Thread(
34+
target=self._loop,
35+
args=(mq,),
36+
name="local_msg_source",
37+
daemon=True,
38+
)
39+
self._thread.start()
40+
41+
def stop(self) -> None:
42+
if self._thread is not None:
43+
self._stop_event.set()
44+
self._thread.join()
45+
self._thread = None
46+
self._stop_event.clear()
47+
48+
def _loop(self, mq: MessageQ) -> None:
49+
while not self._stop_event.is_set():
50+
for msg in self.step():
51+
mq.enqueue(msg)
52+
self._stop_event.wait(0.1)
53+
54+
def step(self) -> list[Mesg]:
55+
return [m for _, m in self._store.step()]

resonate/message_sources/poller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import requests
99

10-
from resonate.encoders.json import JsonEncoder
10+
from resonate.encoders import JsonEncoder
1111
from resonate.logging import logger
1212
from resonate.models.message import InvokeMesg, NotifyMesg, ResumeMesg
1313

resonate/options.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import TYPE_CHECKING, TypedDict
66

77
from resonate.errors import ResonateValidationError
8-
from resonate.retry_policies.never import Never
8+
from resonate.retry_policies import Never
99

1010
if TYPE_CHECKING:
1111
from resonate.models.retry_policy import RetryPolicy

resonate/resonate.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,17 @@
99
from typing import TYPE_CHECKING, Any, Concatenate, overload
1010

1111
from resonate.bridge import Bridge
12-
from resonate.conventions.base import Base
13-
from resonate.conventions.default import Default
14-
from resonate.conventions.sleep import Sleep
12+
from resonate.conventions import Base, Default, Sleep
1513
from resonate.coroutine import LFC, LFI, RFC, RFI
1614
from resonate.dependencies import Dependencies
17-
from resonate.message_sources.poller import Poller
15+
from resonate.message_sources import LocalMessageSource, Poller
1816
from resonate.models.commands import Invoke, Listen
1917
from resonate.models.durable_promise import DurablePromise
2018
from resonate.models.handle import Handle
2119
from resonate.options import Options
2220
from resonate.registry import Registry
2321
from resonate.retry_policies import Exponential, Never
24-
from resonate.stores.local import LocalStore, _LocalMessageSource
25-
from resonate.stores.remote import RemoteStore
22+
from resonate.stores import LocalStore, RemoteStore
2623

2724
if TYPE_CHECKING:
2825
from collections.abc import Generator
@@ -47,8 +44,8 @@ def __init__(
4744
) -> None:
4845
# enforce mutual inclusion/exclusion of store and message source
4946
assert (store is None) == (message_source is None), "store and message source must both be set or both be unset"
50-
assert not isinstance(store, LocalStore) or isinstance(message_source, _LocalMessageSource), "message source must be local message source"
51-
assert not isinstance(store, RemoteStore) or not isinstance(message_source, _LocalMessageSource), "message source must not be local message source"
47+
assert not isinstance(store, LocalStore) or isinstance(message_source, LocalMessageSource), "message source must be local message source"
48+
assert not isinstance(store, RemoteStore) or not isinstance(message_source, LocalMessageSource), "message source must not be local message source"
5249

5350
self._started = False
5451

resonate/stores/local.py

Lines changed: 6 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
11
from __future__ import annotations
22

3-
import threading
43
from dataclasses import dataclass
54
from typing import TYPE_CHECKING, Any, Literal, final
65

7-
from resonate.clocks.wall import WallClock
8-
from resonate.encoders.base64 import Base64Encoder
9-
from resonate.encoders.chain import ChainEncoder
10-
from resonate.encoders.json import JsonEncoder
6+
from resonate.clocks import WallClock
7+
from resonate.encoders import Base64Encoder, ChainEncoder, JsonEncoder
118
from resonate.errors import ResonateStoreError
9+
from resonate.message_sources import LocalMessageSource
1210
from resonate.models.callback import Callback
1311
from resonate.models.durable_promise import DurablePromise
1412
from resonate.models.message import InvokeMesg, Mesg, NotifyMesg, ResumeMesg, TaskMesg
1513
from resonate.models.task import Task
16-
from resonate.routers.tag import TagRouter
14+
from resonate.routers import TagRouter
1715

1816
if TYPE_CHECKING:
1917
from resonate.models.clock import Clock
2018
from resonate.models.encoder import Encoder
21-
from resonate.models.message_source import MessageQ, MessageSource
19+
from resonate.models.message_source import MessageSource
2220
from resonate.models.router import Router
2321

2422

@@ -60,7 +58,7 @@ def add_router(self, router: Router) -> None:
6058
self._routers.append(router)
6159

6260
def message_source(self, group: str, id: str) -> MessageSource:
63-
return _LocalMessageSource(group, id, self)
61+
return LocalMessageSource(group, id, self)
6462

6563
def step(self) -> list[tuple[str, Mesg]]:
6664
messages: list[tuple[str, Mesg]] = []
@@ -777,49 +775,3 @@ def to_dict(self) -> dict[str, Any]:
777775

778776
def ikey_match(left: str | None, right: str | None) -> bool:
779777
return left is not None and right is not None and left == right
780-
781-
782-
class _LocalMessageSource:
783-
def __init__(self, group: str, id: str, store: LocalStore) -> None:
784-
self._group = group
785-
self._id = id
786-
self._store = store
787-
self._thread: threading.Thread | None = None
788-
self._stop_event = threading.Event()
789-
790-
@property
791-
def unicast(self) -> str:
792-
return f"poll://{self._group}/{self._id}"
793-
794-
@property
795-
def anycast(self) -> str:
796-
return f"poll://{self._group}/{self._id}"
797-
798-
def start(self, mq: MessageQ) -> None:
799-
if self._thread is not None:
800-
return
801-
802-
self._stop_event.clear()
803-
self._thread = threading.Thread(
804-
target=self._loop,
805-
args=(mq,),
806-
name="local_msg_source",
807-
daemon=True,
808-
)
809-
self._thread.start()
810-
811-
def stop(self) -> None:
812-
if self._thread is not None:
813-
self._stop_event.set()
814-
self._thread.join()
815-
self._thread = None
816-
self._stop_event.clear()
817-
818-
def _loop(self, mq: MessageQ) -> None:
819-
while not self._stop_event.is_set():
820-
for msg in self.step():
821-
mq.enqueue(msg)
822-
self._stop_event.wait(0.1)
823-
824-
def step(self) -> list[Mesg]:
825-
return [m for _, m in self._store.step()]

resonate/stores/remote.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66

77
from requests import PreparedRequest, Request, Response, Session
88

9-
from resonate.encoders.base64 import Base64Encoder
10-
from resonate.encoders.chain import ChainEncoder
11-
from resonate.encoders.json import JsonEncoder
9+
from resonate.encoders import Base64Encoder, ChainEncoder, JsonEncoder
1210
from resonate.errors import ResonateStoreError
1311
from resonate.models.callback import Callback
1412
from resonate.models.durable_promise import DurablePromise

sim/simulator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import TYPE_CHECKING, Any
55

66
from resonate import Context
7-
from resonate.clocks.step import StepClock
7+
from resonate.clocks import StepClock
88
from resonate.dependencies import Dependencies
99
from resonate.errors import ResonateStoreError
1010
from resonate.models.commands import (
@@ -43,7 +43,7 @@
4343
from resonate.models.task import Task
4444
from resonate.options import Options
4545
from resonate.scheduler import Done, More, Scheduler
46-
from resonate.stores.local import LocalStore
46+
from resonate.stores import LocalStore
4747

4848
if TYPE_CHECKING:
4949
from collections.abc import Callable

tests/conftest.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@
88

99
import pytest
1010

11-
from resonate.message_sources.poller import Poller
12-
from resonate.stores.local import LocalStore
13-
from resonate.stores.remote import RemoteStore
11+
from resonate.message_sources import Poller
12+
from resonate.stores import LocalStore, RemoteStore
1413

1514
if TYPE_CHECKING:
1615
from resonate.models.message_source import MessageSource

tests/runners.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from inspect import isgeneratorfunction
77
from typing import TYPE_CHECKING, Any, Protocol
88

9-
from resonate.conventions.sleep import Sleep
9+
from resonate.conventions import Sleep
1010
from resonate.coroutine import LFC, LFI, RFC, RFI
1111
from resonate.models.commands import (
1212
CancelPromiseReq,
@@ -31,7 +31,7 @@
3131
from resonate.registry import Registry
3232
from resonate.resonate import Default
3333
from resonate.scheduler import Scheduler
34-
from resonate.stores.local import LocalStore
34+
from resonate.stores import LocalStore
3535

3636
if TYPE_CHECKING:
3737
from collections.abc import Callable

tests/test_bridge.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import pytest
77

88
from resonate.resonate import Resonate
9-
from resonate.retry_policies.constant import Constant
9+
from resonate.retry_policies import Constant
1010

1111
if TYPE_CHECKING:
1212
from collections.abc import Generator

tests/test_encoder.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44

55
import pytest
66

7-
from resonate.encoders.base64 import Base64Encoder
8-
from resonate.encoders.chain import ChainEncoder
9-
from resonate.encoders.json import JsonEncoder
7+
from resonate.encoders import Base64Encoder, ChainEncoder, JsonEncoder
108

119

1210
@pytest.mark.parametrize(

tests/test_store_promise.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import pytest
88

9-
from resonate.stores.local import ResonateStoreError
9+
from resonate.errors import ResonateStoreError
1010

1111
if TYPE_CHECKING:
1212
from resonate.models.store import Store

0 commit comments

Comments
 (0)