summaryrefslogtreecommitdiff
path: root/src/apscheduler/datastores/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/apscheduler/datastores/base.py')
-rw-r--r--src/apscheduler/datastores/base.py58
1 files changed, 34 insertions, 24 deletions
diff --git a/src/apscheduler/datastores/base.py b/src/apscheduler/datastores/base.py
index c05d28c..5c7ef7d 100644
--- a/src/apscheduler/datastores/base.py
+++ b/src/apscheduler/datastores/base.py
@@ -1,37 +1,47 @@
from __future__ import annotations
-from apscheduler.abc import (
- AsyncDataStore,
- AsyncEventBroker,
- DataStore,
- EventBroker,
- EventSource,
-)
+from contextlib import AsyncExitStack
+from logging import Logger, getLogger
+import attrs
+from .._retry import RetryMixin
+from ..abc import DataStore, EventBroker, Serializer
+from ..serializers.pickle import PickleSerializer
+
+
+@attrs.define(kw_only=True)
class BaseDataStore(DataStore):
- _events: EventBroker
+ """
+ Base class for data stores.
- def start(self, event_broker: EventBroker) -> None:
- self._events = event_broker
+ :param lock_expiration_delay: maximum amount of time (in seconds) that a scheduler
+ or worker can keep a lock on a schedule or task
+ """
- def stop(self, *, force: bool = False) -> None:
- del self._events
+ lock_expiration_delay: float = 30
+ _event_broker: EventBroker = attrs.field(init=False)
+ _logger: Logger = attrs.field(init=False)
- @property
- def events(self) -> EventSource:
- return self._events
+ async def start(
+ self, exit_stack: AsyncExitStack, event_broker: EventBroker
+ ) -> None:
+ self._event_broker = event_broker
+ def __attrs_post_init__(self):
+ self._logger = getLogger(self.__class__.__name__)
-class BaseAsyncDataStore(AsyncDataStore):
- _events: AsyncEventBroker
- async def start(self, event_broker: AsyncEventBroker) -> None:
- self._events = event_broker
+@attrs.define(kw_only=True)
+class BaseExternalDataStore(BaseDataStore, RetryMixin):
+ """
+ Base class for data stores using an external service such as a database.
- async def stop(self, *, force: bool = False) -> None:
- del self._events
+ :param serializer: the serializer used to (de)serialize tasks, schedules and jobs
+ for storage
+ :param start_from_scratch: erase all existing data during startup (useful for test
+ suites)
+ """
- @property
- def events(self) -> EventSource:
- return self._events
+ serializer: Serializer = attrs.field(factory=PickleSerializer)
+ start_from_scratch: bool = attrs.field(default=False)