diff options
author | Alex Grönholm <alex.gronholm@nextday.fi> | 2021-09-08 21:48:33 +0300 |
---|---|---|
committer | Alex Grönholm <alex.gronholm@nextday.fi> | 2021-09-08 21:48:33 +0300 |
commit | 114e041fa434a36f27c80130b6c0667da5497047 (patch) | |
tree | 7fd2361a824ac06955aeb233240464043ca61844 | |
parent | 075fce4105699c7adb4abc5f22de62dfc83b7e2b (diff) | |
download | apscheduler-114e041fa434a36f27c80130b6c0667da5497047.tar.gz |
Rearranged the data stores
-rw-r--r-- | src/apscheduler/datastores/async_/__init__.py | 0 | ||||
-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__.py | 0 | ||||
-rw-r--r-- | src/apscheduler/schedulers/async_.py | 4 | ||||
-rw-r--r-- | src/apscheduler/schedulers/sync.py | 2 | ||||
-rw-r--r-- | src/apscheduler/workers/async_.py | 2 | ||||
-rw-r--r-- | tests/conftest.py | 16 | ||||
-rw-r--r-- | tests/test_workers.py | 2 |
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) |