diff --git a/docs/reference/extensions/events.rst b/docs/reference/extensions/events.rst index 584f2a45c..c2071f7aa 100644 --- a/docs/reference/extensions/events.rst +++ b/docs/reference/extensions/events.rst @@ -21,8 +21,8 @@ backend owns its own listener hub that: * Serializes subscribe / unsubscribe under a lock so concurrent callers cannot race on driver-level statements that share the connection. -The Oracle native backends (``advanced_queue`` and -``transactional_event_queue``) use an analogous pattern: a per-channel +The Oracle native backends (``aq`` and +``txeventq``) use an analogous pattern: a per-channel queue-handle cache backed by a single dedicated session per backend instance. ``dequeue`` honors ``min(poll_interval, aq_wait_seconds)`` as its wait bound so the caller's polling cadence is respected. @@ -37,8 +37,8 @@ Oracle native event backends Oracle provides two **native** messaging backends in addition to the default ``table_queue``: -* ``advanced_queue`` — classic Oracle Advanced Queuing (AQ). -* ``transactional_event_queue`` — Oracle Transactional Event Queues (TxEventQ). +* ``aq`` — classic Oracle Advanced Queuing (AQ). +* ``txeventq`` — Oracle Transactional Event Queues (TxEventQ). Both share the same client path and JSON payloads; they differ only in how the underlying queue is provisioned. Select one via ``events.backend``: @@ -49,7 +49,7 @@ underlying queue is provisioned. Select one via ``events.backend``: config = OracleAsyncConfig( connection_config={"dsn": "..."}, - extension_config={"events": {"backend": "transactional_event_queue"}}, + extension_config={"events": {"backend": "txeventq"}}, ) The default remains ``table_queue``, which works on every Oracle edition @@ -70,9 +70,9 @@ Provisioning The backend attaches to an existing queue; it does not create one. Provision the queue with ``DBMS_AQADM`` first: -* ``advanced_queue`` — ``create_queue_table(queue_payload_type => 'JSON')`` + +* ``aq`` — ``create_queue_table(queue_payload_type => 'JSON')`` + ``create_queue`` + ``start_queue``. -* ``transactional_event_queue`` — +* ``txeventq`` — ``create_transactional_event_queue(queue_payload_type => 'JSON', multiple_consumers => FALSE)`` + ``start_queue``. diff --git a/sqlspec/adapters/oracledb/config.py b/sqlspec/adapters/oracledb/config.py index c1f6e9cbf..b18498d36 100644 --- a/sqlspec/adapters/oracledb/config.py +++ b/sqlspec/adapters/oracledb/config.py @@ -57,7 +57,7 @@ OracleServerType = Literal["dedicated", "shared", "pooled"] OraclePoolBoundary = Literal["statement", "transaction"] OracleVectorReturnFormat = Literal["array", "list", "numpy"] -OracleEventsBackend = Literal["advanced_queue", "table_queue", "transactional_event_queue"] +OracleEventsBackend = Literal["aq", "table_queue", "txeventq"] class OracleConnectionParams(TypedDict): @@ -192,9 +192,9 @@ class OracleDriverFeatures(TypedDict): This is separate from connection_config["events"], which enables python-oracledb Thick mode database event notifications for HA and continuous query notification. events_backend: Event channel backend selection. - Options: "advanced_queue", "table_queue", "transactional_event_queue" - - "advanced_queue": Oracle Advanced Queuing (native messaging, requires DBMS_AQADM privileges) - - "transactional_event_queue": Oracle Transactional Event Queues (native messaging, requires + Options: "aq", "table_queue", "txeventq" + - "aq": Oracle Advanced Queuing (native messaging, requires DBMS_AQADM privileges) + - "txeventq": Oracle Transactional Event Queues (native messaging, requires DBMS_AQADM privileges; provisioned via DBMS_AQADM.CREATE_TRANSACTIONAL_EVENT_QUEUE) - "table_queue": Durable table-backed queue with retries and exactly-once delivery Defaults to "table_queue" (works on all Oracle editions without special privileges). diff --git a/sqlspec/adapters/oracledb/events/_hub.py b/sqlspec/adapters/oracledb/events/_hub.py index 22ae7d945..2e438bec0 100644 --- a/sqlspec/adapters/oracledb/events/_hub.py +++ b/sqlspec/adapters/oracledb/events/_hub.py @@ -112,7 +112,7 @@ def __init__( visibility: "int | None", default_visibility: "int | None", wait_ceiling: int, - backend_name: str = "advanced_queue", + backend_name: str = "aq", ) -> None: self._config = config self._queue_name_template = queue_name_template @@ -242,7 +242,7 @@ def __init__( visibility: "int | None", default_visibility: "int | None", wait_ceiling: int, - backend_name: str = "advanced_queue", + backend_name: str = "aq", ) -> None: self._config = config self._queue_name_template = queue_name_template diff --git a/sqlspec/adapters/oracledb/events/backend.py b/sqlspec/adapters/oracledb/events/backend.py index 59ddb1400..de6b28534 100644 --- a/sqlspec/adapters/oracledb/events/backend.py +++ b/sqlspec/adapters/oracledb/events/backend.py @@ -86,7 +86,7 @@ class OracleSyncAQEventBackend: supports_sync = True supports_async = False - backend_name = "advanced_queue" + backend_name = "aq" def __init__(self, config: "OracleSyncConfig", settings: "dict[str, Any] | None" = None) -> None: if "oracledb" not in type(config).__module__: @@ -170,7 +170,7 @@ class OracleAsyncAQEventBackend: supports_sync = False supports_async = True - backend_name = "advanced_queue" + backend_name = "aq" def __init__(self, config: "OracleAsyncConfig", settings: "dict[str, Any] | None" = None) -> None: if "oracledb" not in type(config).__module__: @@ -247,7 +247,7 @@ class OracleSyncTxEventQEventBackend(OracleSyncAQEventBackend): __slots__ = () - backend_name = "transactional_event_queue" + backend_name = "txeventq" class OracleAsyncTxEventQEventBackend(OracleAsyncAQEventBackend): @@ -255,7 +255,7 @@ class OracleAsyncTxEventQEventBackend(OracleAsyncAQEventBackend): __slots__ = () - backend_name = "transactional_event_queue" + backend_name = "txeventq" def _get_publish_queue(connection: Any, channel: str, queue_name: str) -> Any: @@ -315,22 +315,22 @@ def create_event_backend( """EventChannel factory for the Oracle AQ backend.""" is_async = config.is_async match (backend_name, is_async): - case ("advanced_queue", False): + case ("aq", False): try: return OracleSyncAQEventBackend(config, extension_settings) # type: ignore[arg-type] except (ImproperConfigurationError, MissingDependencyError): return None - case ("advanced_queue", True): + case ("aq", True): try: return OracleAsyncAQEventBackend(config, extension_settings) # type: ignore[arg-type] except (ImproperConfigurationError, MissingDependencyError): return None - case ("transactional_event_queue", False): + case ("txeventq", False): try: return OracleSyncTxEventQEventBackend(config, extension_settings) # type: ignore[arg-type] except (ImproperConfigurationError, MissingDependencyError): return None - case ("transactional_event_queue", True): + case ("txeventq", True): try: return OracleAsyncTxEventQEventBackend(config, extension_settings) # type: ignore[arg-type] except (ImproperConfigurationError, MissingDependencyError): diff --git a/sqlspec/config.py b/sqlspec/config.py index 3ae24c5fd..2b4dbfa4c 100644 --- a/sqlspec/config.py +++ b/sqlspec/config.py @@ -540,13 +540,13 @@ class EventsConfig(TypedDict): Use in ``extension_config["events"]``. """ - backend: NotRequired[Literal["listen_notify", "table_queue", "listen_notify_durable", "advanced_queue"]] + backend: NotRequired[Literal["listen_notify", "table_queue", "listen_notify_durable", "aq"]] """Backend implementation. PostgreSQL adapters default to 'listen_notify', others to 'table_queue'. - listen_notify: Real-time PostgreSQL LISTEN/NOTIFY (ephemeral) - table_queue: Durable table-backed queue with retries (all adapters) - listen_notify_durable: Hybrid combining both (PostgreSQL only) - - advanced_queue: Oracle Advanced Queueing + - aq: Oracle Advanced Queueing """ queue_table: NotRequired[str] diff --git a/tests/integration/adapters/oracledb/conftest.py b/tests/integration/adapters/oracledb/conftest.py index 49776ecf4..e3bc47ebd 100644 --- a/tests/integration/adapters/oracledb/conftest.py +++ b/tests/integration/adapters/oracledb/conftest.py @@ -32,7 +32,7 @@ def oracle_aq_privileges(oracle_23ai_service: "OracleService") -> None: """Grant the container app user the privileges required to run DBMS_AQADM. Unlocks both classic Advanced Queuing and Transactional Event Queues for the - ``advanced_queue`` / ``transactional_event_queue`` events backends. The grants persist + ``aq`` / ``txeventq`` events backends. The grants persist for the container lifetime, so session scope is sufficient and naturally idempotent (re-granting an existing role/privilege is a no-op in Oracle). """ diff --git a/tests/integration/adapters/oracledb/extensions/events/test_aq_async.py b/tests/integration/adapters/oracledb/extensions/events/test_aq_async.py index 368f6e17a..c4bf3af00 100644 --- a/tests/integration/adapters/oracledb/extensions/events/test_aq_async.py +++ b/tests/integration/adapters/oracledb/extensions/events/test_aq_async.py @@ -1,6 +1,6 @@ """Async Oracle Advanced Queuing event channel parity tests. -Mirrors the asyncpg listen/notify parity bar for the async advanced_queue backend +Mirrors the asyncpg listen/notify parity bar for the async aq backend (OracleAsyncAQEventBackend), which had no live-queue coverage before this suite. """ @@ -31,7 +31,7 @@ async def _wait_for_message(received: "list[Any]", count: int = 1) -> None: def _async_config(oracle_service: OracleService, **events: Any) -> OracleAsyncConfig: - events_config: dict[str, Any] = {"backend": "advanced_queue", **events} + events_config: dict[str, Any] = {"backend": "aq", **events} return OracleAsyncConfig( connection_config={ "host": oracle_service.host, @@ -50,7 +50,7 @@ def _async_config(oracle_service: OracleService, **events: Any) -> OracleAsyncCo async def oracle_aq_async_config( provision_classic_aq: "Callable[..., AbstractContextManager[None]]", oracle_23ai_service: OracleService ) -> "AsyncGenerator[OracleAsyncConfig, None]": - """Async Oracle config backed by a live advanced_queue queue.""" + """Async Oracle config backed by a live aq queue.""" config = _async_config(oracle_23ai_service) with provision_classic_aq(): @@ -69,7 +69,7 @@ async def test_oracle_aq_async_publish_and_ack(oracle_aq_async_config: OracleAsy channel = spec.event_channel(oracle_aq_async_config) assert isinstance(channel, AsyncEventChannel) - assert channel._backend_name == "advanced_queue" # pyright: ignore[reportPrivateUsage] + assert channel._backend_name == "aq" # pyright: ignore[reportPrivateUsage] event_id = await channel.publish("alerts", {"action": "test"}) assert len(event_id) == 32 @@ -147,7 +147,7 @@ async def test_oracle_aq_async_concurrent_multi_channel( ) -> None: """Concurrent listeners on distinct per-channel queues stay isolated and race-free. - The advanced_queue backend routes a channel to its own physical queue via the + The aq backend routes a channel to its own physical queue via the ``{channel}`` template, so each listener must see only its own channel's events even while both drain the shared hub connection under an asyncio lock. """ diff --git a/tests/integration/adapters/oracledb/extensions/events/test_aq_payload_mode.py b/tests/integration/adapters/oracledb/extensions/events/test_aq_payload_mode.py index 8f444ad57..288efe5e4 100644 --- a/tests/integration/adapters/oracledb/extensions/events/test_aq_payload_mode.py +++ b/tests/integration/adapters/oracledb/extensions/events/test_aq_payload_mode.py @@ -1,4 +1,4 @@ -"""Thin-mode JSON payload verification for the Oracle advanced_queue events backend. +"""Thin-mode JSON payload verification for the Oracle aq events backend. Confirms that classic Advanced Queuing carries a structured JSON payload through a full enqueue/dequeue cycle while the adapter is in its default thin mode (no Instant Client). @@ -21,7 +21,7 @@ def oracle_aq_json_config( provision_classic_aq: "Callable[..., AbstractContextManager[None]]", oracle_23ai_service: OracleService ) -> Generator[OracleSyncConfig, None, None]: - """Provision a JSON-payload AQ queue for the advanced_queue backend.""" + """Provision a JSON-payload AQ queue for the aq backend.""" config = OracleSyncConfig( connection_config={ @@ -31,7 +31,7 @@ def oracle_aq_json_config( "user": oracle_23ai_service.user, "password": oracle_23ai_service.password, }, - extension_config={"events": {"backend": "advanced_queue"}}, + extension_config={"events": {"backend": "aq"}}, ) with provision_classic_aq(payload_type="JSON"): @@ -41,7 +41,7 @@ def oracle_aq_json_config( config.close_pool() -def test_advanced_queue_json_round_trips_in_thin_mode(oracle_aq_json_config: OracleSyncConfig) -> None: +def test_aq_json_round_trips_in_thin_mode(oracle_aq_json_config: OracleSyncConfig) -> None: """A nested JSON payload survives enqueue/dequeue unchanged with a thin-mode connection.""" with oracle_aq_json_config.provide_session() as driver: diff --git a/tests/integration/adapters/oracledb/extensions/events/test_aq_poll_interval.py b/tests/integration/adapters/oracledb/extensions/events/test_aq_poll_interval.py index a490604e2..da9f2d0a5 100644 --- a/tests/integration/adapters/oracledb/extensions/events/test_aq_poll_interval.py +++ b/tests/integration/adapters/oracledb/extensions/events/test_aq_poll_interval.py @@ -31,7 +31,7 @@ def oracle_aq_poll_config( "user": oracle_23ai_service.user, "password": oracle_23ai_service.password, }, - extension_config={"events": {"backend": "advanced_queue", "aq_wait_seconds": _AQ_WAIT_SECONDS}}, + extension_config={"events": {"backend": "aq", "aq_wait_seconds": _AQ_WAIT_SECONDS}}, ) with provision_classic_aq(): diff --git a/tests/integration/adapters/oracledb/extensions/events/test_oracle_aq.py b/tests/integration/adapters/oracledb/extensions/events/test_oracle_aq.py index 98a44bdbf..b1728cb13 100644 --- a/tests/integration/adapters/oracledb/extensions/events/test_oracle_aq.py +++ b/tests/integration/adapters/oracledb/extensions/events/test_oracle_aq.py @@ -30,7 +30,7 @@ def _wait_for_message(received: "list[Any]", count: int = 1) -> None: def oracle_aq_config( provision_classic_aq: "Callable[..., AbstractContextManager[None]]", oracle_23ai_service: OracleService ) -> Generator[OracleSyncConfig, None, None]: - """Provision Oracle config with a live advanced_queue queue for tests.""" + """Provision Oracle config with a live aq queue for tests.""" config = OracleSyncConfig( connection_config={ @@ -40,7 +40,7 @@ def oracle_aq_config( "user": oracle_23ai_service.user, "password": oracle_23ai_service.password, }, - extension_config={"events": {"backend": "advanced_queue"}}, + extension_config={"events": {"backend": "aq"}}, ) with provision_classic_aq(): @@ -59,7 +59,7 @@ def test_oracle_aq_publish_receive(oracle_aq_config: OracleSyncConfig) -> None: assert isinstance(channel, SyncEventChannel) - assert channel._backend_name == "advanced_queue" # pyright: ignore[reportPrivateUsage] + assert channel._backend_name == "aq" # pyright: ignore[reportPrivateUsage] event_id = channel.publish("alerts", {"action": "refresh"}) iterator = channel.iter_events("alerts", poll_interval=1.0) diff --git a/tests/integration/adapters/oracledb/extensions/events/test_txeventq.py b/tests/integration/adapters/oracledb/extensions/events/test_txeventq.py index fcb63d83e..a93a850cc 100644 --- a/tests/integration/adapters/oracledb/extensions/events/test_txeventq.py +++ b/tests/integration/adapters/oracledb/extensions/events/test_txeventq.py @@ -1,6 +1,6 @@ """Oracle Transactional Event Queues (TxEventQ) event channel integration tests. -Mirrors the advanced_queue parity bar for the transactional_event_queue backend, which +Mirrors the aq parity bar for the txeventq backend, which shares the AQ client path and differs only in provisioning (CREATE_TRANSACTIONAL_EVENT_QUEUE). """ @@ -40,7 +40,7 @@ async def _async_wait_for_message(received: "list[Any]", count: int = 1) -> None def _sync_config(oracle_service: OracleService, **events: Any) -> OracleSyncConfig: - events_config: dict[str, Any] = {"backend": "transactional_event_queue", "aq_queue": _QUEUE_NAME, **events} + events_config: dict[str, Any] = {"backend": "txeventq", "aq_queue": _QUEUE_NAME, **events} return OracleSyncConfig( connection_config={ "host": oracle_service.host, @@ -54,7 +54,7 @@ def _sync_config(oracle_service: OracleService, **events: Any) -> OracleSyncConf def _async_config(oracle_service: OracleService, **events: Any) -> OracleAsyncConfig: - events_config: dict[str, Any] = {"backend": "transactional_event_queue", "aq_queue": _QUEUE_NAME, **events} + events_config: dict[str, Any] = {"backend": "txeventq", "aq_queue": _QUEUE_NAME, **events} return OracleAsyncConfig( connection_config={ "host": oracle_service.host, @@ -106,7 +106,7 @@ def test_txeventq_publish_receive(oracle_txeventq_config: OracleSyncConfig) -> N channel = spec.event_channel(oracle_txeventq_config) assert isinstance(channel, SyncEventChannel) - assert channel._backend_name == "transactional_event_queue" # pyright: ignore[reportPrivateUsage] + assert channel._backend_name == "txeventq" # pyright: ignore[reportPrivateUsage] event_id = channel.publish("alerts", {"action": "refresh"}) message = next(channel.iter_events("alerts", poll_interval=1.0)) @@ -187,7 +187,7 @@ async def test_txeventq_async_publish_and_ack(oracle_txeventq_async_config: Orac channel = spec.event_channel(oracle_txeventq_async_config) assert isinstance(channel, AsyncEventChannel) - assert channel._backend_name == "transactional_event_queue" # pyright: ignore[reportPrivateUsage] + assert channel._backend_name == "txeventq" # pyright: ignore[reportPrivateUsage] event_id = await channel.publish("alerts", {"action": "test"}) assert len(event_id) == 32 diff --git a/tests/unit/adapters/test_oracledb/test_config.py b/tests/unit/adapters/test_oracledb/test_config.py index 9fd11e6f5..3a02834da 100644 --- a/tests/unit/adapters/test_oracledb/test_config.py +++ b/tests/unit/adapters/test_oracledb/test_config.py @@ -137,9 +137,9 @@ def test_oracle_config_finite_options_use_literals_and_driver_enums() -> None: "numpy", } assert set(get_args(_unwrap_not_required(driver_feature_hints["events_backend"]))) == { - "advanced_queue", + "aq", "table_queue", - "transactional_event_queue", + "txeventq", } diff --git a/tests/unit/extensions/test_events/test_backend_factories.py b/tests/unit/extensions/test_events/test_backend_factories.py index 08f89896d..caf8b861c 100644 --- a/tests/unit/extensions/test_events/test_backend_factories.py +++ b/tests/unit/extensions/test_events/test_backend_factories.py @@ -165,17 +165,17 @@ def test_psqlpy_factory_unknown_returns_none() -> None: assert backend is None -def test_oracle_factory_advanced_queue_backend() -> None: - """Oracle factory creates advanced_queue backend.""" +def test_oracle_factory_aq_backend() -> None: + """Oracle factory creates aq backend.""" pytest.importorskip("oracledb") from sqlspec.adapters.oracledb.config import OracleSyncConfig from sqlspec.adapters.oracledb.events.backend import OracleSyncAQEventBackend, create_event_backend config = OracleSyncConfig(connection_config={"dsn": "localhost/xe"}) - backend = create_event_backend(config, "advanced_queue", {}) + backend = create_event_backend(config, "aq", {}) assert isinstance(backend, OracleSyncAQEventBackend) - assert backend.backend_name == "advanced_queue" + assert backend.backend_name == "aq" assert backend.supports_sync is True assert backend.supports_async is False @@ -187,7 +187,7 @@ def test_oracle_factory_custom_queue_name() -> None: from sqlspec.adapters.oracledb.events.backend import create_event_backend config = OracleSyncConfig(connection_config={"dsn": "localhost/xe"}) - backend = create_event_backend(config, "advanced_queue", {"aq_queue": "MY_CUSTOM_QUEUE"}) + backend = create_event_backend(config, "aq", {"aq_queue": "MY_CUSTOM_QUEUE"}) assert backend is not None assert backend._queue_name == "MY_CUSTOM_QUEUE" @@ -199,10 +199,10 @@ def test_oracle_factory_async_config() -> None: from sqlspec.adapters.oracledb.events.backend import OracleAsyncAQEventBackend, create_event_backend config = OracleAsyncConfig(connection_config={"dsn": "localhost/xe"}) - backend = create_event_backend(config, "advanced_queue", {}) + backend = create_event_backend(config, "aq", {}) assert isinstance(backend, OracleAsyncAQEventBackend) - assert backend.backend_name == "advanced_queue" + assert backend.backend_name == "aq" assert backend.supports_sync is False assert backend.supports_async is True @@ -219,44 +219,44 @@ def test_oracle_factory_unknown_returns_none() -> None: assert backend is None -def test_oracle_factory_transactional_event_queue_backend() -> None: - """Oracle factory creates a transactional_event_queue backend (sync).""" +def test_oracle_factory_txeventq_backend() -> None: + """Oracle factory creates a txeventq backend (sync).""" pytest.importorskip("oracledb") from sqlspec.adapters.oracledb.config import OracleSyncConfig from sqlspec.adapters.oracledb.events.backend import OracleSyncTxEventQEventBackend, create_event_backend config = OracleSyncConfig(connection_config={"dsn": "localhost/xe"}) - backend = create_event_backend(config, "transactional_event_queue", {}) + backend = create_event_backend(config, "txeventq", {}) assert isinstance(backend, OracleSyncTxEventQEventBackend) - assert backend.backend_name == "transactional_event_queue" + assert backend.backend_name == "txeventq" assert backend.supports_sync is True assert backend.supports_async is False -def test_oracle_factory_transactional_event_queue_async() -> None: - """Oracle factory creates a transactional_event_queue backend (async).""" +def test_oracle_factory_txeventq_async() -> None: + """Oracle factory creates a txeventq backend (async).""" pytest.importorskip("oracledb") from sqlspec.adapters.oracledb.config import OracleAsyncConfig from sqlspec.adapters.oracledb.events.backend import OracleAsyncTxEventQEventBackend, create_event_backend config = OracleAsyncConfig(connection_config={"dsn": "localhost/xe"}) - backend = create_event_backend(config, "transactional_event_queue", {}) + backend = create_event_backend(config, "txeventq", {}) assert isinstance(backend, OracleAsyncTxEventQEventBackend) - assert backend.backend_name == "transactional_event_queue" + assert backend.backend_name == "txeventq" assert backend.supports_sync is False assert backend.supports_async is True -def test_oracle_factory_transactional_event_queue_custom_queue_name() -> None: +def test_oracle_factory_txeventq_custom_queue_name() -> None: """TxEventQ factory honors a custom queue name.""" pytest.importorskip("oracledb") from sqlspec.adapters.oracledb.config import OracleSyncConfig from sqlspec.adapters.oracledb.events.backend import create_event_backend config = OracleSyncConfig(connection_config={"dsn": "localhost/xe"}) - backend = create_event_backend(config, "transactional_event_queue", {"aq_queue": "MY_TXEVENTQ"}) + backend = create_event_backend(config, "txeventq", {"aq_queue": "MY_TXEVENTQ"}) assert backend is not None assert backend._queue_name == "MY_TXEVENTQ" @@ -269,11 +269,11 @@ def test_oracle_txeventq_backend_labels_hub_with_backend_name() -> None: from sqlspec.adapters.oracledb.events.backend import OracleSyncTxEventQEventBackend, create_event_backend config = OracleSyncConfig(connection_config={"dsn": "localhost/xe"}) - backend = create_event_backend(config, "transactional_event_queue", {}) + backend = create_event_backend(config, "txeventq", {}) assert isinstance(backend, OracleSyncTxEventQEventBackend) hub = backend._ensure_hub() - assert hub._backend_name == "transactional_event_queue" + assert hub._backend_name == "txeventq" def test_oracle_txeventq_sync_backend_rejects_async_config() -> None: diff --git a/tests/unit/extensions/test_events/test_channel.py b/tests/unit/extensions/test_events/test_channel.py index d1bcfbc55..cebd7d2bd 100644 --- a/tests/unit/extensions/test_events/test_channel.py +++ b/tests/unit/extensions/test_events/test_channel.py @@ -101,7 +101,7 @@ def test_event_channel_backend_fallback(tmp_path) -> None: config = SqliteConfig( connection_config={"database": str(db_path)}, migration_config={"script_location": str(migrations_dir), "include_extensions": ["events"]}, - extension_config={"events": {"backend": "advanced_queue"}}, + extension_config={"events": {"backend": "aq"}}, ) commands = SyncMigrationCommands(config) commands.upgrade() diff --git a/uv.lock b/uv.lock index cfd3b0a98..bc4ec935b 100644 --- a/uv.lock +++ b/uv.lock @@ -437,42 +437,43 @@ wheels = [ [[package]] name = "ast-serialize" -version = "0.5.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", size = 61157, upload-time = "2026-05-17T17:48:29.429Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/9a/13dde51ba9e15f8b97957ab7cb0120d0e381524d651c6bd630b9c359227f/ast_serialize-0.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8f5c14f169eb0972c0c21bada5358b23d6047c76583b005234f865b11f1fa00a", size = 1183520, upload-time = "2026-05-17T17:47:30.831Z" }, - { url = "https://files.pythonhosted.org/packages/37/de/5a7f0a9fe68944f536632a5af84676739c7d2582be42deb082634bf3a754/ast_serialize-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7d1a2de9de5be04652f0ed60738356ef94f66db37924a9499fffe98dc491aa0b", size = 1175779, upload-time = "2026-05-17T17:47:32.551Z" }, - { url = "https://files.pythonhosted.org/packages/9c/81/0bb853e76e4f6e9a1855d569003c59e19ffac45f7079d91505d1bb212f92/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5173fb66f9b49026d9d5a2ff0fc7c7009077107c0eb285b2d60fdf1fe10bd1", size = 1233750, upload-time = "2026-05-17T17:47:34.731Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d3/4cf705beeccc08754d0bbda99aefff26110e209b9a07ac8a6b60eec48531/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8015cd071ac1339924ee2b8098c93e00e155f30a16f40ec9816fcf84f4753f6", size = 1235942, upload-time = "2026-05-17T17:47:36.287Z" }, - { url = "https://files.pythonhosted.org/packages/26/c8/ee097e437ea27dd2b8b227865c875492b585650a5802a22d82b304c8201b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5499e8797edff2a9186aa313ed382c6b422e798e9332d9953badcee6e69a88f2", size = 1442517, upload-time = "2026-05-17T17:47:38.17Z" }, - { url = "https://files.pythonhosted.org/packages/ff/bd/68063442838f1ba68ec72b5436430bc75b3bb17a1a3c3063f09b0c05ae2b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6848f2a093fb5548751a9a09bff8fcd229e2bbeb0e3331f391b6ae6d26cd9903", size = 1254081, upload-time = "2026-05-17T17:47:39.826Z" }, - { url = "https://files.pythonhosted.org/packages/50/e2/1e520793bc6a4e4524a6ab022391e827825eaa0c3811828bfdc6852eca26/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4c998e0b091fd60a6d6bceee535483c4d490de9ba85003af835225719261", size = 1259910, upload-time = "2026-05-17T17:47:41.369Z" }, - { url = "https://files.pythonhosted.org/packages/4e/e1/49b60f467979979cfe6913b43948ff25bca971ad0591d181812f163a988e/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:16db7c62ec0b8efe1d7afd283a388d8f74f2605d56032e5a37747d2de8dba027", size = 1250678, upload-time = "2026-05-17T17:47:43.702Z" }, - { url = "https://files.pythonhosted.org/packages/74/ba/66ab9555de6275677566f6574e5ef6c29cb185ea866f643bc06f8280a8ee/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf5eb061eb5bccade4128ad42da33787d72f6013809cd1b590376ece8b3c937", size = 1301603, upload-time = "2026-05-17T17:47:46.256Z" }, - { url = "https://files.pythonhosted.org/packages/66/42/6aca9b9abc710014b2be9059689e5dd1679339e78f567ffb4d255a9e2050/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:104e4a35bd7c124173c41760ef9aaea17ddb3f86c65cb643671d59afbe3ee94c", size = 1410332, upload-time = "2026-05-17T17:47:47.899Z" }, - { url = "https://files.pythonhosted.org/packages/47/68/2f76594432a22581ecf878b5e75a9b8601c24b2241cf0bbeb1e21fcf370c/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:36be371028fc1675acb38a331bde160dbab7ff907fdf00b67eb6911aa106951b", size = 1509979, upload-time = "2026-05-17T17:47:50.942Z" }, - { url = "https://files.pythonhosted.org/packages/40/ac/a93c9b58292653f6c595752f677a08e608f903b710594909e9231a389b3b/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:061ee58bdb52341c8201a6df41182a977736bae3b7ded87ca7176ca25a8a47ab", size = 1505002, upload-time = "2026-05-17T17:47:54.093Z" }, - { url = "https://files.pythonhosted.org/packages/14/2e/b278f68c497ee2f1d1576cbbef8db5281cd4a5f2db040537592ac9c8862e/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b15219e9cdc9f53f6f4cb51c009203507228226148c05c5e8fe451c28b435eb3", size = 1456231, upload-time = "2026-05-17T17:47:56.311Z" }, - { url = "https://files.pythonhosted.org/packages/0b/43/419be1c566a4c504cd8fd60ce2f84e790f295495c0f327cfaeadf3d51012/ast_serialize-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:842d1c004bb466c7df036f95fabef789570541922b10976b12f5592a69cf0b38", size = 1058668, upload-time = "2026-05-17T17:47:58.305Z" }, - { url = "https://files.pythonhosted.org/packages/03/6f/c9d4d549295ed05111aeb8853232d1afd9d0a179fddb01eeffbb3a4a6842/ast_serialize-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b0c06d760909b095cc466356dfccd05a1c7233a6ca191c020dca2c6a6f16c24c", size = 1101075, upload-time = "2026-05-17T17:48:00.35Z" }, - { url = "https://files.pythonhosted.org/packages/d0/8e/d00c5ab30c58222e07d62956fca86c59d91b9ad32997e633c38b526623a3/ast_serialize-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:787baedb0262cc49e8ce37cc15c00ae818e46a165a3b36f5e21ed174998104cb", size = 1075347, upload-time = "2026-05-17T17:48:01.753Z" }, - { url = "https://files.pythonhosted.org/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, - { url = "https://files.pythonhosted.org/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, - { url = "https://files.pythonhosted.org/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, - { url = "https://files.pythonhosted.org/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, - { url = "https://files.pythonhosted.org/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, - { url = "https://files.pythonhosted.org/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, - { url = "https://files.pythonhosted.org/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, - { url = "https://files.pythonhosted.org/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, - { url = "https://files.pythonhosted.org/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, - { url = "https://files.pythonhosted.org/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, - { url = "https://files.pythonhosted.org/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, - { url = "https://files.pythonhosted.org/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, - { url = "https://files.pythonhosted.org/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", size = 1068311, upload-time = "2026-05-17T17:48:25.027Z" }, - { url = "https://files.pythonhosted.org/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", size = 1108931, upload-time = "2026-05-17T17:48:26.591Z" }, - { url = "https://files.pythonhosted.org/packages/45/19/cc8bd127d28a43da249aa955cfd164cf8fd534e79e42cea96c4854d72fd0/ast_serialize-0.5.0-cp39-abi3-win_arm64.whl", hash = "sha256:92a31c9c20d25a076edaeec76b128a3535d74a24f340b9a8a7e96c9b86dc9642", size = 1081181, upload-time = "2026-05-17T17:48:28.122Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/58/ad/0d70a3a2d6e01968d985415259e8ec7ad3f777903f9b1c1f3c8c44642c60/ast_serialize-0.6.0.tar.gz", hash = "sha256:aadd3ffcf4858c9726bf3515f7b199c7eadbe504f96028e4a87172c0da65a8fe", size = 61489, upload-time = "2026-06-30T20:02:55.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/12/3e5f575f156555547c250a8b0d1347517a3a20fc7f4492e9703a69d4f45e/ast_serialize-0.6.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:a7520b672827885bafeae7501f684d14d47d17e5f45256f9df547686cca52264", size = 1177640, upload-time = "2026-06-30T20:02:06.708Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a4/921a9e27951627983b0f368859ea00f8330a551dc0bf4c2fdcb11855a98b/ast_serialize-0.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a14191beec7e0c078d2fc1f6edc0aee88bcd4db9f18e1bc9f8052b559c22dddc", size = 1168111, upload-time = "2026-06-30T20:02:08.366Z" }, + { url = "https://files.pythonhosted.org/packages/00/69/950cf404de7b8782cf95e5c1237e25e2aa46177b287f39f9eeddf481fd6f/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32ef62ec34cf6be20ad77d4799556638fbdf187f3ae10698dfb20ef9f2c89516", size = 1227656, upload-time = "2026-06-30T20:02:09.843Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a8/46f8f6a6479d9d2273980957bb091a506c55f5b95d3c029ee58518a78407/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13b7769970a39983b0adf2f38917b1cd3b8946f76df045756c3d741bc689f089", size = 1227706, upload-time = "2026-06-30T20:02:11.367Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/9ac415bda0a40e49eab8fea3b2741c19c98bb84d57d62c4cfc6230eb67be/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f7a408601bb3edaefb3bc67a4c01f5235e3253653b6a5729a2ee2382b35341c", size = 1431705, upload-time = "2026-06-30T20:02:12.737Z" }, + { url = "https://files.pythonhosted.org/packages/e5/06/8807115d441444879f7561b5eede5ac18fc80392f11826d61ccf31f503b1/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8670bfa51208a2c0c8d138928e40e998fab158f9200d53bb80c088b5b8eda7b8", size = 1249533, upload-time = "2026-06-30T20:02:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/3e/c0/c2ba82ef9618650357d9421a1fdb27ffec862a7f57e8e2de82a3ccd11e12/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4826809eb8597a8cd59fd924b6d7c285b8969a1e0007e2cb652cab62376270f", size = 1252619, upload-time = "2026-06-30T20:02:16.219Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a7/fa31d52dd4102cede29fb9634e98d214129b2783b4f95528c6dc6a8f6587/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:577a6c189068686869f5f1ddc38363f3ae1808a4753b577266f9202071a7bb66", size = 1242983, upload-time = "2026-06-30T20:02:17.813Z" }, + { url = "https://files.pythonhosted.org/packages/b1/20/ddf742b5ad3c4bafd3466f2265037cfd99bc1b9a5ee46a5d58c90d523242/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085de7f62dc9cc247eb01e965a362707d1d90b1d89a82c5bf78301a60a3c417b", size = 1296148, upload-time = "2026-06-30T20:02:19.146Z" }, + { url = "https://files.pythonhosted.org/packages/24/cb/9f6f217cce8b3b632c5568b478d195a35e79dce4dbe309438cb89ba6ea4f/ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9f8a8b78b13173de6a9ec22111d9be674874cd5bdccda04f14ae5ebc2bef403a", size = 1403826, upload-time = "2026-06-30T20:02:20.696Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f8/9d16d4f0107a183924425cc0e7618d8bf76f96b45afa9ff19f924ed1ad57/ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f2ff3baffc3a29c1f15bc9098aa0c09763410262d5e6cef42116f7356c184554", size = 1502943, upload-time = "2026-06-30T20:02:22.034Z" }, + { url = "https://files.pythonhosted.org/packages/80/dd/bbc1c38756350dddf7e24acae1c9482ef42051c267417e019aecc1ed4075/ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0067b25fce104eaae5b88383de9ab803faeb671831e14ca698b771b356e2600f", size = 1497632, upload-time = "2026-06-30T20:02:23.517Z" }, + { url = "https://files.pythonhosted.org/packages/42/7e/9daffefcf5b97e6bb4c3e0b3c024c1aee9722f23d3cf7cd2ff80d6fb4a40/ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c617417f9cbb0cb144f6283c3cbe0d2e0f01beaf9f608f662b21191058a626ec", size = 1448858, upload-time = "2026-06-30T20:02:24.889Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1f/f9baaab81a677ea0af7d2458cac2f94ebcc85958f8a3c15ba9d9e5dab653/ast_serialize-0.6.0-cp314-cp314t-win32.whl", hash = "sha256:5337cb256dcea3df9288205213d1601581536526b8f4da44b6974f1180f3252a", size = 1052600, upload-time = "2026-06-30T20:02:26.263Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1f/41b535866519512d8cf6669cb2cff7823b7672bb6279c0333b4ff89d7d9f/ast_serialize-0.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2d947e45cafc4b09bd7528917fa84c517654a43de173c79785574b7b3068ac24", size = 1095570, upload-time = "2026-06-30T20:02:27.639Z" }, + { url = "https://files.pythonhosted.org/packages/50/64/e472fe3e3a2d33d874b987e8518aedf24562919e3b6161a4fa1797e89c0f/ast_serialize-0.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:6e15ec740436e1a0d62de848641abe5f3a2f89a7f94907d534795ac91bbacf14", size = 1067267, upload-time = "2026-06-30T20:02:28.949Z" }, + { url = "https://files.pythonhosted.org/packages/52/19/ac8348ae8711c9b5ae834634f635780cab62a0f5e6f988882e048b89c2ae/ast_serialize-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:093cb8bb91b720d8523580498d031791bb1bbaa048599c3d21085d380e11a596", size = 1185367, upload-time = "2026-06-30T20:02:30.427Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f6/ec7ec652c51db77c2f61d8573338e13e4704303265ccc658cb4031d9f354/ast_serialize-0.6.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e61580a69faf47e3689795367ed211f2a10fd741478cc0f36a0f128793360aad", size = 1178657, upload-time = "2026-06-30T20:02:31.964Z" }, + { url = "https://files.pythonhosted.org/packages/6f/02/613a7534a41d0122f37d1e0c64aa8ac78bfb831f8c92f6db057a311abb3c/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305802f2ce2a7c4e87835078ea85c58b586ddda8095b92fe2ead9364ae19c80a", size = 1238620, upload-time = "2026-06-30T20:02:33.664Z" }, + { url = "https://files.pythonhosted.org/packages/4d/21/087957bba486242afc52f49b2d9e21c9dad00289356cf9efe67084015a9d/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7b8b8f0c42f752ea00b2b7d7c090b3f80d9c1c5c75cadf16423790a0cc74081", size = 1236075, upload-time = "2026-06-30T20:02:34.936Z" }, + { url = "https://files.pythonhosted.org/packages/82/04/78128bbb170071c2c72a210a181f1c00e11cc1cec60a8beef747b07f9201/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd5b91b9e6f2356ace3a556963b0cd783b395fbbb0bb17b4defc283415466e77", size = 1441348, upload-time = "2026-06-30T20:02:36.245Z" }, + { url = "https://files.pythonhosted.org/packages/64/64/62fb99d6faf199b4c3e5b08a07136e9a0d7664bb249c6de3670e5b63e9b6/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d6ef91590258ada18909b9caea344dac4de2013906b035473cd674a43f4b790", size = 1258580, upload-time = "2026-06-30T20:02:37.53Z" }, + { url = "https://files.pythonhosted.org/packages/ca/87/b4d6c38e0ccd5e85dc54cecdf933a152c60b28fe5d993a6d8a72fa6d5896/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcbed41e9386059fc0261d602445ede0976c2ecec2939688bcbcb9ed0b6f28b7", size = 1261693, upload-time = "2026-06-30T20:02:39.123Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4b/3676ca2191f39bafb75f93f99b2f429ec464586158fece2165f3572805dc/ast_serialize-0.6.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:cdc4e6f930b9090c2f92c9036ad12ffb8e6e44d4a5ba06f1458a05d60f203f7b", size = 1252517, upload-time = "2026-06-30T20:02:40.511Z" }, + { url = "https://files.pythonhosted.org/packages/f3/58/494ef8c4b4acb2f4a265ac934caf45f792a08fe27d6b853de35ad991941a/ast_serialize-0.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:897ac47b5637be41c0c07061c8a912fafa967ef1dc73fa115e4bfa70882a093b", size = 1304843, upload-time = "2026-06-30T20:02:41.961Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f2/13736d920ab3d49bbee80ef1a277dd7b7aaf3b3545efd9d2a8114fe05525/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c4af9a1386166e40ed01464991806f89038a2d89782576c7774876fa77034e32", size = 1413698, upload-time = "2026-06-30T20:02:44.179Z" }, + { url = "https://files.pythonhosted.org/packages/a8/5a/e046f3899e2acba4677d7427b76431443a1aa1a0e583dfb05b55b69d55cf/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c901adbd750029b9ac4ad3d6aa56853e0ad4875119fbf52b7b8298afc223828b", size = 1512209, upload-time = "2026-06-30T20:02:45.584Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c7/e42aaca7bb2d22a7c06d5a8c7930086c5a334e93d716e6fa5e6647a4515f/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae22a366b752ab4496191525b78b097b5b72d531752e3c1dd7e383a8f2c8a1a", size = 1508464, upload-time = "2026-06-30T20:02:46.942Z" }, + { url = "https://files.pythonhosted.org/packages/95/93/5524a3dc6c3f593de3228ed9cbef73afa047625b7000ec21b7f58e6eb4d4/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4ed29121da8b3fdc291002801a1de0f76248fa07dce89157a5f277842cf6126e", size = 1457164, upload-time = "2026-06-30T20:02:48.294Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c0/36a6ffb4d653cf621427b4c4928671f53ad800c453474de2b82564a44ad9/ast_serialize-0.6.0-cp39-abi3-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b1dac4e09d341c1300ba69cdcbe62867b32a8c75d90db9bf4d083bec3b039f0b", size = 863014, upload-time = "2026-06-30T20:02:49.742Z" }, + { url = "https://files.pythonhosted.org/packages/09/c7/7d5ad8b49e1278e1c2a1e0274bd7850560b3f09313aa00c13bc8d5544792/ast_serialize-0.6.0-cp39-abi3-win32.whl", hash = "sha256:82c312a7844d2fdeb4d5c48bd3d215bf940dafd4704e1a9bcf252a99010a99b1", size = 1063165, upload-time = "2026-06-30T20:02:50.98Z" }, + { url = "https://files.pythonhosted.org/packages/47/ae/6710c14ecb276031cf10249f6adf5a59e2d3fdb3b5183bd59f70524067ee/ast_serialize-0.6.0-cp39-abi3-win_amd64.whl", hash = "sha256:113b58346f9ceb664352032770caca817d4a3c86f611c6088e6ef65ddaa70f0e", size = 1101444, upload-time = "2026-06-30T20:02:52.554Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/c53deb2cd0c9b0fb636d24d9f40924cf2e65028e6b20b10cd5c1eeb2c730/ast_serialize-0.6.0-cp39-abi3-win_arm64.whl", hash = "sha256:ccd132fe8db56f61fe743b1f644d01b8d65b83248a8da506f3132bda86d6ed5e", size = 1072965, upload-time = "2026-06-30T20:02:54.097Z" }, ] [[package]]