summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Grönholm <alex.gronholm@nextday.fi>2021-09-08 21:48:33 +0300
committerAlex Grönholm <alex.gronholm@nextday.fi>2021-09-08 21:48:33 +0300
commit114e041fa434a36f27c80130b6c0667da5497047 (patch)
tree7fd2361a824ac06955aeb233240464043ca61844
parent075fce4105699c7adb4abc5f22de62dfc83b7e2b (diff)
downloadapscheduler-114e041fa434a36f27c80130b6c0667da5497047.tar.gz
Rearranged the data stores
-rw-r--r--src/apscheduler/datastores/async_/__init__.py0
-rw-r--r--src/apscheduler/datastores/async_adapter.py (renamed from src/apscheduler/datastores/async_/sync_adapter.py)12
-rw-r--r--src/apscheduler/datastores/async_sqlalchemy.py (renamed from src/apscheduler/datastores/async_/sqlalchemy.py)51
-rw-r--r--src/apscheduler/datastores/memory.py (renamed from src/apscheduler/datastores/sync/memory.py)14
-rw-r--r--src/apscheduler/datastores/mongodb.py (renamed from src/apscheduler/datastores/sync/mongodb.py)18
-rw-r--r--src/apscheduler/datastores/sqlalchemy.py (renamed from src/apscheduler/datastores/sync/sqlalchemy.py)18
-rw-r--r--src/apscheduler/datastores/sync/__init__.py0
-rw-r--r--src/apscheduler/schedulers/async_.py4
-rw-r--r--src/apscheduler/schedulers/sync.py2
-rw-r--r--src/apscheduler/workers/async_.py2
-rw-r--r--tests/conftest.py16
-rw-r--r--tests/test_workers.py2
12 files changed, 59 insertions, 80 deletions
diff --git a/src/apscheduler/datastores/async_/__init__.py b/src/apscheduler/datastores/async_/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/src/apscheduler/datastores/async_/__init__.py
+++ /dev/null
diff --git a/src/apscheduler/datastores/async_/sync_adapter.py b/src/apscheduler/datastores/async_adapter.py
index 5e9e3f3..89f268a 100644
--- a/src/apscheduler/datastores/async_/sync_adapter.py
+++ b/src/apscheduler/datastores/async_adapter.py
@@ -9,12 +9,12 @@ import attr
from anyio import to_thread
from anyio.from_thread import BlockingPortal
-from ... import events
-from ...abc import AsyncDataStore, DataStore
-from ...enums import ConflictPolicy
-from ...events import Event, SubscriptionToken
-from ...structures import Job, JobResult, Schedule, Task
-from ...util import reentrant
+from .. import events
+from ..abc import AsyncDataStore, DataStore
+from ..enums import ConflictPolicy
+from ..events import Event, SubscriptionToken
+from ..structures import Job, JobResult, Schedule, Task
+from ..util import reentrant
@reentrant
diff --git a/src/apscheduler/datastores/async_/sqlalchemy.py b/src/apscheduler/datastores/async_sqlalchemy.py
index a897556..fad2cd3 100644
--- a/src/apscheduler/datastores/async_/sqlalchemy.py
+++ b/src/apscheduler/datastores/async_sqlalchemy.py
@@ -14,27 +14,28 @@ import sniffio
from anyio import TASK_STATUS_IGNORED, create_task_group, sleep
from attr import asdict
from sqlalchemy import (
- JSON, TIMESTAMP, Column, Enum, Integer, LargeBinary, MetaData, Table, TypeDecorator, Unicode,
- and_, bindparam, func, or_, select)
-from sqlalchemy.engine import URL, Dialect, Result
+ JSON, TIMESTAMP, Column, Enum, Integer, LargeBinary, MetaData, Table, Unicode, and_, bindparam,
+ func, or_, select)
+from sqlalchemy.engine import URL, Result
from sqlalchemy.exc import CompileError, IntegrityError
from sqlalchemy.ext.asyncio import AsyncConnection, create_async_engine
from sqlalchemy.ext.asyncio.engine import AsyncEngine
from sqlalchemy.sql.ddl import DropTable
from sqlalchemy.sql.elements import BindParameter, literal
-from ... import events as events_module
-from ...abc import AsyncDataStore, Job, Schedule, Serializer
-from ...enums import CoalescePolicy, ConflictPolicy, JobOutcome
-from ...events import (
+from .. import events as events_module
+from ..abc import AsyncDataStore, Job, Schedule, Serializer
+from ..enums import CoalescePolicy, ConflictPolicy, JobOutcome
+from ..events import (
AsyncEventHub, DataStoreEvent, Event, JobAdded, JobDeserializationFailed, ScheduleAdded,
ScheduleDeserializationFailed, ScheduleRemoved, ScheduleUpdated, SubscriptionToken, TaskAdded,
TaskRemoved, TaskUpdated)
-from ...exceptions import ConflictingIdError, SerializationError, TaskLookupError
-from ...marshalling import callable_to_ref
-from ...serializers.pickle import PickleSerializer
-from ...structures import JobResult, Task
-from ...util import reentrant
+from ..exceptions import ConflictingIdError, SerializationError, TaskLookupError
+from ..marshalling import callable_to_ref
+from ..serializers.pickle import PickleSerializer
+from ..structures import JobResult, Task
+from ..util import reentrant
+from .sqlalchemy import EmulatedTimestampTZ, EmulatedUUID
def default_json_handler(obj: Any) -> Any:
@@ -60,31 +61,9 @@ def json_object_hook(obj: dict[str, Any]) -> Any:
return obj
-class EmulatedUUID(TypeDecorator):
- impl = Unicode(32)
- cache_ok = True
-
- def process_bind_param(self, value, dialect: Dialect) -> Any:
- return value.hex
-
- def process_result_value(self, value: Any, dialect: Dialect):
- return UUID(value) if value else None
-
-
-class EmulatedTimestampTZ(TypeDecorator):
- impl = Unicode(32)
- cache_ok = True
-
- def process_bind_param(self, value, dialect: Dialect) -> Any:
- return value.isoformat() if value is not None else None
-
- def process_result_value(self, value: Any, dialect: Dialect):
- return datetime.fromisoformat(value) if value is not None else None
-
-
@reentrant
@attr.define(eq=False)
-class SQLAlchemyDataStore(AsyncDataStore):
+class AsyncSQLAlchemyDataStore(AsyncDataStore):
engine: AsyncEngine
schema: Optional[str] = attr.field(default=None, kw_only=True)
serializer: Serializer = attr.field(factory=PickleSerializer, kw_only=True)
@@ -121,7 +100,7 @@ class SQLAlchemyDataStore(AsyncDataStore):
self.notify_channel = None
@classmethod
- def from_url(cls, url: str | URL, **options) -> 'SQLAlchemyDataStore':
+ def from_url(cls, url: str | URL, **options) -> AsyncSQLAlchemyDataStore:
engine = create_async_engine(url, future=True)
return cls(engine, **options)
diff --git a/src/apscheduler/datastores/sync/memory.py b/src/apscheduler/datastores/memory.py
index 17ab70c..df4e0c2 100644
--- a/src/apscheduler/datastores/sync/memory.py
+++ b/src/apscheduler/datastores/memory.py
@@ -9,15 +9,15 @@ from uuid import UUID
import attr
-from ... import events
-from ...abc import DataStore, Job, Schedule
-from ...enums import ConflictPolicy
-from ...events import (
+from .. import events
+from ..abc import DataStore, Job, Schedule
+from ..enums import ConflictPolicy
+from ..events import (
EventHub, JobAdded, ScheduleAdded, ScheduleRemoved, ScheduleUpdated, SubscriptionToken,
TaskAdded, TaskRemoved, TaskUpdated)
-from ...exceptions import ConflictingIdError, TaskLookupError
-from ...structures import JobResult, Task
-from ...util import reentrant
+from ..exceptions import ConflictingIdError, TaskLookupError
+from ..structures import JobResult, Task
+from ..util import reentrant
max_datetime = datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=timezone.utc)
diff --git a/src/apscheduler/datastores/sync/mongodb.py b/src/apscheduler/datastores/mongodb.py
index 1b87929..749381e 100644
--- a/src/apscheduler/datastores/sync/mongodb.py
+++ b/src/apscheduler/datastores/mongodb.py
@@ -14,17 +14,17 @@ from pymongo import ASCENDING, DeleteOne, MongoClient, UpdateOne
from pymongo.collection import Collection
from pymongo.errors import DuplicateKeyError
-from ... import events
-from ...abc import DataStore, Job, Schedule, Serializer
-from ...enums import ConflictPolicy
-from ...events import (
+from .. import events
+from ..abc import DataStore, Job, Schedule, Serializer
+from ..enums import ConflictPolicy
+from ..events import (
DataStoreEvent, EventHub, JobAdded, ScheduleAdded, ScheduleRemoved, ScheduleUpdated,
SubscriptionToken, TaskAdded, TaskRemoved, TaskUpdated)
-from ...exceptions import (
+from ..exceptions import (
ConflictingIdError, DeserializationError, SerializationError, TaskLookupError)
-from ...serializers.pickle import PickleSerializer
-from ...structures import JobResult, Task
-from ...util import reentrant
+from ..serializers.pickle import PickleSerializer
+from ..structures import JobResult, Task
+from ..util import reentrant
@reentrant
@@ -58,7 +58,7 @@ class MongoDBDataStore(DataStore):
self._jobs_results: Collection = database['job_results']
@classmethod
- def from_url(cls, uri: str, **options) -> 'MongoDBDataStore':
+ def from_url(cls, uri: str, **options) -> MongoDBDataStore:
client = MongoClient(uri)
return cls(client, **options)
diff --git a/src/apscheduler/datastores/sync/sqlalchemy.py b/src/apscheduler/datastores/sqlalchemy.py
index 2a170db..11db258 100644
--- a/src/apscheduler/datastores/sync/sqlalchemy.py
+++ b/src/apscheduler/datastores/sqlalchemy.py
@@ -16,17 +16,17 @@ from sqlalchemy.future import Engine, create_engine
from sqlalchemy.sql.ddl import DropTable
from sqlalchemy.sql.elements import BindParameter, literal
-from ...abc import DataStore, Job, Schedule, Serializer
-from ...enums import CoalescePolicy, ConflictPolicy, JobOutcome
-from ...events import (
+from ..abc import DataStore, Job, Schedule, Serializer
+from ..enums import CoalescePolicy, ConflictPolicy, JobOutcome
+from ..events import (
Event, EventHub, JobAdded, JobDeserializationFailed, ScheduleAdded,
ScheduleDeserializationFailed, ScheduleRemoved, ScheduleUpdated, SubscriptionToken, TaskAdded,
TaskRemoved, TaskUpdated)
-from ...exceptions import ConflictingIdError, SerializationError, TaskLookupError
-from ...marshalling import callable_to_ref
-from ...serializers.pickle import PickleSerializer
-from ...structures import JobResult, Task
-from ...util import reentrant
+from ..exceptions import ConflictingIdError, SerializationError, TaskLookupError
+from ..marshalling import callable_to_ref
+from ..serializers.pickle import PickleSerializer
+from ..structures import JobResult, Task
+from ..util import reentrant
class EmulatedUUID(TypeDecorator):
@@ -85,7 +85,7 @@ class SQLAlchemyDataStore(DataStore):
self._supports_update_returning = True
@classmethod
- def from_url(cls, url: str | URL, **options) -> 'SQLAlchemyDataStore':
+ def from_url(cls, url: str | URL, **options) -> SQLAlchemyDataStore:
engine = create_engine(url)
return cls(engine, **options)
diff --git a/src/apscheduler/datastores/sync/__init__.py b/src/apscheduler/datastores/sync/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/src/apscheduler/datastores/sync/__init__.py
+++ /dev/null
diff --git a/src/apscheduler/schedulers/async_.py b/src/apscheduler/schedulers/async_.py
index 335adbf..b60aed6 100644
--- a/src/apscheduler/schedulers/async_.py
+++ b/src/apscheduler/schedulers/async_.py
@@ -13,8 +13,8 @@ from anyio import TASK_STATUS_IGNORED, create_task_group, get_cancelled_exc_clas
from anyio.abc import TaskGroup
from ..abc import AsyncDataStore, DataStore, EventSource, Job, Schedule, Trigger
-from ..datastores.async_.sync_adapter import AsyncDataStoreAdapter
-from ..datastores.sync.memory import MemoryDataStore
+from ..datastores.async_adapter import AsyncDataStoreAdapter
+from ..datastores.memory import MemoryDataStore
from ..enums import CoalescePolicy, ConflictPolicy, RunState
from ..events import (
AsyncEventHub, Event, ScheduleAdded, SchedulerStarted, SchedulerStopped, ScheduleUpdated,
diff --git a/src/apscheduler/schedulers/sync.py b/src/apscheduler/schedulers/sync.py
index d336276..1e5f133 100644
--- a/src/apscheduler/schedulers/sync.py
+++ b/src/apscheduler/schedulers/sync.py
@@ -11,7 +11,7 @@ from typing import Any, Callable, Iterable, Mapping, Optional
from uuid import uuid4
from ..abc import DataStore, EventSource, Trigger
-from ..datastores.sync.memory import MemoryDataStore
+from ..datastores.memory import MemoryDataStore
from ..enums import CoalescePolicy, ConflictPolicy, RunState
from ..events import (
Event, EventHub, ScheduleAdded, SchedulerStarted, SchedulerStopped, ScheduleUpdated,
diff --git a/src/apscheduler/workers/async_.py b/src/apscheduler/workers/async_.py
index e9ac7e7..e9bcc5f 100644
--- a/src/apscheduler/workers/async_.py
+++ b/src/apscheduler/workers/async_.py
@@ -14,7 +14,7 @@ from anyio import TASK_STATUS_IGNORED, create_task_group, get_cancelled_exc_clas
from anyio.abc import CancelScope
from ..abc import AsyncDataStore, DataStore, EventSource, Job
-from ..datastores.async_.sync_adapter import AsyncDataStoreAdapter
+from ..datastores.async_adapter import AsyncDataStoreAdapter
from ..enums import JobOutcome, RunState
from ..events import (
AsyncEventHub, Event, JobAdded, JobCancelled, JobCompleted, JobDeadlineMissed, JobFailed,
diff --git a/tests/conftest.py b/tests/conftest.py
index 13d3dea..bc5bab2 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -6,8 +6,8 @@ from typing import AsyncContextManager, AsyncGenerator, ContextManager, Generato
import pytest
from apscheduler.abc import AsyncDataStore, DataStore, Serializer
-from apscheduler.datastores.async_.sync_adapter import AsyncDataStoreAdapter
-from apscheduler.datastores.sync.memory import MemoryDataStore
+from apscheduler.datastores.async_adapter import AsyncDataStoreAdapter
+from apscheduler.datastores.memory import MemoryDataStore
from apscheduler.serializers.cbor import CBORSerializer
from apscheduler.serializers.json import JSONSerializer
from apscheduler.serializers.pickle import PickleSerializer
@@ -47,7 +47,7 @@ def setup_memory_store() -> Generator[DataStore, None, None]:
def setup_mongodb_store() -> Generator[DataStore, None, None]:
from pymongo import MongoClient
- from apscheduler.datastores.sync.mongodb import MongoDBDataStore
+ from apscheduler.datastores.mongodb import MongoDBDataStore
with MongoClient(tz_aware=True, serverSelectionTimeoutMS=1000) as client:
yield MongoDBDataStore(client, start_from_scratch=True)
@@ -57,7 +57,7 @@ def setup_mongodb_store() -> Generator[DataStore, None, None]:
def setup_sqlite_store() -> Generator[DataStore, None, None]:
from sqlalchemy.future import create_engine
- from apscheduler.datastores.sync.sqlalchemy import SQLAlchemyDataStore
+ from apscheduler.datastores.sqlalchemy import SQLAlchemyDataStore
with TemporaryDirectory('sqlite_') as tempdir:
engine = create_engine(f'sqlite:///{tempdir}/test.db')
@@ -71,7 +71,7 @@ def setup_sqlite_store() -> Generator[DataStore, None, None]:
def setup_psycopg2_store() -> Generator[DataStore, None, None]:
from sqlalchemy.future import create_engine
- from apscheduler.datastores.sync.sqlalchemy import SQLAlchemyDataStore
+ from apscheduler.datastores.sqlalchemy import SQLAlchemyDataStore
engine = create_engine('postgresql+psycopg2://postgres:secret@localhost/testdb')
try:
@@ -84,7 +84,7 @@ def setup_psycopg2_store() -> Generator[DataStore, None, None]:
def setup_mysql_store() -> Generator[DataStore, None, None]:
from sqlalchemy.future import create_engine
- from apscheduler.datastores.sync.sqlalchemy import SQLAlchemyDataStore
+ from apscheduler.datastores.sqlalchemy import SQLAlchemyDataStore
engine = create_engine('mysql+pymysql://root:secret@localhost/testdb')
try:
@@ -97,12 +97,12 @@ def setup_mysql_store() -> Generator[DataStore, None, None]:
async def setup_asyncpg_store() -> AsyncGenerator[AsyncDataStore, None]:
from sqlalchemy.ext.asyncio import create_async_engine
- from apscheduler.datastores.async_.sqlalchemy import SQLAlchemyDataStore
+ from apscheduler.datastores.async_sqlalchemy import AsyncSQLAlchemyDataStore
engine = create_async_engine('postgresql+asyncpg://postgres:secret@localhost/testdb',
future=True)
try:
- yield SQLAlchemyDataStore(engine, start_from_scratch=True)
+ yield AsyncSQLAlchemyDataStore(engine, start_from_scratch=True)
finally:
await engine.dispose()
diff --git a/tests/test_workers.py b/tests/test_workers.py
index f949edf..d9127e7 100644
--- a/tests/test_workers.py
+++ b/tests/test_workers.py
@@ -7,7 +7,7 @@ import pytest
from anyio import fail_after
from apscheduler.abc import Job
-from apscheduler.datastores.sync.memory import MemoryDataStore
+from apscheduler.datastores.memory import MemoryDataStore
from apscheduler.events import (
Event, JobAdded, JobCompleted, JobDeadlineMissed, JobFailed, JobStarted, TaskAdded,
WorkerStarted, WorkerStopped)