From 5af89483c7cf6920dcd9e873058b27d540a455d1 Mon Sep 17 00:00:00 2001 From: Cody Fincher Date: Fri, 9 Oct 2026 01:25:10 +0000 Subject: [PATCH 1/8] refactor(build): upgrade baseline to Python 3.11 and remove tomli fallback --- Makefile | 4 +- pyproject.toml | 15 +- sqlspec/data_dictionary/_loader.py | 7 +- sqlspec/utils/config_tools.py | 7 +- tests/unit/config/test_discovery.py | 6 - tools/scripts/mypyc_inventory.py | 6 +- uv.lock | 1323 ++------------------------- 7 files changed, 83 insertions(+), 1285 deletions(-) diff --git a/Makefile b/Makefile index 94e83cec7..eb8b8270c 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ install-uv: ## Install latest version of .PHONY: install install: destroy clean ## Install the project and dependencies @echo "${INFO} Starting fresh installation..." - @uv python pin 3.10 >/dev/null 2>&1 + @uv python pin 3.11 >/dev/null 2>&1 @uv venv >/dev/null 2>&1 @uv sync --all-extras --no-extra mypyc --dev @echo "${OK} Installation complete! 🎉" @@ -54,7 +54,7 @@ install: destroy clean ## Install the project and d .PHONY: install-compiled install-compiled: destroy clean ## Install with mypyc compilation for performance @echo "${INFO} Starting fresh installation with mypyc compilation..." - @uv python pin 3.10 >/dev/null 2>&1 + @uv python pin 3.11 >/dev/null 2>&1 @uv venv >/dev/null 2>&1 @echo "${INFO} Installing in editable mode with mypyc compilation..." @uv sync --all-extras --dev diff --git a/pyproject.toml b/pyproject.toml index 76f58e83e..663a16f59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,11 +3,11 @@ authors = [{ name = "Cody Fincher", email = "cody@litestar.dev" }] classifiers = [ "Development Status :: 5 - Production/Stable", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Programming Language :: Python :: 3 :: Only", "Typing :: Typed", ] @@ -16,14 +16,13 @@ dependencies = [ "sqlglot>=30.13.0", "mypy-extensions", "rich-click>=1.9.0", - "tomli>=2.0.0; python_version < '3.11'", ] description = "SQL Experiments in Python" license = "MIT" maintainers = [{ name = "Litestar Developers", email = "hello@litestar.dev" }] name = "sqlspec" readme = "README.md" -requires-python = ">=3.10, <4.0" +requires-python = ">=3.11, <4.0" version = "0.66.0" [project.urls] @@ -131,7 +130,6 @@ lint = [ "asyncpg-stubs", "pyarrow-stubs", "pandas-stubs<3", - "tomli>=2.0.0", "types-PyMySQL", ] test = [ @@ -500,7 +498,7 @@ allow_redefinition = false exclude = ["tmp/", ".tmp/", ".bugs/"] local_partial_types = true packages = ["sqlspec", "tests"] -python_version = "3.10" +python_version = "3.11" strict_bytes = true disallow_any_generics = false @@ -561,7 +559,7 @@ module = "tests.*" disableBytesTypePromotions = true exclude = ["**/node_modules", "**/__pycache__", ".venv", "tools", "docs", "tmp", ".tmp", ".bugs", "**/.*"] include = ["sqlspec", "tests"] -pythonVersion = "3.10" +pythonVersion = "3.11" reportMissingTypeStubs = false reportPrivateImportUsage = false reportPrivateUsage = false @@ -577,7 +575,7 @@ strict-imports = false exclude = [".venv", "node_modules", "tmp", ".tmp", ".bugs"] line-length = 120 src = ["sqlspec", "tests", "docs/examples", "tools"] -target-version = "py310" +target-version = "py311" [tool.ruff.format] docstring-code-format = true @@ -648,6 +646,7 @@ ignore = [ "PLW0108", # Replace lambda expression with a def "RUF067", # ruff - init should only have import statements "PLW0717", # too many statements in try block + "ASYNC109", # async function definition with a `timeout` parameter ] preview = true select = ["ALL"] @@ -719,4 +718,4 @@ split-on-trailing-comma = false ban-relative-imports = "all" [tool.ruff.lint.flake8-tidy-imports.banned-api] -"__future__.annotations" = { msg = "Use Python 3.10+ PEP 604 annotations instead of from __future__ import annotations" } +"__future__.annotations" = { msg = "Use Python 3.11+ PEP 604 annotations instead of from __future__ import annotations" } diff --git a/sqlspec/data_dictionary/_loader.py b/sqlspec/data_dictionary/_loader.py index 212c73f9f..ffdfd46f5 100644 --- a/sqlspec/data_dictionary/_loader.py +++ b/sqlspec/data_dictionary/_loader.py @@ -17,13 +17,8 @@ from sqlspec.utils.text import slugify if TYPE_CHECKING: - import sys from collections.abc import Iterable - - if sys.version_info >= (3, 11): - from importlib.resources.abc import Traversable - else: - from importlib.abc import Traversable + from importlib.resources.abc import Traversable from sqlspec.data_dictionary._types import DialectConfig, VersionInfo diff --git a/sqlspec/utils/config_tools.py b/sqlspec/utils/config_tools.py index 57c404b75..26fdc69a6 100644 --- a/sqlspec/utils/config_tools.py +++ b/sqlspec/utils/config_tools.py @@ -7,7 +7,7 @@ """ import inspect -import sys +import tomllib from collections.abc import Sequence from pathlib import Path from types import ModuleType @@ -24,11 +24,6 @@ has_migration_config, ) -if sys.version_info >= (3, 11): - import tomllib -else: - import tomli as tomllib - if TYPE_CHECKING: from collections.abc import Mapping diff --git a/tests/unit/config/test_discovery.py b/tests/unit/config/test_discovery.py index e5e60f983..6a67f5cde 100644 --- a/tests/unit/config/test_discovery.py +++ b/tests/unit/config/test_discovery.py @@ -1,15 +1,9 @@ """Tests for config discovery functionality.""" -import sys from pathlib import Path import pytest -if sys.version_info >= (3, 11): - pass -else: - pass - from sqlspec.utils.config_tools import discover_config_from_pyproject, find_pyproject_toml, parse_pyproject_config diff --git a/tools/scripts/mypyc_inventory.py b/tools/scripts/mypyc_inventory.py index 7cde43ed2..b0c4aed56 100644 --- a/tools/scripts/mypyc_inventory.py +++ b/tools/scripts/mypyc_inventory.py @@ -3,6 +3,7 @@ import argparse import json import sys +import tomllib from collections.abc import Sequence from fnmatch import fnmatch from pathlib import Path @@ -21,11 +22,6 @@ "validate_inventory", ) -try: - import tomllib # type: ignore[import-not-found] -except ModuleNotFoundError: # pragma: no cover - import tomli as tomllib - CANDIDATE_CLASSIFICATIONS = {"candidate", "compile_now", "helper_split_first", "prove_separately"} SURFACE_ORDER = ("compiled", "candidate", "hard_block", "keep_interpreted", "interpreted") diff --git a/uv.lock b/uv.lock index 9fb10b7f1..c00fe5945 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,6 @@ version = 1 -revision = 3 -requires-python = ">=3.10, <4.0" +revision = 5 +requires-python = ">=3.11, <4.0" resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", "python_full_version == '3.14.*' and sys_platform == 'win32'", @@ -14,35 +14,10 @@ resolution-markers = [ "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version < '3.11'", -] - -[options] -exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. -exclude-newer-span = "P7D" - -[options.exclude-newer-package] -advanced-alchemy = false -litestar = false -litestar-asyncapi = false -litestar-asyncpg = false -litestar-autowire = false -litestar-email = false -litestar-granian = false -litestar-htmx = false -litestar-mcp = false -litestar-oracledb = false -litestar-queues = false -litestar-saq = false -litestar-security = false -litestar-vite = false -polyfactory = false -pytest-databases = false -sqlglot = false -sqlglotc = false + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", + "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] [manifest] overrides = [ @@ -94,11 +69,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/9c/f8/ed6475b49a7cf35ea888d5c95e7d4bc9dc6568f9d741f14c0573d622cc1e/adbc_driver_manager-1.12.0.tar.gz", hash = "sha256:45991f0c2de369d330c6a211ca2edbcce6389c5dc81cde70461bdeb6f8f7b268", size = 217579, upload-time = "2026-07-28T00:43:03.512Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/53/2c47920ca9a5bf29893294db2ac765e26823eb3246d0071374d29abdc276/adbc_driver_manager-1.12.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:ca18599e19a40da990bffe964475ee27523a87bb770a1ffa77f15c6e73790822", size = 599962, upload-time = "2026-07-28T00:41:45.02Z" }, - { url = "https://files.pythonhosted.org/packages/53/8b/b66dec201f2dcb36d1a794afd5f18310c1252cdf6ee84dd9b58e17a526e0/adbc_driver_manager-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6166c5a8ea0904d2ab811f575747ade35ce4cabc1c5acc3cc6468ca158d620e9", size = 610987, upload-time = "2026-07-28T00:41:46.946Z" }, - { url = "https://files.pythonhosted.org/packages/01/9e/3617960d056bdc9f2f2cef0ff902b6e3dd767f3a3f232856edcf113a8eac/adbc_driver_manager-1.12.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41dadba88e1806eba6cb3eb30b7a2e9f804001bb002dd18ed6a15edb6f5d096f", size = 4596654, upload-time = "2026-07-28T00:41:49.282Z" }, - { url = "https://files.pythonhosted.org/packages/53/a0/224464451cf28baea8033cae16fd1819d5d769ecd72346363de6c3189e3a/adbc_driver_manager-1.12.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63048664b31c964ae9cc0c1bf3902ec7c26751bee110ab320d78f8d1af7e0b6a", size = 4679094, upload-time = "2026-07-28T00:41:51.455Z" }, - { url = "https://files.pythonhosted.org/packages/35/cf/8089661f92a3991edcd8938c2fe96cbb7a8d1298623aaceafdf78f8ff8cc/adbc_driver_manager-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:bf7764d4f1ac9b54e442d6c3b6afbefce639268a7e505a05629507209fe0e3f7", size = 763065, upload-time = "2026-07-28T00:41:53.11Z" }, { url = "https://files.pythonhosted.org/packages/73/2d/e41ea911f9486c497534ae181dfdab19adca21f71abc8a1fcaf2c27251a8/adbc_driver_manager-1.12.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:3c0c73670c8aa6fe42de1d5e71a0b329c4b37f7c55c560c23f6f3a1609200c1f", size = 600030, upload-time = "2026-07-28T00:41:54.753Z" }, { url = "https://files.pythonhosted.org/packages/10/ea/1a8b51999785d7dce17079dd635c9ee2372c75ec7328423ce862741cb503/adbc_driver_manager-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6943c7adcf3c7c9f7c4b5bdb7589c331027a347e3c77471eb3f656b1a881e351", size = 611058, upload-time = "2026-07-28T00:41:56.306Z" }, { url = "https://files.pythonhosted.org/packages/85/a2/5ede53173a420742fa71d6c26792e2295fc73f25cf39055f912a5385b1f0/adbc_driver_manager-1.12.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78c9936adb280e2c10e90632e41b58aa23be358e1136d8fb3c52862b72818a95", size = 4663735, upload-time = "2026-07-28T00:41:58.793Z" }, @@ -171,7 +141,6 @@ dependencies = [ { name = "jmespath" }, { name = "multidict" }, { name = "python-dateutil" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, { name = "wrapt" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a4/0d/98230a1320e78f2c35277ca194c494690dce3161ad05200556417ab9e816/aiobotocore-3.9.1.tar.gz", hash = "sha256:617d4a78da5adb6ae7d532835727ad388f73555f2ef129b9de1b1add73a43ee6", size = 516440, upload-time = "2026-09-07T17:14:07.099Z" } @@ -204,7 +173,6 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, @@ -214,24 +182,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/58/d9/22ce5786ac0c1653ae8b6c23bded02c1686d11f0dbb45b31ce128e0df985/aiohttp-3.14.3.tar.gz", hash = "sha256:9491196535a88924a60afd5b5f434b5b203b6cc616250878dbdb223a8f7844bc", size = 7971213, upload-time = "2026-07-23T01:57:27.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/4d/4a99fb425c5e0cad715eea7bd190aff46f38b959a0a2dadb993705d34b26/aiohttp-3.14.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eb0495d778817619273c108784292be161a924b9f5ae5cbbc70a2caa6838250b", size = 765848, upload-time = "2026-07-23T01:52:08.217Z" }, - { url = "https://files.pythonhosted.org/packages/74/e8/43b85dc55b8e950dc644babe762add781319ea881b57b33d2cce12017d12/aiohttp-3.14.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c3c200cf9757edd785051dc699c7ecbec22110dbfcb3fefc7a9f9695eda8ea7a", size = 517476, upload-time = "2026-07-23T01:52:10.846Z" }, - { url = "https://files.pythonhosted.org/packages/7f/9e/73b582c4dbbc3c12ef4473822475effaabf1f934b56f14f5b03fe5d3a2af/aiohttp-3.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd51ebf9d3a00c074df4ede271023f4d2dba289bcc740b88191872716014e3c5", size = 515334, upload-time = "2026-07-23T01:52:12.636Z" }, - { url = "https://files.pythonhosted.org/packages/79/03/e98c3c9e05a5bdf97defe5ff9169baba4f0ec9a901f2d60e0f060c2f051e/aiohttp-3.14.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:134ac5ddcf61c6fad984b9a5727d83492ada43d63471db20fb73042c13fca62f", size = 1708830, upload-time = "2026-07-23T01:52:14.538Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2c/26e60b694844dfd2176c57f913a22d0cd6a16f9ff202cbda7580d0328b98/aiohttp-3.14.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:70c987b27534f9ae1a723f47ae921571d616da21d3208282bf4c52af5164ac43", size = 1674012, upload-time = "2026-07-23T01:52:16.486Z" }, - { url = "https://files.pythonhosted.org/packages/38/65/672df92e3172cd876aacfa97a952ac560877eb169384b2991ac5b273de4c/aiohttp-3.14.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1b59533861b70a2185c8f4f350f791f39d64358ef6944ce71c5240c9ec0982c9", size = 1767015, upload-time = "2026-07-23T01:52:18.28Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c5/228dec7bfec1c373cc2217cdeb47d6456dcd7a13a4c55144930a75ae3851/aiohttp-3.14.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1c5281acc88b92396f88c7e1e2748f8466689df22b80170e4f51efa712fb47a8", size = 1858700, upload-time = "2026-07-23T01:52:20.08Z" }, - { url = "https://files.pythonhosted.org/packages/bd/ff/cb36724e8c8d17f90ada567a9ff3efe1d6e9b549fba697a242aece180f21/aiohttp-3.14.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48d67b87db6279c044760787eb01f6413032c2e6f3ba1cafaa492b1c8e578479", size = 1714075, upload-time = "2026-07-23T01:52:22.071Z" }, - { url = "https://files.pythonhosted.org/packages/9f/3a/296a4135c6366376263aeef54b15caca1f07676c2ae0c525d7832f2f808a/aiohttp-3.14.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f53bcd52f585e1ac3e590d61434eb61f9a88c38df041b4ea126d97144344a77b", size = 1588234, upload-time = "2026-07-23T01:52:23.757Z" }, - { url = "https://files.pythonhosted.org/packages/7d/81/9d5d853ef892dc066d1eb6db0e87a47348b920c1c879aa554612fdbd9d79/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0fdea2281997af69da84c77ffa6f5938a0285f21fb3887c249d67419ca865b3d", size = 1677300, upload-time = "2026-07-23T01:52:25.861Z" }, - { url = "https://files.pythonhosted.org/packages/68/96/021d386ae32d9b26d4b88df2e794546232ff56bb6be952bf6be227c0bbc7/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cda5fd5c95ad7a125a2e8464acc78b98b94c475a3780d6aa0aa157c93f470f4d", size = 1691501, upload-time = "2026-07-23T01:52:28Z" }, - { url = "https://files.pythonhosted.org/packages/29/9f/af66adce26a14af135c003cbd0f44ccaa68cebd30ff8ac99ca47fb4958f7/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6debfa7312ff9d4c124dc71d72e9a0a4b9e0879e48ba6fcb42bef5c3300289e2", size = 1735113, upload-time = "2026-07-23T01:52:29.995Z" }, - { url = "https://files.pythonhosted.org/packages/2f/90/28c390d4c9851effe52ac25b5a2e1d92246acd00728b4fc7975dafb67484/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f4e05329faa0ea1a404b37de4f034fd2c2defcca06a68dc6745e4e56c88e8a48", size = 1577486, upload-time = "2026-07-23T01:52:31.937Z" }, - { url = "https://files.pythonhosted.org/packages/db/c2/00e23a1bf2abb70dd353f6987db7e7f2491d0261f7363997738c71c98f95/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a3a8296e7ab5c295f53f1041487cb088e1480775aafbf7fe545d93b770a0f96f", size = 1751353, upload-time = "2026-07-23T01:52:33.688Z" }, - { url = "https://files.pythonhosted.org/packages/6e/7d/d51a706a8cbfa57f0611127daf61ab3ae02ab8420b0407412079227d1c65/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5373dc80ad1aa2fb9ad95c83f24eef418bbda3a61375f128e5b0192e4f3f9b32", size = 1698681, upload-time = "2026-07-23T01:52:38.167Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b0/90bd5cd9fdd9787cb4211d284d1fb8401339a933cb0227a15b71e789232f/aiohttp-3.14.3-cp310-cp310-win32.whl", hash = "sha256:a3e22975f905b89a55a488c2a08f2fdb2186175349e917d48985cc468a3d4c6e", size = 456733, upload-time = "2026-07-23T01:52:41.823Z" }, - { url = "https://files.pythonhosted.org/packages/d8/15/fe5b8f6a71ae112bc677163d0b0701bda5dc15005249582258ede0eb88c7/aiohttp-3.14.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdd0e2834dce1a26c1bbe26464861e16bbe217042cbff619247c11594472518c", size = 480460, upload-time = "2026-07-23T01:52:43.905Z" }, - { url = "https://files.pythonhosted.org/packages/54/00/45e98b6645cd7f00a4b78b749ebd309094b0eaeb2d2e96157eadbc0d0050/aiohttp-3.14.3-cp310-cp310-win_arm64.whl", hash = "sha256:eac645b09bcfdf73df7536331f0678c1086ea250981118ddb5199e17ccef72bb", size = 453479, upload-time = "2026-07-23T01:52:46.075Z" }, { url = "https://files.pythonhosted.org/packages/f8/5c/b3e4ff8ad43a8afef9602c5e90285936da1beaea8b029016b793891f03c3/aiohttp-3.14.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e568e14940c09955aa51f4e645b6daa18a581c5dcfcd73744dcc86a856e3ced3", size = 764250, upload-time = "2026-07-23T01:52:48.525Z" }, { url = "https://files.pythonhosted.org/packages/0e/da/f1b384465e51449d844056b75070461da03a9a23e6c1747003695bf4172a/aiohttp-3.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54cfcdee2770dac994417cbb0ee1f3eb0e7cb6b30c79bf44f2c02ff79ec5124a", size = 516281, upload-time = "2026-07-23T01:52:51.047Z" }, { url = "https://files.pythonhosted.org/packages/b9/3f/01264f820ee2e3712a827892b1cd6ff80f3300c1fcbffbb45714a915d47a/aiohttp-3.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:21c016079415ed3fd676963e9793700a566d85dbbd6bfc564b9b2d209147dcc8", size = 514742, upload-time = "2026-07-23T01:52:53.779Z" }, @@ -409,7 +359,6 @@ name = "anyio" version = "4.15.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.15'" }, ] @@ -499,29 +448,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/a7/c8bbb2173f7a7131b3b2412035b2d814ab5ef2ce9799bd06f07c451640e4/ast_serialize-0.11.2-cp39-abi3-win_arm64.whl", hash = "sha256:dab599cbdcb7b45b18c41fad746645580b3a24357082b7f0e8921cd373804f27", size = 1136031, upload-time = "2026-09-13T18:48:54.04Z" }, ] -[[package]] -name = "async-timeout" -version = "5.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, -] - [[package]] name = "asyncmy" version = "0.2.15" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/08/59/0c275a3b5bfca49958283a6a2b10cf0ea5d6dbe9861acc08f4b58decc391/asyncmy-0.2.15.tar.gz", hash = "sha256:5f6c6fb6543c4c4190d6f3d3db44bc4cae2f925a9df2ba79855edba3db899733", size = 94066, upload-time = "2026-09-21T13:57:06.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/fe/cf2c73c3d7d7081cb6f0fcd27135c8972d2ac464731dc88dcba5cdc3eb2e/asyncmy-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d2d7f6243b07770c409caf38adc09ef51e88460c6690c6181edfa7f0efb1fe68", size = 2262364, upload-time = "2026-09-21T13:55:10.349Z" }, - { url = "https://files.pythonhosted.org/packages/45/f6/456202aba8c0aa86af8d9cfe34f10694a9b9d3a30863657d91455109c317/asyncmy-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce00e4fff3e656cb3f2a4de5804a37951ef26afa3d920050d15875dcdabc0bc5", size = 2225325, upload-time = "2026-09-21T13:55:12.06Z" }, - { url = "https://files.pythonhosted.org/packages/34/1b/0475dfd332525acfb65285d279c22502ba51c04d217916c26a03cd7a2b77/asyncmy-0.2.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b765466e888f6e0b92ed52ac48552cf855e814663746c39aa53b6ce93eb48e8a", size = 6591856, upload-time = "2026-09-21T13:55:13.782Z" }, - { url = "https://files.pythonhosted.org/packages/aa/39/ebe2fccb103a7100766d936f740a9187e388eae81c42bd7b1f4394738a36/asyncmy-0.2.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c818e3ab5ea5734ad26847d6ba277f3aaa14786bb6f917fc6662b77bff743224", size = 6636003, upload-time = "2026-09-21T13:55:15.99Z" }, - { url = "https://files.pythonhosted.org/packages/13/62/dfd0511a162850372037fe32282b68af71f66af17e38753525ca3ec5d789/asyncmy-0.2.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e3f932a7b8f503d1d481afd677f3376fbfe8dfaa10a4f322569fdd0e54a148e8", size = 6370476, upload-time = "2026-09-21T13:55:17.512Z" }, - { url = "https://files.pythonhosted.org/packages/1f/36/fcb600c797a73a5d7700fccc0bcecd3e6c7f0bdc58d5b8f21401444663cf/asyncmy-0.2.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5a87fa350a5e70a6b7d0f30601b0bd8133bf1b53d09251648b80022607ecfe68", size = 6485833, upload-time = "2026-09-21T13:55:19.14Z" }, - { url = "https://files.pythonhosted.org/packages/d1/0b/abb35e0f7dc22a254f9f91985350fa306a34cc5a3e9a3c681abe8d939150/asyncmy-0.2.15-cp310-cp310-win32.whl", hash = "sha256:22b897b25e70c11abad03af9434d94812dd3e89ef94cba3cbd4e06692a7b51b6", size = 2010035, upload-time = "2026-09-21T13:55:21.108Z" }, - { url = "https://files.pythonhosted.org/packages/2a/3b/7f206be95d26c9d244a1a84555bbd8f4443202453a835b0f9e3ef07a7576/asyncmy-0.2.15-cp310-cp310-win_amd64.whl", hash = "sha256:d702f858cee7b8d3e2473ce21b5db8a5b3bc0dbb6cc72c413f3d5b08f804dd5e", size = 2108191, upload-time = "2026-09-21T13:55:22.382Z" }, { url = "https://files.pythonhosted.org/packages/a2/d1/18147bd8694da82dec87b8740270da460aacd6288cffb6f8ae0b5b5df8db/asyncmy-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6132f3568cdcf653a58a71b2a8ce402956fba30ecb12663ce1e02dae2aa17ad", size = 2256948, upload-time = "2026-09-21T13:55:23.914Z" }, { url = "https://files.pythonhosted.org/packages/ae/5b/59e19241492f00388730e15a4db8b9fb7e899bfab2ff428550f9350504b9/asyncmy-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e878e102530a7e8e7cb60038d1247ab08d275a8de6e43d374e5b931e7186ab00", size = 2220137, upload-time = "2026-09-21T13:55:26.065Z" }, { url = "https://files.pythonhosted.org/packages/0e/22/db58bb734446818f1b364210e017b8fb502e35dfcd13c4ac701b8109ba3c/asyncmy-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16589ccc6baa0f1f99077e78fb4a95b1f11df8ae624d47a134debbe8a7d14bde", size = 6879572, upload-time = "2026-09-21T13:55:27.55Z" }, @@ -576,19 +508,8 @@ wheels = [ name = "asyncpg" version = "0.31.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "async-timeout", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/fe/cc/d18065ce2380d80b1bcce927c24a2642efd38918e33fd724bc4bca904877/asyncpg-0.31.0.tar.gz", hash = "sha256:c989386c83940bfbd787180f2b1519415e2d3d6277a70d9d0f0145ac73500735", size = 993667, upload-time = "2025-11-24T23:27:00.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/d9/507c80bdac2e95e5a525644af94b03fa7f9a44596a84bd48a6e80f854f92/asyncpg-0.31.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:831712dd3cf117eec68575a9b50da711893fd63ebe277fc155ecae1c6c9f0f61", size = 644865, upload-time = "2025-11-24T23:25:23.527Z" }, - { url = "https://files.pythonhosted.org/packages/ea/03/f93b5e543f65c5f504e91405e8d21bb9e600548be95032951a754781a41d/asyncpg-0.31.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0b17c89312c2f4ccea222a3a6571f7df65d4ba2c0e803339bfc7bed46a96d3be", size = 639297, upload-time = "2025-11-24T23:25:25.192Z" }, - { url = "https://files.pythonhosted.org/packages/e5/1e/de2177e57e03a06e697f6c1ddf2a9a7fcfdc236ce69966f54ffc830fd481/asyncpg-0.31.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3faa62f997db0c9add34504a68ac2c342cfee4d57a0c3062fcf0d86c7f9cb1e8", size = 2816679, upload-time = "2025-11-24T23:25:26.718Z" }, - { url = "https://files.pythonhosted.org/packages/d0/98/1a853f6870ac7ad48383a948c8ff3c85dc278066a4d69fc9af7d3d4b1106/asyncpg-0.31.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ea599d45c361dfbf398cb67da7fd052affa556a401482d3ff1ee99bd68808a1", size = 2867087, upload-time = "2025-11-24T23:25:28.399Z" }, - { url = "https://files.pythonhosted.org/packages/11/29/7e76f2a51f2360a7c90d2cf6d0d9b210c8bb0ae342edebd16173611a55c2/asyncpg-0.31.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:795416369c3d284e1837461909f58418ad22b305f955e625a4b3a2521d80a5f3", size = 2747631, upload-time = "2025-11-24T23:25:30.154Z" }, - { url = "https://files.pythonhosted.org/packages/5d/3f/716e10cb57c4f388248db46555e9226901688fbfabd0afb85b5e1d65d5a7/asyncpg-0.31.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a8d758dac9d2e723e173d286ef5e574f0b350ec00e9186fce84d0fc5f6a8e6b8", size = 2855107, upload-time = "2025-11-24T23:25:31.888Z" }, - { url = "https://files.pythonhosted.org/packages/7e/ec/3ebae9dfb23a1bd3f68acfd4f795983b65b413291c0e2b0d982d6ae6c920/asyncpg-0.31.0-cp310-cp310-win32.whl", hash = "sha256:2d076d42eb583601179efa246c5d7ae44614b4144bc1c7a683ad1222814ed095", size = 521990, upload-time = "2025-11-24T23:25:33.402Z" }, - { url = "https://files.pythonhosted.org/packages/20/b4/9fbb4b0af4e36d96a61d026dd37acab3cf521a70290a09640b215da5ab7c/asyncpg-0.31.0-cp310-cp310-win_amd64.whl", hash = "sha256:9ea33213ac044171f4cac23740bed9a3805abae10e7025314cfbd725ec670540", size = 581629, upload-time = "2025-11-24T23:25:34.846Z" }, { url = "https://files.pythonhosted.org/packages/08/17/cc02bc49bc350623d050fa139e34ea512cd6e020562f2a7312a7bcae4bc9/asyncpg-0.31.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eee690960e8ab85063ba93af2ce128c0f52fd655fdff9fdb1a28df01329f031d", size = 643159, upload-time = "2025-11-24T23:25:36.443Z" }, { url = "https://files.pythonhosted.org/packages/a4/62/4ded7d400a7b651adf06f49ea8f73100cca07c6df012119594d1e3447aa6/asyncpg-0.31.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2657204552b75f8288de08ca60faf4a99a65deef3a71d1467454123205a88fab", size = 638157, upload-time = "2025-11-24T23:25:37.89Z" }, { url = "https://files.pythonhosted.org/packages/d6/5b/4179538a9a72166a0bf60ad783b1ef16efb7960e4d7b9afe9f77a5551680/asyncpg-0.31.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a429e842a3a4b4ea240ea52d7fe3f82d5149853249306f7ff166cb9948faa46c", size = 2918051, upload-time = "2025-11-24T23:25:39.461Z" }, @@ -680,8 +601,7 @@ wheels = [ [package.optional-dependencies] sphinx = [ - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] @@ -790,7 +710,6 @@ version = "26.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/23/75/e72b839c3dc869c990b4842f3dba730bdcdf5215f68fc7955edf849a1792/cattrs-26.2.1.tar.gz", hash = "sha256:679132bfdc225c5ee40c024fc42519954767c387f950dc6751946c586bccdc6d", size = 525617, upload-time = "2026-09-26T20:53:21.114Z" } @@ -816,18 +735,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/d2/2cde336b375f55c76ca670f0be3978cc048e31e24f3b4d7ce8473150a388/cffi-2.1.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:baed1e86cc735622097354b9d1281406caf42ff42a886d29faa8e8d1630333be", size = 183779, upload-time = "2026-08-03T21:19:15.602Z" }, - { url = "https://files.pythonhosted.org/packages/94/1a/4b2f7c92293ba05cbd4a9a1b28faaf0326272d9488e6354657571c48a7aa/cffi-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca82be1a1d406ecfe1d25dc16cb33488e5a16bf4438c9fb590484ea29d92478b", size = 184178, upload-time = "2026-08-03T21:19:16.67Z" }, - { url = "https://files.pythonhosted.org/packages/17/0b/ba385d8ccedf926c3cd06e8e2f327027da5afe5f0eb30f1f7bc43ac55125/cffi-2.1.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:42e2f76b9455f5a9a844f770bf3e200ed3da0e15f5df3db9c31fe80b04b3d004", size = 211037, upload-time = "2026-08-03T21:19:17.705Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b9/0f2e58b2cefa33255bff36935d42b13180fe559bba82596540eb404bde7d/cffi-2.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5a59cc1c4442bc3d5c703bf720b51138d0bfc173618807c9ee2490a7541dd3d9", size = 218652, upload-time = "2026-08-03T21:19:18.735Z" }, - { url = "https://files.pythonhosted.org/packages/37/15/180e0dab27b9312c7479003d14c9e547634b7dcb934e2cc4650e1b131a7a/cffi-2.1.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:9f8d177621de5cb38ee3e731eda45d421db093ec0739f46a5594babda7987a98", size = 205422, upload-time = "2026-08-03T21:19:19.96Z" }, - { url = "https://files.pythonhosted.org/packages/18/d4/03026f0c850cbbaa9030750490225b4a7f4d524ea4df72c3cc740a90f4ef/cffi-2.1.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:75f80557d1389eddbd0de2681f6a390a0c5338c31ddaa821381c203fc3fd50d9", size = 205444, upload-time = "2026-08-03T21:19:21.246Z" }, - { url = "https://files.pythonhosted.org/packages/75/77/60bebf6f818bec84210ac5b6979ce4eeadce6fbbaabc9c7ab23e506d1ce5/cffi-2.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:194cffa889098ced9976c3fc6340305e43f6303657d298da55366907c05c22d6", size = 218742, upload-time = "2026-08-03T21:19:22.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ae/679bf47e73fd77b352171727f07de559a003f14de5d02b904a6ec1fa73ca/cffi-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5bb4e7ea95dcd6a014a6fef62e62467d67d8e582326443f3d68e71d6320a9fcf", size = 221054, upload-time = "2026-08-03T21:19:23.694Z" }, - { url = "https://files.pythonhosted.org/packages/09/b8/eefc0e06913b70aa153bf74c946094a18f58fd4aff11b7f372bfdfdca050/cffi-2.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3d22a20b1fb1632cc72c22f95f7b0d2961c3e1c235f245ba4c606c4771035659", size = 213489, upload-time = "2026-08-03T21:19:24.922Z" }, - { url = "https://files.pythonhosted.org/packages/6f/13/4e56852824a03cdf68523a35686f1c28eacd4bd30a7b0a78e682e6e6e1d3/cffi-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dea0e4d7d4f11f619fe8c1d76caf49e24405b4b5743c0e3be16a500ecd930c9", size = 220241, upload-time = "2026-08-03T21:19:26.214Z" }, - { url = "https://files.pythonhosted.org/packages/99/7f/040f9e163e4acac3ee3d85b02d00b2576e7ca980d8785f0a3a5f1a9bf7f5/cffi-2.1.1-cp310-cp310-win32.whl", hash = "sha256:7ce713ace7c0e4520535b42b77eaa742c16dab813978064913e5a3cf82973b41", size = 174578, upload-time = "2026-08-03T21:19:27.338Z" }, - { url = "https://files.pythonhosted.org/packages/ba/0b/644a2ec1a4eaba49c2939410bb1eb1d25b09d6d0582f5d2f95c537043725/cffi-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a48d62ab9d6f4f98c983223a547af44be6ca3691074c31cecced6facd3ba2dc1", size = 185082, upload-time = "2026-08-03T21:19:28.409Z" }, { url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" }, { url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" }, { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" }, @@ -923,22 +830,6 @@ version = "3.5.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/33/1c/f41d4e74c28ab327ff3acd36053f7ea506c55872d7a90b0fa71aa3ab0c89/charset_normalizer-3.5.2.tar.gz", hash = "sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef", size = 172659, upload-time = "2026-09-30T04:39:23.398Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/77/46e87bcfc45d25ab4db7cfc9bb544bfa3ffd302289ed31ae93f5433eb899/charset_normalizer-3.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3", size = 373348, upload-time = "2026-09-30T04:34:42.843Z" }, - { url = "https://files.pythonhosted.org/packages/52/fc/e518013affcc43c9f919c3ba41bffe9b4ee4aceb0a6462a6243efcca5f2d/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e", size = 260860, upload-time = "2026-09-30T04:34:44.817Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ad/2a895c945ee61988dfd9ccee64f0b78dc09f29c9b34d1dd545246d78e0ad/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5", size = 246491, upload-time = "2026-09-30T04:34:46.227Z" }, - { url = "https://files.pythonhosted.org/packages/c9/05/5d958bc8ea503e26be25ada5430fd409cfb45dc22ff33f9f96e649613c99/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa", size = 290875, upload-time = "2026-09-30T04:34:47.691Z" }, - { url = "https://files.pythonhosted.org/packages/55/e2/06bad57dfdb49cad92c0ba85b6b4fa5827a67df37897287cfef0553843c2/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320", size = 286987, upload-time = "2026-09-30T04:34:49.356Z" }, - { url = "https://files.pythonhosted.org/packages/c4/9f/9f52d2886d52645987d603425482c63c5045a3005db1354a7097e5ed1ae9/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249", size = 271105, upload-time = "2026-09-30T04:34:50.957Z" }, - { url = "https://files.pythonhosted.org/packages/4a/41/e05e19578b7b87e7db2c3ecb884bd09d065274ab41e1f535542e8bae9b06/charset_normalizer-3.5.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e", size = 269833, upload-time = "2026-09-30T04:34:52.623Z" }, - { url = "https://files.pythonhosted.org/packages/c2/cd/fc7152414561ff78f9c61a4a627025f65fd244abaefc99ac4e75c6169b33/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9", size = 263048, upload-time = "2026-09-30T04:34:54.013Z" }, - { url = "https://files.pythonhosted.org/packages/71/71/fb379e399b1013962716a059d551e03bd80b3e02f05d81246886af6c0958/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5", size = 249237, upload-time = "2026-09-30T04:34:55.373Z" }, - { url = "https://files.pythonhosted.org/packages/33/4f/aeadccd6d20882909eb2597ec40eccc05d505e2262f14dc76d7620700657/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c", size = 290756, upload-time = "2026-09-30T04:34:56.867Z" }, - { url = "https://files.pythonhosted.org/packages/b9/7b/e8a92613236b257d3b75d532496eb21f68ad8231d7d56df94497e460112e/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c", size = 269026, upload-time = "2026-09-30T04:34:58.278Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ac/21d5c6b972285c5f095ff78afdc99f3539e3985dfcf7ff1cfbe9e772f529/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be", size = 287601, upload-time = "2026-09-30T04:34:59.703Z" }, - { url = "https://files.pythonhosted.org/packages/59/72/263491ec1494a194b16fcbff88a0220f2af633738c79e92b4d7189226322/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45", size = 272660, upload-time = "2026-09-30T04:35:01.26Z" }, - { url = "https://files.pythonhosted.org/packages/38/7a/81f1186c57e406233969ae96b5fd0c907254ab8b6e47da8ae24cd20fb9d7/charset_normalizer-3.5.2-cp310-cp310-win32.whl", hash = "sha256:f5833ad231be5eb6553de524a70f48d71b2c8563101750531e0b80184e175cd4", size = 187301, upload-time = "2026-09-30T04:35:02.659Z" }, - { url = "https://files.pythonhosted.org/packages/ae/ab/fb8b5178fdf7bf68efa61cbe892286bc9f73846f26147d4725fb89388475/charset_normalizer-3.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:1461ac396c4fdb983a675f20aa555624f0ee18ac83d832b9244ffff3d8055275", size = 215446, upload-time = "2026-09-30T04:35:04.011Z" }, - { url = "https://files.pythonhosted.org/packages/36/40/e270b74e0d3f583d78d902960845a149e80eb7c737ee5613ccc6efc7264b/charset_normalizer-3.5.2-cp310-cp310-win_arm64.whl", hash = "sha256:c6708715abcf3c73b99508253e961a9967f02fe536532834149574eda6de0d1c", size = 203389, upload-time = "2026-09-30T04:35:05.577Z" }, { url = "https://files.pythonhosted.org/packages/22/67/6a0b94a7960d5e1b5eacd2fb529f3fccc47db4644f7f0a7cfdcfc3be578a/charset_normalizer-3.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6", size = 370642, upload-time = "2026-09-30T04:35:06.91Z" }, { url = "https://files.pythonhosted.org/packages/fb/94/01009e13b94041599004edf32e56e382c24e570f60f79bab8efe45cfe1eb/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5", size = 259280, upload-time = "2026-09-30T04:35:08.448Z" }, { url = "https://files.pythonhosted.org/packages/66/85/3b5358f60a13210f0b67d3755c168ef758701b021e655d88d4da28554467/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74", size = 245335, upload-time = "2026-09-30T04:35:10.104Z" }, @@ -1091,7 +982,7 @@ wheels = [ [[package]] name = "click-extra" -version = "9.3.5" +version = "9.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boltons" }, @@ -1100,22 +991,19 @@ dependencies = [ { name = "deepmerge" }, { name = "extra-platforms" }, { name = "tabulate", extra = ["widechars"] }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "wcmatch" }, { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/c5/a856a174f091d796d6ad21ac531f20192485afcb321c35c7d260c31fdd3f/click_extra-9.3.5.tar.gz", hash = "sha256:92c90e7307867c56713a30230272e24d31dc52439dac76d555e68c6da2793d64", size = 1701948, upload-time = "2026-09-28T07:41:14.092Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/20/e2d60c90277a668b10a00f7a74cd52a87ab0c85afd5b8975cc582601eafc/click_extra-9.4.1.tar.gz", hash = "sha256:065df41b1c8f6601bd9e550d79ac34a73ba40bfc84cfdb320cdcfe066c40a6d1", size = 1759076, upload-time = "2026-10-04T20:44:16.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/3f/8e39d5ffe830eb20cee391e7682ffb2fb90fe5197b6b88276cb4c6ac8732/click_extra-9.3.5-py3-none-any.whl", hash = "sha256:693b42bb45228adb3dafed9d603fcf7b604f4a307169da7cde097df7d92db865", size = 652050, upload-time = "2026-09-28T07:41:11.858Z" }, + { url = "https://files.pythonhosted.org/packages/53/56/32f36d2a5218c2d89c40802649b943f847162de8849850f6a26a88a23a83/click_extra-9.4.1-py3-none-any.whl", hash = "sha256:046c650c1bcbfd14d6836df64156891d18e73c23287ef7b4c19d839308cecda9", size = 665674, upload-time = "2026-10-04T20:44:14.372Z" }, ] [package.optional-dependencies] sphinx = [ - { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "docutils" }, { name = "pygments" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] @@ -1178,20 +1066,6 @@ version = "7.16.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2f/55/d1eaf3e73781174340a00dc1ba2aee8a65f82fadb18e2797b192b6b3925b/coverage-7.16.2.tar.gz", hash = "sha256:ca64d9f1f384f151b9511bec01126072acd2f313439f8ed015a22d8790aab6fa", size = 971999, upload-time = "2026-09-27T12:29:01.118Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/72/db17bf5f87568ab524413693385be2eeb03e652ab56c54ea05fa85515675/coverage-7.16.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:23219888477edd736b6fcaec1272d47d93b926e999641ffea7e53a1738e70b2b", size = 223670, upload-time = "2026-09-27T12:25:34.675Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e1/285727a8a74d48de256e8605413ee4cf82301228253ea58e5ab4270138b0/coverage-7.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:40c0f00899fe6181ae7f434ceb200e51f5ee4b8ed10e3b5f0b605f0cae15da87", size = 224191, upload-time = "2026-09-27T12:25:36.476Z" }, - { url = "https://files.pythonhosted.org/packages/50/c7/c737b73bac9bf5034f5ff45a4237b7a189d417a4e36751faf5d10c082cbe/coverage-7.16.2-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a4624f80732f6b427ac58f1f59c577a0994a12e8174b5af6a027b4b58795d4c3", size = 250921, upload-time = "2026-09-27T12:25:37.857Z" }, - { url = "https://files.pythonhosted.org/packages/29/4e/e1d38d27817d91776ca543d01276a67eace3df675a673cac32b12c167d58/coverage-7.16.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:191803c4996b499fcd78c2ad5e5f767dcc53cb4dc6de6d6a741b443a1821ef02", size = 252751, upload-time = "2026-09-27T12:25:39.291Z" }, - { url = "https://files.pythonhosted.org/packages/0e/19/14a8e44cbb2ad36ae62aaa03c5eec4a06a7f7df220ea3776af26927acbe2/coverage-7.16.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9fd670ac43b709c575aefc25bf52d8a598a3bc5017bddfd0a179152ab06a2deb", size = 254616, upload-time = "2026-09-27T12:25:40.506Z" }, - { url = "https://files.pythonhosted.org/packages/f9/72/f5bcad0d9a9b450080032344fbff7ec60c1b0e3d38019f7735dee2b69645/coverage-7.16.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:705e5af11d34647efdc170c7840b6857c81cf74be96419a553f237e68e62cb72", size = 256541, upload-time = "2026-09-27T12:25:41.785Z" }, - { url = "https://files.pythonhosted.org/packages/ae/9a/8c735234e8abb52bf5d063f98c780fa942e77c4c0225f9fcb9b33effc346/coverage-7.16.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8afd9bf35cc6a1f22eb3634808fa8e0b91902459c5721ef2e4461dfe771d7f08", size = 251589, upload-time = "2026-09-27T12:25:43.269Z" }, - { url = "https://files.pythonhosted.org/packages/35/6a/1bf6d32e55642d6972aa842640e0a8850e612d19ac7d05e2c32fa59dfd34/coverage-7.16.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3f43bac1856ba269b905302778d4df433d6006489a192174ad77ac528e395032", size = 252660, upload-time = "2026-09-27T12:25:45.051Z" }, - { url = "https://files.pythonhosted.org/packages/53/5b/05b1c0d0e9495cb056155a16066259adc1e935e7411a82a62779bf729975/coverage-7.16.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f8475460aa33ee28ac896ab1156d0bb3b6c639f7f8383c2677d3359eb35f8205", size = 250660, upload-time = "2026-09-27T12:25:46.51Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/5bc3db57fc9c56b4ef055725c38c34faa818a27d17d65e251371f7f0e3a0/coverage-7.16.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d6276d78f6fca7d0ac066d5da4165c5acd07829e8305c2cb900b738fb3a75a72", size = 254479, upload-time = "2026-09-27T12:25:47.819Z" }, - { url = "https://files.pythonhosted.org/packages/f6/0f/4a5de66daef26eb919213f63b84f45d5065ab2df94cd767fc7c1174ac5e2/coverage-7.16.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:736fde09ea39646d11f8e3b76bd3425c075aa4dd45f24891970bb77c14ff20f5", size = 250940, upload-time = "2026-09-27T12:25:49.227Z" }, - { url = "https://files.pythonhosted.org/packages/57/d3/84cd6a11e707e422194739e9734d947746efa5e5b3358ff2d601f823ee45/coverage-7.16.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c85d54e7e8a2ca932fe8399301af9b8d5907ea2a455ffaff6e7d1208db83b943", size = 251543, upload-time = "2026-09-27T12:25:50.554Z" }, - { url = "https://files.pythonhosted.org/packages/ab/bc/3d84c2e2a95f38e346ce3730d9f0e53114f4e8aace72e6e51e014afb9992/coverage-7.16.2-cp310-cp310-win32.whl", hash = "sha256:5139009b5efd2194fc168ee9362f0e191ba612ef5d29242f9269c22f9b8f80c7", size = 225732, upload-time = "2026-09-27T12:25:51.945Z" }, - { url = "https://files.pythonhosted.org/packages/07/86/31f1f3170571a345ab9d8361a7b2f8e0c5698173fbecd1f7149b6e2089ee/coverage-7.16.2-cp310-cp310-win_amd64.whl", hash = "sha256:c3305c38a2fa21a4254f2ace7dd9ef5fc569c9a558b66e7017650b3d637fb95e", size = 226357, upload-time = "2026-09-27T12:25:53.272Z" }, { url = "https://files.pythonhosted.org/packages/58/fa/ce3baf63d85b730398d92a7162f486f3a5e4e2cc3382a02488b3943725ba/coverage-7.16.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:732d950e51f3ba4fb6209c73250f3e8924fefca42953ee04a9e65d8c02414d7d", size = 223797, upload-time = "2026-09-27T12:25:54.756Z" }, { url = "https://files.pythonhosted.org/packages/7a/57/9ba29c2aac7f756d479f03d45762120060f0f988788001001bf36e0e6fca/coverage-7.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5dca0bb66b4c3d624ba047887bf70270030c150692d543cb501293dc38a9f4b5", size = 224303, upload-time = "2026-09-27T12:25:56.214Z" }, { url = "https://files.pythonhosted.org/packages/5d/7b/0d6d60906dca7d28cc1e3fce12a9861801c4fbb6cbf220ad78cd059c9467/coverage-7.16.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:af2a2a8c7c74de0559e0c368d94c8def9e16c58faaee33a0bf081057c4227e3b", size = 254715, upload-time = "2026-09-27T12:25:57.755Z" }, @@ -1311,7 +1185,6 @@ version = "50.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9d/af/182eb91b0df3fe75c4d9f26fe70684569566745f6ba7e5c9c73a862c5252/cryptography-50.0.2.tar.gz", hash = "sha256:7b46165bb56eb4704e2eaaf86f3c940d19154535d9b0ca7d6d590b04060e00d5", size = 880623, upload-time = "2026-09-30T15:30:04.884Z" } wheels = [ @@ -1388,9 +1261,6 @@ wheels = [ name = "dishka" version = "1.10.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/97/da/b75b5fe665d16725e1d46e291c8dd4b0ed1731c7964f41087fda92f03d40/dishka-1.10.1.tar.gz", hash = "sha256:51fb624b9acc948b90f57128460061d1f3a1780121fe1c7d14c565e8bbff2083", size = 282008, upload-time = "2026-04-25T12:07:57.587Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2c/08/dd3259a319ba45c48d975caf237c830c7873a203288cb4ab186cc5bef585/dishka-1.10.1-py3-none-any.whl", hash = "sha256:84f40c1115eb391ce3fb558fd7946c5bcaf6361c35b77b7a185b7697a5720ec7", size = 120062, upload-time = "2026-04-25T12:07:59.153Z" }, @@ -1428,39 +1298,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/75/23/529140fe1aab80fc6992f93a706deec709140a6397439139a054e1515c45/docker-7.2.0-py3-none-any.whl", hash = "sha256:a3f45fdeb9165e2d25d9a1d02ddf3bc70fb572cf5ebbf9b58558c22caf29b71f", size = 148775, upload-time = "2026-07-09T14:53:45.224Z" }, ] -[[package]] -name = "docutils" -version = "0.21.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, -] - [[package]] name = "docutils" version = "0.22.4" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, @@ -1472,12 +1313,6 @@ version = "1.5.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/59/0b/d65ea3be00ea79aa276a8388bec588a9cbf409ce637c6d306e5316210d15/duckdb-1.5.6.tar.gz", hash = "sha256:166a91dbfacfc0c9f08cc76c0243cb6d3d4296bfab5bad72a3cfb63140a5b7c8", size = 18032957, upload-time = "2026-09-28T13:38:37.978Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/e1/5d05ecb59e3fd401414dacc9c969a326fe3a0b1eb07920058b656fe728d6/duckdb-1.5.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64db8a6700e81fe419fba130d8f1780686ad40fbf2eb69f78d2a1533728a0549", size = 32758341, upload-time = "2026-09-28T13:37:14.588Z" }, - { url = "https://files.pythonhosted.org/packages/0e/d0/a382d9677097a1493049ae38f8219d751db989bfc72bf3a3766dc5af038e/duckdb-1.5.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6d1eac4de11779bb249b89b0544916ad65751da031df5c5f6d779c85b753109", size = 17372329, upload-time = "2026-09-28T13:37:17.997Z" }, - { url = "https://files.pythonhosted.org/packages/5c/dc/76577ce6520db9e4e8b33f90ec2f503cbf79652a1fd34e391b8043f921f2/duckdb-1.5.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:56355a543a79c7f4d8576d27edcbd9aaed19a562a0901188b021c10f4c818800", size = 15511297, upload-time = "2026-09-28T13:37:20.236Z" }, - { url = "https://files.pythonhosted.org/packages/e0/3e/eeeef69e0c3cf3bb463b544435695647a4802437cfcc2b94035026bf5f84/duckdb-1.5.6-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:95a6b91bb9149950baeb5d02466c006550d0ea98b9d10f15f7d614a8eb32e174", size = 19428638, upload-time = "2026-09-28T13:37:22.436Z" }, - { url = "https://files.pythonhosted.org/packages/58/05/4ed0a651d55c8cbf9f7e826cfa95e67c9955a5db22a0c7c0cc5378f4a90c/duckdb-1.5.6-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd348e9ebdc8b28f1f9930efb5a74a382063c35d9c43901075566fbae50ab5c", size = 21534632, upload-time = "2026-09-28T13:37:25.139Z" }, - { url = "https://files.pythonhosted.org/packages/33/34/66f49f13f4286871e54b8d5478fb0b10e1f334f6ffe81536213e7fb55f09/duckdb-1.5.6-cp310-cp310-win_amd64.whl", hash = "sha256:f14551eef9180fc72869e2d9a2896410a8826169e22495e98a825abaa0eac1a7", size = 13178288, upload-time = "2026-09-28T13:37:27.578Z" }, { url = "https://files.pythonhosted.org/packages/36/e5/01e03d30b7ba33a030a4269fdca16ce445ce10f9d29b84a10fdbe0636ad2/duckdb-1.5.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c88700d0ee68ad149a0cc624df21b0f21efc136ea2449aaadd7cd0c9a564962a", size = 32757482, upload-time = "2026-09-28T13:37:29.916Z" }, { url = "https://files.pythonhosted.org/packages/ba/4f/7f7be626a4649a3948ca646c84d6afc1a00121f292f98e6f0d9ed68330df/duckdb-1.5.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e4f1b10a8b8ff476eb2b73955590fadbcef978da1167c593114c5edf763960", size = 17372997, upload-time = "2026-09-28T13:37:32.363Z" }, { url = "https://files.pythonhosted.org/packages/1a/66/9d57573729348d800a0eebdd508f1a833d3714f72e984fef79b47f0e6c45/duckdb-1.5.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34623eaabd2c66ba5c20f1a39486321c3b7d32e4e0e001ced95f81e3372dd361", size = 15514224, upload-time = "2026-09-28T13:37:34.467Z" }, @@ -1515,26 +1350,13 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "duckdb" }, { name = "packaging" }, - { name = "sqlalchemy", version = "2.0.54", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sqlalchemy", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sqlalchemy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/89/d5/c0d8d0a4ca3ffea92266f33d92a375e2794820ad89f9be97cf0c9a9697d0/duckdb_engine-0.17.0.tar.gz", hash = "sha256:396b23869754e536aa80881a92622b8b488015cf711c5a40032d05d2cf08f3cf", size = 48054, upload-time = "2025-03-29T09:49:17.663Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2a/a2/e90242f53f7ae41554419b1695b4820b364df87c8350aa420b60b20cab92/duckdb_engine-0.17.0-py3-none-any.whl", hash = "sha256:3aa72085e536b43faab635f487baf77ddc5750069c16a2f8d9c6c3cb6083e979", size = 49676, upload-time = "2025-03-29T09:49:15.564Z" }, ] -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, -] - [[package]] name = "execnet" version = "2.1.2" @@ -1587,18 +1409,6 @@ version = "0.4.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/21/f5/dd1935e7b6a7534c008b39205c6fad38c59146ef0a4987696fd770f9e1a1/fastnanoid-0.4.3.tar.gz", hash = "sha256:aa8d33896513fa02dbc1393396365ef5023c1ffb73dd344fd797cc846452b45a", size = 9981, upload-time = "2025-06-30T14:43:35.824Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/33/ce5e1b7e898a8bdca55d794fabd7fe465006ca8d2121cb3f93bbdd2e8bdd/fastnanoid-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10c9ccc8e2d2ae7fc1ae5200a0a40511938376e5285ca756f99df20ddfe5c736", size = 231872, upload-time = "2025-06-30T14:41:27.448Z" }, - { url = "https://files.pythonhosted.org/packages/8c/06/92e69995b29e54bc573baf90a34fbe3bc0d254af705607a7441715eb5a18/fastnanoid-0.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c84cfa23115382d46c47a803d905abfb86a44b1268ff43e4a837dc76c881f1b5", size = 241609, upload-time = "2025-06-30T14:41:41.219Z" }, - { url = "https://files.pythonhosted.org/packages/c1/1d/d62b82712203308efc010ce6e702883ae8175c3bcec3be6121b99b1ed68c/fastnanoid-0.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38ebed8c9e9b541d799b457ca5348462ee2f0c1d96186ef793fe6d9c8a1ea270", size = 366937, upload-time = "2025-06-30T14:41:54.559Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a4/b16506c1d781acdee49dd9c0e00ac6fd91e9771e24ace27c0de5444840d7/fastnanoid-0.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a87f76b8981c5d17818f32f6755298cc894c4fa2a3311160d98a70251bd68dfa", size = 261339, upload-time = "2025-06-30T14:42:07.146Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ec/e7ae4a0d49e02c07e81b6975986a082b50f6e96676297f4374847f1e3ab1/fastnanoid-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8591363d60f1327832fbfa6d951a324804bfca0705f086375dd74c2c4aeceec", size = 235731, upload-time = "2025-06-30T14:42:30.24Z" }, - { url = "https://files.pythonhosted.org/packages/dd/1c/270789f975eab5cbe47c3c99fdf213981e9722eb22760acddf194960043a/fastnanoid-0.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ce4a79eeeaddc70c3b12f9a106e8c78f7ba76484c78be9b72021bbfc2967813", size = 250681, upload-time = "2025-06-30T14:42:17.599Z" }, - { url = "https://files.pythonhosted.org/packages/f5/f9/39ea727bb3ccb762a20fb4c542987ce088bf546652e9076ac06035de91b8/fastnanoid-0.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6d2e9596f5e4595aab72036d0f926656d0469ac1106b440417d0dd7e787a8714", size = 410740, upload-time = "2025-06-30T14:42:47.259Z" }, - { url = "https://files.pythonhosted.org/packages/32/3a/d3535332efd530d6c2d8dc10d5474f9021939278aaddf265e84e28c8b272/fastnanoid-0.4.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:dba768064601c28ee9ea7e262f0ff776fcb1270fd6ae0c0271aa2722e79c347b", size = 504169, upload-time = "2025-06-30T14:42:59.611Z" }, - { url = "https://files.pythonhosted.org/packages/18/8f/54f7c7ad9d06e4b036d659a73335e64ff73f6ac222c8b14f75e29e488ab9/fastnanoid-0.4.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d3f72279b67a4f51b5752113ba27acb83139133222736d2d3204fc31801aa578", size = 431332, upload-time = "2025-06-30T14:43:11.046Z" }, - { url = "https://files.pythonhosted.org/packages/3a/18/d5007434acfa3263bf6ca9539bbbe7b6755a5f599eba5044c73ae19b3f8c/fastnanoid-0.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3e2598b31f3c7a39acaeeeb93f3b0db135ec65ce680ee7fa8237380b315b98f7", size = 406112, upload-time = "2025-06-30T14:43:23.751Z" }, - { url = "https://files.pythonhosted.org/packages/c9/08/d98e30437d1a4e116d1a8a82255c2344dec11a9403f1cbf31bcd38242468/fastnanoid-0.4.3-cp310-cp310-win32.whl", hash = "sha256:9218f3474061f9bc346a2185ac9480567f0445b75d63972bcdd6d41cda472f6f", size = 102769, upload-time = "2025-06-30T14:43:41.509Z" }, - { url = "https://files.pythonhosted.org/packages/d2/00/8b0dd74f4b929951fe7fd194435e724225171bd639349ac139113df1a933/fastnanoid-0.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:37383ffa42e47ed2afc742665b67bfc9c87703404c46475b44496f7475f40e5f", size = 109616, upload-time = "2025-06-30T14:43:36.578Z" }, { url = "https://files.pythonhosted.org/packages/2b/b2/1a1556adc254eedf0d940267ecde9b8b2e7b683b04d403ecbc07671328e2/fastnanoid-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4468f2128ac3b203baef110185b61619a2f45492bb6a90c9f098ca4a957fc4dc", size = 216189, upload-time = "2025-06-30T14:42:44.066Z" }, { url = "https://files.pythonhosted.org/packages/e5/d5/ac87ae976a91585c84ec260ba109d43f19e34d263df88c62381665d79558/fastnanoid-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:338c7d57e199b80b2fde8984138546351bba21ea3bac03ebc51814762d0bfb45", size = 210869, upload-time = "2025-06-30T14:42:41.078Z" }, { url = "https://files.pythonhosted.org/packages/51/28/839d11bf48c5423cecc5117f4e06a8b5902f8bffb9e623461135aa35442a/fastnanoid-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f162bfdd52d50282a727d8193c401c8336cdd7ccd9eaa9fbb3f5b89478ac2cd", size = 231775, upload-time = "2025-06-30T14:41:28.95Z" }, @@ -1651,16 +1461,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d5/30/0037e0d426561fdd46866b04e7214cae854aab050f8c91d4f45ddfd4034f/fastnanoid-0.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b42a90da8c0c085911bef93323cd8244f3a7e6b327ecbfa2432bc3db04086014", size = 404473, upload-time = "2025-06-30T14:43:28.378Z" }, { url = "https://files.pythonhosted.org/packages/47/a1/5b3938464cf0ba235c76b15b1d0fe2d61cfd47dac848595bc47fc1fe541e/fastnanoid-0.4.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5833bb7a1814e105f713731f7aac4aadb06e14517139d70080cacce458026eb", size = 234388, upload-time = "2025-06-30T14:42:35.479Z" }, { url = "https://files.pythonhosted.org/packages/59/30/6dd2f979a78783848fcff31251cc5bc45c315eb9314a5c9b485e76fc818d/fastnanoid-0.4.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:39fb393f81eb5ce37135418a9a10560b670682eeca4c062b985a1bc6fec45705", size = 249086, upload-time = "2025-06-30T14:42:22.718Z" }, - { url = "https://files.pythonhosted.org/packages/1f/64/de3ee84c9672f7e7392cc349da896dbc0ac9239bef1cc6c23f0607e00371/fastnanoid-0.4.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06dffcd4ec8520c2ca5476a484275a8dce592b4707495e6a74cdc2ac0aa7922", size = 232734, upload-time = "2025-06-30T14:41:38.116Z" }, - { url = "https://files.pythonhosted.org/packages/79/ea/48907f92cf2b7fa35adcce975d5c29d086050e7a406acde503e7e0d58a60/fastnanoid-0.4.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa71ef4ba1143da200ba79b16bc82352632ad0fce36aab16710c7b4d3d5f75d6", size = 242244, upload-time = "2025-06-30T14:41:51.469Z" }, - { url = "https://files.pythonhosted.org/packages/d6/b4/9d9b6258421b3669185fc82a4569bd0af3b73db70770661578ce88317b96/fastnanoid-0.4.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5b3143f298528835bb1821e0da161a07631aed9ccbe93eca7c00ef0248402fd", size = 368223, upload-time = "2025-06-30T14:42:03.645Z" }, - { url = "https://files.pythonhosted.org/packages/f6/02/8ed5ada1a302a9c279b3adae2f89c37a9e5177d21a6b072f00255005a682/fastnanoid-0.4.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45b8d11373bde2c0afef38b59353808948407baec33dea0df95ba00dc6dbd84c", size = 262264, upload-time = "2025-06-30T14:42:14.436Z" }, - { url = "https://files.pythonhosted.org/packages/21/b0/e18b1807d81f0a95d244b2cbc68c570518246ad713758f6cd028b4a4bd09/fastnanoid-0.4.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7e6a71a6c9fa6f3c3443dd086d6454c71330b3a3aeb5cd09f883faf9afa0a9c", size = 236353, upload-time = "2025-06-30T14:42:38.872Z" }, - { url = "https://files.pythonhosted.org/packages/0e/8b/6ba5a5a1859758d7bdc42e72bd735b3f36ca5b78dc3768e9d253c312e13e/fastnanoid-0.4.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:320d3dce34b0f64c8941e7a7a1607ce773eea7b8447dfe05f45aa42297d20110", size = 251633, upload-time = "2025-06-30T14:42:27.45Z" }, - { url = "https://files.pythonhosted.org/packages/73/a2/8901e131f01c2e0b1ae4cbbda79eb75e1f4383f7fc415b2293989340bdbe/fastnanoid-0.4.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aaf2e182e79665af3812f3c8f57f73c872e5c4eb89b1cb685e4cab5b8c0be848", size = 411386, upload-time = "2025-06-30T14:42:56.348Z" }, - { url = "https://files.pythonhosted.org/packages/95/fb/ed1f380a60d7f19047abcee2d310839a269f68e8bdd0fd6f0bbccaf4df4d/fastnanoid-0.4.3-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:a6e2c9d635ae6efbe430f046ac4b748925c17343e886f4bcc0de411aa0eca569", size = 504920, upload-time = "2025-06-30T14:43:07.684Z" }, - { url = "https://files.pythonhosted.org/packages/50/04/b0478867c36dc142cc0661fa06542f42c80cd989cc025a9b9594172ab682/fastnanoid-0.4.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:b7e11772a44afba1a244fab80926f1a5baa2cf6dc5b857efcb62128eeda2afbf", size = 432008, upload-time = "2025-06-30T14:43:20.015Z" }, - { url = "https://files.pythonhosted.org/packages/10/b0/97e4518ac6b6e158533167e15d967005e6b86b83ca897bf3c0924db62f79/fastnanoid-0.4.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c11b9c5795add802540f6ae9e0942e4ed2b1b5f74376946c8e3dc9ecee19c5ea", size = 406686, upload-time = "2025-06-30T14:43:31.972Z" }, { url = "https://files.pythonhosted.org/packages/0a/95/36b1b47db8cd3fc66b2152e5f552f20ea70458387bf6a4f9a26de7993bf0/fastnanoid-0.4.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c931443d1a29f7a004e506b89fcbce256a31c4aab5d081dee4df0432db3d05", size = 232543, upload-time = "2025-06-30T14:41:39.179Z" }, { url = "https://files.pythonhosted.org/packages/f9/f8/80697c7b4158317b5396779c8861dcd3cc621ddcb736ab555401e311e684/fastnanoid-0.4.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec5a4fc039a698b8d1b99a19ce50e853d8d8fb42aa52a3beea0e80a3df30facd", size = 242101, upload-time = "2025-06-30T14:41:52.489Z" }, { url = "https://files.pythonhosted.org/packages/01/f4/b7bf12cd7ab6d5b26d0c5a94731fa5255d188524ea15e8365f8b24293a08/fastnanoid-0.4.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7898b91478853f7034e54f276bc10aeccdecfa76bbc0385aeeba2196bfdc201d", size = 368124, upload-time = "2025-06-30T14:42:04.692Z" }, @@ -1675,11 +1475,11 @@ wheels = [ [[package]] name = "filelock" -version = "4.0.7" +version = "4.0.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/f5/14097cca69f53794270d8c7970b48321636302affe3154c7e0ba114eeff9/filelock-4.0.7.tar.gz", hash = "sha256:da5915714a70b55d167fdc7e251ad91302b0a36816fb574dfafae8f4f2c9bb21", size = 248489, upload-time = "2026-09-29T23:04:05.995Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/e4/34efcb869715cf299e47d1ac7b2624d2bcb6f2d3dffc2f0abe8417f65ab2/filelock-4.0.12.tar.gz", hash = "sha256:cf42711a7ac791818b299fab0332a088c65aeeefa36290de98db92c434303b0c", size = 253880, upload-time = "2026-10-05T13:17:43.677Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/cf/1731c0dd182ee35f80a39e63afb3d03056ea0dd561b7498932b10b2e34d9/filelock-4.0.7-py3-none-any.whl", hash = "sha256:a93c4d93269b339a6af4848342c7e940d0f9928ad95eff64764699e5f1bf8a6a", size = 109242, upload-time = "2026-09-29T23:04:04.696Z" }, + { url = "https://files.pythonhosted.org/packages/da/a1/b047e1c486a2c66283633b7dbb73872ca16ca1ce6a426f70d4d037fc8e1c/filelock-4.0.12-py3-none-any.whl", hash = "sha256:5f17ee83ecee8a6f3e389c75822fb70a1c2f0506b99438a6dffa1d56793588c8", size = 111732, upload-time = "2026-10-05T13:17:42.361Z" }, ] [[package]] @@ -1705,22 +1505,6 @@ version = "1.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, - { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, - { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, - { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, - { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, - { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, - { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, - { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, - { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, - { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, - { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, - { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, @@ -2037,7 +1821,7 @@ wheels = [ [[package]] name = "google-cloud-storage" -version = "3.15.1" +version = "3.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core" }, @@ -2047,9 +1831,9 @@ dependencies = [ { name = "google-resumable-media" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/01/4e521d8bd13769e9be53cc6fc08ea1b9268692edd92669507226fb350e63/google_cloud_storage-3.15.1.tar.gz", hash = "sha256:b6d882049c18f5e8a29da1998cdbed31586e2b0d738886c3ad13688c69ffb272", size = 17351079, upload-time = "2026-09-29T19:26:08.831Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/e1/7460613a818ed8d38ee888e672ddb89966f8f92f751ba127c1bf57f4bec2/google_cloud_storage-3.17.0.tar.gz", hash = "sha256:4373aa6328e070c31c97aa236f1600a239dfd3c85e5870cdf3dc2a928dfe0bca", size = 17355535, upload-time = "2026-10-08T18:12:54.643Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/e1/28d9eb5b96da7b5125341b012438b2e8b5ffe1d4f12a4cc564ac193e7f5a/google_cloud_storage-3.15.1-py3-none-any.whl", hash = "sha256:8e05c55b9168b15a523728d8c2c75dc8403bc2ec889f2421556845ab3a276e62", size = 343454, upload-time = "2026-09-29T19:25:44.172Z" }, + { url = "https://files.pythonhosted.org/packages/9e/21/c6869b66d723d93d4e63fba0dc4b539debeaf03e8b9af53de906a9910ec7/google_cloud_storage-3.17.0-py3-none-any.whl", hash = "sha256:0b89283fccf84745bae75bbefdbda8393e5323471071a2ba24ab437407141171", size = 345704, upload-time = "2026-10-08T18:12:26.717Z" }, ] [[package]] @@ -2058,11 +1842,6 @@ version = "1.9.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/fa/25/9cb0c1c31c45b893eb8f11ae70b3f4309432d59b5acaebca5dbe791729a4/google_crc32c-1.9.0.tar.gz", hash = "sha256:7b8c84c3d159ab6817fe3f74e6e6cef099c3f95dcec3abc0d8afb1404642efbe", size = 14857, upload-time = "2026-09-24T21:39:32.067Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/7c/e89a13c971bcab4a0464ecc78f8dc162c5c7ec8986a54dd867fc093b2c6f/google_crc32c-1.9.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6b529a6a287104ec79d281c411685231200ce954a29c28ab8e5093cb6e130fb", size = 31959, upload-time = "2026-09-24T21:19:00.091Z" }, - { url = "https://files.pythonhosted.org/packages/c6/06/510062c2acbdbf602d759b7b0086032c487126106bb25197b9da1ff1047f/google_crc32c-1.9.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:51cb4e23a38ad4f495f35f87c233ca3ea6b9c4559e7ac383cdef786fab0f7977", size = 31801, upload-time = "2026-09-24T21:22:24.222Z" }, - { url = "https://files.pythonhosted.org/packages/9a/c6/53eaa12dc62625f4605760b09854a0814ef6afebdc0e611a38c7b15aa6d1/google_crc32c-1.9.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8535e75dfead304f30e9122b9ea2c0a570dbaa52c176a0a591540c7914c1e46d", size = 37203, upload-time = "2026-09-24T21:38:04.791Z" }, - { url = "https://files.pythonhosted.org/packages/dd/92/770c2713df471df73998f79758739da83e410ef576bfafd05e5e845959ff/google_crc32c-1.9.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:280f3a3e47af0eeba3a3e5aa7d311af77001812b8df80fb8beafcd0b40eaf7f1", size = 35816, upload-time = "2026-09-24T21:38:05.798Z" }, - { url = "https://files.pythonhosted.org/packages/b8/f3/181945217690644aa502220a3ec9bf0d2ef9af930bbfffee555fe5236e2f/google_crc32c-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:56610f548f1b35c9568b9d1de30423480f505dae4991556072d5802820ff35c4", size = 35097, upload-time = "2026-09-24T21:39:27.402Z" }, { url = "https://files.pythonhosted.org/packages/0e/55/a2f07f15e624f0de79359b1a6c1deb59ec5061bd3b38744b3b2849400662/google_crc32c-1.9.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:457d0d9a4718fd52b1494eac5c200ad25beeadbdc91843d550a003910838589f", size = 31958, upload-time = "2026-09-24T21:19:00.994Z" }, { url = "https://files.pythonhosted.org/packages/f8/b3/923743597b774bbcf12a7c3e00e48d745e15fd616ad7489a40a63fff8f2f/google_crc32c-1.9.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ccfe40021fd6afe23361175cf7551e3cef5fd34dc1ebe319f14993a83579e0eb", size = 31805, upload-time = "2026-09-24T21:22:25.019Z" }, { url = "https://files.pythonhosted.org/packages/df/a6/4d0352fe889663e0d81cea7fc664ec9158727384de4a44ab10e9967a7682/google_crc32c-1.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fbef61a3794e011c65fb4396a196cf123a7f474fe5a443db8e5dd7d751b9e6d4", size = 38119, upload-time = "2026-09-24T21:38:06.634Z" }, @@ -2155,15 +1934,6 @@ version = "3.5.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3e/6e/0091f175ccd02b02bc8811bbcbcc6ac2e980be116e3b2f7a736ca322bf84/greenlet-3.5.6.tar.gz", hash = "sha256:8e67c43bdfc88d5fee6db0d3e40175b362fc95fb85f0412d233b9b203c53a575", size = 207653, upload-time = "2026-09-14T15:42:51.806Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/4f/4af258e1ce388eb64be82d6466b7d0b3bc3eede154e14c3360a76a759b71/greenlet-3.5.6-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:95e7c44d072db623a1aab04ce488cf9533294a77ed9d072cd503a3596f4106ac", size = 292967, upload-time = "2026-09-14T14:26:34.475Z" }, - { url = "https://files.pythonhosted.org/packages/1d/05/dc0d54e90af2f192724936799cee990687792ff54a4638d3ae0e0a0145c0/greenlet-3.5.6-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7d501d5eb5d4f67207df364752ad697465b834268744be7581c18d81d35d41d", size = 609284, upload-time = "2026-09-14T15:11:58.49Z" }, - { url = "https://files.pythonhosted.org/packages/c1/51/826b4fe7bc39c3f910c95e889a981c827f72a611fc035f31816a256cf043/greenlet-3.5.6-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a364c1ea75dc51b83a17f52fe0c79cf8bc4ddf740403bebd4581c7666eea017d", size = 622648, upload-time = "2026-09-14T15:20:39.198Z" }, - { url = "https://files.pythonhosted.org/packages/55/3b/f2d36fc38934588dff6d6ec9288934c9611abac7a79c866c2002fc707698/greenlet-3.5.6-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5599b380c1f28efeb724e81569eac80cd92f99a85bd9775456caaf3225d40b11", size = 629557, upload-time = "2026-09-14T15:25:03.036Z" }, - { url = "https://files.pythonhosted.org/packages/94/5c/092682ae7ca1aadd44aa36b0bc35c48c9ed55f9ffebb5794980b1e2ae74b/greenlet-3.5.6-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eed88b64a5e5da72d6a71cdc5aaeefaa5ced9b748f8d19f89800b339961dad39", size = 622813, upload-time = "2026-09-14T14:35:54.845Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f6/4167f0e44e795840cbc219b2e5d8f576492192cd9e3e17e827db20287daa/greenlet-3.5.6-cp310-cp310-manylinux_2_39_riscv64.whl", hash = "sha256:5bbda3c70dd35d60671bc33b01916802707a052130d9e50cdb871d34594d35cb", size = 425482, upload-time = "2026-09-14T15:28:34.144Z" }, - { url = "https://files.pythonhosted.org/packages/07/59/9c6b723a559b53bee0980a5dc57577d434891dd454f0fe54ed6e22d4e4ce/greenlet-3.5.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:874cea8bb1ec1ddccbacbd027856f6bf496f6bc18aba97a918c20e067edab236", size = 1585817, upload-time = "2026-09-14T15:10:03.922Z" }, - { url = "https://files.pythonhosted.org/packages/de/d4/2bceaa305ff0ecf99511480da8f0a866eb2469a68da8715008a0d3e8f65f/greenlet-3.5.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:128813fc29f2336a21b4d06eedd5e16bcc7ea46f59e9ff1cb30ea70e48195d88", size = 1650177, upload-time = "2026-09-14T14:35:46.736Z" }, - { url = "https://files.pythonhosted.org/packages/7a/33/c57855a6abada0c7bfb9c6c0f33df1fbed8e5224708478dbcdff6c5db490/greenlet-3.5.6-cp310-cp310-win_amd64.whl", hash = "sha256:dad3d233d441a022c1f7155f0fb9d5aff7b97c1ea8c7dfa02cce586b16ab2d0b", size = 322896, upload-time = "2026-09-14T14:24:52.308Z" }, { url = "https://files.pythonhosted.org/packages/f1/d7/41511ee2696f14be4200b524d9553dc4295e2bdeb20aa8962c3cb25e71c6/greenlet-3.5.6-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a6a4b98a9132e0f45c9fc245a63894cfd8c45fb7a0d6bffc5eab3ec327cf7324", size = 294075, upload-time = "2026-09-14T14:25:16.922Z" }, { url = "https://files.pythonhosted.org/packages/f8/7b/b509624970909294cd064ff7346148ca9941c21bec9026d7873dd254e9fa/greenlet-3.5.6-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45bfd2b51e38aaa5f9849f114d9c7c1d75f69187c849b3549cd64c465283abfa", size = 613429, upload-time = "2026-09-14T15:12:00.454Z" }, { url = "https://files.pythonhosted.org/packages/2b/5c/d2eb503067f9ba20875ef8c87681f29a64f53bbbbe4059a5d7c53179d442/greenlet-3.5.6-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3c6dede9133e1da41d561bc3fb14e92b47e2ce39ae60edefaad145658ea7c5e2", size = 625405, upload-time = "2026-09-14T15:20:41.053Z" }, @@ -2270,16 +2040,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/3f/4f/4435c0aae54657258d9cfcba78598f3d9e5fe4c82ff18d78558567b90faf/grpcio-1.84.0.tar.gz", hash = "sha256:19aaf172fc2edbefccce3f6e92c5150975dbe56c45744e9e87cf72ebdf85bfbe", size = 13493876, upload-time = "2026-09-14T06:59:33.291Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/4b/a0dc421d049b743093eae90caeb5dd92ced7226cd4919dc4de34c81455b6/grpcio-1.84.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:71fd60e6e426d293d0a2f685115ad0a0845117602cf13605a4be7524fb5f7bba", size = 6450049, upload-time = "2026-09-14T06:56:48.72Z" }, - { url = "https://files.pythonhosted.org/packages/f7/41/90292bf55af7aa09de0e3ec928d1b8c56d477f85244f7928d2231630b781/grpcio-1.84.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8e1a45d174b6b8589f51dce1cea804aa6c1f72c9c80cba91ae2caabeb6d90540", size = 12344932, upload-time = "2026-09-14T06:56:51.685Z" }, - { url = "https://files.pythonhosted.org/packages/e9/68/b6c0248266a378b1bde08e4de7d69f3cc08ee6f5937a5dce7d3c3ba0fe1d/grpcio-1.84.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efb29f8633bf6630dc89de4fe0353ac3d7e4b70ef7b6e29fb40f00e68c127fa5", size = 7030162, upload-time = "2026-09-14T06:56:54.412Z" }, - { url = "https://files.pythonhosted.org/packages/70/2b/0a2a2cbcf48847f83eb51fb982116d0965f2fe068e73f28b2d17facf30a4/grpcio-1.84.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d0fdd25faece8a1f95e8a3a8006e29701b5cf8dadb4a8132e68f3134637004a5", size = 7781546, upload-time = "2026-09-14T06:56:56.571Z" }, - { url = "https://files.pythonhosted.org/packages/a6/7c/da97476f3c2e90e9f00bfb19def7cbb5f841b7661e3cd09c6a89beaa5b98/grpcio-1.84.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:393d8a78bff6731ecc5ad2151a821f8fbc1709b137ebb9c25a4ef399fbdcc914", size = 7186279, upload-time = "2026-09-14T06:56:58.817Z" }, - { url = "https://files.pythonhosted.org/packages/14/16/27fa3aed1ee6fdcbb978a1bd4bce255dc0122b90179535177a96543d14fc/grpcio-1.84.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fc66cb50c93554b86db0b6625ab5c6e9051dbf8847c08d93c84918e02e413fb7", size = 7731191, upload-time = "2026-09-14T06:57:02.447Z" }, - { url = "https://files.pythonhosted.org/packages/4c/78/75644af37af85afb381376aef99cad92da8bc2d56ba3e5ae070a7cb59682/grpcio-1.84.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:455ed6083353b8e938f1d58c765eab2fbb165731e5b507be30fee344915a2a11", size = 8790443, upload-time = "2026-09-14T06:57:04.623Z" }, - { url = "https://files.pythonhosted.org/packages/95/4d/ce57fa986e93c06ef867f64e1ebe419e924fdc2395115607f0725f4855e4/grpcio-1.84.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d6a82c4fc6c85f2fb7572c86bdb86f84c97b6580e5f6599f711800bac48a5d8", size = 8138068, upload-time = "2026-09-14T06:57:07.348Z" }, - { url = "https://files.pythonhosted.org/packages/ba/a6/22a73111c4f75da9450bf0481fac805396ec9bf6f949a90bb2969de07cf4/grpcio-1.84.0-cp310-cp310-win32.whl", hash = "sha256:8e3f508d0e9e6236ba2f08d56e33355e434e785e813149a1b8477d3edf69779d", size = 4496545, upload-time = "2026-09-14T06:57:09.236Z" }, - { url = "https://files.pythonhosted.org/packages/31/ff/dc048bc3d8ebd8d4b7f6f6803c76142a9a5ca1e1e9fa34e79597f0f9ed77/grpcio-1.84.0-cp310-cp310-win_amd64.whl", hash = "sha256:ed2c1493c44d0932f1e55fdb5d1ead658c68288ec5d51b8c4928422d98633ef9", size = 5258144, upload-time = "2026-09-14T06:57:11.403Z" }, { url = "https://files.pythonhosted.org/packages/2d/b9/46146728b3f4a5c7e34c17d0ab724d58b5456b116e76dc77d3ef4e79b135/grpcio-1.84.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:4aaeceeb7fa7d824c322d1ec3208c8495c88478a927295553235435fc49043ad", size = 6454572, upload-time = "2026-09-14T06:57:14.651Z" }, { url = "https://files.pythonhosted.org/packages/e3/63/5d668b4102637410d700153fd12d6a798e3ff8308bd9dcbaeae93f191060/grpcio-1.84.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:06619ba1515e5ee69fb2a514e95dd8be05ce74cb3928d5b34f87f87c86fe3c27", size = 12359529, upload-time = "2026-09-14T06:57:17.202Z" }, { url = "https://files.pythonhosted.org/packages/18/2a/52e29c02047a493f15a78c0502bde4d3fab7c19c7813944d367cd501811c/grpcio-1.84.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:158c1c11cfb61b4849c3caf4d52de6f5ecd376e14446feb4a90dc95a90d616f5", size = 7029927, upload-time = "2026-09-14T06:57:19.767Z" }, @@ -2378,7 +2138,6 @@ dependencies = [ { name = "packaging" }, { name = "pathspec" }, { name = "pluggy" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tomlkit" }, { name = "trove-classifiers" }, ] @@ -2428,13 +2187,6 @@ version = "0.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342, upload-time = "2026-05-25T22:17:48.841Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/b9/be66eb0decd730d89b9c94f930e4b8d87787b05724bb84af98bfd825f72c/httptools-0.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf3b6f807c8541503cecfbb8a8dffb385640d0d96102f3d112aa8740f9b7c826", size = 208805, upload-time = "2026-05-25T22:16:50.434Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f7/b4d41eaae2869d31356bc4bbf546f44fae83ff298af0a043ca0625b06773/httptools-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da684f2e1aa2ee9bdcb083f3f3a68c5956750b375bc5df864d3a5f0c42a40b77", size = 113527, upload-time = "2026-05-25T22:16:51.672Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e4/77487e14fc7be47180fd0eb4267c7486d0cc59b74031839a3daf8650136b/httptools-0.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6f21e2a3b0067bbe7f67e34cfd16276af556e5e52f4c7503be0cb5f90e905e4", size = 450035, upload-time = "2026-05-25T22:16:53.313Z" }, - { url = "https://files.pythonhosted.org/packages/da/72/5a8f787e323f56fbd86c32a4be92a86776e4cfe8b4317db999f452028362/httptools-0.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea897f0c729581ebf72131a438a7932d9b14efef72d75ada966700cac3caaeb", size = 451101, upload-time = "2026-05-25T22:16:54.696Z" }, - { url = "https://files.pythonhosted.org/packages/ed/41/b44a25560955197674b6744cb903664300e239235a5eaa69df0890d87054/httptools-0.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0d726cc107fceb7d45f978483b4b70dd8caa836f5914d3434bb18628eb73813", size = 436140, upload-time = "2026-05-25T22:16:56.239Z" }, - { url = "https://files.pythonhosted.org/packages/74/b0/054aac84c03d7e097bf4c605fb7e74eec3d65c0276adf64ee97f3a103ff5/httptools-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9878eb2785ba5eb70631ad269b37976f73d647955e26c91d490eb8a4edfda4ba", size = 437041, upload-time = "2026-05-25T22:16:57.716Z" }, - { url = "https://files.pythonhosted.org/packages/bb/e8/86b85bbc0ac7892232f1a99ab96a9aa71936984fa06adfc0afc83ca7789e/httptools-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:b205e5f5523fa039679da0dfe5a10132b2a4abeae6a86fdd1ddc035f7f836557", size = 90454, upload-time = "2026-05-25T22:16:58.871Z" }, { url = "https://files.pythonhosted.org/packages/f8/d2/c3eedaef57de65c3cc5f8dc244cf12d09c84ad258a479055aad6db23206c/httptools-0.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed377e64805bdba4943c82717333f8f8603a13b09aff9cead2717c6c817fb168", size = 208428, upload-time = "2026-05-25T22:16:59.717Z" }, { url = "https://files.pythonhosted.org/packages/f1/94/dfe435d90d0ef61ec0f2cc3d480eef78c59727c6c2ce039f433882f6131a/httptools-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9518c406d7b310f05adb1a37f80acabac40504a575d7c0da6d3e365c695ac20d", size = 113366, upload-time = "2026-05-25T22:17:00.795Z" }, { url = "https://files.pythonhosted.org/packages/cc/d4/13025f1a56e615dcb331e0bbe2d9a1143212b58c263385fc5d2e558f5bac/httptools-0.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:57278e6fa0424c42a8a3e454828ab4f0aff27b40cddf9679579b98c6dce6a376", size = 464676, upload-time = "2026-05-25T22:17:02.014Z" }, @@ -2519,12 +2271,6 @@ version = "3.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/dc/9d/9f31efe9462a220d3e4e19dc96839b97a8dcd4203e9245a0497cfae6f683/ibm_db-3.3.0.tar.gz", hash = "sha256:75c6749957d202e0b6b37e1e823583bfc37b65293ee123fb287e409d7426b53d", size = 315316, upload-time = "2026-08-11T21:00:35.04Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/78/4922d6557e0be0618df915d69aa0d434385cfe093b292a84ce5804730452/ibm_db-3.3.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:6509d856d339c0faa79efa1dc67425a3fe8e677d228f661bbc2ba16881c8bc87", size = 24195122, upload-time = "2026-08-11T20:58:02.45Z" }, - { url = "https://files.pythonhosted.org/packages/94/db/4195a6112d9732d096b728bf8aec611c7c2e5bddef80256a91caefb08219/ibm_db-3.3.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:4dba74cf0742412df3a23bd19d9b15cf21eef3f3bcff5471090c87272e6571d6", size = 20864607, upload-time = "2026-08-11T20:58:06.07Z" }, - { url = "https://files.pythonhosted.org/packages/fd/26/ba431a1fe94325eeded62f1fbe752407a95425978fcf333bd41cbedc1113/ibm_db-3.3.0-cp310-cp310-manylinux_2_34_i686.whl", hash = "sha256:c61b5e913a98c6d94eca64b70f8dea695cd24da2855b4abbdf4eb468e52011da", size = 43829217, upload-time = "2026-08-11T20:58:11.178Z" }, - { url = "https://files.pythonhosted.org/packages/43/0d/744c9d0a6b43e711835ccba3b94fe816d6acde573ae34a1319f2372a6017/ibm_db-3.3.0-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:169e7c055e9b72c6539c3663704c6c59d16d22ad3ff92819a5c3953c04effed6", size = 48180042, upload-time = "2026-08-11T20:58:16.905Z" }, - { url = "https://files.pythonhosted.org/packages/5a/12/985afe97f3b4558cc0004ffd2e9b2f4298ddb18f060ea352c3cacbbafe63/ibm_db-3.3.0-cp310-cp310-win32.whl", hash = "sha256:eabb1610bcff637233355f1db50b7fde59281ad9919e14016f54ef7276859bf7", size = 24602258, upload-time = "2026-08-11T20:58:21.023Z" }, - { url = "https://files.pythonhosted.org/packages/7e/5b/4d9c2f34a63768cbcebb41d1d2789478e2ccfec8b46925db0fa30431f54c/ibm_db-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:dcd02f8252cf861dc1fe87c2b86854a249a40259ce7a69216bb410c922b70a96", size = 28420687, upload-time = "2026-08-11T20:58:25.09Z" }, { url = "https://files.pythonhosted.org/packages/aa/c9/0d94968ff00bbba05e3646d84210f03c06ff7d80b0d4b3da8d052d9c1670/ibm_db-3.3.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:57af3415e9a41f3921929496ce2335378c475dcbe29e37d8b7a2cca12b7845d5", size = 24195127, upload-time = "2026-08-11T20:58:28.871Z" }, { url = "https://files.pythonhosted.org/packages/e7/16/ab95afef216322c76d9ff88df376f5d4be3eb06278d0f3ace519f815c065/ibm_db-3.3.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:16daafed613d3863ac06f0509cae6121e9a9131d52914ed0de30ab70583f7122", size = 20864603, upload-time = "2026-08-11T20:58:32.539Z" }, { url = "https://files.pythonhosted.org/packages/03/14/844dd4840e4b721fbbdcaefae8a214a486377924c5354937816c93639cf2/ibm_db-3.3.0-cp311-cp311-manylinux_2_34_i686.whl", hash = "sha256:5ee32bbeca54f1fcc9f0d4495ea4c174c5afadd9dbe2228b037b9f92d122399e", size = 43834559, upload-time = "2026-08-11T20:58:36.818Z" }, @@ -2637,8 +2383,7 @@ dependencies = [ { name = "attrs" }, { name = "jsonschema-specifications" }, { name = "referencing" }, - { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "rpds-py" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } wheels = [ @@ -2663,20 +2408,6 @@ version = "0.16.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/04/f5/9dc696772d241814bacac7880bac32f2930b5a6ebc1f85317b83161a011c/librt-0.16.0.tar.gz", hash = "sha256:ac38d6d8d66bf3d744148dbbc0b8e193e195a51e364ed55e224631f5721891fc", size = 219839, upload-time = "2026-09-29T00:55:32.891Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/77/900294b3c9a81415323d81b3f3f271a7f5d7ed9d01e824fc38ffa49470b6/librt-0.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:96f576f2711f8519152ec76d0e599243555c1f07679fa73606ca8c8c868c0be6", size = 148668, upload-time = "2026-09-29T00:44:20.282Z" }, - { url = "https://files.pythonhosted.org/packages/55/3b/c301e8cc47758e4518b93e926a0111080155cc79fa03651d202ac2025065/librt-0.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bec3818c7da7c96ceae0ef5915a3d16c52dd08f3ea913bf1fe8568c447c7978", size = 153562, upload-time = "2026-09-29T00:44:21.672Z" }, - { url = "https://files.pythonhosted.org/packages/62/b1/4d5b98114a58bf17e3832cd33400e40f2582f68c2fb7ce25b4468cb1afd3/librt-0.16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c79520414a3fdfc6aabd7593e6169afa14d5f8d9908d4b498db068868b08dd", size = 494337, upload-time = "2026-09-29T00:44:23.096Z" }, - { url = "https://files.pythonhosted.org/packages/88/36/14223c9b0dc38982eb4f399732c8cb27b19c7e027ae0faef5ca51d08d19f/librt-0.16.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f81b5b19ce748ef68d4746656b7929762eb2fe99269b266e4be07e2ee4de7144", size = 485440, upload-time = "2026-09-29T00:44:24.555Z" }, - { url = "https://files.pythonhosted.org/packages/ec/9e/d7155e6800d0c33e297e529b217649f7361d706491ebf9d2fc0fc627309e/librt-0.16.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c71d1b76210a36729fedfc5115069b50a3d8619054745f8758fe5d6f19e86671", size = 498363, upload-time = "2026-09-29T00:44:26.03Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ce/d5f1fb9f913ac0979d6fc5db9fb9c0bf28cc3470988528957922f15ed40c/librt-0.16.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:473eebc7866bb0a0c8849a292b5e7157c1aba5d14d0f0f610c52158d6d964262", size = 515453, upload-time = "2026-09-29T00:44:27.566Z" }, - { url = "https://files.pythonhosted.org/packages/b4/d4/ca0fca1a27c26080d1a25b2b31f271e532078a5719878c3daca0c3d4c539/librt-0.16.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4eb1313a19847089ee81e88742abedf285c60538816640b99742d8534b81d26a", size = 509537, upload-time = "2026-09-29T00:44:29.14Z" }, - { url = "https://files.pythonhosted.org/packages/ee/c0/26807bf2221a53a2c66f2e23a5c4d57f1c0eaa4afed7cb81d841cf3d1903/librt-0.16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ebefd60b42e2a82b32d136bb5f7c94eadfcd29f772b547df6f3291d1ed855a1c", size = 532541, upload-time = "2026-09-29T00:44:30.745Z" }, - { url = "https://files.pythonhosted.org/packages/0e/50/c329d509907e1bc061abeec3796f94d255d43ba25d28c3854d2138ed5ab2/librt-0.16.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6c5da27e8056439f927ea896735da60e616c477a8293feaa3233d4e7781a6726", size = 537059, upload-time = "2026-09-29T00:44:32.102Z" }, - { url = "https://files.pythonhosted.org/packages/84/d6/4571b9c9e65d98e5503734166dce2fd3e216f526dc3c59a3773faa8a60e3/librt-0.16.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:67e718c7a43f8db325abbbf1404e2d535f12f8f7a1a82259568385cc5274b82a", size = 536614, upload-time = "2026-09-29T00:44:33.653Z" }, - { url = "https://files.pythonhosted.org/packages/c8/d3/a2ed8a292e4ab7889792a9c3f4ad5d1caf6557afce7f6b452e77f8ed20b7/librt-0.16.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:314e703f0c19320dc8094e7a784b9cf29e1b67402515abf580069a6363c0b4f1", size = 517199, upload-time = "2026-09-29T00:44:35.115Z" }, - { url = "https://files.pythonhosted.org/packages/9e/24/276e5218b4b7adb6258a42b7403cb1b7cef25616238d0c2152288a9d2f53/librt-0.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:943c6bbecbdf7fa575a4f2952fcfd848c88ef95507c3fca411e89d4ac3ff8143", size = 558746, upload-time = "2026-09-29T00:44:36.656Z" }, - { url = "https://files.pythonhosted.org/packages/7c/5c/9156df81a1726e1efc9567379def2b8777a6d56f464d2f1b760bf951b8af/librt-0.16.0-cp310-cp310-win32.whl", hash = "sha256:7cc365f006891afb006b52d5ee5ee74c09306ffa20e2f8705a32a4450af2f3ba", size = 104424, upload-time = "2026-09-29T00:44:38.123Z" }, - { url = "https://files.pythonhosted.org/packages/0b/62/4fd172cb3f49ab2cf5ef17de519a93cfb935202c1270ba9d44c6a64178c3/librt-0.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:0314058469f4d2fd279ce7c62ac274ac82c3918ef7db62ef0697c4c359370155", size = 124267, upload-time = "2026-09-29T00:44:39.455Z" }, { url = "https://files.pythonhosted.org/packages/ba/0e/b04fd2d76b6a78a02286938251b2c119fb36ddece92c76cb4886ef7d44b8/librt-0.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fe4372c52d4849096c6cc1cda2817d293ec51440c890474ed59ef38d46556f18", size = 148058, upload-time = "2026-09-29T00:44:40.903Z" }, { url = "https://files.pythonhosted.org/packages/a3/fc/e1ed24aadb32d38603c0c07f579d739eb4d90e64e90d525b024e4a999b4d/librt-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c72c5295a84bd249526da9bdca38f2e176d15c31c13bb0063c5053f4ca023421", size = 153073, upload-time = "2026-09-29T00:44:42.165Z" }, { url = "https://files.pythonhosted.org/packages/be/38/133ab655409420e0c34a9a9836a7f4e5ae75fba758d7fe177099130d58ba/librt-0.16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be56ba9c884143495b517f23fe794ae367d58cd89ea0fdd6d437e3c024a87f9f", size = 493052, upload-time = "2026-09-29T00:44:44.043Z" }, @@ -2794,7 +2525,6 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "click" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "httpx" }, { name = "litestar-htmx" }, { name = "msgspec" }, @@ -2821,42 +2551,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f2/24/8d99982f0aa9c1cd82073c6232b54a0dbe6797c7d63c0583a6c68ee3ddf2/litestar_htmx-0.5.0-py3-none-any.whl", hash = "sha256:92833aa47e0d0e868d2a7dbfab75261f124f4b83d4f9ad12b57b9a68f86c50e6", size = 9970, upload-time = "2025-06-11T21:19:44.465Z" }, ] -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, -] - [[package]] name = "markdown-it-py" version = "4.2.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] dependencies = [ { name = "mdurl" }, ] @@ -2871,17 +2569,6 @@ version = "3.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, - { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, - { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, @@ -2955,8 +2642,7 @@ name = "mdit-py-plugins" version = "0.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "markdown-it-py" }, ] sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } wheels = [ @@ -2978,24 +2664,6 @@ version = "5.3.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/8d/3c/eb1d82a87c504259dac5ce1c7de7587b68ffac841b55d23f8ea2c9df8422/mmh3-5.3.1.tar.gz", hash = "sha256:bd86d0c86b52332319d981d03781ff77811a29db544a69902dc06b5506bb3e19", size = 33354, upload-time = "2026-09-30T17:38:09.577Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/a6/fcd38b51cd78f1195c262605f2235c3c473180421fa2383e29edde5f0b65/mmh3-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0df74f1d6e1ee35561487e6ecb1d05e37a5d424cc74a2addff7181a0b7a3460", size = 55354, upload-time = "2026-09-30T17:34:35.133Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e0/668a15dae1052062c8dac04a0b8a118876db12e0be813b7900456a0a1448/mmh3-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbe3391ba8e58f06cdc93c2bcbffaf1bd339571b95a6f7ae5784c5cf6285a138", size = 39943, upload-time = "2026-09-30T17:34:36.462Z" }, - { url = "https://files.pythonhosted.org/packages/5c/19/b4282fe32d7e6852c3f79acf2a5075de7e2ac04efdc3f071a83e033a9dea/mmh3-5.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5640fc2f14406b7015aece7fba97868ae4017dc8c66c9d010ac725d77f0b7921", size = 39583, upload-time = "2026-09-30T17:34:37.823Z" }, - { url = "https://files.pythonhosted.org/packages/63/16/e4ad2cebff9d63d3b1ae93d9f570a76a2d603b86e764c051eb7d07ff778a/mmh3-5.3.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:eb19747a88d045411121e64b9ad2f6ca1e255cd11df40725decf80ed4cd031c0", size = 95122, upload-time = "2026-09-30T17:34:39.135Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a0/4a85c58961a398f48d60d1d0b9758072d3a6af173febba1a11145c1017ff/mmh3-5.3.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e11db3320f138efc34d18b3797f6c66f41bc465c722fa27ea6952e488a82181", size = 100998, upload-time = "2026-09-30T17:34:40.376Z" }, - { url = "https://files.pythonhosted.org/packages/b9/ae/3e35c36b2e4e5049ca982ad4f524d7c2d128d3e42db017fda8e3fb068abe/mmh3-5.3.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61faab401216923fdc943ec7e68f51c50100e9e30d9662ba64d91125bb0a08ea", size = 103792, upload-time = "2026-09-30T17:34:41.854Z" }, - { url = "https://files.pythonhosted.org/packages/89/75/b4d60ba44d3a0bc612e04ec02df14e46227d1d1fcdef284a11456d6cddaf/mmh3-5.3.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:64e9a4922f78352a7730900175557d8ad51fb45f6ea3308720734c9c2978a0fb", size = 110677, upload-time = "2026-09-30T17:34:43.035Z" }, - { url = "https://files.pythonhosted.org/packages/6c/06/2863a02fd23786185893498853903289eca202fe67500d716ff57a28fbc0/mmh3-5.3.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fc205e9f78224db7239d163b9b7cac35596aa615665135b0105beb8080e9ebc5", size = 118065, upload-time = "2026-09-30T17:34:44.545Z" }, - { url = "https://files.pythonhosted.org/packages/96/45/0c69f0652de49764120b7fca80ce9411755d1a70a47967c4fcfa71de2a5d/mmh3-5.3.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:292c1770e96fa583d6a4c5b38229ab52231794f8c2aafc279eda83449f306357", size = 101518, upload-time = "2026-09-30T17:34:45.856Z" }, - { url = "https://files.pythonhosted.org/packages/1b/9b/51054cd93ebd8480328105c955d4001c07f67efd0aaa56852dbb1fec5119/mmh3-5.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12f63cecc74757adefe0c15655cd607898c068cc4f13f1d6944fe644ab6d68e5", size = 101498, upload-time = "2026-09-30T17:34:47Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2b/4d6cb28d14c41db2c3aa511b4c70863287d56fe5504a4ef71a1c8e5e6e93/mmh3-5.3.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:57e06d35e8db0a8570c21d8f6681056aa84eb3bcb2bf4b886e4adb9d9be9e325", size = 96478, upload-time = "2026-09-30T17:34:48.159Z" }, - { url = "https://files.pythonhosted.org/packages/65/0d/008beb87bf1ef7af57f79e73ee50eb9a4bb7e1ed8ae75675672555b091d8/mmh3-5.3.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4c782a60a248eb0dcf776560d3226e1cf0681eaac2a118c0168822be932f3b9a", size = 110086, upload-time = "2026-09-30T17:34:49.341Z" }, - { url = "https://files.pythonhosted.org/packages/4a/70/e45069746f6a5c5172af11639a6e080f51a2e0cd130e1c9cf48e3d4e78fe/mmh3-5.3.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:8477b3b4e9714f1acd15fdc8923f59482068a1c1ec8629867d8c500825c3d9c1", size = 99299, upload-time = "2026-09-30T17:34:50.791Z" }, - { url = "https://files.pythonhosted.org/packages/74/29/5aee09721348c42de73b624a04133b172dd344717803d6dda59e9e86d518/mmh3-5.3.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:20fac8667cd63ca88bf8b3e6fc97c5e1188872e7b51ccd936cc8a40411cad089", size = 111647, upload-time = "2026-09-30T17:34:51.957Z" }, - { url = "https://files.pythonhosted.org/packages/90/db/81b388f3bb58c69c5229e2159612de2793f4fec8ea86a207d6fea9a87dfc/mmh3-5.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c130eced1b89220777013fcd16b3a8f7d4ee6055877a5c9ef552b4694d1dce99", size = 99881, upload-time = "2026-09-30T17:34:53.451Z" }, - { url = "https://files.pythonhosted.org/packages/de/b1/5a14d6c7fea4cceb6b0f2a9f184d9284fb40897c460af97a5ec6b8a33c3d/mmh3-5.3.1-cp310-cp310-win32.whl", hash = "sha256:68508d90c3c690cc3f603bbb0162f3749c30e470fdd55caaef130153f40e475e", size = 40318, upload-time = "2026-09-30T17:34:54.88Z" }, - { url = "https://files.pythonhosted.org/packages/26/f1/7864702203a83f931568125516ea1ed68b6dec0068d00b1e97cec24e4766/mmh3-5.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:c2d626c36cb3a91dcc244e235b9963df5b1be3274aae7d08f73de9126d2205ab", size = 41705, upload-time = "2026-09-30T17:34:56.155Z" }, - { url = "https://files.pythonhosted.org/packages/a9/42/d39170dc3ee7dcf0c1b1ef2bbfed07308f2954ecee78d3b5691971f192df/mmh3-5.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:5375a10f50463bedbd858b8d876d3f56cdab3fd3fe6a0bfeb189d77e0b60ace9", size = 40089, upload-time = "2026-09-30T17:34:57.286Z" }, { url = "https://files.pythonhosted.org/packages/1d/2f/b6f34c372d68835ca89cb9d6f5c5166577472e13dae769d411496a106111/mmh3-5.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7e24c455cc6a4f30267a96c4f1fef85bfebffec5515ba6724e0ba88ac6baabaa", size = 55355, upload-time = "2026-09-30T17:34:58.391Z" }, { url = "https://files.pythonhosted.org/packages/09/52/dc370ebb3b7c056821f7093748dd23de096779cbec63f8825266c0f42aec/mmh3-5.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:86cee07b7e2767f2ea221f5a04a08e4dbd35363897231115a16365ca24641c57", size = 39950, upload-time = "2026-09-30T17:34:59.505Z" }, { url = "https://files.pythonhosted.org/packages/10/e9/f4c14e0ab768c4e2ba21cb0b212eedeb645459f3b5a353561a11f6f4a045/mmh3-5.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b07fe9ce79bf9b53b1117c0d4c03744eb4060526d82b39e64972e739467a5134", size = 39583, upload-time = "2026-09-30T17:35:00.617Z" }, @@ -3171,16 +2839,6 @@ version = "0.22.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d0/e6/6dcf9306ff3c5e486578f3bf29ed11dfbdbbc2a8bf0caf7e07d392887fda/msgspec-0.22.0.tar.gz", hash = "sha256:0a13624a4969159fe35d8c2a3d377b2b61bbd8585e327440d5e52725affcce38", size = 343188, upload-time = "2026-09-29T14:14:11.422Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/5e/78d4fa2073bb3a891753e7f915d51094e2ded5aa5e9b20402518929b373e/msgspec-0.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f3413e3647275f787b21b4dfb4836a59a1a5acf1018ab1d45843b1d7edf15c22", size = 200076, upload-time = "2026-09-29T14:12:07.599Z" }, - { url = "https://files.pythonhosted.org/packages/38/f8/59701da04584af4ccd55f42200da303ebf146cd6867186a8b9b1e127a4a2/msgspec-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:38c5b9bd347bc9abbcee40752be3c5117854e891ea7a1881a56d4b3dec58c5e7", size = 192337, upload-time = "2026-09-29T14:12:09.198Z" }, - { url = "https://files.pythonhosted.org/packages/eb/dd/bd4131da741aa349656fe32a5cca0c4266c58d7b5ad75485bed29565f7cd/msgspec-0.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57c282f474e17acf6bcf84f393c73afd45d6eba47cccff8b76b79c4fbb8a3b54", size = 222888, upload-time = "2026-09-29T14:12:10.691Z" }, - { url = "https://files.pythonhosted.org/packages/c6/46/01fe71c42b3342f00e2dd6c5a8837f5dc4d0e1596b4c74c054fb13075201/msgspec-0.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12a887c4c06e4a771a2db32c9a80c7bb21866b12458025f636dcdc2253331c28", size = 227838, upload-time = "2026-09-29T14:12:12.178Z" }, - { url = "https://files.pythonhosted.org/packages/62/8f/1a459825e0a5510de882af461459bd7f0525342b3c0bf1000e27be7aeef5/msgspec-0.22.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6c8a3f210421e29d8f7e9815f106cf59d758665b7fe5428e61152ce24fe65d7", size = 235818, upload-time = "2026-09-29T14:12:13.586Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2e/9d37b6f1190101b452f6c455e8715cc9960afad231e18cf9545af58710b9/msgspec-0.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ebd211d7af79ed8710c64e9e8d4c0d02749bc20170e7ab4e1c5801ca7c99d25b", size = 228019, upload-time = "2026-09-29T14:12:15.156Z" }, - { url = "https://files.pythonhosted.org/packages/c1/d5/33723137c96b8f244d8e6fc57a0a8d3b57b3599ce9b4a4dd58dc55a46d1c/msgspec-0.22.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:27d9ef46c80884f9c4f323e0b18bec464287e872121e70f2cbe47335780bf597", size = 236406, upload-time = "2026-09-29T14:12:16.908Z" }, - { url = "https://files.pythonhosted.org/packages/44/4a/f0e4a9ab970ce0a31f191acb772d3e1af67eeb73e1d73b70c079252aed02/msgspec-0.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ec108e96fdaa8fdbe5bb993ec97a9d1faa69b3a521eecd71a6e5acbe0e29ae69", size = 231028, upload-time = "2026-09-29T14:12:18.497Z" }, - { url = "https://files.pythonhosted.org/packages/0a/e8/3de7345a8944a5bcfc9dd861d30fcea5f20f51057bcafacbbff9164e55fc/msgspec-0.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:21c887d4de397355f6635c2a037b1c067882dac5d132a1793d63bbf7cf5ca78e", size = 190753, upload-time = "2026-09-29T14:12:20.291Z" }, - { url = "https://files.pythonhosted.org/packages/66/c9/f0d3bd2dfc3753806ab70b8d00a1613019c39148a87da797771d7f72a0a9/msgspec-0.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:4a663a8d7f6ad56ac1dbcba91e046ba8ebab7773ae72ef3dd3c47f8226919184", size = 188939, upload-time = "2026-09-29T14:12:21.645Z" }, { url = "https://files.pythonhosted.org/packages/9d/22/45c17acb1a85360b10afb95f66777f76bc2634993c66db8b7833832bd343/msgspec-0.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb1e129b81ac8fcf9ec649b081c6c8da1c7ea6f87cab336d46386abc2cd855c1", size = 198231, upload-time = "2026-09-29T14:12:23.016Z" }, { url = "https://files.pythonhosted.org/packages/34/79/1cf725694125051e866066d74e6199206838d1465cbfc35081dc29b6e366/msgspec-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dce29a04966e31abf9b83b697c6d672486526dc5d03fcd6970cb56d5dc1fbeea", size = 190911, upload-time = "2026-09-29T14:12:24.636Z" }, { url = "https://files.pythonhosted.org/packages/bc/b2/e0ace038031a2988aa2e85c431c4d7aef734fbba4749ace6bc5bf310b769/msgspec-0.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b962000e11dd34fb210a5a2c57a8a62b2d92b381c8cb3b05c075a83e38f8d645", size = 220343, upload-time = "2026-09-29T14:12:26.111Z" }, @@ -3263,12 +2921,6 @@ dependencies = [ { name = "mssql-python-odbc" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/30/4e688daafd96cde0085cbed76bc4090e037f00ef917096352a4b54b450f5/mssql_python-1.15.0-cp310-cp310-macosx_15_0_universal2.whl", hash = "sha256:1db46fc13de5cf597e2da97f699c079e2a11be1a66df1815291da6f93b494b29", size = 9926893, upload-time = "2026-09-11T15:21:36.221Z" }, - { url = "https://files.pythonhosted.org/packages/ee/43/025c0c4e4678bfedb867adfc157c92083ba564755c5f8eaaecf5f9b697a0/mssql_python-1.15.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:dc78e7d8c1adef399933869c737620290946ee6a22bf66180a2c098cd992a261", size = 5552224, upload-time = "2026-09-11T15:21:38.591Z" }, - { url = "https://files.pythonhosted.org/packages/65/3f/4d4b631c29a9750935bec21fd4757b65eb6f85ebfcf86a2876679e6392b2/mssql_python-1.15.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:71a2c97054a14d50d5173c47fb6d72d5d79c93a85e7caa2736473b7a28ab74e1", size = 5834381, upload-time = "2026-09-11T15:21:40.338Z" }, - { url = "https://files.pythonhosted.org/packages/27/e6/f403184dda4436af7f55a739aa70ccb18d67ae9d82f25edcbceab4d749bc/mssql_python-1.15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8d4d2484ef6ca76c7737eaa4423003d919aa9ef3d537a82ec242c9a2559ca0f8", size = 5472742, upload-time = "2026-09-11T15:21:42.078Z" }, - { url = "https://files.pythonhosted.org/packages/26/35/e7a03e7d9ec1d53ee4e361c8328dd0f5a7cfcaf2e2230f2352c0b7a14d15/mssql_python-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d17d9b2a1e45614dc85407d5f80e42b3273ef7ffa5402d4985032baa1cfb348e", size = 5725317, upload-time = "2026-09-11T15:21:43.951Z" }, - { url = "https://files.pythonhosted.org/packages/0c/43/027b9c3b49406b249f9caad89d953900b610302f7da04dbd1c91462410cb/mssql_python-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:0a9454c108eb8fa3fb049f5fb6f1f721a370c2f553fc8c1ba94232d02af8293a", size = 5186413, upload-time = "2026-09-11T15:21:45.737Z" }, { url = "https://files.pythonhosted.org/packages/4f/ed/38e52376a20f06dcd13c725a9706407ce72db5534f05242e463eb185e8f3/mssql_python-1.15.0-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:630b3f1c94ef051b5f12379607ceb88aa74d35a8cffedf37c03fa38d080504a6", size = 9935682, upload-time = "2026-09-11T15:21:47.657Z" }, { url = "https://files.pythonhosted.org/packages/52/15/8d34096e15d59aa14cb0137561d30d049557eefd3ba9decd793ea807e6e7/mssql_python-1.15.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2e3b80c0f54342efc6d9ce162ab761f957befe3448a17c6146f688eae48b0906", size = 6073931, upload-time = "2026-09-11T15:21:50.15Z" }, { url = "https://files.pythonhosted.org/packages/b4/f6/050628231e49c694cf7a0def9dbc928e2f55f2dd7604f65d8598098687b7/mssql_python-1.15.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:016c61a4c82a1b69a8f8a43c91dc3537463d8ca068da73fa91f7e348b48e6d22", size = 6529330, upload-time = "2026-09-11T15:21:51.995Z" }, @@ -3317,31 +2969,8 @@ wheels = [ name = "multidict" version = "6.9.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/d6/99/1d4d69c3512d0ddbfa3a1b69cfd9a151012ab2eb4eabbb096201b1f0b7d8/multidict-6.9.1.tar.gz", hash = "sha256:0f06e60fa190aa7abd0914c2a766736fdc8e9f34878c4346338534b73d1b20e2", size = 182404, upload-time = "2026-09-21T17:59:05.362Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/1c/fb2114207afc7f00ab9897ae5beeee27de5ec58ea8b9623e879f2c56f003/multidict-6.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aef74e9beabbd6c4aafc091dabff86d046ccf013ce1e4396c0fbb01b4cad9de8", size = 97307, upload-time = "2026-09-21T17:54:14.957Z" }, - { url = "https://files.pythonhosted.org/packages/b7/23/1ab8c7349adbb30c8cf41b88b0794740df8ea9f7de2e382da040a2f5bd8e/multidict-6.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1ca5ebe6d454f1e5496cf052386a559f1080bf2de75bf327ebca0a6003b79f19", size = 58830, upload-time = "2026-09-21T17:54:16.261Z" }, - { url = "https://files.pythonhosted.org/packages/e0/89/b845535014a9ad50537ca50204aaf6351c5368822a3acd9da854fb2a5a34/multidict-6.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f6d0c4b70f783305e73f9944d8efe6be1022550f0974ba0ae9d8893c0350fa", size = 57645, upload-time = "2026-09-21T17:54:17.491Z" }, - { url = "https://files.pythonhosted.org/packages/fe/4f/28ebb40a6f8e8aa7be78bcbe4bf9a1ac9518c40ef88accf2d4cd6ed7a7e0/multidict-6.9.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8050e75af7e4c6e2d5260b84eeedb618f3e452e66473432e085b5d1b81429299", size = 301535, upload-time = "2026-09-21T17:54:18.946Z" }, - { url = "https://files.pythonhosted.org/packages/33/51/0de5fc980df34d1ffed9ef68f60ce86c2d4baa3d422598a53f8730c56757/multidict-6.9.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4736d350371337825cac1793c9f7c40701c32a03912548c2a7608e51679cbb96", size = 298796, upload-time = "2026-09-21T17:54:20.52Z" }, - { url = "https://files.pythonhosted.org/packages/55/58/dd86067bdd2e961fdee8ec659fabc50f4e76403616b508714ec2686b0a49/multidict-6.9.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:02fe09dc197b8ae7e355371e51e5dce2f39060cd5a8badf94904527e23a3f188", size = 282392, upload-time = "2026-09-21T17:54:21.86Z" }, - { url = "https://files.pythonhosted.org/packages/2f/52/5464a2675579e3adb48b7cd4707a59da499660f0e22c024bc7281d2d9bdf/multidict-6.9.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ad4528cdce058b684f75fad1faf4a6a6c992fe2f08376370ca66e4ce5916a84a", size = 314538, upload-time = "2026-09-21T17:54:23.366Z" }, - { url = "https://files.pythonhosted.org/packages/d3/69/7f2b3fafe064181669157ce872a097b08a0546fb6fd2481e8c5604b47ec3/multidict-6.9.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8885e3808aedbd6725b921fb67dacaae0678933561ddd47c2b01315198c70e2e", size = 315675, upload-time = "2026-09-21T17:54:24.808Z" }, - { url = "https://files.pythonhosted.org/packages/bd/53/f65ed68b96eea2b4f6fa4f9031bdfccd8f3097c429e3d371c545d1c40ca4/multidict-6.9.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3b6e6840421c83ccb60398e333b44f910b0907bb409597685ab2eedd1e22eab", size = 303685, upload-time = "2026-09-21T17:54:26.236Z" }, - { url = "https://files.pythonhosted.org/packages/1a/5f/ade05795c6fb9adfccd61695a0f0509bc793583f589c4b1b87f27215a139/multidict-6.9.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c9648ed33dc8179e4ec04bbc73bd7f0038e1e81217a69467f61f02a78bf07e88", size = 280306, upload-time = "2026-09-21T17:54:27.685Z" }, - { url = "https://files.pythonhosted.org/packages/60/b2/c996349a61e0f43c7c95877943a67476261bf906ff993670afbd33ff5bf4/multidict-6.9.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d9d6544790ba50438a9c1a903c3c4afb1ec8a7832db5518549275b40ef0dd4b1", size = 291691, upload-time = "2026-09-21T17:54:29.004Z" }, - { url = "https://files.pythonhosted.org/packages/0e/87/8b7016d1084854729c80acfae71c5a51ea7e7c9411d66c3e2729772f5723/multidict-6.9.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1c9f3c25df6c9d3bbae4f6fd3f514b1c5c740a2110f56ccf36069c85417e289c", size = 290357, upload-time = "2026-09-21T17:54:30.491Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3d/801653b6aa9343a7430cecdefa1bf71ff24432224c02f15cc15e47837652/multidict-6.9.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cf22b43f35b7dbb9f71e8ee2041b5c00029cdfc28ede3a2f31cf8906f9a6c126", size = 305831, upload-time = "2026-09-21T17:54:32.132Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f3/9fc997861920bdbf70db82bdce5c802ec6477754c4bd78cff2898e3c63f9/multidict-6.9.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed78ccad4c7b421804f5d524b7740946a7ef75d89dc0dac52e9d7c24c472410", size = 308995, upload-time = "2026-09-21T17:54:33.571Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5f/278b5a2c99d6de27914b49158dd6f2a6481e53359142cc366dff04821a2f/multidict-6.9.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e3b1aa25f01238886a6baed9e13b9a9240ed344346c79ae280ae65e8603b21d5", size = 279240, upload-time = "2026-09-21T17:54:35.025Z" }, - { url = "https://files.pythonhosted.org/packages/3d/db/0922594c601a691eb4365a83f4f92104ef87a9728d8066fa25c99349e754/multidict-6.9.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bc94a68ea5e18f8e85dc6b522bcb53093f692c8eb62b4837ac047da73956cbe4", size = 305487, upload-time = "2026-09-21T17:54:36.555Z" }, - { url = "https://files.pythonhosted.org/packages/64/cb/07bca86d4a361a87128f3019540d7689800fdcad44e3b3ad08f1f035ed74/multidict-6.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73533644e1f69ea1164d56cc6505f564c6c44072b646b66d67df2d31fed0348c", size = 301997, upload-time = "2026-09-21T17:54:37.903Z" }, - { url = "https://files.pythonhosted.org/packages/e1/e3/99591bf626613ea35779d2460949b45e59e589dc9058d6693c923eccd4e5/multidict-6.9.1-cp310-cp310-win32.whl", hash = "sha256:66987aa68b0f7c2a1cc5f388ca962b8ed92b10f79de38d6d0d8c716154f519d9", size = 51205, upload-time = "2026-09-21T17:54:39.152Z" }, - { url = "https://files.pythonhosted.org/packages/ae/18/10c008aac77297aa618631e8726ece31668f9dc9d9c848e4b5d2e68eb3d3/multidict-6.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:a32b78c1e52ebd8e247bb68300b90b233300d8816faa008ed0713bc539fb6af0", size = 59049, upload-time = "2026-09-21T17:54:40.465Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b1/da73a58bef2613571902a824f1e11185207ba756215c99038f6d220bc167/multidict-6.9.1-cp310-cp310-win_arm64.whl", hash = "sha256:ab64ace1a68682d191d9bedd9d4c939406ad86b1d9f628180410644249ad46c2", size = 54610, upload-time = "2026-09-21T17:54:41.605Z" }, { url = "https://files.pythonhosted.org/packages/e3/24/3823efc330630a1f132bcd0a9b182ddec3c53f452f551c8e8d3aaf5a2d20/multidict-6.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:910d4260512660484c0dc1588a316fbb35a40c081c36fc51d1225351af17cfe4", size = 96739, upload-time = "2026-09-21T17:54:42.815Z" }, { url = "https://files.pythonhosted.org/packages/6a/69/36331fe1d3aeb0c525a9972d6cf82791075a395aa96f026f060009d691ae/multidict-6.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33fa55b990f81c2927e01399ace0d18926c69d69baa8cdaa819424132fb97987", size = 58514, upload-time = "2026-09-21T17:54:44.064Z" }, { url = "https://files.pythonhosted.org/packages/8c/ca/5860651f782078ef13f2761c2593f4ba066d76f626b2f30f23a7f838b775/multidict-6.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:369b5aa01b241cd3fea6890bdbb11a1425d87bf1515831500d518f4223e9d72c", size = 57303, upload-time = "2026-09-21T17:54:45.304Z" }, @@ -3512,17 +3141,10 @@ dependencies = [ { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, { name = "pathspec" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/82/6a/878cc1097d4035f82bd516658d0c528d2a9955bc7b363afcbd0b07fea11b/mypy-2.3.1.tar.gz", hash = "sha256:47c1b1207258513a9d93495f69c8be9de73916186f0e52703e8c461b7a623419", size = 3992554, upload-time = "2026-08-15T03:03:38.549Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/b9/de8f67e12d721cdcc8ba6cfc440b989a4ba4dfabe4402ae94dfdd8bb30a4/mypy-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:57a936373fc690c43a8cd7e7e12a35148e4ec5aa7698ad7fc0a9f918bdc5be41", size = 14015541, upload-time = "2026-08-15T03:01:53.104Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8a/9e746ab012c67ed8ea3232a613716c306ee8c0b5682c80d8103b4f04568e/mypy-2.3.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d00d769056bde2f4e69c175071eba45cfb44fa1ed92bdfbfe64a93e0543b0cf0", size = 14248142, upload-time = "2026-08-15T03:02:43.201Z" }, - { url = "https://files.pythonhosted.org/packages/f7/5c/c99ff2d8d0e2c53393e32dfe22d9aa43a5d959d30db46c786dafd24527d3/mypy-2.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2166b29228835e1f88ff411e96639e6ca3c7fdde84b62ec211f70f86b4051167", size = 15193309, upload-time = "2026-08-15T03:01:28.714Z" }, - { url = "https://files.pythonhosted.org/packages/64/39/124638f745243faae1ff4b37d5426fe41c0f0454535edc82fe8102b56a3c/mypy-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:83d36c2924df7426333abe7faf4724a7e1aab0d9fd41625e81b4683034b80c13", size = 15498246, upload-time = "2026-08-15T03:02:46.29Z" }, - { url = "https://files.pythonhosted.org/packages/b2/83/31c0781e243836505c0fb5f4e865487d6df1023e4ad959f4ebd4b84a0226/mypy-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:f12fdb70459d0060dea40b29e52163a961b156106d68d57882a6a9f648983a53", size = 11155028, upload-time = "2026-08-15T03:01:39.08Z" }, - { url = "https://files.pythonhosted.org/packages/a0/ab/bc2eb0129e72d7d7d93d5e981a78084a9abefda7efa732a7e02f97d6e27d/mypy-2.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:e099200a1b1b1223a4951f0a90cbff1b8c91b250ba599dab1f7217a628144d90", size = 10151438, upload-time = "2026-08-15T03:02:19.04Z" }, { url = "https://files.pythonhosted.org/packages/a4/be/c624d4241484f37dc62839e177ab607a9b8b3e96f0866544ca99e8e41d51/mypy-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94f04929f1c44c35fb0061e912087edaf504acede963a4a7d00680bd089d8531", size = 13936739, upload-time = "2026-08-15T03:03:26.475Z" }, { url = "https://files.pythonhosted.org/packages/53/84/e3cf72f90dce5960871c82551c8fba6da05fc1018f79be41c047bd126bdd/mypy-2.3.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5d716048611e85ca9eefb2e1baa5d73ede389b5820ded260ea27c757d667af8", size = 14166460, upload-time = "2026-08-15T03:01:50.565Z" }, { url = "https://files.pythonhosted.org/packages/4a/ff/6b97d58aa0f79a5ab9b472db1f6d6df1b11a51d74d0c08ab3760d3a613ba/mypy-2.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b091a455111214cb5c9d54a57b9618e9a49f9fe2a42e4e1ac86e9d104ed96ce8", size = 15100476, upload-time = "2026-08-15T03:03:12.079Z" }, @@ -3585,11 +3207,6 @@ version = "9.6.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/6f/6e/c89babc7de3df01467d159854414659c885152579903a8220c8db02a3835/mysql_connector_python-9.6.0.tar.gz", hash = "sha256:c453bb55347174d87504b534246fb10c589daf5d057515bf615627198a3c7ef1", size = 12254999, upload-time = "2026-02-10T12:04:52.63Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/27/106f5b7a69381c58cb0ba6bf44e6488969ce6cd9f69f62df340f379141ee/mysql_connector_python-9.6.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:478e035ebcf734b3a1497bfd3eb72ce3632da6384545b08cf6329471b3849b6e", size = 17582676, upload-time = "2026-01-21T09:04:35.755Z" }, - { url = "https://files.pythonhosted.org/packages/17/97/d3cbab27663d7b5063d891c6bd322db6cf1cdb42d4e0d2d2ec9a1952c67f/mysql_connector_python-9.6.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:228000bb951810dad724821d04000174ffcc7fa94b4dcef884b17a3cdae07283", size = 18449353, upload-time = "2026-01-21T09:04:38.032Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9e/0e14e30dddb8f9a5230c6dbce6f874fba2aeaab1ce971dce3912cf81773e/mysql_connector_python-9.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:477e86182aefbf693b71ff8bda7679ab4487af64c027759af831a70080aaaeac", size = 34161450, upload-time = "2026-01-21T09:04:40.763Z" }, - { url = "https://files.pythonhosted.org/packages/5d/80/1b0012fd86b5a7c0952878e33938ccd4b2862eb882e08a502b99348988d0/mysql_connector_python-9.6.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:4bf932724a2702d8b9cde4bf764b843a35e85c59479a870997d37a2a68a5632d", size = 34533941, upload-time = "2026-01-21T09:04:43.759Z" }, - { url = "https://files.pythonhosted.org/packages/7c/ed/9ff5ff9ea8421ffdf248fa71b9328fd8b9a23e1e3a2a523db5f7d58240c6/mysql_connector_python-9.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:b507372c060eb39e2a10ebcb3eb1b12e1778b0120808062fc23e3856268cd2d9", size = 16515417, upload-time = "2026-01-21T09:04:46.47Z" }, { url = "https://files.pythonhosted.org/packages/2a/08/0e9bce000736454c2b8bb4c40bded79328887483689487dad7df4cf59fb7/mysql_connector_python-9.6.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:011931f7392a1087e10d305b0303f2a20cc1af2c1c8a15cd5691609aa95dfcbd", size = 17582646, upload-time = "2026-01-21T09:04:48.327Z" }, { url = "https://files.pythonhosted.org/packages/93/aa/3dd4db039fc6a9bcbdbade83be9914ead6786c0be4918170dfaf89327b76/mysql_connector_python-9.6.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b5212372aff6833473d2560ac87d3df9fb2498d0faacb7ebf231d947175fa36a", size = 18449358, upload-time = "2026-01-21T09:04:50.278Z" }, { url = "https://files.pythonhosted.org/packages/53/38/ecd6d35382b6265ff5f030464d53b45e51ff2c2523ab88771c277fd84c05/mysql_connector_python-9.6.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61deca6e243fafbb3cf08ae27bd0c83d0f8188de8456e46aeba0d3db15bb7230", size = 34169309, upload-time = "2026-01-21T09:04:52.402Z" }, @@ -3613,51 +3230,14 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/15/dd/b3250826c29cee7816de4409a2fe5e469a68b9a89f6bfaa5eed74f05532c/mysql_connector_python-9.6.0-py2.py3-none-any.whl", hash = "sha256:44b0fb57207ebc6ae05b5b21b7968a9ed33b29187fe87b38951bad2a334d75d5", size = 480527, upload-time = "2026-02-10T12:04:36.176Z" }, ] -[[package]] -name = "myst-parser" -version = "4.0.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" } }, - { name = "jinja2" }, - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" } }, - { name = "mdit-py-plugins" }, - { name = "pyyaml" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, -] - [[package]] name = "myst-parser" version = "5.1.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] dependencies = [ - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, + { name = "docutils" }, { name = "jinja2" }, - { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" } }, + { name = "markdown-it-py" }, { name = "mdit-py-plugins" }, { name = "pyyaml" }, { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, @@ -3677,79 +3257,14 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/c8/12811c9b48fde162bb72b6f2e78fada9a247a09d7bb5be2050a5d099c77b/nodeenv-1.11.0-py2.py3-none-any.whl", hash = "sha256:edaa16e6c14d7cf395d75d4bbd5a26390f4dc06501a33b4e76282b02cc688a25", size = 34277, upload-time = "2026-09-26T11:29:19.933Z" }, ] -[[package]] -name = "numpy" -version = "2.2.6" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, - { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, - { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, - { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, - { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, - { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, - { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, - { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, - { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, - { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, -] - [[package]] name = "numpy" version = "2.4.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", + "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } wheels = [ @@ -3918,10 +3433,8 @@ name = "numpydoc" version = "1.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c4/2f/5e9bf8ed0a93587b8089242b4926dfd04d4b3b0b65f04345d219a1225f03/numpydoc-1.11.0.tar.gz", hash = "sha256:26db0adaac8087e98da05c86b11198defd962aef7c21f4dffd2703c8c6eb4187", size = 101575, upload-time = "2026-09-15T16:31:08.905Z" } wheels = [ @@ -3937,19 +3450,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/a2/27/aa7549157a4a681157e315534ba5ab8f167f77662166e792a6e836938f46/obstore-0.11.1.tar.gz", hash = "sha256:a5afe8b99e3b20cdc9133be7a1b381259acf0d470029f6b2fc79c3f9947ad436", size = 130828, upload-time = "2026-08-21T23:57:27.837Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/cc/3a1cecaa2064b13ebab89c9bb5356a1ff3a7101281c8442320cd3e5a8a9b/obstore-0.11.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a8cc4681d45196645b0567cf7259730fcb0edba751ecad8c4c3a6ccc63fabe24", size = 5396165, upload-time = "2026-08-21T23:56:08.033Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a2/146017519514f48dcb5f19684a5446e5159480c24866afab6384ccedeccc/obstore-0.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e657c600b90f465ef43d00e6dd921e676a1bec34713dad1fc09ef6715e30658", size = 4597862, upload-time = "2026-08-21T23:56:10.048Z" }, - { url = "https://files.pythonhosted.org/packages/bd/de/48e58021deacefabc53cc17cae68dce85fa9646e4112929a247d694ef63e/obstore-0.11.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614a36f19963cfefedd52f06c5370c034a6dc5b0a2be2e4602fe6ac8e52e97a6", size = 4999983, upload-time = "2026-08-21T23:56:12.047Z" }, - { url = "https://files.pythonhosted.org/packages/65/bc/107da92378c2b64d1f5d97d78a52f08ea3ace0ba32b3bf9845e5c5df4207/obstore-0.11.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:066cb4190e957b172b269affb98bee5a8f5cf6d0949b5b57ffe7f8cfaa540779", size = 5242146, upload-time = "2026-08-21T23:56:13.588Z" }, - { url = "https://files.pythonhosted.org/packages/1d/f1/316dc893fd6ea4b054d05a8d6cd03b401b6fc7bfb8a99b7621b13b6153a0/obstore-0.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdc2d273b7656d862c7295d2dab45987a2c22197d60f1cad14c8b86c5af0b452", size = 5441652, upload-time = "2026-08-21T23:56:15.01Z" }, - { url = "https://files.pythonhosted.org/packages/0b/18/353674bff52ef261251af0907fa66f35ac3fa08ad7e3a275ae6330b07b5b/obstore-0.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c71e619d9965375241566beda8358031fdce8cb136310d4f5b71faa88f278ad1", size = 5305125, upload-time = "2026-08-21T23:56:16.589Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ed/ec65b417d9add8ab8288fd36adc392ed7c3b5ecb4ec2e1a490e615258fe9/obstore-0.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32dcdae4207656ef353f949f927342e31757f926c58f014873b2d90c70276cb7", size = 5550877, upload-time = "2026-08-21T23:56:17.98Z" }, - { url = "https://files.pythonhosted.org/packages/b8/0c/24e889173e5d214d2f67b3b0e2fc33405bdfb99b2ff057ea1a31ae8451b3/obstore-0.11.1-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:446dfe0019740da25394917585b8b0c116ae79454a633ee83aeb0c973c8812d2", size = 5338482, upload-time = "2026-08-21T23:56:19.39Z" }, - { url = "https://files.pythonhosted.org/packages/06/1f/8e8b64f5c45d7f807a620e798a8b055388e2fa342ab4f73ff6f2e6d6f762/obstore-0.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1dd9d7ddc10bbf17cea0e84553a665a822878bd199380557a6df2aa1e60ce34", size = 5547022, upload-time = "2026-08-21T23:56:21.103Z" }, - { url = "https://files.pythonhosted.org/packages/2f/d7/b904f852949970619db8eda789da83ee303bf5f928b73e2c68d2232f0902/obstore-0.11.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:75a12f1d0d38fd2923e972e417797d7bf123ff7d13e2b6c5919d2e9a3c6653cc", size = 5230503, upload-time = "2026-08-21T23:56:22.723Z" }, - { url = "https://files.pythonhosted.org/packages/bb/6e/12e87af69c5db824f0f2486279d3965a2b71363cf79628ce529a3768be18/obstore-0.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ebfb22202530863aaf00ebb9352fd17cdd1066aae50986006d76b10c1e8506e9", size = 5358659, upload-time = "2026-08-21T23:56:24.117Z" }, - { url = "https://files.pythonhosted.org/packages/80/ca/b43ab2731b685c275c8ef0057923c6b0a82235934fc09f61c952586a7a75/obstore-0.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:63be447e5fdaf0c31517a66906030148697ab3b1f1611fe03e30125a56199ccc", size = 5789141, upload-time = "2026-08-21T23:56:25.642Z" }, - { url = "https://files.pythonhosted.org/packages/c3/df/db708826dd22bb438e0c40a249fb5dc7e9305321195edcde437c0b783b74/obstore-0.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eab3231ce66bc08e57b686b795d4a1333133c28b2e50c11f9986311dec69899", size = 5306959, upload-time = "2026-08-21T23:56:27.32Z" }, { url = "https://files.pythonhosted.org/packages/0d/38/438f85772bfbcd2985845a5d00d1c910e98b15f587dae6cb1e435865eba9/obstore-0.11.1-cp311-abi3-macosx_10_12_x86_64.whl", hash = "sha256:d5c50b755d781efebe4f9c70ee6d00858e44d95f0229b8b5174358f861d9bd7c", size = 5400146, upload-time = "2026-08-21T23:56:29.168Z" }, { url = "https://files.pythonhosted.org/packages/e7/62/edd2613649cb6b4400f5d125223ee094d2da1c4c93636453a5360c61b865/obstore-0.11.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:093152daa5c32b70a032f231bbc6a7eff76dda4285eed5a81d272b4485032dab", size = 4596203, upload-time = "2026-08-21T23:56:30.7Z" }, { url = "https://files.pythonhosted.org/packages/c1/52/09edd48251a26a65f786bf2def93994ffce501f3aea6724474d8de0a7f4f/obstore-0.11.1-cp311-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b97ee10456e65f166c030b5fbde8380ca508621e23b84efd77aad83afe99315a", size = 5003021, upload-time = "2026-08-21T23:56:32.085Z" }, @@ -4068,13 +3568,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/8c/f3/22113415f48b6608ada31ebb46047b3b8ac361dba393d1b5ed1f768d8f6a/oracledb-26.0.1.tar.gz", hash = "sha256:786397a6b37e94ebfa6c1c6cd026755eb8fccfd39e15bcb64cb5879491882aef", size = 910463, upload-time = "2026-09-22T21:23:20.378Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/46/64c6e1f4b456740f20d64ebf34edb73d137a4ba94f24be521672d34f8100/oracledb-26.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:73d4c8331f2608029eec074ff6e4d9a78e91253f4d47b7485199fe9a6b114b8d", size = 4856055, upload-time = "2026-09-22T21:23:25.364Z" }, - { url = "https://files.pythonhosted.org/packages/d2/dc/7e59265d2b9b0c28a2e001068a901baf59f54f766f0e86c52ab13669eb76/oracledb-26.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2abec64bddf992c9dcdb0637463317b1ced2faff054ca599dcf44719e572c27", size = 2644115, upload-time = "2026-09-22T21:23:27.039Z" }, - { url = "https://files.pythonhosted.org/packages/4d/6c/38fe83561d07508bc6be48d90d52307d1aee5af761bd9a41515c607d841d/oracledb-26.0.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bb6af067d7014bb22ea1799f111bd3f5ac7338179264b444f164b4ca9d9cb1c", size = 2843839, upload-time = "2026-09-22T21:23:28.588Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2f/c89aa7b5d339323e4f4e5b35555f0dc3187630741367d3f5d7249c9ec2a3/oracledb-26.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:90ab26b9968278881c564ddca2a255b08008b5b8daf92f91c0382732cc384077", size = 2696987, upload-time = "2026-09-22T21:23:30.214Z" }, - { url = "https://files.pythonhosted.org/packages/bd/83/5a2fee01e141c1f5efef07d4c729d1304f40837e1d47a16eb401b73728ae/oracledb-26.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d11a759bffadc6f28e2f994701a2e32c7bc2db3d0d1f212a1e4f7690814f84ed", size = 2870964, upload-time = "2026-09-22T21:23:31.875Z" }, - { url = "https://files.pythonhosted.org/packages/f0/51/5d4820896f576a6b71374755661a17316a737359c3d86c9621d219ebfd8c/oracledb-26.0.1-cp310-cp310-win32.whl", hash = "sha256:75631b2db015e96074e2927d927541e2956f3f74082634118be21c3c09517cfc", size = 1613129, upload-time = "2026-09-22T21:23:33.938Z" }, - { url = "https://files.pythonhosted.org/packages/ab/7b/a2b3ed7f9475f99f464b4fcd3818c5b9d392f28f6bd2e5454e52649ca1bc/oracledb-26.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:d22fbf5c0a87826b961b5e90f55b06d769ecaa8a38667ee8708fa46b56bfb6d6", size = 2064138, upload-time = "2026-09-22T21:23:35.341Z" }, { url = "https://files.pythonhosted.org/packages/ce/91/e63f777028a560908bc3662b1cbbaf8aba3a27dd57304655349fcbd128fe/oracledb-26.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c8635ed9f8d659421679e16d7da56a0d50078d91b40782fb9c27c85f8d6c3075", size = 4806896, upload-time = "2026-09-22T21:23:36.916Z" }, { url = "https://files.pythonhosted.org/packages/0e/59/149845af7f23cac1138f76ff1f68d0e6e03fe65e67da8084251c98bc4fa7/oracledb-26.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1872361b806678c8865e375b8a46b59e2b4923191fb49af37d1dabc9438189f", size = 2633349, upload-time = "2026-09-22T21:23:38.505Z" }, { url = "https://files.pythonhosted.org/packages/e4/58/caf7db67e8c66e0e099c30b58d257e3a60b1b33c88b331dd2802c9e356df/oracledb-26.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b6949975dcd283dd4904c79c2263bbb32843116eb07f16b266b07b069ca2593", size = 2829714, upload-time = "2026-09-22T21:23:39.971Z" }, @@ -4123,15 +3616,6 @@ version = "3.12.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0f/f3/742fb1f62b825f2c010697eaf4e828004bc2a81e7e806666989c132c7c42/orjson-3.12.0.tar.gz", hash = "sha256:d14203fb1aae2ad9b3d52f8a0e82aeb10197ef1c9bc61da7f358bd70b00123d5", size = 4142915, upload-time = "2026-08-14T16:13:30.607Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/35/819eeb4fa8ee676d38fdbb8213a76fd496f7dbbfdfafa89d34e02b22dfac/orjson-3.12.0-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:747843254519dd43b93eee3153a19e5a509334320c4d2f823ec879232db5c796", size = 224133, upload-time = "2026-08-14T16:12:00.607Z" }, - { url = "https://files.pythonhosted.org/packages/58/ab/d9221d4a2b085b073fcddc91728d490f20b9cf010c62c2f42371ab997695/orjson-3.12.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:7c2ad193c8004254f34b499f3bd2c80f043d10754aff2b38f93da574f4883f98", size = 113669, upload-time = "2026-08-14T16:12:02.126Z" }, - { url = "https://files.pythonhosted.org/packages/15/12/644cbbcabb26df61d9ef0c66e6f2bf8b687cc7b66137597f2858951f1952/orjson-3.12.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:bc7a872f03522d90e0429e6c0c5cd23084f767bedcb4c58048eec19294613344", size = 130410, upload-time = "2026-08-14T16:12:03.503Z" }, - { url = "https://files.pythonhosted.org/packages/14/6d/e3a8c34d687895aecd8b267a01c46106eb98d8424a83bfa7bacb723854f6/orjson-3.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18a87929f31d94a77f7dc93cf527e91f39ce7fe7813d588a4de2507efd32a387", size = 131101, upload-time = "2026-08-14T16:12:04.918Z" }, - { url = "https://files.pythonhosted.org/packages/75/20/930824c07685c22af23f26818ed3853b0270488a412b6ab757904b7f787b/orjson-3.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9683ee9ea0659da64f36574ef675b8a86330c34c19ea75db1fb93c3ff99e0ef", size = 131479, upload-time = "2026-08-14T16:12:06.11Z" }, - { url = "https://files.pythonhosted.org/packages/4c/a6/22e863bbbe8917aa292e33e0db597000f9a07eb5e6f52efed623fa16bae1/orjson-3.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:103b5db66aa53c1f9e88c2524be4f383e831ba7dfd5f9f5af6336a177c622f11", size = 135865, upload-time = "2026-08-14T16:12:07.392Z" }, - { url = "https://files.pythonhosted.org/packages/50/a0/ceb5008914a65e9a19a46a09d94bc67a74d120209fdfa772750023ceb377/orjson-3.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd57d79aefa3f84eec851d6de7a366795b9345cfaf17f82b4820430a7a5fa241", size = 127843, upload-time = "2026-08-14T16:12:08.607Z" }, - { url = "https://files.pythonhosted.org/packages/12/3d/61c6b3b84c250cb09cb7229701ff77e4d763773ad7f577d0b6abf2892664/orjson-3.12.0-cp310-cp310-win32.whl", hash = "sha256:3dbce9b6b3074b31a5d5dd322a9c4e5b16f206091ece4194c2e36952847a105e", size = 128293, upload-time = "2026-08-14T16:12:09.819Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/ea0f4a563253b6363195a4f704123c6bfbf156641bd3be5a75de81c5e917/orjson-3.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:3bb17a06f9bd15237b3216c044209fe92597379124018cfc196fbb846cde64df", size = 122216, upload-time = "2026-08-14T16:12:11.261Z" }, { url = "https://files.pythonhosted.org/packages/75/1a/a7075a8e8b0d3f5097d17ac3099017104b6b7b42012041147995d5b2da05/orjson-3.12.0-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a94f0f0c6fcbb2b5bd9734c57a489c7584a732bbdf04a39e8c83b861e9d03e92", size = 223409, upload-time = "2026-08-14T16:12:12.654Z" }, { url = "https://files.pythonhosted.org/packages/05/34/c2eb3b2900e5597db7841a4c6416ac2d90081bd956b02d4dd1833fa2b96b/orjson-3.12.0-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:a696529ec96a90d9a5f9570207efe403c8b08f8e4aa2783ee3403511e2fdfa10", size = 124015, upload-time = "2026-08-14T16:12:14.025Z" }, { url = "https://files.pythonhosted.org/packages/1c/df/b49081766a75b6a37b3d33bdc0a39e492abab8441dd25e3e1998e7b83fcb/orjson-3.12.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:e4ac5059baab4b3acbd99485de019ff8cda0fdf34b61fa74f7197a53db78bfe8", size = 113471, upload-time = "2026-08-14T16:12:15.81Z" }, @@ -4198,91 +3682,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, ] -[[package]] -name = "pandas" -version = "2.3.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, - { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, - { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, - { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, - { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, - { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, - { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, - { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, - { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, - { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, - { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, - { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, - { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, - { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, - { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, - { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, - { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, - { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, - { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, - { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, - { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, - { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, - { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, - { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, - { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, - { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, - { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, - { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, - { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, - { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, - { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, - { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, -] - [[package]] name = "pandas" version = "3.0.6" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] dependencies = [ { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "numpy", version = "2.5.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -4355,8 +3758,7 @@ name = "pandas-stubs" version = "2.3.3.260113" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "numpy", version = "2.5.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "types-pytz" }, ] @@ -4435,18 +3837,19 @@ wheels = [ [[package]] name = "prek" -version = "0.5.4" +version = "0.5.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/f1/8f3143530bf43fa82f8873f4e536f318b6143dd5c09171aba0d465e21f04/prek-0.5.4.tar.gz", hash = "sha256:7f5bc061880141e362ef422e52188d0090794c0622e442e3157686d1e342780a", size = 565182, upload-time = "2026-09-28T04:54:43.453Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/7b/11538b8e6cd7e269261feae62a2d08818fdcf8f43c3b1a253cec01a5488d/prek-0.5.5.tar.gz", hash = "sha256:16bf596768bb754779c7d42317e9ca16ac609c0cce7d13bae0829944ab40a26a", size = 570428, upload-time = "2026-10-05T06:08:59.165Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/a7/f3a4a252c0846c5846dd86118ee0c1fddb7381dc35e3d44c2a5f3cea1757/prek-0.5.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:550ecaae0601f9405526c866a57cc6882ed1e9d8696ac1117b8703bb37d087eb", size = 6011113, upload-time = "2026-09-28T04:54:28.107Z" }, - { url = "https://files.pythonhosted.org/packages/1b/e3/26638cf090b620e63e60a639b8e7d7eb38b9fbea74a0827a182fc922cf8e/prek-0.5.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a7ef67cc23e23c6e9c6ca0b27a7b12c19f16774d36b1c88ed035f2639995718d", size = 5534338, upload-time = "2026-09-28T04:54:30.214Z" }, - { url = "https://files.pythonhosted.org/packages/a0/08/64b668eb088204650b96183cea739b56e6b179130c4398a8a83cbe9b125a/prek-0.5.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:59f2206850f643bafe46b28b4431525f8dcc5b7a763f271179bff10b8157870d", size = 5840937, upload-time = "2026-09-28T04:54:32.226Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ee/a0f847194eb6a2b67921b4c94c4fbf3f33a785affb190c6a2097344dbdd6/prek-0.5.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d5b0cab1219a7bc9cc90785c7436f563765440616543ede7dfa3ba5c332cede", size = 6234354, upload-time = "2026-09-28T04:54:34.176Z" }, - { url = "https://files.pythonhosted.org/packages/32/9a/14186d90ed29b46650452068d6bd1ac233ca0ea41a3b35081c37f6b77b1c/prek-0.5.4-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:8fc22db8132dab9aed4e152bf6a58a7f791f4c91c74305d65d96c48b8ec0bc62", size = 5845649, upload-time = "2026-09-28T04:54:36.252Z" }, - { url = "https://files.pythonhosted.org/packages/e0/88/ff5bbbada4098f59740ab767f5c2f82d4110b90ea7db309a9bcf21f3dcb9/prek-0.5.4-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:19d4f3986dcd1dfa15f9417e32a75fb2ba084156dbd7ace161f0764281b8064b", size = 6351516, upload-time = "2026-09-28T04:54:38.539Z" }, - { url = "https://files.pythonhosted.org/packages/c8/1a/0cc410232ef42750b3bf34babd6def4a3943ec98259d9fecda3b26fcd63f/prek-0.5.4-py3-none-win_amd64.whl", hash = "sha256:3100233ba802eff6a4b09bc045c8f50d599bb9d810fa234823bc1642938b224f", size = 5755956, upload-time = "2026-09-28T04:54:40.227Z" }, - { url = "https://files.pythonhosted.org/packages/98/78/3fd53cc54468db37462885d3139eae40bb469d51beae4575c986b190ab6e/prek-0.5.4-py3-none-win_arm64.whl", hash = "sha256:9fc4ad2d647f70a8a3a9900849e1dd89472cf5a71d830f083b62cf87a0406e27", size = 5502478, upload-time = "2026-09-28T04:54:41.973Z" }, + { url = "https://files.pythonhosted.org/packages/2e/77/189e554ea92baf6c1d33733b3e9d1ed819ab7d77e57eb2e3ead0bb1d8060/prek-0.5.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:50fbceb0f728b504023f6e6c9037ac0656436949d94f7a85bac5542e6c1a4a75", size = 6038669, upload-time = "2026-10-05T06:08:39.368Z" }, + { url = "https://files.pythonhosted.org/packages/63/ea/fc857c6b3f1e3fdb4d81bdca2051076de82e986cb1455a01b351ac7a5cd1/prek-0.5.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2f610927b95e84b28173a4c810892a7b5d5bb55bee792ddf97178fa97654633e", size = 5548955, upload-time = "2026-10-05T06:08:41.428Z" }, + { url = "https://files.pythonhosted.org/packages/47/c3/2bab54f6393fb9f247225681d476086e24fa6242f329e9ca1e5bd638ec50/prek-0.5.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:120ef7d4b6bb58155e74827743c266e48501efb0e4c37ff726b14fe6e86a126b", size = 5848228, upload-time = "2026-10-05T06:08:44.051Z" }, + { url = "https://files.pythonhosted.org/packages/aa/f9/1279e1c83819de5904db1a09f4afc589932a2e62c7063713b1fe3a54ee46/prek-0.5.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2f6c453a12c21757b23bbbc97415aef78527841ad3f9e61f52cb35cf012f93e5", size = 6371296, upload-time = "2026-10-05T06:08:46.278Z" }, + { url = "https://files.pythonhosted.org/packages/93/fc/e566be5919eaffef4cc22488f16e4bbfd08961734bd67c06f85d405e4cbc/prek-0.5.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73d509c0d9556171de2502bada4962be7a25871e7b23e782549074e1416dc850", size = 6269922, upload-time = "2026-10-05T06:08:48.645Z" }, + { url = "https://files.pythonhosted.org/packages/d2/39/a48d8e6203055bff7bb734b1f2f9aede4a4539bee6ab4c9273dbc01fa546/prek-0.5.5-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:76c867fdbd4e4f19e6b6b2988bd1e1407d1324170ebcf1428e4e34f8f0751a99", size = 5861518, upload-time = "2026-10-05T06:08:50.808Z" }, + { url = "https://files.pythonhosted.org/packages/b7/03/690fba9543033e25ea2e7b2ae1cca1ae8d8c2e32295f0d66f4b50934b8c7/prek-0.5.5-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:c69f60c2b3b4d481e38d0eab3b97ac05ec05d7648ae690925ae95ca9d22c7643", size = 6383685, upload-time = "2026-10-05T06:08:52.868Z" }, + { url = "https://files.pythonhosted.org/packages/8c/04/1e9ccf3a61a3bfd4107b83973f7afde9177b6ff8f2d5d4b00125e77c2100/prek-0.5.5-py3-none-win_amd64.whl", hash = "sha256:15bff9039349466ea9bf6b0c173b822ff08f8ae4cfbfdea782492e519c06d874", size = 5784759, upload-time = "2026-10-05T06:08:55.056Z" }, + { url = "https://files.pythonhosted.org/packages/41/d9/bb6811e438d3c74d26cb5d72e6343606e0a7a6283fee87521189f4ba1191/prek-0.5.5-py3-none-win_arm64.whl", hash = "sha256:3db3191d2509830c75438e20956a47c2259867d18a4106064ed75088b968a0c6", size = 5517355, upload-time = "2026-10-05T06:08:57.193Z" }, ] [[package]] @@ -4476,23 +3879,6 @@ version = "0.5.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b3/9a/9fbf4e4ec0c2d7f1c32519fff782ef467859b8faa9fbc5331a96f6395d43/propcache-0.5.4.tar.gz", hash = "sha256:ff6b113f50bc066a698db5d944d2c6dc7507168dd3341e255a8892fd0715a558", size = 61545, upload-time = "2026-09-16T00:17:14.386Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/dd/997704118aea215cc5f65c277f5323657b4ba44c1f9a32fb11c8064e4997/propcache-0.5.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b77c313314524ca9c38fbd70f73515d04597ac58c40c939bc0e71eeb4abff680", size = 87225, upload-time = "2026-09-16T00:13:43.864Z" }, - { url = "https://files.pythonhosted.org/packages/3e/6d/ceeca1762ed51230c08d557591404f844ecef5e294550136155572f7faae/propcache-0.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8f911c395cef73c510bac566da9507bb6a43e7763d0c79138dc60ee53f11207e", size = 50809, upload-time = "2026-09-16T00:13:45.33Z" }, - { url = "https://files.pythonhosted.org/packages/ff/9a/6be90814d8762952594a9e380161802541bff690f3a2e011dcc28ec193ce/propcache-0.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d83b12902eb8bce151259c86c03ba746600b2d994543de46e370cecf96c452f2", size = 52552, upload-time = "2026-09-16T00:13:46.48Z" }, - { url = "https://files.pythonhosted.org/packages/bf/d1/7fd3ffb5ca0e669a8fbf55d9fbb17c50ff5f44becfefcab27a9b9b67908f/propcache-0.5.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9281e922c072158c91974d4589f1dbe0fee6d467f284c28e463f9f5a4d933f4", size = 226804, upload-time = "2026-09-16T00:13:47.739Z" }, - { url = "https://files.pythonhosted.org/packages/74/87/a3e199c45b26587f073db655d19c30d2144b0f883827ba6ab77acf5c7d45/propcache-0.5.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9f3551b8a35c1df3e7ea4d2d86edee15f0dde1bddd434a71744048683544d0ef", size = 234452, upload-time = "2026-09-16T00:13:48.98Z" }, - { url = "https://files.pythonhosted.org/packages/12/7c/08c15c7df256f94a6b4563f74165c3242fb554cdd1909b661d093c31b976/propcache-0.5.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ec6a85f424afa8d23e0d9a094e5dbb6eda01da91c92b9183cd433768247ffc97", size = 240399, upload-time = "2026-09-16T00:13:50.416Z" }, - { url = "https://files.pythonhosted.org/packages/f0/51/5adee15e12a7e314cece4543fbf295b0fe1b504dc78b32dff4c8eb1e29b0/propcache-0.5.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f574e460d1c8a08384a016fdb09ccf3543433263ed6b2f97104f979e64ea57c2", size = 224251, upload-time = "2026-09-16T00:13:51.874Z" }, - { url = "https://files.pythonhosted.org/packages/9d/53/54bd510bb5d473edf66914602885226187218b4e3a5017e9dd80bceea41f/propcache-0.5.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d8e017eeb7482bed34cdb0d61cf2bcfc88d104bbab296a17cd16a6af8aabc70e", size = 202721, upload-time = "2026-09-16T00:13:53.524Z" }, - { url = "https://files.pythonhosted.org/packages/6f/b4/a468700d0526dfb2ca6af5d790125de5894acc7d8ecd99243ecedfa4c4cc/propcache-0.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f273dcf7149a50527c4fd1f55cfe9eac0f60753f5af544b4c9352578e20c0874", size = 219148, upload-time = "2026-09-16T00:13:55.068Z" }, - { url = "https://files.pythonhosted.org/packages/6b/d4/bf563e19ac9a5cc47113431337fdf2ee3573859f3f3e0a58e59833e9b75d/propcache-0.5.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:fc2461ecc45f17893f8207e73b46ea8ba93e33630e51cf4af3fbc21d47462b1a", size = 211011, upload-time = "2026-09-16T00:13:56.588Z" }, - { url = "https://files.pythonhosted.org/packages/4b/3d/0189b6537f4a8cd795e685a130a6f47aeda78a5b7b062574705cffc685ca/propcache-0.5.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:279655a16973f1ee2bd2fe79973137681642fd9ae0d89215bba263726eb0dc3a", size = 228148, upload-time = "2026-09-16T00:13:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/ce/b7/59c16e245a549df202b4ebe2de91fa58a67dc4373df9840e372a64224dee/propcache-0.5.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e9f165403b81fea7e89c932d89046a1e3d9a3a60e8d7ef2f249dccdcb0982bf5", size = 201432, upload-time = "2026-09-16T00:13:59.453Z" }, - { url = "https://files.pythonhosted.org/packages/41/0b/7b19eb20bb0b1f9476d08f6e387ae094dc6870fc06d459ea1f35f28b25d3/propcache-0.5.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1783582065a1f07f9d9ee1e992e13f15d7dc8fb1eb3a7476d43eb3f2e69d26bb", size = 228923, upload-time = "2026-09-16T00:14:00.731Z" }, - { url = "https://files.pythonhosted.org/packages/3a/f9/b1a0bd47218216b935d019912d6fec1676ae7c07f15fa82bfb54b8d58976/propcache-0.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d605bb239b796e82a81c6709548b2bd460ab73b4590cb0c83de8a2dd9694d0f", size = 218327, upload-time = "2026-09-16T00:14:02.091Z" }, - { url = "https://files.pythonhosted.org/packages/55/c0/51e5d1ad504e9529831606534c48e272db751072eee9ff07e4abe37e50bd/propcache-0.5.4-cp310-cp310-win32.whl", hash = "sha256:141fdbd73748db0cf7636035030aaac383d2efde8f34e7bc24594cc776d225b8", size = 43096, upload-time = "2026-09-16T00:14:03.427Z" }, - { url = "https://files.pythonhosted.org/packages/80/57/0a0b4b1122f4ed5bcd1c626d910003cdf5282c2a12f8a1cfa17970b3ded2/propcache-0.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:146f48a9e4812611a7581003b1a39de56c34967046310c4171a68ef908c9a745", size = 46589, upload-time = "2026-09-16T00:14:04.581Z" }, - { url = "https://files.pythonhosted.org/packages/66/87/e71b24adc8ece61782ba3d6f3879e6a07fdb85bce21a9c529524184e3ec6/propcache-0.5.4-cp310-cp310-win_arm64.whl", hash = "sha256:6c7599df2b57ebeea8de011b5f2f7b85de95e76037d43d34b95e328430275487", size = 43982, upload-time = "2026-09-16T00:14:05.728Z" }, { url = "https://files.pythonhosted.org/packages/1e/40/14b21e505b7921617466576423f188a5c9caddfdaa1cf4b2b8a83d8fe216/propcache-0.5.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:897d1ddf6716e8f47200f7aad9a0efa6cc7586df66c6defa572f9eab379c078e", size = 86393, upload-time = "2026-09-16T00:14:06.9Z" }, { url = "https://files.pythonhosted.org/packages/e7/4b/5a52e1a7b43563f7d408814194bb23cc8bf214eb6b86639b667a33a8d0d0/propcache-0.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9cbfff4423eef4cc6cafc021469641a2b835f610b2647a6c5281903e21b8670d", size = 50431, upload-time = "2026-09-16T00:14:08.025Z" }, { url = "https://files.pythonhosted.org/packages/05/cf/b5248180bf056cc76acc60c9c6e8c0ebbfdbd1c6cffd31fd14996927b7c8/propcache-0.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fc24f209c1b7f7f688b66b98293954f5504279760999b58920ee12dd8471c1d", size = 52116, upload-time = "2026-09-16T00:14:09.114Z" }, @@ -4648,18 +4034,6 @@ version = "0.12.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/6b/e8/7a55ccd9f0ae0343b40394cd2dca45c3e8cb8308c0f89bc19367458cbc2f/psqlpy-0.12.1.tar.gz", hash = "sha256:d702874ef5498671ea1528f8fb4ae299f87983c0f88ea9592f0a40df6263ef66", size = 306171, upload-time = "2026-06-28T18:43:10.601Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/e2/02c96959e630c5135b1b59d21cc0cfc65a6b288c88fc10eef4175a68ba97/psqlpy-0.12.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ab3aa5975502a7596874f6282c1afa6e6e4b9e9784c2018823d5c5d05b5df024", size = 4426838, upload-time = "2026-06-28T18:41:01.338Z" }, - { url = "https://files.pythonhosted.org/packages/3d/6a/a605f9d09f430dea17aa4a46163b7bc9dbe3d823486dc8ab829ace26d2f2/psqlpy-0.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0295f38327e9b06c017f14ded3f8b69827d73ba1de155c70f526ed1800ede619", size = 4644985, upload-time = "2026-06-28T18:41:03.211Z" }, - { url = "https://files.pythonhosted.org/packages/28/5c/f511aad98a3f4573b9cb66b05269caf520081bc5dfd593023dd28b9f6417/psqlpy-0.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79d349778bd6ac614d5e4ec5150b0abb3d54ebce35edde7097e9295f67e5970a", size = 5167533, upload-time = "2026-06-28T18:41:04.96Z" }, - { url = "https://files.pythonhosted.org/packages/dd/1d/3802c1303675e2498caa1446163a4cf8c9fd3e3c626086b87b61396dd327/psqlpy-0.12.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9c4bd6a08f92afc9c9b31ef8e93570a5ad6a5871d95b2c199a53f37c0308a62", size = 4437426, upload-time = "2026-06-28T18:41:06.839Z" }, - { url = "https://files.pythonhosted.org/packages/16/2a/50b0c1574c390d8ed729e4edb5e70d718a6af724dae2098d0d0f5c69542b/psqlpy-0.12.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04b30aa735ec8f1fb35d8203f5cfaab1871ebe989cbc815a60878c173c440742", size = 5074396, upload-time = "2026-06-28T18:41:08.617Z" }, - { url = "https://files.pythonhosted.org/packages/a3/a7/5cf32454073d2774ac0901fa4ec0ec977db85428ebb4a93847b2f6a5a018/psqlpy-0.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30422812e5de77fd80362cd6a55c5e620dd71df89e5d90dadb8fe98793f61264", size = 5091560, upload-time = "2026-06-28T18:41:10.211Z" }, - { url = "https://files.pythonhosted.org/packages/fa/5d/f8448b9ee0a5ce8498191f54e41fa49ad7f6a9f03e66d0d7ad30e278af5f/psqlpy-0.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4c4e76cfc7643c9ea5a02930827a9e74da8bce11d5d08b3f87f6438a24e8b46", size = 4770859, upload-time = "2026-06-28T18:41:11.992Z" }, - { url = "https://files.pythonhosted.org/packages/74/b3/358c2f49db6f89ceefc0462c7a6004cf30dae5c1e4771c87782251fb2ecf/psqlpy-0.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e1a9d2f59a14a479e08bfd1c166e27d0f05fecf5d65550cb01c1b36e46bb76", size = 4941929, upload-time = "2026-06-28T18:41:13.497Z" }, - { url = "https://files.pythonhosted.org/packages/00/0b/feca31531d82d1c8a7caed45afcd74e504c973061099544cfc83aff92b38/psqlpy-0.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e7714d560477e6677959ca0bf7d93bfce22b279f0d8663775ba05b99f2204c6e", size = 5137323, upload-time = "2026-06-28T18:41:14.977Z" }, - { url = "https://files.pythonhosted.org/packages/a5/2c/5572fa1fea8b852ab17de774f0dfe1850162a74a456992e119c7e2f8d4f7/psqlpy-0.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2d24d30dac8710ccb1416af660ad3da7328094af281e58c457a797d9ff09f865", size = 5244595, upload-time = "2026-06-28T18:41:16.46Z" }, - { url = "https://files.pythonhosted.org/packages/85/63/01d6442ab9cfb97d07380309d48e1f844a60479e28dc957e3b83ccfcc5df/psqlpy-0.12.1-cp310-cp310-win32.whl", hash = "sha256:77cde1400396c0a33fb59af7bda1df219e9a8684758561e2a33f53e5a3c9d924", size = 3641507, upload-time = "2026-06-28T18:41:17.95Z" }, - { url = "https://files.pythonhosted.org/packages/da/46/bf7f783141efe4a195afae33d070a110f69b3b192bd9e6a49161ed0730aa/psqlpy-0.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:4da20b1ef1c40f936b3d564e219f7391463a6de87d2aa650f01f24a5b638c817", size = 4287934, upload-time = "2026-06-28T18:41:19.596Z" }, { url = "https://files.pythonhosted.org/packages/e8/e6/9b46aa639882cd601da05fee55a23ff0f010b1d0572a604058f6a97abeb7/psqlpy-0.12.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4dee6660a4227b4a8ddb94c427e97e99d47dc564c649827151c8708f2bc77f7b", size = 4425370, upload-time = "2026-06-28T18:41:21.303Z" }, { url = "https://files.pythonhosted.org/packages/7d/ba/829bbced20c91f55122207dba5618ecc302a08fbd3de17fa4c485ff18121/psqlpy-0.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:500ae80c01c3c3f646f5f9a959f1aa9817b6643c81ec2d4a3164928655cd9863", size = 4645861, upload-time = "2026-06-28T18:41:22.708Z" }, { url = "https://files.pythonhosted.org/packages/46/12/081913871867c342c9adacd5847d93c12226d3acd8f7974ba1dcf1973eb4/psqlpy-0.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e1cdd3ef44757ef32f225a4aaa52db3daf25df1c84ef560f43ca0ae7d060054", size = 5168221, upload-time = "2026-06-28T18:41:24.458Z" }, @@ -4708,16 +4082,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/dd/afb4580af80fde43502400f50bb64f6d9390a25b38d3812b173f3d274ad8/psqlpy-0.12.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:733251b378908aa6c5738079c3f053c0fcaaf542412abb312cd3b7cdda696e1d", size = 5247075, upload-time = "2026-06-28T18:42:34.378Z" }, { url = "https://files.pythonhosted.org/packages/57/94/51ce28393efcde16d6881acd01c4bd3ab57c99258243244581fbe62d1890/psqlpy-0.12.1-cp314-cp314-win32.whl", hash = "sha256:31a5d8bb8fa1a13b7da6edbc183754cc68fc47cb931bd9b96b9edecb77d98522", size = 3637418, upload-time = "2026-06-28T18:42:35.813Z" }, { url = "https://files.pythonhosted.org/packages/51/3a/3116e5d4b1c7cd5fb4825263e0764c431c4e73f0e3e1002aa288c5de6596/psqlpy-0.12.1-cp314-cp314-win_amd64.whl", hash = "sha256:f7337f373a1d41d1cbc5a53f32232afd5b66135c191357dcc1d6cf4cf7d0c17c", size = 4300529, upload-time = "2026-06-28T18:42:37.3Z" }, - { url = "https://files.pythonhosted.org/packages/26/44/f51ec4c450c470cd36fd637fc85adcded77b2a88781d3dd20489acac4e6c/psqlpy-0.12.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7ea3ac9ce92078137d571740dd935a5ef7520d00dd8669750c3da3e020ba84b3", size = 4419212, upload-time = "2026-06-28T18:42:39.208Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ce/f66d0ac91a2e17bcba61e18edc89fed59f5333f95b494a799882615eda08/psqlpy-0.12.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:0b3a318922674ab36e38378828de603f87360404d160912946363c2c4a5157b5", size = 4647437, upload-time = "2026-06-28T18:42:40.79Z" }, - { url = "https://files.pythonhosted.org/packages/5b/66/fcfbf42a1115c5bf5ddd6a868d12cc2b50c12201996baf3d7ff87c53d4be/psqlpy-0.12.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4228e9f4a0a36dc58d7728e44b835e9a376fc339e227758546d31de9f872e9c", size = 5161527, upload-time = "2026-06-28T18:42:42.352Z" }, - { url = "https://files.pythonhosted.org/packages/34/70/027e544fa348032112a09b4e75cfd5a836b2936c46f47cc2be2a3e97a7c3/psqlpy-0.12.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7925ffdb717fccb806883490fb134c5ef14ffdf7d05b5d9daef63ed3230ea056", size = 4433056, upload-time = "2026-06-28T18:42:43.77Z" }, - { url = "https://files.pythonhosted.org/packages/1b/4a/468214456e7a3d11f46945129a628e2da75afceb00128466341bf3f99362/psqlpy-0.12.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1f63af6205c489a6b19cf0d93b810852b265920cf2a919151f9acc64469a76", size = 5077093, upload-time = "2026-06-28T18:42:45.46Z" }, - { url = "https://files.pythonhosted.org/packages/88/7a/0269ef3bb609ddfe37bde0de5cfda556b5120043ba816fc92136646cd241/psqlpy-0.12.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1adf04bc13086e1d2ee96bb4ce0eab1121c02ff3e3a98c9d5a581834a0008b84", size = 5093081, upload-time = "2026-06-28T18:42:46.918Z" }, - { url = "https://files.pythonhosted.org/packages/78/f1/2c69c933daa112ba0654e234ac5dd32d21509ce283262e378449a6af7995/psqlpy-0.12.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a6a10509d56f489cfda5852de5cfb36878497886a8c978ef68034eec560599", size = 4776795, upload-time = "2026-06-28T18:42:48.293Z" }, - { url = "https://files.pythonhosted.org/packages/1c/87/667cc20b6a82bb75fd55ef759ce3d7bec23edbd4bb4babfd5d29a7e1dcf5/psqlpy-0.12.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6dea4a70ba98940e803d8d2d1fa83cf1694549b3a9f2e7378506a37da3f3eb", size = 4936554, upload-time = "2026-06-28T18:42:50.113Z" }, - { url = "https://files.pythonhosted.org/packages/10/db/8ae30cf4b096c4362c615d312924a3e22f0f08bdb45af89ca0ffd3ba01d6/psqlpy-0.12.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d5d811b158848b84935722fa3f43fc77aeb6cedb8481c53bc7fd0f4158c3ce5f", size = 5140165, upload-time = "2026-06-28T18:42:51.763Z" }, - { url = "https://files.pythonhosted.org/packages/22/09/7a6858e3fc84517ac3ae66d32bf5dfa23ef9cb73ed5210f6c886f69be103/psqlpy-0.12.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5e9234ce2a749feb407ac5cf862db4d0e6e67a4f442053be3afb76567e8d4e21", size = 5243563, upload-time = "2026-06-28T18:42:53.415Z" }, { url = "https://files.pythonhosted.org/packages/59/89/2d9e57c6fcc4e0b252232068789ace003a64c7dd373c227deb42d945942c/psqlpy-0.12.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a98a3fe1486a1fa570afc4ef2311232ee0c97107a621d845e525d3836d4472d", size = 4419025, upload-time = "2026-06-28T18:42:54.829Z" }, { url = "https://files.pythonhosted.org/packages/9e/25/ba379d09662d2ad6d4c7ec9ca7c9079f8283b3f8361749d95e35771da04b/psqlpy-0.12.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0937bddd455d2b9673218e4a6635d07f92acad651d34111564732a447abfb2b4", size = 4648682, upload-time = "2026-06-28T18:42:56.439Z" }, { url = "https://files.pythonhosted.org/packages/e4/44/080191f8c5ccb4cf9a915e6bb13ca5e0ccb2148fe7aede516eea2a51f120/psqlpy-0.12.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2f90453d54685b7dac3a4a41a5270df1a0894fde8dec98c7e066221e49e213e", size = 5162613, upload-time = "2026-06-28T18:42:57.819Z" }, @@ -4784,17 +4148,6 @@ name = "psycopg-binary" version = "3.3.6" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/92/00350a66de0af05e41d01aa3134e3970045e816afed3f99d58ec1abe15b2/psycopg_binary-3.3.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7beb3e41c9a1e509f3ed85263386588cbe3e975aa67be21f79f44fd35ffaeefc", size = 4728682, upload-time = "2026-09-18T13:15:36.605Z" }, - { url = "https://files.pythonhosted.org/packages/91/fc/afa9c7fd316a469af7ede6ebb020eac482f5d827fae57d5310c9bc0c41ae/psycopg_binary-3.3.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa73160077345ec21b3f51e8e24b3de2e99586217e497629326eb9b2ea88c52e", size = 4777111, upload-time = "2026-09-18T13:15:46.566Z" }, - { url = "https://files.pythonhosted.org/packages/f2/44/7c1e015f1bc56b36ff1369f09e852b2d83ccefd5a669a42633a916cdedc4/psycopg_binary-3.3.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f87dbdc42e78ee0f7ea180c03f8c78e80a949e373066629bd90fefff10552dff", size = 5592755, upload-time = "2026-09-18T13:15:52.886Z" }, - { url = "https://files.pythonhosted.org/packages/3b/ae/314a251ca918cdac380bce1b87839ade9355382ea749e6ef3ba75ba0c09f/psycopg_binary-3.3.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a9348c5b43a3bb5ef8c2e89d5237c9c87eeafb01d338c84a7aebbc5cd0313299", size = 5267949, upload-time = "2026-09-18T13:16:00.53Z" }, - { url = "https://files.pythonhosted.org/packages/b6/9f/3bb0cfe9bb0f31ca57cf486ddc8c9ac51251aed8181bf88ff870b2623105/psycopg_binary-3.3.6-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a52991594ac4db888c7d39bccef331797e30cb31a95cae02cf2607f83a42dc2", size = 6862403, upload-time = "2026-09-18T13:16:10.385Z" }, - { url = "https://files.pythonhosted.org/packages/c4/d6/7032c10309c3155e9b24300fdcc9a1afa539cfd20ce52fdef74a46f10161/psycopg_binary-3.3.6-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ea8beeb5541780b4b50b462eeacbc4f594ce3b911dc20c81c75f267876f71d2", size = 5107271, upload-time = "2026-09-18T13:16:16.843Z" }, - { url = "https://files.pythonhosted.org/packages/61/cc/79add2cf92684cf1a81da134b32caa662c25c72d0cc905d181ef4455f834/psycopg_binary-3.3.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:198a48e68cc99ccac03ba95ac857e73aa66f3bf6be77019fafb0832a05f7ad03", size = 4627984, upload-time = "2026-09-18T13:16:23.889Z" }, - { url = "https://files.pythonhosted.org/packages/c9/48/6dfb14f9350c14af6a2edb3c31262051b8cd94e2186e4b831e46dbbe8cd9/psycopg_binary-3.3.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fa34eb47969297471db7b7f193622c7e3ee839ec05abd05f1fe104d5b1b1dcf4", size = 4322054, upload-time = "2026-09-18T13:16:29.33Z" }, - { url = "https://files.pythonhosted.org/packages/29/35/2982338716a91cbb4dfc866be015be4457ee8106a445aabf3d1fb6a270e0/psycopg_binary-3.3.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:b979a42815410432420275412633960807178b1ce26591a16ce06e78a5bd4bb2", size = 4048471, upload-time = "2026-09-18T13:16:34.119Z" }, - { url = "https://files.pythonhosted.org/packages/24/e1/171b1db1542c5f76a678b7ee0a7800bebc9735a0a03417c76cf948bfd63c/psycopg_binary-3.3.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:889e42acec10450185e0cdfb396f375e2c1a8d7737c114830a7fde4654f59e30", size = 4353931, upload-time = "2026-09-18T13:16:38.692Z" }, - { url = "https://files.pythonhosted.org/packages/08/89/4424e62a944eef40bd9326ada4ae23802b28eab6502af91e84ef7bba74fb/psycopg_binary-3.3.6-cp310-cp310-win_amd64.whl", hash = "sha256:cbd5f73073ed19c378d4c35499db1e3e703a5b1a324e521204065967bfaa7a18", size = 3674362, upload-time = "2026-09-18T13:16:44.454Z" }, { url = "https://files.pythonhosted.org/packages/70/86/b71166048974d49c6d136b2ed1c0e5bec0b974d8c4de5cbce7e86a9e412a/psycopg_binary-3.3.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:be4f9b3c9338ac5dd217c5847e21521b396c8117f78dc420d495a5c49bbef874", size = 4728002, upload-time = "2026-09-18T13:16:53.393Z" }, { url = "https://files.pythonhosted.org/packages/12/1d/1e06c0de7ed5aed898acb87544eac6ef0bc7d752a67ec6e5d6b835e9b40c/psycopg_binary-3.3.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f0535693ce476a722b718b002d5d2c27d47e71ca945276ac194409c98e74c492", size = 4775403, upload-time = "2026-09-18T13:16:58.939Z" }, { url = "https://files.pythonhosted.org/packages/84/02/2ffcbc43f8e4bbc38e5286a22013bcac01898d13cd38325f60dd5428a8af/psycopg_binary-3.3.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3c9e663b2e800e3218994cf948c11bcc2844e6491b34aa80d089baf6531827bf", size = 5594145, upload-time = "2026-09-18T13:17:08.515Z" }, @@ -4870,13 +4223,6 @@ version = "25.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3d/e3/27f57f80141379d60defe6703eb50a707325706f07fedfd1312c7a751995/pyarrow-25.0.1.tar.gz", hash = "sha256:9150a83248bfed9813ea3c3af74c3856c1984d444aa28e58bf7733b9750ddf6a", size = 1201653, upload-time = "2026-08-10T12:40:53.904Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/3e/5cd70becb51e1d044c54ba5e627424a6e87df5b98008cbd22cc6abd409ca/pyarrow-25.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0b1edbb2f385a6a65e9711b62ba86ac54a7816a3f8d17bb3e8a5929d65fb2485", size = 35954271, upload-time = "2026-08-10T12:36:33.857Z" }, - { url = "https://files.pythonhosted.org/packages/64/be/17599e086df264ea7dc221d1101e3131e181e00da428a2f9bd0358f0d06b/pyarrow-25.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:a4dd8bf99a8fac133efc0ed6a92f5fddbe2adba0d0f6dd720e39ba9855cea85c", size = 37647543, upload-time = "2026-08-10T12:36:39.486Z" }, - { url = "https://files.pythonhosted.org/packages/42/34/e138b451fd3970a6eda4599f68ae3b2b32b661bc958de3239d54a0bf6575/pyarrow-25.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bddd0c4f7630c2a3ddf6347c1bdaa79d97bcf6bd445f9e60c816b7d77c85a5ae", size = 46837120, upload-time = "2026-08-10T12:36:46.58Z" }, - { url = "https://files.pythonhosted.org/packages/57/5c/f8fc0eb2de03464a557d5a4d0c15e972d73362414696618833b771f7eddd/pyarrow-25.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a4d6d5e9a3d1879a97c08ded0c797579b7965eafd0f0c26c30b45ccc06db939b", size = 50066460, upload-time = "2026-08-10T12:36:53.702Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d1/0dd64fd06de0333b808a02f60981635f067b71aad3a30698a9a104fae778/pyarrow-25.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:514ddb60285631af068875550c90eddc181db3e8e63a032b1559be189e82f056", size = 49937892, upload-time = "2026-08-10T12:37:00.349Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3c/f89d1bd76d5f3284c2a44d7d7ebbd8204535e5ae2b41f4077069b4ff2ec6/pyarrow-25.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cab40b1edfef0262e0e5251aa2c58d75630f24d06dd7794480243acc001a1d7d", size = 53107240, upload-time = "2026-08-10T12:37:07.205Z" }, - { url = "https://files.pythonhosted.org/packages/67/67/b554a8e09f3f3decccf405eb8fbe86696321cbcb5b62d18b4a5057a4c113/pyarrow-25.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:60e89d8f13861a1f7f8d950fa54aebb8023b30734d0ac51ffa80beabe2df4bba", size = 27848683, upload-time = "2026-08-10T12:37:12.058Z" }, { url = "https://files.pythonhosted.org/packages/ee/8b/0d23b47702fcfe8b3618d5292035099675c5a1c48258932350c08020f7b5/pyarrow-25.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:51093dd9e10325fbdb3c10a2ae7c4806e5c822d94e74ae4938b26524a3323fee", size = 35946180, upload-time = "2026-08-10T12:37:18.934Z" }, { url = "https://files.pythonhosted.org/packages/d8/17/707d17a5476c55a9541fde0db8213ac30979a792864d72415f176ba50c45/pyarrow-25.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:eb6203482ff3746a5632303a7279ae0b5a304c46985b49ed1378cb350ea6728d", size = 37644787, upload-time = "2026-08-10T12:37:25.795Z" }, { url = "https://files.pythonhosted.org/packages/c1/b2/cdc98ecf1a6408280bc3a6a07054cdd99a3f4670acc0545d383ce113e87d/pyarrow-25.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:880523be3d29efcf83d3998835d206118ccf35e3871dbd2fb60408cf6b007a80", size = 46834633, upload-time = "2026-08-10T12:37:33.604Z" }, @@ -4980,20 +4326,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/af/f9/8a06bea35ef8daf588f707784c973a7046e0034c8d8cfb08828eeffb8b75/pydantic_core-2.46.5.tar.gz", hash = "sha256:10416c15b8839ecc4ef4d0885da76da6fd0f67333a0eb8aff6d93c4b8f2910fc", size = 472262, upload-time = "2026-08-28T10:01:31.677Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/6b/8f79692844269427abb3e4dd9e68edfcbe65ae25527d99183214de716c59/pydantic_core-2.46.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:657b40d6240c0a7b6a64b30f22d1e3aa631c7e846c621b0c0f6d1d75e2e15ea6", size = 2076533, upload-time = "2026-08-28T09:57:35.421Z" }, - { url = "https://files.pythonhosted.org/packages/bd/d0/c787604c71c2bdcda1a5656942fc822cd0f9cd879b9484bb84fc42172703/pydantic_core-2.46.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ecb42011e12ee19cafbc312887cbf3546959fe02fbad44f272d4be5baa997615", size = 1924650, upload-time = "2026-08-28T09:57:37.944Z" }, - { url = "https://files.pythonhosted.org/packages/4a/77/ca2f8e997d9bfdb32205297aff38f210f398822d895b1af1b59fd9df9c13/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dedce55295becb61921e386b99d4f2706045306e7fa52249a33004c837379fb", size = 1951261, upload-time = "2026-08-28T09:57:39.339Z" }, - { url = "https://files.pythonhosted.org/packages/a0/53/bd12e1a9255df4edee00353778e2614b5346265d51e1567ab72153e803a2/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f47b8a949e60f027f0aa0a6f6c7b7e9c55cbf4380d10b344e282fa4e7ab1e1b", size = 2021808, upload-time = "2026-08-28T09:57:40.69Z" }, - { url = "https://files.pythonhosted.org/packages/d7/41/f7f312751ebc6d6767da91964a9c7954c18e226a1720ab234e3dfb9d6c17/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:200aa3dc9f8d54f0754f43247c0bad0999fdcfbfd2488384dd44f37279271fe6", size = 2196184, upload-time = "2026-08-28T09:57:42.275Z" }, - { url = "https://files.pythonhosted.org/packages/3d/93/ce93aa030ab6bac4683ba8861e7baad89dd24b02e66b8801a0e4f6a00311/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d30e1a4f138b8951063e9a394752a9179b51da288ffa507b1e659222f4c1793", size = 2238212, upload-time = "2026-08-28T09:57:44.122Z" }, - { url = "https://files.pythonhosted.org/packages/34/a1/c8e6b66f499f510752c07a092dfe27621f9c255635e59d38704b5681c35a/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:850a08d167dde16db8702c274f320c7be9d7da6f6dff2b58b18f9e815bd94f5b", size = 2064073, upload-time = "2026-08-28T09:57:45.613Z" }, - { url = "https://files.pythonhosted.org/packages/5c/fa/605e2b127ee30dbf4b1da9da4843587cf2b2d16486c241cc7a5be2d2c1bd/pydantic_core-2.46.5-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:c3471e5c4a949c26ec00a77f01df59096aa9495877de76fd60a980f8ee6be461", size = 2093102, upload-time = "2026-08-28T09:57:46.953Z" }, - { url = "https://files.pythonhosted.org/packages/4a/f7/1ab28093c09032ddce7c92c7a55d503b6ecd70f42c32492946c1cb5477b1/pydantic_core-2.46.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a3e26b6a8274211bddee2d0e4d0d42778f17a34510f49d2ec44b58abfc41736", size = 2133452, upload-time = "2026-08-28T09:57:48.362Z" }, - { url = "https://files.pythonhosted.org/packages/30/c8/47c79b756f12f85e8b0fbdb2b495f6b6eb32e6c98a4beae7a570a0b7c63c/pydantic_core-2.46.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc5d783bd4a2387e97b8a2d5ec781cfb92b3d893bf82370548e99db5915935d3", size = 2146477, upload-time = "2026-08-28T09:57:49.74Z" }, - { url = "https://files.pythonhosted.org/packages/13/5c/79fc00cb8f651d6061991de8d7cedf1c78c73cbd4862c42ef418f03b8bfa/pydantic_core-2.46.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:356c8368cbc321050b169595683a2e1d63413b1e0e2868b330af9fc14c616d3f", size = 2300832, upload-time = "2026-08-28T09:57:51.639Z" }, - { url = "https://files.pythonhosted.org/packages/b4/72/dd1a29853cf6d22a1ebd9e3baf0239cbc57d2d16caff36a89e38eb9b1db3/pydantic_core-2.46.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb7d8d0e5886a89a55d2eef490e272fa965a9d57c6b29a5b5088a7997ec2cad1", size = 2320505, upload-time = "2026-08-28T09:57:53.236Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d1/ba4a8e06a9ddad0b4caf69cfaeecc0fbfcec20473bd808f5127fd16491c4/pydantic_core-2.46.5-cp310-cp310-win32.whl", hash = "sha256:4d44cf99ddebf875f9b68cc267aa684c99b7b44fe63ee1cac4ec163807290069", size = 1956853, upload-time = "2026-08-28T09:57:54.592Z" }, - { url = "https://files.pythonhosted.org/packages/f2/94/205ed9d7ddaf44acd489889708ea124a3f41bdb42c141c8684d528ad0e7a/pydantic_core-2.46.5-cp310-cp310-win_amd64.whl", hash = "sha256:1e5aad1220a1192c42341c8fd4a8686657e73ab2a920c970bdc4de334fe3193d", size = 2042551, upload-time = "2026-08-28T09:57:56.017Z" }, { url = "https://files.pythonhosted.org/packages/a2/b6/81d2d19ea0be2c03664381b59f65fa72fc7969decedae00bc2c4ad835708/pydantic_core-2.46.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a1dee1b804ff4d11c663636cf15d2ea47e9f79cd56c033fb1cbf08924842a48f", size = 2074737, upload-time = "2026-08-28T09:57:57.711Z" }, { url = "https://files.pythonhosted.org/packages/0c/18/b70da8300e292df4099684ea11b1958043580d2f50d2dc8bf7e542bdd84a/pydantic_core-2.46.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d625a186a65201c23a9e3b8ed9c47e90a026e03256608cc91851c6709096844f", size = 1921751, upload-time = "2026-08-28T09:57:59.265Z" }, { url = "https://files.pythonhosted.org/packages/e7/1a/0d590341b6ffa4b4aca83508e6b8db4761aaeacfc15a25ca3815876d4797/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8507560a9284e1370bb048ed4282012fbef4e8d109875b95e884d228552061", size = 1948231, upload-time = "2026-08-28T09:58:00.678Z" }, @@ -5139,9 +4471,6 @@ wheels = [ name = "pyjwt" version = "2.15.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/43/ea/5194e52748b0da83d71e082d75496eaec6e58f419f5e184786ded517e6a9/pyjwt-2.15.1.tar.gz", hash = "sha256:4f259e80cdfb6b3fc18a7de51fd1ef9ec79652f25019bae68975ca2468a34df8", size = 121252, upload-time = "2026-09-28T18:40:42.598Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/50/ca/44de4e75f8aadc457f0634be3b542815078ded46dca30efb960edeecad6e/pyjwt-2.15.1-py3-none-any.whl", hash = "sha256:42d59d631f7768a1028a64c7ff581a9bf7519804daf91fc5b6c56e30eec5e193", size = 33860, upload-time = "2026-09-28T18:40:41.429Z" }, @@ -5158,13 +4487,6 @@ version = "2.4.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/19/ae/44c335d6d380dc75da6fb47c15cb90ba2faa3016237817f7ec193ebc8824/pymssql-2.4.2.tar.gz", hash = "sha256:f0f7e2fffc25de6ec7f56551c91afa7981644ffc9c4d2d9c2a19ef4890797b67", size = 209508, upload-time = "2026-09-27T01:32:54.965Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/09/b2310e761154e1c59bca89815136b93bc3bf844ab9b6ec7d39daf71053b4/pymssql-2.4.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:593028018016ac3544e8a022abaf894148ad60843ec9b247f80d95d9662b5105", size = 3209599, upload-time = "2026-09-27T01:31:21.395Z" }, - { url = "https://files.pythonhosted.org/packages/e9/82/f4142bfe3f2923b9af720eaa47ce61fd29f68fb8fe810691c7994e0b46a4/pymssql-2.4.2-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:d2b8b57c5b74a10904971cd30910f0ffcde7dd4eb96663cfbe8edcf80332cfc5", size = 3014095, upload-time = "2026-09-27T01:31:22.997Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ee/87cf5d28c13b8e2711eeb322b09456dfd62316c14e8e44b9935e4f9a32a0/pymssql-2.4.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33461bece3b64420a371b5b061c8849f9519cda2d9aa1353ea5469fa410ee332", size = 3077012, upload-time = "2026-09-27T01:31:24.236Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c9/2f5c439b71d045fcf37905bbe463320211c8258e5e9503814e5feaeee2c8/pymssql-2.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9d1205a1046b413dc50a4253ab623fad2cdf74b50d55fc0b9af3aa8f262f030", size = 3258371, upload-time = "2026-09-27T01:31:25.443Z" }, - { url = "https://files.pythonhosted.org/packages/24/55/4629ca1187f69936d640dcbf049b230f5e90a1e2cd25eca8e38ed383f74d/pymssql-2.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:14bef8a505ea452f7e01aef06acc811cc641dc3f6ff14aaa9e7a4ca7b5a420b0", size = 3726139, upload-time = "2026-09-27T01:31:27.087Z" }, - { url = "https://files.pythonhosted.org/packages/28/f5/f65ef8aca27facad609e3dab8745a020b6f03a4381c3824ebde0d8a2860d/pymssql-2.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d842bc3b9079b9ec55a477161926240c74b208d1cbeada8d9472e0a8078946bf", size = 3468488, upload-time = "2026-09-27T01:31:28.722Z" }, - { url = "https://files.pythonhosted.org/packages/a0/6c/e22392a25ea30bdb7a6275093bcf7f394170c162cd38611eda162313bae6/pymssql-2.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:0cf996d159b1650fc903a01538e832f25e748bd64d8fdbfe32d19dc1061190ba", size = 2350394, upload-time = "2026-09-27T01:31:30.258Z" }, { url = "https://files.pythonhosted.org/packages/ac/ec/8cfb9dc051e2698ca683099e56c3792d236b253032c919bfc2868d73c4e0/pymssql-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:17d802a8b4a56eac1f004bf6bdf24be5fa9d99bc7f2d53812da95df265082c64", size = 3208069, upload-time = "2026-09-27T01:31:31.738Z" }, { url = "https://files.pythonhosted.org/packages/67/0a/f76a2844ffa8b54ec3bb00453ccc92965e47ccaf72e0e31f9ec99037ada3/pymssql-2.4.2-cp311-cp311-macosx_15_0_x86_64.whl", hash = "sha256:19dda2f9581c862e135e1597abd5bd5f435c576dd3cf7b7be68f25b799aaab2f", size = 3012266, upload-time = "2026-09-27T01:31:33.135Z" }, { url = "https://files.pythonhosted.org/packages/bf/33/d8e69edadef56686b38457a6d4c26bce4615d925bc7b176dd9c3c03485e8/pymssql-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4fa9da3cc867003785b9a5ccb8d14180ae09b4f1462ffa00d36503b18b1a07d4", size = 3068155, upload-time = "2026-09-27T01:31:34.386Z" }, @@ -5244,12 +4566,10 @@ version = "9.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } wheels = [ @@ -5392,9 +4712,6 @@ name = "pywin32" version = "312" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/1b/9cfdeac80ee45bebbbcb31f1b7b99a0d81a1c72de48d837be984e0e88b1d/pywin32-312-cp310-cp310-win32.whl", hash = "sha256:772235332b5d1024c696f11cea1ae4be7930f0a8b894bb43db14e3f435f1ff7e", size = 6361387, upload-time = "2026-06-04T07:49:14.329Z" }, - { url = "https://files.pythonhosted.org/packages/33/b1/7afc96d041d982c27bc2df6f853d43f01fd273e3d39d04be3647ddeb533d/pywin32-312-cp310-cp310-win_amd64.whl", hash = "sha256:5dbc35d2b5320dc07f25fa31269cfb767471002b17de5eb067d03da68c7cb2db", size = 6926780, upload-time = "2026-06-04T07:49:16.881Z" }, - { url = "https://files.pythonhosted.org/packages/ce/3a/4140da9ad54108e517f4a16b2d83da3033e08662144623e1239587cb7db6/pywin32-312-cp310-cp310-win_arm64.whl", hash = "sha256:3020656e34f1cf7faeb7bccd2b84653a607c6ff0c55ada85e6487d61716deabd", size = 4307203, upload-time = "2026-06-04T07:49:18.993Z" }, { url = "https://files.pythonhosted.org/packages/1f/f5/10a6e845a00fc5e7afd0a988b744f403d4d57162a28d160a093c4d9322f0/pywin32-312-cp311-cp311-win32.whl", hash = "sha256:17948aeadbdb091f0ced6ef0841620794e68327b94ee415571c1203594b7215c", size = 6362659, upload-time = "2026-06-04T07:49:21.349Z" }, { url = "https://files.pythonhosted.org/packages/35/c4/dcd2d62b5944b6d5db53413a5899016ccd57ffcb7278f3f81655d25d2027/pywin32-312-cp311-cp311-win_amd64.whl", hash = "sha256:d11417d84412f859b722fad0841b3614459ed0047f7542d8362e77884f6b6e8a", size = 6928825, upload-time = "2026-06-04T07:49:23.934Z" }, { url = "https://files.pythonhosted.org/packages/b7/56/3cbb433fe4501cdba2eb9040f56a4e1a8243faa4186b25295564d1a7a79d/pywin32-312-cp311-cp311-win_arm64.whl", hash = "sha256:b2200a054ca6d6625c4842fc56a4976a4b47f96b73dbe5538c3f813a80359f47", size = 6721875, upload-time = "2026-06-04T07:49:26.416Z" }, @@ -5418,15 +4735,6 @@ version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, @@ -5494,8 +4802,7 @@ version = "0.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, - { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } @@ -5523,8 +4830,7 @@ name = "rich" version = "15.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "markdown-it-py" }, { name = "pygments" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } @@ -5540,7 +4846,6 @@ dependencies = [ { name = "click" }, { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "rich" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/3e/5688fdd83aea416de336582a274f2bc8236b5c261b04c11e17bc262786ad/rich_click-1.9.9.tar.gz", hash = "sha256:324cba7513cd4187ee92b2eef21f071714e45be062458c8b157bd7e0c81103e3", size = 75866, upload-time = "2026-09-05T19:20:14.799Z" } wheels = [ @@ -5556,152 +4861,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, ] -[[package]] -name = "rpds-py" -version = "0.30.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, - { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, - { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, - { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, - { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, - { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, - { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, - { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, - { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, - { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, - { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, - { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, - { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, - { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, - { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, - { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, - { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, - { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, - { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, - { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, - { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, - { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, - { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, - { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, - { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, - { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, - { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, - { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, - { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, - { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, - { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, - { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, - { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, - { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, - { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, - { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, - { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, - { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, - { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, - { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, - { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, - { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, - { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, - { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, - { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, - { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, - { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, - { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, - { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, - { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, - { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, - { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, - { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, - { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, - { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, - { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, - { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, - { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, - { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, - { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, - { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, - { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, - { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, - { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, - { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, - { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, - { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, - { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, - { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, - { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, - { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, - { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, - { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, - { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, - { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, - { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, - { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, - { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, - { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, - { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, - { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, - { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, - { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, - { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, - { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, - { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, - { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, -] - [[package]] name = "rpds-py" version = "2026.6.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/94/1f/a2dca5ffdbf1d475ffc4e80e4d5d720ff3a00f691795910116960ee12511/rpds_py-2026.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7b689145a1485c335569bd056464f3243a29af7ed3871c7be31ad624ba239bc7", size = 342174, upload-time = "2026-06-30T07:14:54.821Z" }, @@ -5918,8 +5081,7 @@ version = "2026.7.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments-styles" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ba/d2/8017988e02791162b286576116fedd200ed33e8d8af3579ab3587df3d3d0/shibuya-2026.7.12.tar.gz", hash = "sha256:9496606f5b95595511ad86b773d74b4b8d694a4dcc2f848e6ec34e2ad71d9060", size = 86545, upload-time = "2026-07-11T15:41:16.342Z" } @@ -5940,9 +5102,6 @@ wheels = [ name = "slotscheck" version = "0.21.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "tomli", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/33/34/811f9588dbd55e3adee986e53cd1bcdfabc6c5b6919b9cf1ff208f2878cd/slotscheck-0.21.0.tar.gz", hash = "sha256:0a5296300c5d5d9663e597861d7b3ef16abc74c851498a648116d868960c12c2", size = 15354, upload-time = "2026-09-06T19:08:07.131Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e1/51/778abe936884e73944d43267bed0eae1da0658b11c7d6eb7e10ce83a646b/slotscheck-0.21.0-py3-none-any.whl", hash = "sha256:c109206db56ee48b3862feccd8c44ca480bb4d102ec39f6cc0f8a9695ef17eb0", size = 18076, upload-time = "2026-09-06T19:08:05.937Z" }, @@ -5966,51 +5125,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4c/07/2ebca9b11fb9be7340a818d8d6f63feaebb146be2c4afbd6061701d6df6e/snowballstemmer-3.1.1-py3-none-any.whl", hash = "sha256:7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752", size = 104164, upload-time = "2026-06-03T00:56:38.614Z" }, ] -[[package]] -name = "sphinx" -version = "8.1.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" } }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, - { name = "tomli" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload-time = "2024-10-13T20:27:10.448Z" }, -] - [[package]] name = "sphinx" version = "9.0.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", + "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "alabaster" }, { name = "babel" }, { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, + { name = "docutils" }, { name = "imagesize" }, { name = "jinja2" }, { name = "packaging" }, @@ -6052,7 +5180,7 @@ dependencies = [ { name = "alabaster" }, { name = "babel" }, { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, + { name = "docutils" }, { name = "imagesize" }, { name = "jinja2" }, { name = "packaging" }, @@ -6072,47 +5200,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, ] -[[package]] -name = "sphinx-autobuild" -version = "2024.10.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "colorama" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, - { name = "starlette" }, - { name = "uvicorn" }, - { name = "watchfiles" }, - { name = "websockets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023, upload-time = "2024-10-02T23:15:30.172Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/c0/eba125db38c84d3c74717008fd3cb5000b68cd7e2cbafd1349c6a38c3d3b/sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa", size = 11908, upload-time = "2024-10-02T23:15:28.739Z" }, -] - [[package]] name = "sphinx-autobuild" version = "2025.8.25" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] dependencies = [ { name = "colorama" }, { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, @@ -6127,29 +5218,14 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/20/56411b52f917696995f5ad27d2ea7e9492c84a043c5b49a3a3173573cd93/sphinx_autobuild-2025.8.25-py3-none-any.whl", hash = "sha256:b750ac7d5a18603e4665294323fd20f6dcc0a984117026d1986704fa68f0379a", size = 12535, upload-time = "2025-08-25T18:44:54.164Z" }, ] -[[package]] -name = "sphinx-autodoc-typehints" -version = "3.0.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, -] -sdist = { url = "https://files.pythonhosted.org/packages/26/f0/43c6a5ff3e7b08a8c3b32f81b859f1b518ccc31e45f22e2b41ced38be7b9/sphinx_autodoc_typehints-3.0.1.tar.gz", hash = "sha256:b9b40dd15dee54f6f810c924f863f9cf1c54f9f3265c495140ea01be7f44fa55", size = 36282, upload-time = "2025-01-16T18:25:30.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/dc/dc46c5c7c566b7ec5e8f860f9c89533bf03c0e6aadc96fb9b337867e4460/sphinx_autodoc_typehints-3.0.1-py3-none-any.whl", hash = "sha256:4b64b676a14b5b79cefb6628a6dc8070e320d4963e8ff640a2f3e9390ae9045a", size = 20245, upload-time = "2025-01-16T18:25:27.394Z" }, -] - [[package]] name = "sphinx-autodoc-typehints" version = "3.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", + "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" } }, @@ -6191,10 +5267,8 @@ version = "6.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, - { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "docutils" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9a/ed/a9767cd1b8b7fbdf260a89d5c8c86e20e3536b9878579e5ab7965a291e55/sphinx_click-6.2.0.tar.gz", hash = "sha256:fc78b4154a4e5159462e36de55b8643747da6cda86b3b52a8bb62289e603776c", size = 27035, upload-time = "2025-12-04T19:33:05.437Z" } @@ -6207,8 +5281,7 @@ name = "sphinx-copybutton" version = "0.5.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" } @@ -6216,42 +5289,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload-time = "2023-04-14T08:10:20.844Z" }, ] -[[package]] -name = "sphinx-design" -version = "0.6.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689, upload-time = "2024-08-02T13:48:44.277Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338, upload-time = "2024-08-02T13:48:42.106Z" }, -] - [[package]] name = "sphinx-design" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] dependencies = [ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -6266,8 +5307,7 @@ name = "sphinx-iconify" version = "0.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/68/4e/498964c2a6025e489b255015d3b5644aa93eb1dd1035324de18179af8abc/sphinx_iconify-0.3.0.tar.gz", hash = "sha256:7824ca694472d6babbe811e72cdcaf52b6e0ff4240e8cfda721f84f867605611", size = 3701, upload-time = "2025-12-18T05:19:03.683Z" } @@ -6280,10 +5320,8 @@ name = "sphinx-paramlinks" version = "0.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "docutils" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ae/21/62d3a58ff7bd02bbb9245a63d1f0d2e0455522a11a78951d16088569fca8/sphinx-paramlinks-0.6.0.tar.gz", hash = "sha256:746a0816860aa3fff5d8d746efcbec4deead421f152687411db1d613d29f915e", size = 12363, upload-time = "2023-08-11T16:09:28.604Z" } @@ -6320,8 +5358,7 @@ name = "sphinxcontrib-jquery" version = "4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/de/f3/aa67467e051df70a6330fe7770894b3e4f09436dea6881ae0b4f3d87cad8/sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", size = 122331, upload-time = "2023-03-14T15:01:01.944Z" } @@ -6345,8 +5382,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "pyyaml" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8c/87/06537dff20aa57df2d0f2afa87edff4afa85dec6f57f03f7acc24f83ff88/sphinxcontrib_mermaid-2.1.1.tar.gz", hash = "sha256:f8d7f1b2f0ad69b7ebdd5cbf532fb4ee107893b5373bc2d0e9634089c0b2cfee", size = 22353, upload-time = "2026-09-01T16:10:23.671Z" } @@ -6376,22 +5412,12 @@ wheels = [ name = "sqlalchemy" version = "2.0.54" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] dependencies = [ { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/29/9c/271aa905cf2964f841371a97f3e63ab692bf51b4423d0491e67bc7f64037/sqlalchemy-2.0.54.tar.gz", hash = "sha256:baa8521e8ee9f24e75dfc7aaabc08020e551ef0d48d7c3e3536f5cddf277586b", size = 9969559, upload-time = "2026-09-15T21:06:57.337Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/2f/7a427d7e10bc5f285d41fa1cadf46031ffc6c84f35a9d6e19737587a4eb0/sqlalchemy-2.0.54-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:24ae093dec196ba37fc2beb0316de53e7871d3d246a50faecbbb53034e41ded2", size = 2189267, upload-time = "2026-09-15T22:11:14.024Z" }, - { url = "https://files.pythonhosted.org/packages/84/1f/80122de187c0f80cb47addce97609160004a8605010afdd815e608fcf003/sqlalchemy-2.0.54-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8cc6532f930c27974e9239e5ce5abebe7600ba9807cea4fcf42f1b6cab18fe7", size = 3358362, upload-time = "2026-09-15T22:33:36.534Z" }, - { url = "https://files.pythonhosted.org/packages/c8/93/9d26b109f5472017bf6e7a1b9dac12ac5f6165ba37a297834d0690c42cf3/sqlalchemy-2.0.54-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e7a76d5dce712ce50435d0f97181eb955ec27d138c004176f01282e063bac52", size = 3357692, upload-time = "2026-09-15T22:33:14.781Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d4/63e800b45bd4fa59cb4b14c013130e0aa92c7a019a0b8bf68115643bf32b/sqlalchemy-2.0.54-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f5c09090b1a7c4d389d1431f820931e8df318f82caafc53f9a72c872fef467c5", size = 3308258, upload-time = "2026-09-15T22:33:38.469Z" }, - { url = "https://files.pythonhosted.org/packages/f4/fe/6c96fe018b9db15476b46619228dc0749cdd9b4dc8baab89aca59205b605/sqlalchemy-2.0.54-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:762cfe4d340c56368256d936a98b620a9a5650e49c1c84eba51d6edd17ffefb2", size = 3336734, upload-time = "2026-09-15T22:33:16.533Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f1/8d225d6b77863ae83ba51e913fe5954bcf58b49dd54229f0b5ba0bc983f0/sqlalchemy-2.0.54-cp310-cp310-win32.whl", hash = "sha256:6b6d4e601c4f6d85e99bb3416107cc9418c5603ca73d4ee0f5f8d79c2a1ed9e8", size = 2144294, upload-time = "2026-09-15T22:41:20.424Z" }, - { url = "https://files.pythonhosted.org/packages/f5/f6/4247fdd087bf1b39be90930bb2b276a1c55041540628c8736512b4242669/sqlalchemy-2.0.54-cp310-cp310-win_amd64.whl", hash = "sha256:03cbf8d9a67da618bd65500a5eb3ddac89caf4c61e99b2f03fa4a1952a0725a9", size = 2170318, upload-time = "2026-09-15T22:41:21.973Z" }, { url = "https://files.pythonhosted.org/packages/76/bf/7339b18ef05c03335a32f077e450c8040eab0c952c2964e32cd889eafc22/sqlalchemy-2.0.54-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d03084f3352dd92048cb19c71d90f116d076c9c7937e0ebc7752c4685de6d38", size = 2187776, upload-time = "2026-09-15T22:32:35.535Z" }, { url = "https://files.pythonhosted.org/packages/9b/bb/3b6f5f3f51582d63af4c88b1e70da7888e936dee6b86a237b7633fb3f216/sqlalchemy-2.0.54-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92622fbbda1b1fe1632f3402a6e516a93c0e41d9158839c6b3dfb12117f26b72", size = 3428952, upload-time = "2026-09-15T22:40:14.441Z" }, { url = "https://files.pythonhosted.org/packages/77/d5/ffd6b59795ebec81d582ad866f71ec7c73d356768e0442c6a07bba61c40c/sqlalchemy-2.0.54-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5800ddea045c2c860ef1d359a07a3066c7c0c426f45e3abc3874e116cb3c6937", size = 3428566, upload-time = "2026-09-15T22:35:33.739Z" }, @@ -6435,110 +5461,6 @@ asyncio = [ { name = "greenlet" }, ] -[[package]] -name = "sqlalchemy" -version = "2.1.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", - "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", - "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'emscripten'", - "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/cb/7c68da82239ffae9378eca076afe14c310e17a4f01e3d315112f266e26c7/sqlalchemy-2.1.1.tar.gz", hash = "sha256:fcf3cbb33bb23bad75d2150157c21804618745731e9931ab27e61879a9f6123b", size = 10503203, upload-time = "2026-09-25T14:59:00.117Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/49/5046a3fc309a3c1953bb163d37d417914ce17e4768f64e76376a4ccdc908/sqlalchemy-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5516bdaacf5521b7de69a5c76961fde2cdc4edcb39730eccff16246a44cb8715", size = 2455148, upload-time = "2026-09-25T15:17:03.244Z" }, - { url = "https://files.pythonhosted.org/packages/7a/7d/b3aaed3af03e8f36953c8d0eeec76c3b16fbec17dcfba4966d602ad7f22e/sqlalchemy-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f083b4b6a6d0061b0f9ffec0ea9ded82700a6bd11ced32ccb42f855f7806f812", size = 4612428, upload-time = "2026-09-25T15:25:43.007Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7d/a1df6a02d5765cbf564bc115f6116857e7d84eff5e053b4198fea1a02661/sqlalchemy-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:758d52653c8902baac25269c5b7c6fca4a198e066f2212fd2ed1b98174fd7bbb", size = 4633286, upload-time = "2026-09-25T15:25:49.88Z" }, - { url = "https://files.pythonhosted.org/packages/d6/3e/04d3f468bc8e8eaedd300fd72936ae857428f9ecddc8ff598b0645718490/sqlalchemy-2.1.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6a7ff6a02a102e0575d237172e90adc96466e6ab6511eae7fd43775e6ab19db2", size = 4363892, upload-time = "2026-09-25T15:31:39.47Z" }, - { url = "https://files.pythonhosted.org/packages/fb/56/6c34b184f9e29d124603d70fb072bb386be019bb37ba1c182d9f1e47d07f/sqlalchemy-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b91e020ba33c0cb9842be6eb7de32dfebd9ad1e8f9a660a0fdb567fd0aeaed1", size = 4551082, upload-time = "2026-09-25T15:25:44.916Z" }, - { url = "https://files.pythonhosted.org/packages/d6/8b/a94db16b6f62e6d9793355ea4b0fe649b8c56adc24802345159b8610a0e0/sqlalchemy-2.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:73743f135b489d3551eeb3cbbb3756d6cc41bb68e033d2b7b2b620b11c6c9d12", size = 4361249, upload-time = "2026-09-25T15:31:41.444Z" }, - { url = "https://files.pythonhosted.org/packages/4d/24/80c7de16f0248faeb4193fea62ec346f4b56df2ad2e906c82dbea7e73c69/sqlalchemy-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0593ed87886c44e94dfac4b22d20ed88b19a7dacd7440177d7156f9b011e4376", size = 4603313, upload-time = "2026-09-25T15:25:53.288Z" }, - { url = "https://files.pythonhosted.org/packages/b7/57/18d9916461ff24deb02c564cb26740ddb536b21da72164670995cefe11fa/sqlalchemy-2.1.1-cp311-cp311-win32.whl", hash = "sha256:c19633f7614e1af93192f89debfa5bfbfaed93c80dd8903417d1605d019958dc", size = 2372093, upload-time = "2026-09-25T15:36:01.461Z" }, - { url = "https://files.pythonhosted.org/packages/4a/a1/d91a5a3b2637a9ed1b99ba0ed35384404f5cf470dc638e9bab096bae512e/sqlalchemy-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:9dcedb4b1ad160a1297772162f9a15fc317627b76ac7c98d12c41ce38522d8ef", size = 2422083, upload-time = "2026-09-25T15:36:03.268Z" }, - { url = "https://files.pythonhosted.org/packages/42/18/1240d7c33784b6737bb47bfec63da246b174db4878c1cf2bc3b7897e945a/sqlalchemy-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:e08c92feb447b60e352c3581cc8a03119e36917b79362af62fd1a289c4d8e27b", size = 2387119, upload-time = "2026-09-25T15:11:43.595Z" }, - { url = "https://files.pythonhosted.org/packages/c8/44/950ac8e093784fdd5fd4fc385d110e0cf1d1d2bae781dc7be659bf3e7af3/sqlalchemy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1abf1acecd4d0fc34d4ab7e9cda9e849ce95b647e1a5f76db7d2a5a0bea4e1e5", size = 2458475, upload-time = "2026-09-25T15:17:05.018Z" }, - { url = "https://files.pythonhosted.org/packages/20/13/ade5c1da6221e865a57ee45132a3c61528bb244d7b22ddbbddd589989754/sqlalchemy-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61333b2f806f64a08a1edf0b0e4271905f73c1f7e525c23da7a491f74c109835", size = 4653012, upload-time = "2026-09-25T15:25:47.467Z" }, - { url = "https://files.pythonhosted.org/packages/b2/95/37b6846549a76c69beca71974905446130d78bddd88a4414b5b88c88af16/sqlalchemy-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fad3dc37851b096ef72538b18152a5c1ae9c8b2013cd89f51eca83fc6eba36b", size = 4701803, upload-time = "2026-09-25T15:25:55.644Z" }, - { url = "https://files.pythonhosted.org/packages/57/88/abdc1ce5daa0af77c5d27183625ab7bb1155de41067fd77db4fb1cdc9616/sqlalchemy-2.1.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a3126c1203cdfc0f00884f9e8dbe95307b813f883ee9d9691983a563ebc96f8", size = 4351745, upload-time = "2026-09-25T15:31:43.337Z" }, - { url = "https://files.pythonhosted.org/packages/7b/28/4375244fc658c95033593429bc6dfc61df96beb9b64c8bf57821fdebf85d/sqlalchemy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f90e517b2eb9c4c40fcc978c8c242789fa6cb0064c501fd8c1515145ed5fe23d", size = 4576898, upload-time = "2026-09-25T15:25:49.478Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ce/0aa3c294150a7a018e61af42462cf299022ad71b4b94384be36fff6ec567/sqlalchemy-2.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:054a2c2b6cbe3ca7cb88aba9c5e2ecdbfc43656bea22326a41d09e5398c86ec4", size = 4346156, upload-time = "2026-09-25T15:31:45.624Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/cf00fdbcdd8f1933aa4b33d499218a8d470ec9fd935a2f33ec55dcef4fdc/sqlalchemy-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ea049f3e2702967414bc79f58a484dab191359267726607e6c1579a09ef93788", size = 4650545, upload-time = "2026-09-25T15:25:57.819Z" }, - { url = "https://files.pythonhosted.org/packages/48/9b/8b4a17884e2b286d5f89e3b93bc2be928c6d86d7bfeadf9ae4459d64c244/sqlalchemy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:842a5c00ca9719cc26fba6f401f70e4bac19dc8cc4dc36350803a03954d6aea2", size = 2369166, upload-time = "2026-09-25T15:36:05.081Z" }, - { url = "https://files.pythonhosted.org/packages/ed/5a/c91c3cf7f0e65ae7ad9ebc87ec4cc68f6d163fddaa36736621a00dac5905/sqlalchemy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:0220e0d1d1ad2391a03cd6713ca5d795419033cc40baa1233f9ad454dffa25e6", size = 2421474, upload-time = "2026-09-25T15:36:07.069Z" }, - { url = "https://files.pythonhosted.org/packages/e3/65/fc72cd55397792553b72a8c43e14531baa436d08f832486d2cff9e806f36/sqlalchemy-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af189bd861bd31a84f0ba244d6db0c8aeae9e56448c9001bf02ee6a93758b39e", size = 2381060, upload-time = "2026-09-25T15:11:45.018Z" }, - { url = "https://files.pythonhosted.org/packages/cc/54/83400a33b70e02ef03b877e9d35c451124b4e74846a02e8a8a42d66b3dc9/sqlalchemy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b04365ffe57cdeaf4d0f75630332d857dde3f91336bc4bdec76c810473c9c35e", size = 2452431, upload-time = "2026-09-25T15:12:48.551Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ab/15a4bda565d148aae53f8df650a5e3c908735460b97ce37a89f637a87d49/sqlalchemy-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dee7886f4725c304641929a38d1ebe163f9fb45a5c9363f34bbb85bfdcb084c5", size = 4577496, upload-time = "2026-09-25T15:18:56.457Z" }, - { url = "https://files.pythonhosted.org/packages/b0/98/35dd80a408ae2d880f92631eaaff7ae1b1004a3cd8f070f95d9c534380ee/sqlalchemy-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:abd893deac6b0765f51d87129c5631cc5bc8f784f8bf22a9d3903695c764bccc", size = 4628607, upload-time = "2026-09-25T15:19:51.653Z" }, - { url = "https://files.pythonhosted.org/packages/47/61/177fad5305fbd3ca2b528361f8723d7804995eeb458bdf33eba5547eb747/sqlalchemy-2.1.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7c60fb6793cf60b2733012352f0e1861c38b24727d0e37a1da1f3974eb79f0ed", size = 4295693, upload-time = "2026-09-25T16:17:51.491Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2a/ec0273d82a196180f75084cfd7bc5ad5ae43724d0b8e4addf5dd97f1a0a5/sqlalchemy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a74c46cd93e34b912adafab98aa71c862518451a019d97f9c2f37392fc8eea3f", size = 4502443, upload-time = "2026-09-25T15:18:58.555Z" }, - { url = "https://files.pythonhosted.org/packages/4b/91/36ff623fa5f28c5b96cec0f31c5c76c66ab9362d21f1d97df14261b5ec3e/sqlalchemy-2.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:eef01acb10295adfac8a960f716687052fe16f14a3f5955b56c24eefa9df7851", size = 4297102, upload-time = "2026-09-25T16:17:54.314Z" }, - { url = "https://files.pythonhosted.org/packages/71/58/a5a62bb8e2aa32c202dad2930efe7d7775b98f6cce7424dc7e6b5f357500/sqlalchemy-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ed18c0747eec4a0d8d9abe4c89d96ec0eda97721ab7d3a31d0c1ebcbf38cd2e", size = 4589847, upload-time = "2026-09-25T15:19:53.839Z" }, - { url = "https://files.pythonhosted.org/packages/f9/d4/8e80c47eea173dcfb09ed73d255ae2f5f52b6c053a335639fed9000b0cfd/sqlalchemy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:389e7098e9ae15094f222496de98b0fd211c06b896c73c6e46aa9ca5b6fcd590", size = 2366456, upload-time = "2026-09-25T15:20:28.824Z" }, - { url = "https://files.pythonhosted.org/packages/07/ec/29eb6ce8f821d36df50ebe7bd05fb6f04b61aeed78ccb6cf830f413b34d0/sqlalchemy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:cf88881d593f527860fa7c63a50095496a5fa15632b1fee58e3114353f7fbc22", size = 2416469, upload-time = "2026-09-25T15:20:30.607Z" }, - { url = "https://files.pythonhosted.org/packages/69/ff/ab43fb0042119bd7ac7347d2df1391f37515b2e27cc49bf29bf799651878/sqlalchemy-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:28b882509319789d52966d70164ccfc5bc1aaffc1c7f98a79bbccec13346ebd7", size = 2377438, upload-time = "2026-09-25T15:25:19.304Z" }, - { url = "https://files.pythonhosted.org/packages/19/6e/3739dc61a0bd20db049f1b220cf380d55cc6c6e6e80a9cab382b3fe2d826/sqlalchemy-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:597e1edf9cbe6ce63974813000c02c7a44da3d21f1da47f07174732ba188e8ae", size = 2455544, upload-time = "2026-09-25T15:12:50.464Z" }, - { url = "https://files.pythonhosted.org/packages/51/9b/29879ca69033f466da33486d6fb238ce1f4465e15529959e5bd3a47a8f8d/sqlalchemy-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e37b1fe2e080bf47f3b693dfbec9aa39d3c3d52bfac3b4fef290a449570bcf3f", size = 4571544, upload-time = "2026-09-25T15:19:00.881Z" }, - { url = "https://files.pythonhosted.org/packages/41/0f/6db5347662a9ed83509a5236e64afc15285947ed4dd71e618912bde83445/sqlalchemy-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18148691d761ef20a92cfc7dced305834e2c6ab4f4f3648f66f5d4028e234089", size = 4601803, upload-time = "2026-09-25T15:19:55.751Z" }, - { url = "https://files.pythonhosted.org/packages/77/e4/073eecd01e8a1bb5b90638c15f06b86c897518ef96d70118a70ab37bb673/sqlalchemy-2.1.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:44dff425e7d88b04497b4317478a6af2a694327a087e6f1670a4266180838269", size = 4295583, upload-time = "2026-09-25T16:17:56.955Z" }, - { url = "https://files.pythonhosted.org/packages/25/71/c4e261d50297457c2496bb39b03f2a2ea0578a298defe4edc5ef514d4423/sqlalchemy-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6a261e2244fa88e6eded95a078550c0584da55db22d49b0b2db8c075788282fb", size = 4501686, upload-time = "2026-09-25T15:19:02.804Z" }, - { url = "https://files.pythonhosted.org/packages/7c/85/9ec520ba12027bfdbcaa3e6633e977d1984dca5739ab73bc6c9f16cb4900/sqlalchemy-2.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:4789593e8979d7c946da1985a560200b6ef6c3dc6dcc5442985d62c6f2908875", size = 4296847, upload-time = "2026-09-25T16:17:59.584Z" }, - { url = "https://files.pythonhosted.org/packages/dd/65/877c7f19fe976dffbffc579148d842bb99665e520af83d28b287a162f843/sqlalchemy-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1477f2f1f531697753a729dd8f3e4e98f7019086f001fdc4d50350c929871c8c", size = 4560888, upload-time = "2026-09-25T15:19:57.887Z" }, - { url = "https://files.pythonhosted.org/packages/0c/f3/feb8b0803a6a2d095f4330cdc598aacef46cfb1ab6e83f4b396c6f5b89cb/sqlalchemy-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1ef7bc38d140b3cf08cc6e8823b8e76da2e188b5594997e2c16586c9778af472", size = 2373288, upload-time = "2026-09-25T15:20:32.159Z" }, - { url = "https://files.pythonhosted.org/packages/be/b6/eef7d11752b5b52ad3fecfe03fabf7324e676bf1db5a22788cbcb3ba69c6/sqlalchemy-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:73b0f7cb41a3df79dc0427377a9e2a099eb15995a327120d651f21309faa662a", size = 2423714, upload-time = "2026-09-25T15:20:34.012Z" }, - { url = "https://files.pythonhosted.org/packages/22/a0/6ce78eaac3a3197847a1d184a24633869cc343b0885f9207aa605e916bf5/sqlalchemy-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:a0421f9eedad616b04a097ae3f155c5a0a31380364369861fd6e0f46074c3fce", size = 2388489, upload-time = "2026-09-25T15:25:20.78Z" }, - { url = "https://files.pythonhosted.org/packages/b1/56/db8f82c576dbe4f52db82e0e430debca0a6398fd0bf6a45bde11e7feb126/sqlalchemy-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2f0bb0502de28baed425278d4bd98658d8256419fd9ad6ca964138710f933aa0", size = 2494990, upload-time = "2026-09-25T15:27:27.737Z" }, - { url = "https://files.pythonhosted.org/packages/d8/e0/cbadd9f851fa376c619f97adb4abd4b0c9d727841e988c4283dc45007c1f/sqlalchemy-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e20233c7d000c006a03f3734d8e7a6e63aa878fcd3482c1f412c864a0992e5a0", size = 4899710, upload-time = "2026-09-25T15:28:30.224Z" }, - { url = "https://files.pythonhosted.org/packages/e2/5f/8cb1a5c751161cdac50355b2c91617e2a872c237922a54b47ce014f11dd3/sqlalchemy-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b0660ded5f9c090f9bf49fba78d52843ff3ca8c10f71624811f42f11655762d", size = 4810110, upload-time = "2026-09-25T15:49:02.468Z" }, - { url = "https://files.pythonhosted.org/packages/6b/4f/a4329f5a006b6cd2e8836b160d179c522c0cd7edfd494971a6d5a504f33e/sqlalchemy-2.1.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:63c0291bf0f721543db3719c71f2d5ad6649f12abbcbc8324d42805dac112cbc", size = 4490328, upload-time = "2026-09-25T17:35:02.971Z" }, - { url = "https://files.pythonhosted.org/packages/4c/40/7bfd8136b8038bc1ffad70f283bd51aa93e43808ea522dac5a99be7b26b3/sqlalchemy-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:092a743f28f3a660321e9b093144b6a5b16f08dbb9b2f52466b47a2a128475c2", size = 4757854, upload-time = "2026-09-25T15:28:32.778Z" }, - { url = "https://files.pythonhosted.org/packages/ab/4b/a25d5f0e8493fa8ad2334a7100479302cd1928f788c6200faa952b47ee27/sqlalchemy-2.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fdef70d59afce463bedef54580ba6a832f9f2313c1d0054e15cbb4ff46f37a97", size = 4490016, upload-time = "2026-09-25T17:35:05.664Z" }, - { url = "https://files.pythonhosted.org/packages/20/74/075ae28f89ba586a2229dc746aa8b4e5b0b2595f228c96bacadf66940bf4/sqlalchemy-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0f94929be35def6580cf161f20c71930d9364d62f7040b6aed02b13fd3ca09e6", size = 4748267, upload-time = "2026-09-25T15:49:05.376Z" }, - { url = "https://files.pythonhosted.org/packages/57/fd/744a9e6d2788d1d4a077ed711d06cf503762ee8a614f887e284f0869beba/sqlalchemy-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:dabf6a73f2cc1fa2155b29f2a8a85afd82d8613262e6054cc3c932f5dee5d474", size = 2431659, upload-time = "2026-09-25T15:25:37.802Z" }, - { url = "https://files.pythonhosted.org/packages/c7/11/f4a73cb472cf1401ba3f47b02eed7983a0545f0347582afd469d5da2f324/sqlalchemy-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:3353333f8c25fc5e0661f54630238a17b0d6600305e224400cd4642cce4af34f", size = 2499109, upload-time = "2026-09-25T15:25:39.706Z" }, - { url = "https://files.pythonhosted.org/packages/ee/54/21ceb7c4ad51255be2333aa4fb32c973d35fa28b26f9895c6d66767aff4d/sqlalchemy-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7f15820c84b2377bcf02cf754232690ac2ad90d425978bf1e5ba30cc04f94d55", size = 2417171, upload-time = "2026-09-25T15:20:58.386Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b4/bd32e5cc1d641871ca95c0d7bd06c9d7e03d47bcab100f0c27fd2e6c8c74/sqlalchemy-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:481d926922d9bff632955ed6f07e2b87066b0d1069eb67cbc8c35e27f7fe5e1e", size = 2455487, upload-time = "2026-09-25T15:07:27.083Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2c/87f7754471eff7ad3186243a835ebd609f10a46d73d0c62a40188d8ace70/sqlalchemy-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2a036e3c8b183f9c31df7611e03a4bd160e055915772bb8c13ec382da8f3571", size = 4575174, upload-time = "2026-09-25T15:24:16.573Z" }, - { url = "https://files.pythonhosted.org/packages/c5/82/c6684ed8aea294894b26b8b832b5ad42dc448e385d35d8d265f6c24309bd/sqlalchemy-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb1f36ca818146b0e844dbde6dced65805d4ee06ce6282aa46a807f9a6619ede", size = 4610877, upload-time = "2026-09-25T15:35:07.336Z" }, - { url = "https://files.pythonhosted.org/packages/e8/14/ce3422645f694cc59eadc267009c245c401f15e03b342a9342cb05517b99/sqlalchemy-2.1.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:583038541d9246dbb05fc4ab73038dc61820983c12fa5e32a3b0d903e1ba7bba", size = 4312066, upload-time = "2026-09-25T15:28:55.17Z" }, - { url = "https://files.pythonhosted.org/packages/51/58/0888d935b0f9e2a61dfd28872cdda833be63239a4f21ac49f22a79fbb848/sqlalchemy-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:e5274d07ae1dc5dc0e452ec24bdc97cf76ba189cab3f0c1c0386a1523240f775", size = 4505127, upload-time = "2026-09-25T15:24:18.447Z" }, - { url = "https://files.pythonhosted.org/packages/95/4b/c54b6cd56a1d064bef1dd1e202aa54d6b9baac4f3ecb8f42c179907d5e99/sqlalchemy-2.1.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:f2c1c27a41d1a26db380b3bad45f822d979c9608108c32ee613a418ec454ecbf", size = 4312019, upload-time = "2026-09-25T15:28:57.606Z" }, - { url = "https://files.pythonhosted.org/packages/db/b0/a42e854cc34c9fd47b36f3df15b4036f778b5032bc3206b1be31d35476f9/sqlalchemy-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:3ac9781474e4b6c3e184487643d47408666be794d5782165a817da63f981f89a", size = 4571994, upload-time = "2026-09-25T15:35:10.02Z" }, - { url = "https://files.pythonhosted.org/packages/d3/2d/34b2b42bdc5c5e4bd2d65406ac02cea51ad4bb6fed258223f6501a5ee902/sqlalchemy-2.1.1-cp315-cp315-win32.whl", hash = "sha256:eb2095d39baecbf8b78ea202d3d21178cc8d73e52c3b450c82feb200d5b0d1a9", size = 2373014, upload-time = "2026-09-25T15:19:07.42Z" }, - { url = "https://files.pythonhosted.org/packages/5c/91/441d75e7a94f3b5cf92b655282f5405925403daeba543d2cdfbcc6742923/sqlalchemy-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:ee446c07db92e94af30e1390ef7d65c1172756403f743fb7d8b4fc5f377cd427", size = 2423755, upload-time = "2026-09-25T15:19:09.005Z" }, - { url = "https://files.pythonhosted.org/packages/52/1e/414a98da13eec0e6b984a0659c7cdcc835be8e5cb73ed13cf134aefff9e8/sqlalchemy-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:57ae70935cd382cd41d84757e802687f7c5e7411aecf2b962b7bdb6ea74e088c", size = 2388191, upload-time = "2026-09-25T15:29:56.041Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d6/750d7aeb670f4954704206a5a0d20b07833549080d2e5cb1503890da568a/sqlalchemy-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:558d6d7d6eec0e54ed212320a587bb7f30553550396226d8488803c93757f17b", size = 2491192, upload-time = "2026-09-25T15:27:29.424Z" }, - { url = "https://files.pythonhosted.org/packages/e3/07/8e5c0691325466bbca0768406b4d5c2b6585d9684e25a4894bdc4df9c745/sqlalchemy-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1986faa95fd7b206e5bdd1af7f4ba9ac10f1166225fb2eca0fbca04e3851f7d", size = 4875769, upload-time = "2026-09-25T15:28:35.083Z" }, - { url = "https://files.pythonhosted.org/packages/29/2f/4deede5e238c5d539422e8f6cd692925a604a37b7c518bbcc89ac49ca801/sqlalchemy-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:87d45175e8ba4a1ee027ad9307e6a4bf8a242469415f12afc9477def739474b0", size = 4826021, upload-time = "2026-09-25T15:49:07.847Z" }, - { url = "https://files.pythonhosted.org/packages/b2/0d/b620b9ccafbdefd83cda6fd479e82d7f5dd0baec0fcae8c9e2b1296091f1/sqlalchemy-2.1.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8d846615b89702ef5d0809e701ff5f3816b88dd02670c777adc456f6d81ef3ef", size = 4476462, upload-time = "2026-09-25T17:35:08.43Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b1/e6829e519e73365c180568b64b5d2f79350daf6eb468e74cdc45b2bef018/sqlalchemy-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9324681cf8d8e9c7f6e507fea6a8ac2215fee253340d4399645216a08b936660", size = 4733363, upload-time = "2026-09-25T15:28:37.973Z" }, - { url = "https://files.pythonhosted.org/packages/af/78/9315b9732ce85aae954a4609f9e7d45975a8cf3a4133f2f8bda7fb7bdca0/sqlalchemy-2.1.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:88cb0a27ee9571fe339d7809a40b14ff2387ea05d02629a390a03c87cc981277", size = 4475138, upload-time = "2026-09-25T17:35:10.766Z" }, - { url = "https://files.pythonhosted.org/packages/99/f0/50f86f633f6ddb76d4a81bba1d0b382acfe465063699bc19900daeefdf05/sqlalchemy-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:359e2411cf4713b4b323b3c2558a07663a19ab82a5d7b23c601e1be5432aac0c", size = 4752931, upload-time = "2026-09-25T15:49:10.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/0c/e5a498c55b4f73b06bd9d541dff00b9736942bade23203719f1ba2c90774/sqlalchemy-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:d111318e32b4452d85b491d2ba3f39f6be2736ff858da616f0e6627bb3810145", size = 2428440, upload-time = "2026-09-25T15:25:41.517Z" }, - { url = "https://files.pythonhosted.org/packages/99/0b/df1c33f575ef39074dc682db2a33a1c5f259d48ca392b95a695f43553a29/sqlalchemy-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:b357598df0676accd1ccfb6bbc5db53dbfb499052d2d1677adf4ce14a7180664", size = 2494146, upload-time = "2026-09-25T15:25:43.453Z" }, - { url = "https://files.pythonhosted.org/packages/43/e1/f3d25c2ca66ed394b0fc9786af9857c448bc9ac68e59c3d2283245e9dc40/sqlalchemy-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:b76d8fddf080c53f2afdea6e7149721e7b980086a2f17a9b0bdb42571a92c285", size = 2412985, upload-time = "2026-09-25T15:20:59.747Z" }, - { url = "https://files.pythonhosted.org/packages/c5/7a/7d1879d78c086737acee5f3250cbff9d285e5bd7cb6bc2c730f24e8d400e/sqlalchemy-2.1.1-py3-none-any.whl", hash = "sha256:4357c1a222e141662251a59d3702f9b124294941171dfa6bd570513e9f4905ee", size = 2047471, upload-time = "2026-09-25T15:20:37.797Z" }, -] - -[package.optional-dependencies] -asyncio = [ - { name = "greenlet" }, -] - [[package]] name = "sqlglot" version = "30.21.0" @@ -6562,10 +5484,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/c3/ab/fd1e7bc4be367998624be1392334d61b3e69e2c2a9089ec80ef4c71b93fe/sqlglotc-30.21.0.tar.gz", hash = "sha256:7644276e946fa3985d361e9f12b097cb910c4c215ccf73d9caa09e289ef59432", size = 528711, upload-time = "2026-10-01T01:29:13.274Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/ff/23271960e0bc68b41457a417163a3b8622732fa36a5cf538daa2ffdccb22/sqlglotc-30.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eae2c90ea39ea4936eb0157c4f872ac59c58a9195875c8455dcf2b2dc3baed95", size = 33144926, upload-time = "2026-09-30T17:22:49.054Z" }, - { url = "https://files.pythonhosted.org/packages/8f/5a/59e5f0a5869aac62359680f78c07d71eda3ef4e44bed7b8044ab4756c5a0/sqlglotc-30.21.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1756ebfc2217c7aa76238ab0e2c4ef7d76cb348de44886815470fafd14fb69f4", size = 25461244, upload-time = "2026-09-30T17:22:51.579Z" }, - { url = "https://files.pythonhosted.org/packages/8d/99/26d7a1d8470760ba694672892719569bf4e87800239a9656ee0227e2ca1f/sqlglotc-30.21.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78d53a9df94a2cf6d91b3c4e12b42e6d8ee750e44e35e8f466a8d4e1cb7d2c00", size = 26610532, upload-time = "2026-09-30T17:22:53.889Z" }, - { url = "https://files.pythonhosted.org/packages/85/a9/aaee4711248e411f87d8e8e378bfd8c618c4fd81c9bcbc82781c07fcc9bf/sqlglotc-30.21.0-cp310-cp310-win_amd64.whl", hash = "sha256:e766776ebcca8366df573a1dff8ff70d4b72a221b2cd5eb0a0151d14361884da", size = 11178279, upload-time = "2026-09-30T17:22:56.166Z" }, { url = "https://files.pythonhosted.org/packages/e7/23/262dd51f76e2c2a387b46152cf7447c927f82c961edd2d5ff3d4007f6491/sqlglotc-30.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:57e84ef998118435bfabc23087da198b1e07dd5de5e500671a60ec89683a9fb9", size = 32995491, upload-time = "2026-09-30T17:22:58.205Z" }, { url = "https://files.pythonhosted.org/packages/4f/86/49988180d083bc058a4e162cb81983d07d70e5e05b4002d8a69ead39f50f/sqlglotc-30.21.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2571092e68ebda8a18a91e69a9c8568c9e4f6947f58909ae683a3126e11b0021", size = 25656024, upload-time = "2026-09-30T17:23:00.492Z" }, { url = "https://files.pythonhosted.org/packages/8f/0e/440800dab52972bec060a6ada9fb0a02caf63a7916d2a1a95fb4854f929d/sqlglotc-30.21.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:319e7487cb7255bbb2bae372368e89504fb8b20c17f5b54dcba756e275c7f6b8", size = 26832002, upload-time = "2026-09-30T17:23:02.781Z" }, @@ -6601,7 +5519,6 @@ dependencies = [ { name = "mypy-extensions" }, { name = "rich-click" }, { name = "sqlglot" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] @@ -6696,8 +5613,7 @@ orjson = [ { name = "orjson" }, ] pandas = [ - { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "pandas", version = "3.0.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pandas" }, { name = "pyarrow" }, ] performance = [ @@ -6744,8 +5660,7 @@ uuid = [ benchmarks = [ { name = "duckdb-engine" }, { name = "psutil" }, - { name = "sqlalchemy", version = "2.0.54", source = { registry = "https://pypi.org/simple" }, extra = ["asyncio"], marker = "python_full_version < '3.11'" }, - { name = "sqlalchemy", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, extra = ["asyncio"], marker = "python_full_version >= '3.11'" }, + { name = "sqlalchemy", extra = ["asyncio"] }, { name = "types-psutil" }, ] build = [ @@ -6773,8 +5688,7 @@ dev = [ { name = "fsspec", extra = ["s3"] }, { name = "hatch-mypyc" }, { name = "mypy" }, - { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "myst-parser", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "myst-parser" }, { name = "numpydoc" }, { name = "pandas-stubs" }, { name = "pgvector" }, @@ -6798,25 +5712,19 @@ dev = [ { name = "shibuya" }, { name = "slotscheck" }, { name = "sniffio" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "sphinx-autobuild", version = "2024.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx-autobuild" }, + { name = "sphinx-autodoc-typehints", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx-autodoc-typehints", version = "3.13.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "sphinx-click" }, { name = "sphinx-copybutton" }, - { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-design" }, { name = "sphinx-iconify" }, { name = "sphinx-paramlinks" }, { name = "sphinxcontrib-jquery" }, { name = "sphinxcontrib-mermaid" }, - { name = "sqlalchemy", version = "2.0.54", source = { registry = "https://pypi.org/simple" }, extra = ["asyncio"], marker = "python_full_version < '3.11'" }, - { name = "sqlalchemy", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, extra = ["asyncio"], marker = "python_full_version >= '3.11'" }, - { name = "tomli" }, + { name = "sqlalchemy", extra = ["asyncio"] }, { name = "types-cffi" }, { name = "types-colorama" }, { name = "types-docker" }, @@ -6829,22 +5737,17 @@ dev = [ doc = [ { name = "auto-pytabs", extra = ["sphinx"] }, { name = "click-extra", extra = ["sphinx"] }, - { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "myst-parser", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "myst-parser" }, { name = "numpydoc" }, { name = "shibuya" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "sphinx-autobuild", version = "2024.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx-autobuild" }, + { name = "sphinx-autodoc-typehints", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx-autodoc-typehints", version = "3.13.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "sphinx-click" }, { name = "sphinx-copybutton" }, - { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-design" }, { name = "sphinx-iconify" }, { name = "sphinx-paramlinks" }, { name = "sphinxcontrib-jquery" }, @@ -6871,7 +5774,6 @@ lint = [ { name = "pyright" }, { name = "ruff" }, { name = "slotscheck" }, - { name = "tomli" }, { name = "types-cffi" }, { name = "types-colorama" }, { name = "types-docker" }, @@ -6954,7 +5856,6 @@ requires-dist = [ { name = "sqlglot", specifier = ">=30.13.0" }, { name = "sqlglot", extras = ["c"], marker = "extra == 'mypyc'", specifier = ">=30.13.0" }, { name = "starlette", marker = "extra == 'starlette'" }, - { name = "tomli", marker = "python_full_version < '3.11'", specifier = ">=2.0.0" }, { name = "typing-extensions" }, { name = "uuid-utils", marker = "extra == 'uuid'", specifier = ">=0.17.0" }, ] @@ -7027,7 +5928,6 @@ dev = [ { name = "sphinxcontrib-jquery" }, { name = "sphinxcontrib-mermaid", specifier = ">=0.9.2" }, { name = "sqlalchemy", extras = ["asyncio"] }, - { name = "tomli", specifier = ">=2.0.0" }, { name = "types-cffi" }, { name = "types-colorama" }, { name = "types-docker" }, @@ -7075,7 +5975,6 @@ lint = [ { name = "pyright", specifier = ">=1.1.386" }, { name = "ruff", specifier = ">=0.16.0" }, { name = "slotscheck", specifier = ">=0.16.5" }, - { name = "tomli", specifier = ">=2.0.0" }, { name = "types-cffi" }, { name = "types-colorama" }, { name = "types-docker" }, @@ -7375,16 +6274,6 @@ version = "6.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/64/7c/e1fa3fb70b53192436d751b5cb671f0ee960baa188b8351a7fec735223d3/ujson-6.0.0.tar.gz", hash = "sha256:80e23393feb707582e0ad495c397a4477b646d08094d2df64f7316f9fafd8aae", size = 7169158, upload-time = "2026-09-04T03:55:42.983Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/0e/37251c324a2b8799a22b5354b8edd4b867b91f0e68fb74423772c377bd7f/ujson-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca83e86a300db6c72847bc7acc259bf86481063aea408b07c8a96d649797b7f", size = 54947, upload-time = "2026-09-04T03:53:06.967Z" }, - { url = "https://files.pythonhosted.org/packages/f6/e6/988d06bf5e46c992397d93123012bdd1e84bd829afe8181d8334a98ba7e0/ujson-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc8510c8b5b8373e0789ca05ebffc0aaab6e8a8f86d67956c91bc37f43d4f989", size = 54239, upload-time = "2026-09-04T03:53:08.176Z" }, - { url = "https://files.pythonhosted.org/packages/b4/78/ac325bada531de2fa2623e7dca1f690ae2314f9fb790ebad64dd41571298/ujson-6.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:1080587042cb19f9cfb08f289498d866ac5f93393b21006321dea331dbf62375", size = 58298, upload-time = "2026-09-04T03:53:09.41Z" }, - { url = "https://files.pythonhosted.org/packages/76/67/0e6a2ee29000cdde7a8fb931bf2fdd941a8c0deef18451e3e9c936dbfece/ujson-6.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b8d019e935e4f8d6493690036161e62fae033891b71f20d238342ae266fec852", size = 52397, upload-time = "2026-09-04T03:53:10.631Z" }, - { url = "https://files.pythonhosted.org/packages/49/9a/cce4d9f023bc3213a17ceab844c597399f1e65c6654ba3ba178aff28683e/ujson-6.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:83194e213d9df2f2aed1edb821689f99c0f7789bdee173125fda510282f61070", size = 53487, upload-time = "2026-09-04T03:53:11.648Z" }, - { url = "https://files.pythonhosted.org/packages/15/bd/d1652f9e1ff16b1324c0715d97c8c295d845aba2766d69dab8a2cd90de9c/ujson-6.0.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:108a9f3a635913d38a856e05007afc9b243929938939cd11576a3f5484925145", size = 57182, upload-time = "2026-09-04T03:53:12.731Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ec/ed610aff77e0f060d0abb6e1d5ad8f07b2b6e4a0c5e765225ccc5f229ef4/ujson-6.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e94f0b95459caa6cb5e333baf6763bf1e7a96ea5e4f1ea7fbb0ad88e81a88ab", size = 56232, upload-time = "2026-09-04T03:53:13.848Z" }, - { url = "https://files.pythonhosted.org/packages/0f/bb/4e37fb0c4593870684f848ba0e3f06f17695596df3311fd4ccf0185db2de/ujson-6.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bde35c0d6b5a204990f43e4ab43b6e3e4d5a1de773246e11d518945e3ba789ed", size = 1037432, upload-time = "2026-09-04T03:53:15.084Z" }, - { url = "https://files.pythonhosted.org/packages/eb/40/7db01714718c4324d3641061b12cce285ef906f750c09157f65dfc5c16fa/ujson-6.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:666a91606eeb47c997927ff294f3a9f8f930a02d0d2293ec7b19da5ed688f7ec", size = 1196188, upload-time = "2026-09-04T03:53:16.611Z" }, - { url = "https://files.pythonhosted.org/packages/51/2b/a445456fdca0a4bd6c691861d66a7c226f015a543d9f6b2f5537e1b734cc/ujson-6.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:03a385e523f67dec6d4dad0970f20a080cad045b56d9a3564d07807090a9c106", size = 1088475, upload-time = "2026-09-04T03:53:17.848Z" }, { url = "https://files.pythonhosted.org/packages/8d/c3/170109078742892cf5ca19b0c8df517e5945f5b7141782235c2cb6124518/ujson-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a69419253e9367281db03355eb55b5231eef5ff338bb816eb5926ee788faf48", size = 54948, upload-time = "2026-09-04T03:53:23.106Z" }, { url = "https://files.pythonhosted.org/packages/4a/f8/4b927dc315819479058551d9b18307460a5e1a07ff0e7470a82aedf63c1a/ujson-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff3b33d8c8dbbe32936d2056296324371a07ed0b29177e2eb8ec46569436817f", size = 54233, upload-time = "2026-09-04T03:53:24.334Z" }, { url = "https://files.pythonhosted.org/packages/84/52/bf7a055ae58f13933500906a937b58b7e9052ea881c1159c1ad5bfdb17d3/ujson-6.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:d4a731cc7cd513bf4c4016a24a060fb1aa8475e8682e1f8b1bfb836f8d3f50f0", size = 58323, upload-time = "2026-09-04T03:53:25.357Z" }, @@ -7484,19 +6373,6 @@ version = "1.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5e/35/2e9666504bcb3ab50656b86cd468880cedb86d3c97b88d3805dcc124b95d/uuid_utils-1.0.0.tar.gz", hash = "sha256:8ed2e0156d29c4cfa0f931b4b71b35d2705d84054f63ba07a78f7acc2eb09a5c", size = 43759, upload-time = "2026-09-08T13:27:28.344Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/38/e3c3a533db555fa6615f4e761984a70930af9277e02899e032382888ee0f/uuid_utils-1.0.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3318d37b0009d4b5b64aa80c36f9314bdfcfa3283c93819fa60360471f921293", size = 564708, upload-time = "2026-09-08T13:25:03.587Z" }, - { url = "https://files.pythonhosted.org/packages/13/7a/190d26644bf77cd14a82dc5a7a5110d0967bef8bd3a60e4d3ddd7353586e/uuid_utils-1.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9fa9ea6eb4f4b47dc5410ec33a84eb817316d9111be7add1fea2c1fcb141ab9a", size = 287542, upload-time = "2026-09-08T13:25:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/c7/58/697c6439193b1b0c1a0b4af84282eb9c210477f15c1df48a4cf27ab7bc6a/uuid_utils-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28696dfacced277762eb76892a6b794b583058efae58e1f036f93b2c7f1d2e45", size = 327213, upload-time = "2026-09-08T13:25:06.949Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d3/63a7ba03572488852b0539d31ff9b9d985c84780ccc99ec8852e1a70e9e9/uuid_utils-1.0.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b74b0247502b3a2a009f01bc97d38e99f589f957a378e68dd8e516a69b1776f3", size = 335949, upload-time = "2026-09-08T13:25:08.547Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e9/5f1fe095807b7e0654503a8fbe0199ccacc960a721798b7833f62db96cd7/uuid_utils-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:288e6a37506e4410183d0038590ce6a37fe7b045e2138a4b778fca458137b7f4", size = 450487, upload-time = "2026-09-08T13:25:10.09Z" }, - { url = "https://files.pythonhosted.org/packages/a3/3b/1f9742d81a6ea2c41e8801aeb44eec0adc1ab4477997433a2277b44f304d/uuid_utils-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2eee7e1abd2578988458892d6630bb76118a1495ddc35d88000526ae69a2f7e", size = 328321, upload-time = "2026-09-08T13:25:11.938Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1c/e835cfcd2e13e480c51c77dc1ded91a4f4c63f8e78ebd4beb6d6abfd2dd1/uuid_utils-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cda59ab521c0fb1681ca758d1c97ffe24d6982105cd8c888cf31c3871e3caa34", size = 353137, upload-time = "2026-09-08T13:25:13.508Z" }, - { url = "https://files.pythonhosted.org/packages/8a/5d/d9575181946f8385771b744e6d431c22745b5c2ac5855a2a246d3dd89d43/uuid_utils-1.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e116657b19aa12724c92de7ec05391fe53a3ebf4a6101469894477afd523f392", size = 505038, upload-time = "2026-09-08T13:25:15.189Z" }, - { url = "https://files.pythonhosted.org/packages/36/d9/9a8bab20e7b3d2f54f59b225047888a0689e72c822d730d4582d49b580f1/uuid_utils-1.0.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:5876a4ad79124158e60562a6406b5e2d9d4c93c01b6d85c699fbd219ec1e49b0", size = 611288, upload-time = "2026-09-08T13:25:17.137Z" }, - { url = "https://files.pythonhosted.org/packages/a5/5b/fc5cca60af65cbf1e63f8cc292dbc11c04b9d605084675cfc5d2fb14297f/uuid_utils-1.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:98c8f6f8fda6da2e46d29f84f9c6529f19465f3cc4abbd767e04962102a4c7f6", size = 569360, upload-time = "2026-09-08T13:25:18.583Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b2/56be9ed079936056df9a694e2ca54fe293c62ab03fcc6ee2b66ac6ba364e/uuid_utils-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f2b63bd980bfea99164337b5666d5c5613da27727a078811efffa605be217b8c", size = 533681, upload-time = "2026-09-08T13:25:19.946Z" }, - { url = "https://files.pythonhosted.org/packages/20/1a/e8901350ee4ca6d6da410d00025cbb640afc7c5d09fcd419387ebb5f4a4d/uuid_utils-1.0.0-cp310-cp310-win32.whl", hash = "sha256:3cbb671f647b80483ba15d1e9f91bae25d34148498bc92d05e5eba738a73d71c", size = 173148, upload-time = "2026-09-08T13:25:21.317Z" }, - { url = "https://files.pythonhosted.org/packages/86/f5/52ff2025f26e9bbed867a92d6674c113465b4db037de3f45ab74bf061a19/uuid_utils-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:878cffe1e21abfa0fd1e363c00ce6ee901ddbf1761e07f0a67a8679068f77a21", size = 179767, upload-time = "2026-09-08T13:25:22.7Z" }, { url = "https://files.pythonhosted.org/packages/06/0b/9dd7618399c34481b4bad422d8c15c69a659bba8b1f1c85aa3198cb0cfbc/uuid_utils-1.0.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:55b8912f743b0026aa72a5ff392831610a240fb48eeeccf945db60f74645cd2f", size = 564415, upload-time = "2026-09-08T13:25:24.193Z" }, { url = "https://files.pythonhosted.org/packages/03/00/6cb04489068dac102ba11e089fdaba32caaae79edc94ba02c34b7b460278/uuid_utils-1.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2ca478b10c68b57e47f22c5baf4ffe7c4ac922db776573840efbd4b34dfe4cfe", size = 287836, upload-time = "2026-09-08T13:25:25.91Z" }, { url = "https://files.pythonhosted.org/packages/12/f1/01c95c433a52a0af7b03d1e54f3a5546f22c2e0bee769e3fda4aaa7c11e4/uuid_utils-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d66cb850461fd4786da6452a8ee1a7efe882de1ebe395ddfb18f27b25ad96646", size = 326987, upload-time = "2026-09-08T13:25:27.39Z" }, @@ -7586,7 +6462,6 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/da/34/30e9280707135d2cfc589dfff3cb796bd07a3aeb1a3e415ba09dd89d7bb4/uvicorn-0.54.0.tar.gz", hash = "sha256:a2e33cbfaa0306f8e6b0c13e0cb89d7d7a2da3e62b90c66e18c33d9807b28620", size = 112283, upload-time = "2026-09-25T06:52:37.601Z" } wheels = [ @@ -7599,12 +6474,6 @@ version = "0.22.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/14/ecceb239b65adaaf7fde510aa8bd534075695d1e5f8dadfa32b5723d9cfb/uvloop-0.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef6f0d4cc8a9fa1f6a910230cd53545d9a14479311e87e3cb225495952eb672c", size = 1343335, upload-time = "2025-10-16T22:16:11.43Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ae/6f6f9af7f590b319c94532b9567409ba11f4fa71af1148cab1bf48a07048/uvloop-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cd375a12b71d33d46af85a3343b35d98e8116134ba404bd657b3b1d15988792", size = 742903, upload-time = "2025-10-16T22:16:12.979Z" }, - { url = "https://files.pythonhosted.org/packages/09/bd/3667151ad0702282a1f4d5d29288fce8a13c8b6858bf0978c219cd52b231/uvloop-0.22.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac33ed96229b7790eb729702751c0e93ac5bc3bcf52ae9eccbff30da09194b86", size = 3648499, upload-time = "2025-10-16T22:16:14.451Z" }, - { url = "https://files.pythonhosted.org/packages/b3/f6/21657bb3beb5f8c57ce8be3b83f653dd7933c2fd00545ed1b092d464799a/uvloop-0.22.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:481c990a7abe2c6f4fc3d98781cc9426ebd7f03a9aaa7eb03d3bfc68ac2a46bd", size = 3700133, upload-time = "2025-10-16T22:16:16.272Z" }, - { url = "https://files.pythonhosted.org/packages/09/e0/604f61d004ded805f24974c87ddd8374ef675644f476f01f1df90e4cdf72/uvloop-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a592b043a47ad17911add5fbd087c76716d7c9ccc1d64ec9249ceafd735f03c2", size = 3512681, upload-time = "2025-10-16T22:16:18.07Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ce/8491fd370b0230deb5eac69c7aae35b3be527e25a911c0acdffb922dc1cd/uvloop-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1489cf791aa7b6e8c8be1c5a080bae3a672791fcb4e9e12249b05862a2ca9cec", size = 3615261, upload-time = "2025-10-16T22:16:19.596Z" }, { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, @@ -7643,9 +6512,6 @@ version = "6.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, - { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, - { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, @@ -7655,8 +6521,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, - { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, @@ -7758,17 +6622,6 @@ version = "15.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/da/6462a9f510c0c49837bbc9345aca92d767a56c1fb2939e1579df1e1cdcf7/websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b", size = 175423, upload-time = "2025-03-05T20:01:35.363Z" }, - { url = "https://files.pythonhosted.org/packages/1c/9f/9d11c1a4eb046a9e106483b9ff69bce7ac880443f00e5ce64261b47b07e7/websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205", size = 173080, upload-time = "2025-03-05T20:01:37.304Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4f/b462242432d93ea45f297b6179c7333dd0402b855a912a04e7fc61c0d71f/websockets-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a", size = 173329, upload-time = "2025-03-05T20:01:39.668Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0c/6afa1f4644d7ed50284ac59cc70ef8abd44ccf7d45850d989ea7310538d0/websockets-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e", size = 182312, upload-time = "2025-03-05T20:01:41.815Z" }, - { url = "https://files.pythonhosted.org/packages/dd/d4/ffc8bd1350b229ca7a4db2a3e1c482cf87cea1baccd0ef3e72bc720caeec/websockets-15.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf", size = 181319, upload-time = "2025-03-05T20:01:43.967Z" }, - { url = "https://files.pythonhosted.org/packages/97/3a/5323a6bb94917af13bbb34009fac01e55c51dfde354f63692bf2533ffbc2/websockets-15.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb", size = 181631, upload-time = "2025-03-05T20:01:46.104Z" }, - { url = "https://files.pythonhosted.org/packages/a6/cc/1aeb0f7cee59ef065724041bb7ed667b6ab1eeffe5141696cccec2687b66/websockets-15.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d", size = 182016, upload-time = "2025-03-05T20:01:47.603Z" }, - { url = "https://files.pythonhosted.org/packages/79/f9/c86f8f7af208e4161a7f7e02774e9d0a81c632ae76db2ff22549e1718a51/websockets-15.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9", size = 181426, upload-time = "2025-03-05T20:01:48.949Z" }, - { url = "https://files.pythonhosted.org/packages/c7/b9/828b0bc6753db905b91df6ae477c0b14a141090df64fb17f8a9d7e3516cf/websockets-15.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c", size = 181360, upload-time = "2025-03-05T20:01:50.938Z" }, - { url = "https://files.pythonhosted.org/packages/89/fb/250f5533ec468ba6327055b7d98b9df056fb1ce623b8b6aaafb30b55d02e/websockets-15.0.1-cp310-cp310-win32.whl", hash = "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256", size = 176388, upload-time = "2025-03-05T20:01:52.213Z" }, - { url = "https://files.pythonhosted.org/packages/1c/46/aca7082012768bb98e5608f01658ff3ac8437e563eca41cf068bd5849a5e/websockets-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41", size = 176830, upload-time = "2025-03-05T20:01:53.922Z" }, { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, @@ -7802,12 +6655,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/d40f779fa16f74d3468357197af8d6ad07e7c5a27ea1ca74ceb38986f77a/websockets-15.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3", size = 173109, upload-time = "2025-03-05T20:03:17.769Z" }, - { url = "https://files.pythonhosted.org/packages/bc/cd/5b887b8585a593073fd92f7c23ecd3985cd2c3175025a91b0d69b0551372/websockets-15.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1", size = 173343, upload-time = "2025-03-05T20:03:19.094Z" }, - { url = "https://files.pythonhosted.org/packages/fe/ae/d34f7556890341e900a95acf4886833646306269f899d58ad62f588bf410/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475", size = 174599, upload-time = "2025-03-05T20:03:21.1Z" }, - { url = "https://files.pythonhosted.org/packages/71/e6/5fd43993a87db364ec60fc1d608273a1a465c0caba69176dd160e197ce42/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9", size = 174207, upload-time = "2025-03-05T20:03:23.221Z" }, - { url = "https://files.pythonhosted.org/packages/2b/fb/c492d6daa5ec067c2988ac80c61359ace5c4c674c532985ac5a123436cec/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04", size = 174155, upload-time = "2025-03-05T20:03:25.321Z" }, - { url = "https://files.pythonhosted.org/packages/68/a1/dcb68430b1d00b698ae7a7e0194433bce4f07ded185f0ee5fb21e2a2e91e/websockets-15.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122", size = 176884, upload-time = "2025-03-05T20:03:27.934Z" }, { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, ] @@ -7829,17 +6676,6 @@ version = "2.5.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3e/d2/a254a26d8ceaea87e0eee2e89fcfe53ddc1858418647493bb2937549ab6f/wrapt-2.5.0.tar.gz", hash = "sha256:c48cdb6c904dca76d9915a579e4a5fab6b0c25f650c1019ce78a78effaf7a345", size = 183288, upload-time = "2026-09-27T01:41:56.874Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/23/37e2276e520ae569af851ebffaf03476e6984cd3ff298234ecd6920f7c4e/wrapt-2.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0345d4c1f7aa5a27075d28a7f0e9ed386729198045f1f08b47f8320d6bbda23", size = 104967, upload-time = "2026-09-27T01:39:31.258Z" }, - { url = "https://files.pythonhosted.org/packages/c3/d3/a75a67fb1c9e3164eec4d31c2da3c606895d1ae71f74045eb70ab591fe53/wrapt-2.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aae2f5f4c77335a39ebe5a1c77d5519f6cefefc7dbff50bd551e3771d927e3fc", size = 105434, upload-time = "2026-09-27T01:39:32.997Z" }, - { url = "https://files.pythonhosted.org/packages/c3/e1/6f46c822f6657a69c8fef5d0824e0b5287d27b76d3769b501770b917fbb8/wrapt-2.5.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1b35ef7379323a149a6398f6261248bf48b61666210bd69e2ab24a9a9afdedc0", size = 231084, upload-time = "2026-09-27T01:39:34.363Z" }, - { url = "https://files.pythonhosted.org/packages/81/49/ee77b33964f83ee5624dbccfa939356ca84092ad30a211681095985a5b7e/wrapt-2.5.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e2af7ff9553c492f684a41d903ec41e37bf6267ee3206c17518a349201cae46", size = 232732, upload-time = "2026-09-27T01:39:35.604Z" }, - { url = "https://files.pythonhosted.org/packages/55/a7/e0c0ca927a03d164927001677530bba68e6fe6b267584dda26cbeba5a2dc/wrapt-2.5.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:734ea79e4707751fb7cc4f716123b2115cd16ed0c4926e803540aece22e3ba67", size = 221110, upload-time = "2026-09-27T01:39:36.877Z" }, - { url = "https://files.pythonhosted.org/packages/78/b0/0fe1d3cf811b0135593c8f91d0bb57ff2576807e37eff2a7aa4e3a24d1cc/wrapt-2.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1ccd22ef8690ca302425f26d4c3e8b24f1284d4351d20e49ce21f9c0dd58d64d", size = 230627, upload-time = "2026-09-27T01:39:38.225Z" }, - { url = "https://files.pythonhosted.org/packages/fd/fc/312410d55792dccebe489771fa36a35a71df17580568d6c9685e74102ca6/wrapt-2.5.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:439523506fd0d9af4f76d75f2e46aa4979e164fecba6890859326ff06edbaf9c", size = 218491, upload-time = "2026-09-27T01:39:39.716Z" }, - { url = "https://files.pythonhosted.org/packages/f8/90/a647f92c48c981ce198fe59bfd62c2113ca58e8557bcb8f05149cac93f5d/wrapt-2.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94ebe745d1b0ebd3af91e22c38961616d32a228bdf9c326e7d4a6007a623d48e", size = 220505, upload-time = "2026-09-27T01:39:41.215Z" }, - { url = "https://files.pythonhosted.org/packages/23/34/2f5bf610f5629f68ca71188f8c33db3422da469e05d9d719b84c4304ddf0/wrapt-2.5.0-cp310-cp310-win32.whl", hash = "sha256:5375ff1d2159e2ef847449e3dd2329441423d0a3d895d123273a67095fe7ca0c", size = 100329, upload-time = "2026-09-27T01:39:42.619Z" }, - { url = "https://files.pythonhosted.org/packages/87/c1/c9d72d5f648798c680d68ecaa691b55f7a54b4b9c1f0cb373502b975a01f/wrapt-2.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:513dd1f4a1f91030d5656d9f4b3af8aa490d4db1eb53481e6846b8a5ee7acfcd", size = 105398, upload-time = "2026-09-27T01:39:43.851Z" }, - { url = "https://files.pythonhosted.org/packages/c5/8f/99de0a11ed51906b3a81a5e7ba7ab7d2d39ca4882a31afcb97c70ab9de60/wrapt-2.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:c3dfb16e047c912e1a06bfbc45da752219f474897be85f55b8069f7936b08cc0", size = 102622, upload-time = "2026-09-27T01:39:45.038Z" }, { url = "https://files.pythonhosted.org/packages/7f/d0/7c23187af053bfa54c99964f87b94b96cea76b78f019b06e42fa86752e5d/wrapt-2.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:57fa1a3fd1279b3ca7655b943ad61d298f2a2464a4cdca7ff298058e408322f9", size = 105327, upload-time = "2026-09-27T01:39:46.242Z" }, { url = "https://files.pythonhosted.org/packages/3d/fa/6f7f880207b2d74162a44b35e41217d999fd4af48338afb356c650f89a07/wrapt-2.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:63e58f96849f622ce769dcd705f83c7445cd9829bce1dae00e78bb031aec8096", size = 105501, upload-time = "2026-09-27T01:39:47.592Z" }, { url = "https://files.pythonhosted.org/packages/6f/19/b0b7e7cf1a5499a25bd5260b38deb3b17aa9ca7b268ef29e546dcb683aa7/wrapt-2.5.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fd91203e156d610ecb28b9ccd7b764af7a7b38662d7c163090babab0d10def0c", size = 239849, upload-time = "2026-09-27T01:39:48.838Z" }, @@ -7931,23 +6767,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/75/16/e8be8e2fb175bbf41a0680381a319f1199fae256588241a2ac8677eafb49/yarl-1.25.1.tar.gz", hash = "sha256:03dd38de09bc213e9a8b29761eec33ee1d5318dac0e49d8af36e4d27830e23a7", size = 246245, upload-time = "2026-09-15T19:35:02.264Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/92/55fa9ee84cb8ec9930a910b5753936a926f918d8cc8965bdac571479c095/yarl-1.25.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:142c06c4d6a35ee3ec5da08499805e879cb3ca7c1fbfbecb0140fe72403818d6", size = 144695, upload-time = "2026-09-15T19:29:53.114Z" }, - { url = "https://files.pythonhosted.org/packages/16/b4/9edc8e605b16b2eb5bd0c2ccc73e2b15aab583862460767fb43f91f11839/yarl-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24ce942011a61953e7d313438038f4d32ff21387b775f58a957f7a07dd55ef95", size = 104332, upload-time = "2026-09-15T19:29:55.443Z" }, - { url = "https://files.pythonhosted.org/packages/ae/de/4204e6646e278b1cd4a9cf73ebe8b7cfcf16693f1249b324eb273d67602a/yarl-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e23c82b63cd7652fc24d33ed6cc17099d607aa3b4fc4ddc75e95062f3d82df4", size = 104449, upload-time = "2026-09-15T19:29:57.239Z" }, - { url = "https://files.pythonhosted.org/packages/1d/fc/21d74789198ad68a23a209ab0d73fe5a52d39ebbd9945041e72827acdd77/yarl-1.25.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee202350cf57abf0e9502a41601841019c25d3db7ff52d980aaf31446254059", size = 116828, upload-time = "2026-09-15T19:29:59.031Z" }, - { url = "https://files.pythonhosted.org/packages/8f/31/90891ddb61848c067ebd1fb505ab5902a6e7d4707c2f3823f67ff37883d3/yarl-1.25.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5df89f769cc8ff94c3d7e7603386fba309d25ce5240132d26c15baa8d0e96c4c", size = 107150, upload-time = "2026-09-15T19:30:00.868Z" }, - { url = "https://files.pythonhosted.org/packages/a1/15/f3d18743d3688b5f01aa83034b6c00665692ab20e1d0c89a29000d4979ea/yarl-1.25.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:83e9f4a25085bd4b7214701a0794ff1f50fc633ffb8bdfebf07abdd81c2db126", size = 124704, upload-time = "2026-09-15T19:30:03.128Z" }, - { url = "https://files.pythonhosted.org/packages/99/37/718789d8004775d6a2db86b2afc72b1d156e0590b88a1b8634ddd4bdb8ee/yarl-1.25.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e636b64d24fd9c38053c5e389a1174c66361fa49dcfd220f4dd35b4abde7cb89", size = 129246, upload-time = "2026-09-15T19:30:05.014Z" }, - { url = "https://files.pythonhosted.org/packages/28/b9/7818ac6dec7fbcd16be2d19495807c01e2c38834e57d41c63356a75e786b/yarl-1.25.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e5637ca8d0bd7fb72648a6c7934af4baaccb697657f7438c9d264fc2abb8b0b1", size = 118071, upload-time = "2026-09-15T19:30:06.977Z" }, - { url = "https://files.pythonhosted.org/packages/b2/e3/8d098cafb30a64df7283b5a5dd0d32d22a71b18a1b9ec071d0776ffe5c2a/yarl-1.25.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:683e362b8ba453080f7489c66f4ea794e751c35b72e7eab3575ef784c2fbc7fb", size = 116180, upload-time = "2026-09-15T19:30:08.836Z" }, - { url = "https://files.pythonhosted.org/packages/20/9c/fbe9432478d87e00eef80242e15179639df162cb3d5d8d978fc56dcb6c51/yarl-1.25.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:df23df54b5114a17c2d0ef192433e2e5a9f0c5178c32375e90b7cfc965f349d0", size = 116578, upload-time = "2026-09-15T19:30:10.782Z" }, - { url = "https://files.pythonhosted.org/packages/b1/8e/b3dfd03732236b86b0bcf06a72a37de412ff6f82e719a947c3c651d4dece/yarl-1.25.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f53dcd26694f148f738edc052b5a69234833e739f10f4c3287bdfd8ec0f7b326", size = 108886, upload-time = "2026-09-15T19:30:12.951Z" }, - { url = "https://files.pythonhosted.org/packages/83/e1/94dacb650d4963d5f844bc3df7ba70288cb7b68ed5a4d070da71acb19b14/yarl-1.25.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b8075fe90bc08e40b8b8a1874fab42ee4c7b56af05c5886e9cc841397f916908", size = 124098, upload-time = "2026-09-15T19:30:14.963Z" }, - { url = "https://files.pythonhosted.org/packages/d6/3f/c93f76a218258c7bfc60dd27fd56e9102bdbc625517f4a6ee673295fe4e4/yarl-1.25.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a8c2b841478068440d8b733005d13a5ef535b9928cbc05f17182d410f32ba449", size = 115768, upload-time = "2026-09-15T19:30:16.736Z" }, - { url = "https://files.pythonhosted.org/packages/a8/79/4d93f13c3b05cda3c962805dec28cbc255c50239b3457808abc5633a00c2/yarl-1.25.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ca32926d7d77bcc8838425c4c95e040a3ace1cb7dfdae599013458dcda2607ca", size = 122461, upload-time = "2026-09-15T19:30:18.901Z" }, - { url = "https://files.pythonhosted.org/packages/c5/8e/e2ba83b3a9bfc1d3b882ad35fa8abc04a7af4d9356f2e329a23d0c8d889d/yarl-1.25.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:192a866877a49993949ef1975864ad8728bea28ee810f6abe1a0729c2b500426", size = 118295, upload-time = "2026-09-15T19:30:21.07Z" }, - { url = "https://files.pythonhosted.org/packages/42/67/cb5ea1baa0c0ac60bda44ce59f601133154af2a2e67722d3517f8793855d/yarl-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:3f4d48a6112712973e676bd792121fee470e432d749177162d9949d5c9460a1b", size = 102929, upload-time = "2026-09-15T19:30:23.122Z" }, - { url = "https://files.pythonhosted.org/packages/2f/85/9a1e98de10fc0e738d517efd2a9984c3e7db6cf35fa72b2b373988a9e9b7/yarl-1.25.1-cp310-cp310-win_arm64.whl", hash = "sha256:48796ea00a303961507dc6c8437c4b325a6fc3f95f7c36c71b91ea9a8150963c", size = 98854, upload-time = "2026-09-15T19:30:25.102Z" }, { url = "https://files.pythonhosted.org/packages/83/b3/2cea721d495ca57f8f414aa4867ee263f486b274e07463158cf52f02ba7f/yarl-1.25.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d693bf4bf534e9ba3ae2780cfd577f5135629f7b5ac653490859d0b77864865", size = 143794, upload-time = "2026-09-15T19:30:26.946Z" }, { url = "https://files.pythonhosted.org/packages/55/e6/cd145cff8e5cf60b8b3c41fbecfa2a45028a8dec3fbc52bec03595ff3d3b/yarl-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ab2054c5531af2a9ba7b69b8ec91e4f884420e83a8c5e579b013084cb57e5e5d", size = 103993, upload-time = "2026-09-15T19:30:28.661Z" }, { url = "https://files.pythonhosted.org/packages/ce/7c/fbb40fe2d53747c40aa36a9e2bd2178a202f942bda0b670f3306d4aefbce/yarl-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:564fdc7085d2245ab84f88882fdb1d6ac0723124bff6ded35bfb1c00f812630d", size = 104010, upload-time = "2026-09-15T19:30:31.069Z" }, From 5f178eebf24d4023ca62c93a962f1d0337d547bf Mon Sep 17 00:00:00 2001 From: Cody Fincher Date: Fri, 9 Oct 2026 01:32:48 +0000 Subject: [PATCH 2/8] refactor(typing): resolve Python 3.11 mypy and pyright diagnostics --- sqlspec/typing.py | 5 ++-- .../test_aiosqlite/test_exception_mapping.py | 8 +++---- .../test_spanner/test_adk_artifact_store.py | 14 +++++------ .../adapters/test_spanner/test_adk_store.py | 24 +++++++++---------- .../test_sqlite/test_exception_mapping.py | 8 +++---- 5 files changed, 29 insertions(+), 30 deletions(-) diff --git a/sqlspec/typing.py b/sqlspec/typing.py index cd27b4373..938adca52 100644 --- a/sqlspec/typing.py +++ b/sqlspec/typing.py @@ -251,8 +251,9 @@ def get_type_adapter(f: "type[T]") -> Any: Returns: :class:`pydantic.TypeAdapter`[:class:`typing.TypeVar`[T]] """ - type_adapter = _typing.TypeAdapter + type_adapter: Any = _typing.TypeAdapter if PYDANTIC_USE_FAILFAST: fail_fast = _typing.FailFast - return type_adapter(Annotated[f, fail_fast()]) + annotated_type: Any = Annotated + return type_adapter(annotated_type[f, fail_fast()]) return type_adapter(f) diff --git a/tests/unit/adapters/test_aiosqlite/test_exception_mapping.py b/tests/unit/adapters/test_aiosqlite/test_exception_mapping.py index 5a363e318..a99e560f0 100644 --- a/tests/unit/adapters/test_aiosqlite/test_exception_mapping.py +++ b/tests/unit/adapters/test_aiosqlite/test_exception_mapping.py @@ -11,15 +11,15 @@ class _SqliteError(sqlite3.OperationalError): def __init__(self, message: str, code: int | None = None, name: str | None = None) -> None: super().__init__(message) - self.sqlite_errorcode = code - self.sqlite_errorname = name + setattr(self, "sqlite_errorcode", code) + setattr(self, "sqlite_errorname", name) class _SqliteIntegrityError(sqlite3.IntegrityError): def __init__(self, message: str, code: int | None = None, name: str | None = None) -> None: super().__init__(message) - self.sqlite_errorcode = code - self.sqlite_errorname = name + setattr(self, "sqlite_errorcode", code) + setattr(self, "sqlite_errorname", name) def test_busy_error_code_maps_to_deadlock() -> None: diff --git a/tests/unit/adapters/test_spanner/test_adk_artifact_store.py b/tests/unit/adapters/test_spanner/test_adk_artifact_store.py index f40157860..f4b5f2139 100644 --- a/tests/unit/adapters/test_spanner/test_adk_artifact_store.py +++ b/tests/unit/adapters/test_spanner/test_adk_artifact_store.py @@ -1,6 +1,6 @@ """Unit tests for SpannerSyncADKArtifactStore and SpannerAsyncADKArtifactStore.""" -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any, cast from unittest.mock import AsyncMock, MagicMock @@ -60,7 +60,7 @@ def _sample_record( mime_type="application/pdf", canonical_uri=f"gs://bucket/app-1/user-1/{filename}/v{version}", custom_metadata=custom_metadata if custom_metadata is not None else {"author": "agent"}, - created_at=datetime(2026, 1, 1, 12, 0, tzinfo=timezone.utc), + created_at=datetime(2026, 1, 1, 12, 0, tzinfo=UTC), ) @@ -143,7 +143,7 @@ def test_sync_insert_and_get_artifact_user_and_session_scoped(mocker: Any) -> No assert insert_params["session_id"] == "" assert insert_params["version"] == 0 - now = datetime(2026, 1, 1, 12, 0, tzinfo=timezone.utc) + now = datetime(2026, 1, 1, 12, 0, tzinfo=UTC) fake_row = ( "app-1", "user-1", @@ -179,7 +179,7 @@ def test_sync_insert_and_get_artifact_user_and_session_scoped(mocker: Any) -> No def test_sync_list_versions_keys_and_next_version(mocker: Any) -> None: """list_artifact_versions, list_artifact_keys, and get_next_version build expected Spanner queries.""" store = SpannerSyncADKArtifactStore(_make_sync_config()) - now = datetime(2026, 1, 1, 12, 0, tzinfo=timezone.utc) + now = datetime(2026, 1, 1, 12, 0, tzinfo=UTC) rows = [ ("app-1", "user-1", "sess-1", "report.pdf", 0, "application/pdf", "gs://b/v0", None, now), ("app-1", "user-1", "sess-1", "report.pdf", 1, "application/pdf", "gs://b/v1", {"k": 1}, now), @@ -210,7 +210,7 @@ def test_sync_list_versions_keys_and_next_version(mocker: Any) -> None: def test_sync_delete_artifact_and_delete_older_than(mocker: Any) -> None: """delete_artifact and delete_artifacts_older_than atomically query and delete inside run_in_transaction.""" store = SpannerSyncADKArtifactStore(_make_sync_config()) - now = datetime(2026, 1, 1, 12, 0, tzinfo=timezone.utc) + now = datetime(2026, 1, 1, 12, 0, tzinfo=UTC) row = ("app-1", "user-1", "sess-1", "report.pdf", 0, "application/pdf", "gs://b/v0", None, now) tx = MagicMock() @@ -230,7 +230,7 @@ def test_sync_delete_artifact_and_delete_older_than(mocker: Any) -> None: tx.reset_mock() tx.execute_sql.return_value = [row] - cutoff = datetime(2026, 2, 1, 0, 0, tzinfo=timezone.utc) + cutoff = datetime(2026, 2, 1, 0, 0, tzinfo=UTC) swept = store.delete_artifacts_older_than(cutoff, app_name="app-1") assert len(swept) == 1 assert "created_at < @before" in tx.execute_sql.call_args.args[0] @@ -245,7 +245,7 @@ def test_sync_delete_artifact_and_delete_older_than(mocker: Any) -> None: async def test_async_artifact_store_operations(mocker: Any) -> None: """SpannerAsyncADKArtifactStore executes async snapshot reads and transactional writes.""" store = SpannerAsyncADKArtifactStore(_make_async_config()) - now = datetime(2026, 1, 1, 12, 0, tzinfo=timezone.utc) + now = datetime(2026, 1, 1, 12, 0, tzinfo=UTC) row = ("app-1", "user-1", "", "notes.md", 0, "text/markdown", "gs://b/notes/v0", '{"tag":"x"}', now) tx = MagicMock() diff --git a/tests/unit/adapters/test_spanner/test_adk_store.py b/tests/unit/adapters/test_spanner/test_adk_store.py index c83c08109..38fe549ff 100644 --- a/tests/unit/adapters/test_spanner/test_adk_store.py +++ b/tests/unit/adapters/test_spanner/test_adk_store.py @@ -1,17 +1,15 @@ -# pyright: reportPrivateUsage=false """Unit tests for Spanner ADK store behavior.""" from collections.abc import Iterator from contextlib import contextmanager -from datetime import datetime, timezone +from datetime import UTC, datetime from types import SimpleNamespace -from typing import Any, cast, get_args, get_origin +from typing import Any, NotRequired, cast, get_args, get_origin from unittest.mock import AsyncMock, MagicMock, patch import pytest from google.api_core.exceptions import NotFound from google.cloud.spanner_v1 import param_types -from typing_extensions import NotRequired from sqlspec.adapters.spanner.adk import ( SpannerADKConfig, @@ -33,7 +31,7 @@ def _mock_config(adk_config: dict[str, object] | None = None) -> MagicMock: def _spanner_not_found(message: str) -> NotFound: - return NotFound(message) # type: ignore[no-untyped-call] + return cast("NotFound", cast("Any", NotFound)(message)) def test_spanner_adk_config_types_adapter_local_optimizations() -> None: @@ -71,7 +69,7 @@ def test_spanner_adk_config_types_adapter_local_optimizations() -> None: def test_insert_event_preserves_event_record_timestamp() -> None: """Spanner stores the ADK event timestamp, not the commit timestamp.""" store = SpannerSyncADKStore(_mock_config()) - timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) event: StoredEvent = { "id": "event-1", "app_name": "app", @@ -83,7 +81,7 @@ def test_insert_event_preserves_event_record_timestamp() -> None: } with patch.object(type(store), "_run_write") as run_write: - store._insert_event(event) # pyright: ignore[reportPrivateUsage] + store._insert_event(event) statements = run_write.call_args.args[0] sql, params, _types = statements[0] @@ -96,7 +94,7 @@ def test_insert_event_preserves_event_record_timestamp() -> None: def test_append_event_and_update_state_preserves_event_record_timestamp() -> None: """Atomic append uses the ADK event timestamp while session update uses commit time.""" store = SpannerSyncADKStore(_mock_config()) - timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) event: StoredEvent = { "id": "event-1", "app_name": "app", @@ -214,7 +212,7 @@ def _batch_update(stmts: list[tuple[str, dict[str, Any], dict[str, Any]]]) -> tu database.run_in_transaction.side_effect = _run_in_txn store = SpannerSyncADKMemoryStore(config) - timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) entry_existing: StoredMemory = { "id": "memory-0", "session_id": "session-1", @@ -269,7 +267,7 @@ def _batch_update(stmts: list[tuple[str, dict[str, Any], dict[str, Any]]]) -> tu def test_spanner_memory_rows_to_records_decodes_json_and_embedding_fields() -> None: store = SpannerSyncADKMemoryStore(_mock_config()) - timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) records = store._rows_to_records([ ( @@ -612,7 +610,7 @@ async def _batch_update(stmts: list[tuple[str, dict[str, Any], dict[str, Any]]]) return await job(txn) database.run_in_transaction = _run_in_txn - now = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + now = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) snapshot = MagicMock() @@ -660,7 +658,7 @@ async def _rows() -> Any: async def test_async_adk_store_append_event_and_update_state_and_get_events() -> None: """Verify SpannerAsyncADKStore atomic append_event_and_update_state and get_events.""" store = SpannerAsyncADKStore(_mock_config()) - timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) event: StoredEvent = { "id": "event-1", "app_name": "app", @@ -750,7 +748,7 @@ async def _batch_update(stmts: list[tuple[str, dict[str, Any], dict[str, Any]]]) await store.create_tables() database.update_ddl.assert_awaited_once() - timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) entry: StoredMemory = { "id": "memory-1", "session_id": "session-1", diff --git a/tests/unit/adapters/test_sqlite/test_exception_mapping.py b/tests/unit/adapters/test_sqlite/test_exception_mapping.py index 36cde8db2..c77a81b57 100644 --- a/tests/unit/adapters/test_sqlite/test_exception_mapping.py +++ b/tests/unit/adapters/test_sqlite/test_exception_mapping.py @@ -11,15 +11,15 @@ class _SqliteError(sqlite3.OperationalError): def __init__(self, message: str, code: int | None = None, name: str | None = None) -> None: super().__init__(message) - self.sqlite_errorcode = code - self.sqlite_errorname = name + setattr(self, "sqlite_errorcode", code) + setattr(self, "sqlite_errorname", name) class _SqliteIntegrityError(sqlite3.IntegrityError): def __init__(self, message: str, code: int | None = None, name: str | None = None) -> None: super().__init__(message) - self.sqlite_errorcode = code - self.sqlite_errorname = name + setattr(self, "sqlite_errorcode", code) + setattr(self, "sqlite_errorname", name) def test_primary_key_code_maps_to_unique_violation() -> None: From 4ce3314fdef6a2a9c6e81fde56bb6b4f0328b55d Mon Sep 17 00:00:00 2001 From: Cody Fincher Date: Fri, 9 Oct 2026 01:36:50 +0000 Subject: [PATCH 3/8] refactor(core): modernize non-adapter modules and tests for Python 3.11 --- docs/examples/extensions/adk/memory_store.py | 4 +-- .../extensions/adk/tool_integration.py | 6 ++--- sqlspec/_typing.py | 4 +-- sqlspec/base.py | 4 +-- sqlspec/builder/_base.py | 3 +-- sqlspec/builder/_ddl.py | 3 +-- sqlspec/builder/_dml.py | 3 +-- sqlspec/builder/_explain.py | 3 +-- sqlspec/builder/_insert.py | 3 +-- sqlspec/builder/_join.py | 3 +-- sqlspec/builder/_merge.py | 3 +-- sqlspec/builder/_select.py | 3 +-- sqlspec/builder/_update.py | 3 +-- sqlspec/builder/_values.py | 3 +-- sqlspec/config.py | 4 +-- sqlspec/core/explain.py | 4 +-- sqlspec/core/parameters/_types.py | 4 +-- sqlspec/core/type_converter.py | 4 +-- sqlspec/data_dictionary/_dependencies.py | 8 +++--- sqlspec/data_dictionary/_types.py | 10 +++---- sqlspec/driver/_async.py | 3 +-- sqlspec/driver/_common.py | 3 +-- sqlspec/driver/_exception_handler.py | 3 +-- sqlspec/driver/_query_cache.py | 3 +-- sqlspec/driver/_stream.py | 4 +-- sqlspec/driver/_sync.py | 3 +-- sqlspec/extensions/adk/_config_utils.py | 4 +-- sqlspec/extensions/adk/artifact/service.py | 4 +-- sqlspec/extensions/adk/converters.py | 13 ++++------ sqlspec/extensions/adk/maintenance.py | 10 +++---- sqlspec/extensions/adk/memory/converters.py | 8 +++--- sqlspec/extensions/adk/service.py | 4 +-- sqlspec/extensions/adk/store.py | 4 +-- sqlspec/extensions/events/_hints.py | 4 +-- sqlspec/extensions/events/_models.py | 4 +-- sqlspec/extensions/events/_payload.py | 14 +++++----- sqlspec/extensions/events/_queue.py | 8 +++--- sqlspec/extensions/fastapi/providers.py | 6 ++--- sqlspec/extensions/litestar/providers.py | 3 +-- sqlspec/extensions/litestar/store.py | 4 +-- sqlspec/loader.py | 4 +-- sqlspec/migrations/_backup.py | 4 +-- sqlspec/migrations/base.py | 4 +-- sqlspec/migrations/utils.py | 4 +-- sqlspec/migrations/version.py | 12 ++++----- sqlspec/observability/_formatters/_aws.py | 4 +-- sqlspec/protocols.py | 4 +-- sqlspec/storage/backends/base.py | 3 +-- sqlspec/storage/backends/obstore.py | 3 +-- sqlspec/storage/pipeline.py | 4 +-- sqlspec/utils/portal.py | 4 +-- sqlspec/utils/serializers/_json.py | 4 +-- sqlspec/utils/type_converters.py | 4 +-- tests/typing/typing_lazy_exports.py | 3 +-- tests/unit/core/test_capabilities.py | 5 ++-- tests/unit/core/test_cursor_codec.py | 4 +-- tests/unit/core/test_filters.py | 3 +-- tests/unit/core/test_type_conversion.py | 8 +++--- .../unit/exceptions/test_exception_handler.py | 2 +- .../test_adk/test_artifact_service.py | 16 ++++++------ .../extensions/test_adk/test_converters.py | 19 +++++--------- .../extensions/test_adk/test_maintenance.py | 4 +-- .../test_adk/test_memory_converters.py | 4 +-- .../unit/extensions/test_adk/test_service.py | 26 +++++++++---------- .../test_adk/test_store_common_mixins.py | 10 +++---- .../test_events/test_backend_factories.py | 13 +++++----- .../test_events/test_channel_extended.py | 4 +-- .../test_events/test_listener_hubs.py | 6 ++--- .../extensions/test_events/test_models.py | 22 ++++++++-------- .../extensions/test_events/test_primitives.py | 4 +-- .../unit/extensions/test_events/test_queue.py | 26 +++++++++---------- .../extensions/test_fastapi/test_providers.py | 8 +++--- .../test_litestar/test_providers.py | 4 +-- tests/unit/migrations/test_version.py | 8 +++--- .../observability/test_observability_core.py | 3 +-- .../serializers/test_default_type_encoders.py | 2 +- tests/unit/utils/test_env.py | 3 +-- tests/unit/utils/test_serialization.py | 12 ++++----- tests/unit/utils/test_sync_tools.py | 3 +-- tools/profiling.py | 4 +-- tools/scripts/pgo_training.py | 7 ++--- tools/sphinx_ext/playground.py | 3 +-- 82 files changed, 220 insertions(+), 265 deletions(-) diff --git a/docs/examples/extensions/adk/memory_store.py b/docs/examples/extensions/adk/memory_store.py index f66c6fed5..5cea194bf 100644 --- a/docs/examples/extensions/adk/memory_store.py +++ b/docs/examples/extensions/adk/memory_store.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING import anyio @@ -37,7 +37,7 @@ async def _run() -> "list[StoredEvent]": invocation_id="inv_1", author="user", content=types.Content(parts=[types.Part(text="Hello")]), - timestamp=datetime.now(timezone.utc).timestamp(), + timestamp=datetime.now(UTC).timestamp(), ) event_record = event_to_record(event, session["app_name"], session["user_id"], session["id"]) await store.append_event(event_record) diff --git a/docs/examples/extensions/adk/tool_integration.py b/docs/examples/extensions/adk/tool_integration.py index 9f08da5cd..a2af39efb 100644 --- a/docs/examples/extensions/adk/tool_integration.py +++ b/docs/examples/extensions/adk/tool_integration.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime import anyio import pytest @@ -30,11 +30,11 @@ async def _run() -> int: "scope": "user", "event_id": "evt_1", "author": "tool", - "timestamp": datetime.now(timezone.utc), + "timestamp": datetime.now(UTC), "content_json": {"tool": "search", "query": "sqlspec"}, "content_text": "tool:search query=sqlspec", "metadata_json": None, - "inserted_at": datetime.now(timezone.utc), + "inserted_at": datetime.now(UTC), "embedding": None, } await store.insert_memory_entries([record]) diff --git a/sqlspec/_typing.py b/sqlspec/_typing.py index 67021aa3d..8185015ec 100644 --- a/sqlspec/_typing.py +++ b/sqlspec/_typing.py @@ -10,9 +10,9 @@ from collections.abc import Iterable, Mapping from dataclasses import dataclass from enum import Enum -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, Protocol, cast, runtime_checkable +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, Protocol, Self, cast, runtime_checkable -from typing_extensions import Self, TypeVar, dataclass_transform +from typing_extensions import TypeVar, dataclass_transform from sqlspec.utils.module_loader import ( dependency_flag, diff --git a/sqlspec/base.py b/sqlspec/base.py index bbd438c44..11439079c 100644 --- a/sqlspec/base.py +++ b/sqlspec/base.py @@ -3,10 +3,10 @@ import weakref from collections.abc import Awaitable, Coroutine from contextlib import AbstractAsyncContextManager, AbstractContextManager -from typing import TYPE_CHECKING, Any, ClassVar, Generic, TypeGuard, cast, overload +from typing import TYPE_CHECKING, Any, ClassVar, Generic, Self, TypeGuard, cast, overload from mypy_extensions import mypyc_attr -from typing_extensions import Self, TypeVar +from typing_extensions import TypeVar from sqlspec.config import ( AsyncConfigT, diff --git a/sqlspec/builder/_base.py b/sqlspec/builder/_base.py index 3f9416ea3..e320847b6 100644 --- a/sqlspec/builder/_base.py +++ b/sqlspec/builder/_base.py @@ -6,7 +6,7 @@ import re from abc import abstractmethod from collections.abc import Callable, Iterable, Mapping -from typing import Any, Final, NoReturn, cast +from typing import Any, Final, NoReturn, Self, cast import sqlglot from sqlglot import Dialect, exp @@ -23,7 +23,6 @@ from sqlglot.optimizer.pushdown_projections import pushdown_projections as _pushdown_projections_rule from sqlglot.optimizer.qualify_columns import quote_identifiers as _quote_identifiers_rule from sqlglot.optimizer.simplify import simplify as _simplify_rule -from typing_extensions import Self from sqlspec.builder._locking import register_lock_generator from sqlspec.builder._parsing_utils import _normalize_dialect, _resolve_dialect diff --git a/sqlspec/builder/_ddl.py b/sqlspec/builder/_ddl.py index bcb08f8fd..ade70767b 100644 --- a/sqlspec/builder/_ddl.py +++ b/sqlspec/builder/_ddl.py @@ -4,12 +4,11 @@ TRUNCATE, and other schema manipulation statements. """ -from typing import TYPE_CHECKING, Any, ClassVar, cast +from typing import TYPE_CHECKING, Any, ClassVar, Self, cast from mypy_extensions import trait from sqlglot import exp from sqlglot.errors import ParseError -from typing_extensions import Self from sqlspec.builder._base import BuiltQuery, QueryBuilder from sqlspec.builder._parsing_utils import _mark_explicit_table_quotes, _normalize_dialect diff --git a/sqlspec/builder/_dml.py b/sqlspec/builder/_dml.py index 6fa95732b..0aeaba6b6 100644 --- a/sqlspec/builder/_dml.py +++ b/sqlspec/builder/_dml.py @@ -1,11 +1,10 @@ """Reusable mixins for INSERT/UPDATE/DELETE builders.""" from collections.abc import Mapping, Sequence -from typing import TYPE_CHECKING, Any, cast +from typing import TYPE_CHECKING, Any, Self, cast from mypy_extensions import trait from sqlglot import exp -from typing_extensions import Self from sqlspec.builder._base import BuiltQuery, QueryBuilder from sqlspec.builder._parsing_utils import ( diff --git a/sqlspec/builder/_explain.py b/sqlspec/builder/_explain.py index dd3275958..ec5f9014a 100644 --- a/sqlspec/builder/_explain.py +++ b/sqlspec/builder/_explain.py @@ -4,11 +4,10 @@ dialect-aware SQL generation. """ -from typing import TYPE_CHECKING, Any, Final +from typing import TYPE_CHECKING, Any, Final, Self from mypy_extensions import trait from sqlglot import Dialect, exp -from typing_extensions import Self from sqlspec.core import SQL, StatementConfig from sqlspec.core.explain import ORACLE_EXPLAIN_PREFIX, ORACLE_MANAGED_EXPLAIN_META_KEY, ExplainFormat, ExplainOptions diff --git a/sqlspec/builder/_insert.py b/sqlspec/builder/_insert.py index 325de0797..972eacd65 100644 --- a/sqlspec/builder/_insert.py +++ b/sqlspec/builder/_insert.py @@ -4,10 +4,9 @@ parameter binding and validation. """ -from typing import TYPE_CHECKING, Any, Final +from typing import TYPE_CHECKING, Any, Final, Self from sqlglot import exp -from typing_extensions import Self from sqlspec.builder._base import QueryBuilder from sqlspec.builder._dml import InsertFromSelectMixin, InsertIntoClauseMixin, InsertValuesMixin, ReturningClauseMixin diff --git a/sqlspec/builder/_join.py b/sqlspec/builder/_join.py index 63b30a861..5acaa32c1 100644 --- a/sqlspec/builder/_join.py +++ b/sqlspec/builder/_join.py @@ -4,11 +4,10 @@ Provides mixins for JOIN operations in SELECT statements. """ -from typing import TYPE_CHECKING, Any, Union, cast, final +from typing import TYPE_CHECKING, Any, Self, Union, cast, final from mypy_extensions import trait from sqlglot import exp -from typing_extensions import Self from sqlspec.builder._base import BuiltQuery, QueryBuilder from sqlspec.builder._parsing_utils import extract_sql_object_expression, parse_table_expression diff --git a/sqlspec/builder/_merge.py b/sqlspec/builder/_merge.py index 1877bcf3f..c331f8bde 100644 --- a/sqlspec/builder/_merge.py +++ b/sqlspec/builder/_merge.py @@ -9,13 +9,12 @@ from datetime import date, datetime, time from decimal import Decimal from itertools import starmap -from typing import TYPE_CHECKING, Any, Final, cast +from typing import TYPE_CHECKING, Any, Final, Self, cast from uuid import UUID from mypy_extensions import trait from sqlglot import exp from sqlglot.errors import ParseError -from typing_extensions import Self from sqlspec.builder._base import QueryBuilder from sqlspec.builder._explain import ExplainMixin diff --git a/sqlspec/builder/_select.py b/sqlspec/builder/_select.py index 6585b4ac2..5d2100104 100644 --- a/sqlspec/builder/_select.py +++ b/sqlspec/builder/_select.py @@ -7,11 +7,10 @@ # pyright: reportPrivateUsage=false, reportPrivateImportUsage=false import re -from typing import TYPE_CHECKING, Any, Final, Union, cast +from typing import TYPE_CHECKING, Any, Final, Self, Union, cast from mypy_extensions import trait from sqlglot import exp -from typing_extensions import Self from sqlspec.builder._base import BuiltQuery, QueryBuilder from sqlspec.builder._explain import ExplainMixin diff --git a/sqlspec/builder/_update.py b/sqlspec/builder/_update.py index e8a0e77e5..91018af52 100644 --- a/sqlspec/builder/_update.py +++ b/sqlspec/builder/_update.py @@ -4,10 +4,9 @@ parameter binding and validation. """ -from typing import TYPE_CHECKING, Any, cast +from typing import TYPE_CHECKING, Any, Self, cast from sqlglot import exp -from typing_extensions import Self from sqlspec.builder._base import BuiltQuery, QueryBuilder from sqlspec.builder._dml import ( diff --git a/sqlspec/builder/_values.py b/sqlspec/builder/_values.py index cb0f22de2..8bdbce041 100644 --- a/sqlspec/builder/_values.py +++ b/sqlspec/builder/_values.py @@ -5,10 +5,9 @@ """ from collections.abc import Mapping, Sequence -from typing import Any +from typing import Any, Self from sqlglot import exp -from typing_extensions import Self from sqlspec.builder._base import QueryBuilder from sqlspec.builder._parsing_utils import extract_sql_object_expression diff --git a/sqlspec/config.py b/sqlspec/config.py index 41d52bff0..e9839cb46 100644 --- a/sqlspec/config.py +++ b/sqlspec/config.py @@ -15,9 +15,9 @@ from difflib import get_close_matches from inspect import Signature, signature from pathlib import Path -from typing import TYPE_CHECKING, Any, ClassVar, Generic, Literal, TypeAlias, TypeVar, cast +from typing import TYPE_CHECKING, Any, ClassVar, Generic, Literal, NotRequired, TypeAlias, TypeVar, cast -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from sqlspec.core import TypeCoercionCapabilities from sqlspec.core.config_runtime import ( diff --git a/sqlspec/core/explain.py b/sqlspec/core/explain.py index c87002cc0..159ef2b5e 100644 --- a/sqlspec/core/explain.py +++ b/sqlspec/core/explain.py @@ -4,7 +4,7 @@ database dialects. """ -from enum import Enum +from enum import StrEnum from typing import Any, Final from mypy_extensions import mypyc_attr @@ -30,7 +30,7 @@ ORACLE_EXPLAIN_PREFIX: Final[str] = "EXPLAIN PLAN FOR " -class ExplainFormat(str, Enum): +class ExplainFormat(StrEnum): """Output formats for EXPLAIN statements. Different databases support different output formats: diff --git a/sqlspec/core/parameters/_types.py b/sqlspec/core/parameters/_types.py index 703cd9fb5..1e6514916 100644 --- a/sqlspec/core/parameters/_types.py +++ b/sqlspec/core/parameters/_types.py @@ -3,7 +3,7 @@ from collections.abc import Callable, Collection, Generator, Iterable, Mapping, Sequence from datetime import date, datetime, time from decimal import Decimal -from enum import Enum +from enum import StrEnum from types import MappingProxyType from typing import Any, Final, Literal, TypeAlias @@ -134,7 +134,7 @@ @mypyc_attr(allow_interpreted_subclasses=False) -class ParameterStyle(str, Enum): +class ParameterStyle(StrEnum): """Enumeration of supported SQL parameter placeholder styles.""" NONE = "none" diff --git a/sqlspec/core/type_converter.py b/sqlspec/core/type_converter.py index e340e9334..8af8ded54 100644 --- a/sqlspec/core/type_converter.py +++ b/sqlspec/core/type_converter.py @@ -1,7 +1,7 @@ """Base classes and scalar helpers for adapter type conversion.""" import json -from datetime import date, datetime, time, timezone +from datetime import UTC, date, datetime, time from decimal import Decimal from typing import Any from uuid import UUID @@ -111,7 +111,7 @@ def format_datetime_rfc3339(dt: "datetime") -> str: RFC 3339 formatted datetime string. """ if dt.tzinfo is None: - dt = dt.replace(tzinfo=timezone.utc) + dt = dt.replace(tzinfo=UTC) return dt.isoformat() diff --git a/sqlspec/data_dictionary/_dependencies.py b/sqlspec/data_dictionary/_dependencies.py index 6a1664138..b73e3b980 100644 --- a/sqlspec/data_dictionary/_dependencies.py +++ b/sqlspec/data_dictionary/_dependencies.py @@ -1,7 +1,7 @@ """Typed dependency graph helpers for data-dictionary DDL ordering.""" from collections import defaultdict -from enum import Enum +from enum import StrEnum from typing import TYPE_CHECKING from sqlspec.data_dictionary._types import ( @@ -32,7 +32,7 @@ ) -class DependencyEdgeKind(str, Enum): +class DependencyEdgeKind(StrEnum): """Kinds of metadata dependency edges used for DDL ordering.""" CHECK_EXPRESSION = "check_expression" @@ -51,7 +51,7 @@ class DependencyEdgeKind(str, Enum): VIEW_REFERENCE = "view_reference" -class DependencyStrength(str, Enum): +class DependencyStrength(StrEnum): """Strength of a dependency for ordering and diagnostics.""" HARD = "hard" @@ -59,7 +59,7 @@ class DependencyStrength(str, Enum): SOFT = "soft" -class DependencyDirection(str, Enum): +class DependencyDirection(StrEnum): """Relative direction for create and drop ordering.""" FROM_BEFORE_TO = "from_before_to" diff --git a/sqlspec/data_dictionary/_types.py b/sqlspec/data_dictionary/_types.py index 1de0a48c0..7092b53d3 100644 --- a/sqlspec/data_dictionary/_types.py +++ b/sqlspec/data_dictionary/_types.py @@ -1,4 +1,4 @@ -from enum import Enum +from enum import StrEnum from typing import TYPE_CHECKING, Any, TypedDict, cast from mypy_extensions import mypyc_attr @@ -52,7 +52,7 @@ ) -class MetadataSupport(str, Enum): +class MetadataSupport(StrEnum): """Support status for a metadata domain.""" GATED = "gated" @@ -62,7 +62,7 @@ class MetadataSupport(str, Enum): UNSUPPORTED = "unsupported" -class MetadataFidelity(str, Enum): +class MetadataFidelity(StrEnum): """Fidelity of a metadata response.""" GENERATED = "generated" @@ -74,7 +74,7 @@ class MetadataFidelity(str, Enum): UNSUPPORTED = "unsupported" -class MetadataRisk(str, Enum): +class MetadataRisk(StrEnum): """Risk or access gate attached to a metadata domain.""" BILLED = "billed" @@ -87,7 +87,7 @@ class MetadataRisk(str, Enum): VERSION_GATED = "version_gated" -class MetadataSource(str, Enum): +class MetadataSource(StrEnum): """Source used to produce a metadata response.""" CATALOG = "catalog" diff --git a/sqlspec/driver/_async.py b/sqlspec/driver/_async.py index 2d9bb2cf0..2888b0cb9 100644 --- a/sqlspec/driver/_async.py +++ b/sqlspec/driver/_async.py @@ -4,10 +4,9 @@ from abc import abstractmethod from inspect import isawaitable from time import perf_counter -from typing import TYPE_CHECKING, Any, ClassVar, Final, Generic, Literal, TypeVar, cast, final, overload +from typing import TYPE_CHECKING, Any, ClassVar, Final, Generic, Literal, Self, TypeVar, cast, final, overload from mypy_extensions import mypyc_attr -from typing_extensions import Self from sqlspec.core import SQL, StackResult, create_arrow_result from sqlspec.core.result import DMLResult diff --git a/sqlspec/driver/_common.py b/sqlspec/driver/_common.py index dffae51d0..905458353 100644 --- a/sqlspec/driver/_common.py +++ b/sqlspec/driver/_common.py @@ -6,12 +6,11 @@ from collections import OrderedDict from collections.abc import Mapping from time import perf_counter -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NamedTuple, NoReturn, Protocol, cast, overload +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NamedTuple, NoReturn, Protocol, Self, cast, overload import sqlglot from mypy_extensions import mypyc_attr, trait from sqlglot import exp -from typing_extensions import Self from sqlspec.builder import QueryBuilder from sqlspec.core import ( diff --git a/sqlspec/driver/_exception_handler.py b/sqlspec/driver/_exception_handler.py index 3c87e548c..7c1ae9a59 100644 --- a/sqlspec/driver/_exception_handler.py +++ b/sqlspec/driver/_exception_handler.py @@ -30,10 +30,9 @@ import asyncio import sys -from typing import TYPE_CHECKING, Any, TypeVar +from typing import TYPE_CHECKING, Any, Self, TypeVar from mypy_extensions import mypyc_attr -from typing_extensions import Self from sqlspec.exceptions import SQLSpecError diff --git a/sqlspec/driver/_query_cache.py b/sqlspec/driver/_query_cache.py index 3787d2e6c..cacdf96cc 100644 --- a/sqlspec/driver/_query_cache.py +++ b/sqlspec/driver/_query_cache.py @@ -1,10 +1,9 @@ """Query cache for fast-path statement execution.""" from collections import OrderedDict -from typing import TYPE_CHECKING, Final +from typing import TYPE_CHECKING, Final, final from mypy_extensions import mypyc_attr -from typing_extensions import final if TYPE_CHECKING: from sqlspec.core.compiler import OperationProfile, OperationType diff --git a/sqlspec/driver/_stream.py b/sqlspec/driver/_stream.py index d5dc51791..0080856d4 100644 --- a/sqlspec/driver/_stream.py +++ b/sqlspec/driver/_stream.py @@ -11,9 +11,7 @@ import builtins import contextlib -from typing import TYPE_CHECKING, Any, Generic, Protocol, TypeVar, cast, overload - -from typing_extensions import Self +from typing import TYPE_CHECKING, Any, Generic, Protocol, Self, TypeVar, cast, overload from sqlspec.exceptions import SQLSpecError from sqlspec.utils.schema import to_schema diff --git a/sqlspec/driver/_sync.py b/sqlspec/driver/_sync.py index 8a988e0c3..de4bf86f3 100644 --- a/sqlspec/driver/_sync.py +++ b/sqlspec/driver/_sync.py @@ -3,10 +3,9 @@ import logging from abc import abstractmethod from time import perf_counter -from typing import TYPE_CHECKING, Any, ClassVar, Final, Generic, Literal, TypeVar, cast, final, overload +from typing import TYPE_CHECKING, Any, ClassVar, Final, Generic, Literal, Self, TypeVar, cast, final, overload from mypy_extensions import mypyc_attr -from typing_extensions import Self from sqlspec.core import SQL, StackResult, create_arrow_result from sqlspec.core.result import DMLResult diff --git a/sqlspec/extensions/adk/_config_utils.py b/sqlspec/extensions/adk/_config_utils.py index d8300d868..9a07bf8e2 100644 --- a/sqlspec/extensions/adk/_config_utils.py +++ b/sqlspec/extensions/adk/_config_utils.py @@ -1,9 +1,9 @@ """ADK store configuration helpers.""" import importlib -from typing import Any, NoReturn, Protocol, cast +from typing import Any, NoReturn, NotRequired, Protocol, cast -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from sqlspec.exceptions import ImproperConfigurationError, SQLSpecError from sqlspec.utils.module_loader import import_string diff --git a/sqlspec/extensions/adk/artifact/service.py b/sqlspec/extensions/adk/artifact/service.py index 9d1738af7..4b3da0efd 100644 --- a/sqlspec/extensions/adk/artifact/service.py +++ b/sqlspec/extensions/adk/artifact/service.py @@ -13,7 +13,7 @@ import json import logging import re -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any from google.adk.artifacts.base_artifact_service import BaseArtifactService @@ -119,7 +119,7 @@ async def save_artifact( mime_type=mime_type, canonical_uri=canonical_uri, custom_metadata=custom_metadata, - created_at=datetime.now(tz=timezone.utc), + created_at=datetime.now(tz=UTC), ) await self._store.insert_artifact(record) diff --git a/sqlspec/extensions/adk/converters.py b/sqlspec/extensions/adk/converters.py index db6e90c18..4d2e0024e 100644 --- a/sqlspec/extensions/adk/converters.py +++ b/sqlspec/extensions/adk/converters.py @@ -10,7 +10,7 @@ filter, and merge state before handing it to backend stores. """ -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any from google.adk.events.event import Event @@ -47,8 +47,8 @@ def session_to_record(session: "Session") -> StoredSession: user_id=session.user_id, state=filter_temp_state(session.state), # create_time is not exposed by ADK Session; a re-upsert of a restored session will reset this timestamp. - create_time=datetime.now(timezone.utc), - update_time=datetime.fromtimestamp(session.last_update_time, tz=timezone.utc), + create_time=datetime.now(UTC), + update_time=datetime.fromtimestamp(session.last_update_time, tz=UTC), ) @@ -64,10 +64,7 @@ def compute_update_marker(update_time: "datetime") -> str: Returns: ISO 8601 string with microsecond precision. """ - if update_time.tzinfo is not None: - update_time = update_time.astimezone(timezone.utc) - else: - update_time = update_time.replace(tzinfo=timezone.utc) + update_time = update_time.astimezone(UTC) if update_time.tzinfo is not None else update_time.replace(tzinfo=UTC) return update_time.isoformat(timespec="microseconds") @@ -121,7 +118,7 @@ def event_to_record(event: "Event", app_name: str, user_id: str, session_id: str user_id=user_id, session_id=session_id, invocation_id=event.invocation_id, - timestamp=datetime.fromtimestamp(event.timestamp, tz=timezone.utc), + timestamp=datetime.fromtimestamp(event.timestamp, tz=UTC), event_data=event_data, ) diff --git a/sqlspec/extensions/adk/maintenance.py b/sqlspec/extensions/adk/maintenance.py index 68c238ec5..ac720bc7c 100644 --- a/sqlspec/extensions/adk/maintenance.py +++ b/sqlspec/extensions/adk/maintenance.py @@ -11,7 +11,7 @@ """ import time -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any, Literal from typing_extensions import TypedDict @@ -60,7 +60,7 @@ async def prune_sessions(target: Any, *, idle_days: int = 30, app_name: str | No start = time.perf_counter() store = _resolve_session_store(target) table_name = getattr(store, "session_table", "adk_session") - cutoff = datetime.now(timezone.utc) - timedelta(days=retention_days) + cutoff = datetime.now(UTC) - timedelta(days=retention_days) deleted = await _call_store_method(store, "delete_idle_sessions", cutoff, app_name=app_name) elapsed_ms = (time.perf_counter() - start) * 1000.0 return PruneReport(deleted_count=deleted, elapsed_ms=elapsed_ms, table=str(table_name)) @@ -84,7 +84,7 @@ async def prune_events(target: Any, *, older_than_days: int = 90, app_name: str start = time.perf_counter() store = _resolve_session_store(target) table_name = getattr(store, "events_table", "adk_event") - cutoff = datetime.now(timezone.utc) - timedelta(days=retention_days) + cutoff = datetime.now(UTC) - timedelta(days=retention_days) deleted = await _call_store_method(store, "delete_expired_events", cutoff, app_name=app_name) elapsed_ms = (time.perf_counter() - start) * 1000.0 return PruneReport(deleted_count=deleted, elapsed_ms=elapsed_ms, table=str(table_name)) @@ -141,7 +141,7 @@ async def prune_user_state(target: Any, *, idle_days: int = 180, app_name: str | start = time.perf_counter() store = _resolve_session_store(target) table_name = getattr(store, "user_state_table", "adk_user_state") - cutoff = datetime.now(timezone.utc) - timedelta(days=retention_days) + cutoff = datetime.now(UTC) - timedelta(days=retention_days) deleted = await _call_store_method(store, "delete_idle_user_states", cutoff, app_name=app_name) elapsed_ms = (time.perf_counter() - start) * 1000.0 return PruneReport(deleted_count=deleted, elapsed_ms=elapsed_ms, table=str(table_name)) @@ -172,7 +172,7 @@ async def prune_artifacts(target: Any, *, older_than_days: int = 90, app_name: s start = time.perf_counter() service = _resolve_artifact_service(target) table_name = getattr(service.store, "artifact_table", "adk_artifact") - cutoff = datetime.now(timezone.utc) - timedelta(days=retention_days) + cutoff = datetime.now(UTC) - timedelta(days=retention_days) deleted = await _call_store_method(service, "delete_artifacts_older_than", cutoff, app_name=app_name) elapsed_ms = (time.perf_counter() - start) * 1000.0 return PruneReport(deleted_count=deleted, elapsed_ms=elapsed_ms, table=str(table_name)) diff --git a/sqlspec/extensions/adk/memory/converters.py b/sqlspec/extensions/adk/memory/converters.py index 865e4eb59..4cbe6a46e 100644 --- a/sqlspec/extensions/adk/memory/converters.py +++ b/sqlspec/extensions/adk/memory/converters.py @@ -4,7 +4,7 @@ and converting between ADK models and database records. """ -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any from google.adk.memory.memory_entry import MemoryEntry @@ -94,7 +94,7 @@ def event_to_memory_record( custom_metadata = dict(event.custom_metadata) if event.custom_metadata else None - now = datetime.now(timezone.utc) + now = datetime.now(UTC) return StoredMemory( id=str(uuid4()), @@ -104,7 +104,7 @@ def event_to_memory_record( scope=scope, event_id=event.id, author=event.author, - timestamp=datetime.fromtimestamp(event.timestamp, tz=timezone.utc), + timestamp=datetime.fromtimestamp(event.timestamp, tz=UTC), content_json=content_dict, content_text=content_text, metadata_json=custom_metadata, @@ -154,7 +154,7 @@ def memory_entry_to_record( if entry.custom_metadata: merged_metadata.update(entry.custom_metadata) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) timestamp = now if entry.timestamp: diff --git a/sqlspec/extensions/adk/service.py b/sqlspec/extensions/adk/service.py index 4bdebc9d4..07ef1b708 100644 --- a/sqlspec/extensions/adk/service.py +++ b/sqlspec/extensions/adk/service.py @@ -2,7 +2,7 @@ import inspect import logging -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any, cast from google.adk.errors import StaleSessionError @@ -144,7 +144,7 @@ async def get_session( if config: if config.after_timestamp: - after_timestamp = datetime.fromtimestamp(config.after_timestamp, tz=timezone.utc) + after_timestamp = datetime.fromtimestamp(config.after_timestamp, tz=UTC) limit = config.num_recent_events if limit == 0: diff --git a/sqlspec/extensions/adk/store.py b/sqlspec/extensions/adk/store.py index 540172265..3aa1ecabc 100644 --- a/sqlspec/extensions/adk/store.py +++ b/sqlspec/extensions/adk/store.py @@ -3,7 +3,7 @@ import inspect import logging from abc import ABC, abstractmethod -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING, Any, Final, Generic, TypeVar, cast from sqlspec.extensions.adk._config_utils import _adk_session_store_config @@ -168,7 +168,7 @@ def _calculate_expires_at(self, expires_in: "int | timedelta | None") -> "dateti if expires_in_seconds <= 0: return None - return datetime.now(timezone.utc) + timedelta(seconds=expires_in_seconds) + return datetime.now(UTC) + timedelta(seconds=expires_in_seconds) def _drop_sql_for_table_profile(self, table_profile: "tuple[str, str, str, str, str]") -> "list[str]": session_table, events_table, app_state_table, user_state_table, metadata_table = table_profile diff --git a/sqlspec/extensions/events/_hints.py b/sqlspec/extensions/events/_hints.py index cc1930c8f..6443bf2b3 100644 --- a/sqlspec/extensions/events/_hints.py +++ b/sqlspec/extensions/events/_hints.py @@ -1,9 +1,7 @@ """Runtime hint registry for EventChannel defaults.""" from dataclasses import dataclass -from typing import Any, Final - -from typing_extensions import final +from typing import Any, Final, final __all__ = ("EventRuntimeHints", "get_runtime_hints", "resolve_adapter_name") diff --git a/sqlspec/extensions/events/_models.py b/sqlspec/extensions/events/_models.py index 69be9a1d2..d9af1410a 100644 --- a/sqlspec/extensions/events/_models.py +++ b/sqlspec/extensions/events/_models.py @@ -2,9 +2,7 @@ from dataclasses import dataclass from datetime import datetime -from typing import Any - -from typing_extensions import final +from typing import Any, final __all__ = ("EventMessage",) diff --git a/sqlspec/extensions/events/_payload.py b/sqlspec/extensions/events/_payload.py index d11b0b64c..0658286b3 100644 --- a/sqlspec/extensions/events/_payload.py +++ b/sqlspec/extensions/events/_payload.py @@ -1,7 +1,7 @@ """Shared payload encoding/decoding utilities for event backends.""" import contextlib -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any from sqlspec.exceptions import EventChannelError @@ -39,7 +39,7 @@ def encode_notify_payload(event_id: str, payload: "dict[str, Any]", metadata: "d Raises: EventChannelError: If the encoded envelope exceeds the PostgreSQL notification budget. """ - encoded = _serialize_notify_envelope(event_id, payload, metadata, datetime.now(timezone.utc)) + encoded = _serialize_notify_envelope(event_id, payload, metadata, datetime.now(UTC)) encoded_bytes = len(encoded) if encoded_bytes > MAX_NOTIFY_BYTES: msg = ( @@ -60,7 +60,7 @@ def measure_notify_payload( mapping. Omitting ``event_id`` measures the canonical backend UUID-hex shape. """ resolved_event_id = uuid4().hex if event_id is None else event_id - return len(_serialize_notify_envelope(resolved_event_id, payload, metadata, datetime.now(timezone.utc))) + return len(_serialize_notify_envelope(resolved_event_id, payload, metadata, datetime.now(UTC))) def fits_notify_payload( @@ -96,12 +96,12 @@ def parse_event_timestamp(value: Any) -> "datetime": current UTC time for invalid or missing values. """ if isinstance(value, datetime): - return value if value.tzinfo else value.replace(tzinfo=timezone.utc) + return value if value.tzinfo else value.replace(tzinfo=UTC) if isinstance(value, str): with contextlib.suppress(ValueError): parsed = datetime.fromisoformat(value) - return parsed if parsed.tzinfo else parsed.replace(tzinfo=timezone.utc) - return datetime.now(timezone.utc) + return parsed if parsed.tzinfo else parsed.replace(tzinfo=UTC) + return datetime.now(UTC) def _serialize_notify_envelope( @@ -117,7 +117,7 @@ def _serialize_notify_envelope( "event_id": event_id, "payload": payload, "metadata": metadata, - "published_at": published_at.astimezone(timezone.utc).isoformat(timespec="microseconds"), + "published_at": published_at.astimezone(UTC).isoformat(timespec="microseconds"), }, as_bytes=True, ) diff --git a/sqlspec/extensions/events/_queue.py b/sqlspec/extensions/events/_queue.py index 8818d4d5a..846201396 100644 --- a/sqlspec/extensions/events/_queue.py +++ b/sqlspec/extensions/events/_queue.py @@ -3,11 +3,9 @@ import asyncio import time from contextlib import suppress -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from functools import partial -from typing import TYPE_CHECKING, Any, ClassVar, cast - -from typing_extensions import final +from typing import TYPE_CHECKING, Any, ClassVar, cast, final from sqlspec.core import SQL, StatementConfig from sqlspec.extensions.events._hints import EventRuntimeHints, get_runtime_hints, resolve_adapter_name @@ -175,7 +173,7 @@ def _claim_parameters(row: "dict[str, Any]", now: "datetime", leased_until: "dat @staticmethod def _utcnow() -> "datetime": - return datetime.now(timezone.utc) + return datetime.now(UTC) @classmethod def _batch_insert_parameters( diff --git a/sqlspec/extensions/fastapi/providers.py b/sqlspec/extensions/fastapi/providers.py index 665ab114f..95a54646e 100644 --- a/sqlspec/extensions/fastapi/providers.py +++ b/sqlspec/extensions/fastapi/providers.py @@ -13,12 +13,12 @@ from functools import partial from inspect import isclass from types import GenericAlias -from typing import Annotated, Any, Literal, NamedTuple, TypeVar, cast +from typing import Annotated, Any, Literal, NamedTuple, NotRequired, TypeVar, cast from uuid import UUID from fastapi import Depends, Query from fastapi.exceptions import RequestValidationError -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from sqlspec.core import ( BeforeAfterFilter, @@ -559,7 +559,7 @@ def _parse_datetime(value: Any, alias: str) -> datetime.datetime | None: if isinstance(value, datetime.datetime): return value try: - return datetime.datetime.fromisoformat(value.replace("Z", "+00:00")) + return datetime.datetime.fromisoformat(value) except (ValueError, TypeError, AttributeError): msg = f"Invalid date format for {alias}" raise RequestValidationError(errors=[{"loc": ("query", alias), "msg": msg, "type": "value_error.datetime"}]) diff --git a/sqlspec/extensions/litestar/providers.py b/sqlspec/extensions/litestar/providers.py index af4d833ce..0265d5d16 100644 --- a/sqlspec/extensions/litestar/providers.py +++ b/sqlspec/extensions/litestar/providers.py @@ -12,14 +12,13 @@ from functools import partial from inspect import isclass from types import GenericAlias -from typing import Annotated, Any, Literal, NamedTuple, TypedDict, TypeVar, cast +from typing import Annotated, Any, Literal, NamedTuple, NotRequired, TypedDict, TypeVar, cast from uuid import UUID from litestar.di import NamedDependency, Provide from litestar.exceptions import ValidationException from litestar.params import QueryParameter, SkipValidation from litestar.utils.signature import ParsedSignature -from typing_extensions import NotRequired from sqlspec.core import ( BeforeAfterFilter, diff --git a/sqlspec/extensions/litestar/store.py b/sqlspec/extensions/litestar/store.py index 3a94898ce..b70f06aca 100644 --- a/sqlspec/extensions/litestar/store.py +++ b/sqlspec/extensions/litestar/store.py @@ -2,7 +2,7 @@ import re from abc import abstractmethod -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any, ClassVar, Final, Generic, TypeVar, cast from litestar.stores.base import Store @@ -228,7 +228,7 @@ def _calculate_expires_at(self, expires_in: "int | timedelta | None") -> "dateti if expires_in_seconds <= 0: return None - return datetime.now(timezone.utc) + timedelta(seconds=expires_in_seconds) + return datetime.now(UTC) + timedelta(seconds=expires_in_seconds) def _value_to_bytes(self, value: "str | bytes") -> bytes: """Convert value to bytes if needed. diff --git a/sqlspec/loader.py b/sqlspec/loader.py index 1ca5ba126..827d7ae31 100644 --- a/sqlspec/loader.py +++ b/sqlspec/loader.py @@ -13,7 +13,7 @@ import logging import re import time -from datetime import datetime, timezone +from datetime import UTC, datetime from pathlib import Path from typing import TYPE_CHECKING, Any, Final from urllib.parse import unquote, urlparse @@ -177,7 +177,7 @@ def __init__( self.content = content self.path = path self.metadata = metadata or {} - self.loaded_at = loaded_at or datetime.now(timezone.utc) + self.loaded_at = loaded_at or datetime.now(UTC) self.checksum = hashlib.md5(self.content.encode(), usedforsecurity=False).hexdigest() diff --git a/sqlspec/migrations/_backup.py b/sqlspec/migrations/_backup.py index 8741ba47b..f4803b3ba 100644 --- a/sqlspec/migrations/_backup.py +++ b/sqlspec/migrations/_backup.py @@ -1,14 +1,14 @@ """Private migration backup helpers.""" import shutil -from datetime import datetime, timezone +from datetime import UTC, datetime from pathlib import Path __all__ = ("create_backup", "remove_backup", "restore_backup") def create_backup(migrations_path: Path) -> Path: - timestamp = datetime.now(tz=timezone.utc).strftime("%Y%m%d_%H%M%S") + timestamp = datetime.now(tz=UTC).strftime("%Y%m%d_%H%M%S") backup_dir = migrations_path / f".backup_{timestamp}" backup_dir.mkdir(parents=True, exist_ok=False) diff --git a/sqlspec/migrations/base.py b/sqlspec/migrations/base.py index 7904accfe..cee1d4cdc 100644 --- a/sqlspec/migrations/base.py +++ b/sqlspec/migrations/base.py @@ -3,11 +3,11 @@ import os from abc import abstractmethod from pathlib import Path -from typing import TYPE_CHECKING, Any, Generic, TypeVar, cast +from typing import TYPE_CHECKING, Any, Generic, NotRequired, TypeVar, cast from mypy_extensions import mypyc_attr from sqlglot import exp -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from sqlspec.builder._column import Column from sqlspec.builder._ddl import CreateTable, _parse_ddl_identifier, _parse_ddl_table diff --git a/sqlspec/migrations/utils.py b/sqlspec/migrations/utils.py index d37a883a0..8efc1079f 100644 --- a/sqlspec/migrations/utils.py +++ b/sqlspec/migrations/utils.py @@ -4,7 +4,7 @@ import inspect import os import subprocess -from datetime import datetime, timezone +from datetime import UTC, datetime from pathlib import Path from typing import TYPE_CHECKING, Any, cast @@ -332,7 +332,7 @@ def _build_template_context( project_slug: str, safe_message: str, ) -> "dict[str, str]": - created_at = datetime.now(timezone.utc).isoformat() + created_at = datetime.now(UTC).isoformat() display_message = message or "New migration" description = display_message.strip() or safe_message or version return { diff --git a/sqlspec/migrations/version.py b/sqlspec/migrations/version.py index 97d4825b2..0a1fd14f2 100644 --- a/sqlspec/migrations/version.py +++ b/sqlspec/migrations/version.py @@ -6,7 +6,7 @@ import re from dataclasses import dataclass -from datetime import datetime, timezone +from datetime import UTC, datetime from enum import Enum from typing import TYPE_CHECKING, final @@ -90,8 +90,8 @@ def __lt__(self, other: "MigrationVersion") -> bool: if self.type == other.type: if self.type == VersionType.SEQUENTIAL: return (self.sequence or 0) < (other.sequence or 0) - return (self.timestamp or datetime.min.replace(tzinfo=timezone.utc)) < ( - other.timestamp or datetime.min.replace(tzinfo=timezone.utc) + return (self.timestamp or datetime.min.replace(tzinfo=UTC)) < ( + other.timestamp or datetime.min.replace(tzinfo=UTC) ) return self.type == VersionType.SEQUENTIAL @@ -198,7 +198,7 @@ def is_timestamp_version(version_str: "str | None") -> bool: return False try: - datetime.strptime(version_str, "%Y%m%d%H%M%S").replace(tzinfo=timezone.utc) + datetime.strptime(version_str, "%Y%m%d%H%M%S").replace(tzinfo=UTC) except ValueError: return False else: @@ -241,7 +241,7 @@ def parse_version(version_str: "str | None") -> MigrationVersion: ) if is_timestamp_version(version_str): - dt = datetime.strptime(version_str, "%Y%m%d%H%M%S").replace(tzinfo=timezone.utc) + dt = datetime.strptime(version_str, "%Y%m%d%H%M%S").replace(tzinfo=UTC) return MigrationVersion( raw=version_str, type=VersionType.TIMESTAMP, sequence=None, timestamp=dt, extension=None ) @@ -283,7 +283,7 @@ def generate_timestamp_version() -> str: Returns: Timestamp version string. """ - return datetime.now(tz=timezone.utc).strftime("%Y%m%d%H%M%S") + return datetime.now(tz=UTC).strftime("%Y%m%d%H%M%S") def get_next_sequential_number(migrations: "list[MigrationVersion]", extension: "str | None" = None) -> int: diff --git a/sqlspec/observability/_formatters/_aws.py b/sqlspec/observability/_formatters/_aws.py index 9d818b269..520b017e3 100644 --- a/sqlspec/observability/_formatters/_aws.py +++ b/sqlspec/observability/_formatters/_aws.py @@ -1,6 +1,6 @@ """Amazon Web Services log formatter.""" -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any, ClassVar __all__ = ("AWSLogFormatter",) @@ -58,7 +58,7 @@ def format( entry: dict[str, Any] = { "level": self.LEVEL_MAP.get(level.upper(), "INFO"), "message": message, - "timestamp": datetime.now(timezone.utc).isoformat(), + "timestamp": datetime.now(UTC).isoformat(), } if correlation_id: diff --git a/sqlspec/protocols.py b/sqlspec/protocols.py index 1303a7679..eec0357b9 100644 --- a/sqlspec/protocols.py +++ b/sqlspec/protocols.py @@ -4,9 +4,7 @@ and runtime isinstance() checks. """ -from typing import TYPE_CHECKING, Any, ClassVar, Literal, Protocol, overload, runtime_checkable - -from typing_extensions import Self +from typing import TYPE_CHECKING, Any, ClassVar, Literal, Protocol, Self, overload, runtime_checkable if TYPE_CHECKING: from collections.abc import AsyncIterator, Callable, Iterator, Mapping, Sequence diff --git a/sqlspec/storage/backends/base.py b/sqlspec/storage/backends/base.py index 1f04e3fb8..2355cf6d4 100644 --- a/sqlspec/storage/backends/base.py +++ b/sqlspec/storage/backends/base.py @@ -6,10 +6,9 @@ import contextlib from abc import abstractmethod from collections.abc import AsyncIterator, Iterator -from typing import TYPE_CHECKING, Any, Literal, cast +from typing import TYPE_CHECKING, Any, Literal, Self, cast from mypy_extensions import mypyc_attr -from typing_extensions import Self if TYPE_CHECKING: from pathlib import Path diff --git a/sqlspec/storage/backends/obstore.py b/sqlspec/storage/backends/obstore.py index 132fa3db1..fbeecbd5c 100644 --- a/sqlspec/storage/backends/obstore.py +++ b/sqlspec/storage/backends/obstore.py @@ -10,11 +10,10 @@ from datetime import timedelta from functools import partial from pathlib import Path -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, cast, overload +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, Self, cast, overload from urllib.parse import urlparse from mypy_extensions import mypyc_attr -from typing_extensions import Self from sqlspec.exceptions import StorageOperationFailedError from sqlspec.storage._arrow_stream import iter_parquet_row_groups, validate_parquet_stream_options diff --git a/sqlspec/storage/pipeline.py b/sqlspec/storage/pipeline.py index 827a174e9..a848663e4 100644 --- a/sqlspec/storage/pipeline.py +++ b/sqlspec/storage/pipeline.py @@ -4,11 +4,11 @@ from functools import partial from pathlib import Path from time import perf_counter -from typing import TYPE_CHECKING, Any, NamedTuple, TypeAlias, cast +from typing import TYPE_CHECKING, Any, NamedTuple, NotRequired, TypeAlias, cast from urllib.parse import unquote, urlparse from mypy_extensions import mypyc_attr -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from sqlspec.exceptions import ImproperConfigurationError, StorageCapabilityError from sqlspec.storage._arrow_payload import StorageFormat, decode_arrow_payload, encode_arrow_payload diff --git a/sqlspec/utils/portal.py b/sqlspec/utils/portal.py index eb4c73cc3..3a95b693f 100644 --- a/sqlspec/utils/portal.py +++ b/sqlspec/utils/portal.py @@ -10,9 +10,7 @@ import os import queue import threading -from typing import TYPE_CHECKING, Any, ClassVar, TypeVar, cast - -from typing_extensions import Self +from typing import TYPE_CHECKING, Any, ClassVar, Self, TypeVar, cast from sqlspec.exceptions import ImproperConfigurationError from sqlspec.utils.logging import get_logger diff --git a/sqlspec/utils/serializers/_json.py b/sqlspec/utils/serializers/_json.py index dde60bd96..38ff6ba45 100644 --- a/sqlspec/utils/serializers/_json.py +++ b/sqlspec/utils/serializers/_json.py @@ -14,7 +14,7 @@ from typing import TYPE_CHECKING, Any, Final, Literal, Protocol, cast, overload if TYPE_CHECKING: - from typing_extensions import Self + from typing import Self from sqlspec.typing import MSGSPEC_INSTALLED, NUMPY_INSTALLED, ORJSON_INSTALLED, PYDANTIC_INSTALLED from sqlspec.utils.logging import get_logger @@ -53,7 +53,7 @@ def _uuid_utils_type() -> "type[Any] | None": def convert_datetime_to_gmt_iso(value: datetime.datetime) -> str: """Normalize datetime values to ISO 8601 strings.""" if value.tzinfo is None: - value = value.replace(tzinfo=datetime.timezone.utc) + value = value.replace(tzinfo=datetime.UTC) return value.isoformat().replace("+00:00", "Z") diff --git a/sqlspec/utils/type_converters.py b/sqlspec/utils/type_converters.py index 748ec9b12..2c1f38cf4 100644 --- a/sqlspec/utils/type_converters.py +++ b/sqlspec/utils/type_converters.py @@ -1,11 +1,9 @@ """Reusable converter builders for parameter configuration.""" import decimal -from typing import TYPE_CHECKING, Any, Protocol +from typing import TYPE_CHECKING, Any, Protocol, final from uuid import UUID -from typing_extensions import final - from sqlspec.utils.dispatch import TypeDispatcher from sqlspec.utils.module_loader import import_optional_attr from sqlspec.utils.uuids import uuid_from_int diff --git a/tests/typing/typing_lazy_exports.py b/tests/typing/typing_lazy_exports.py index 6766dcda0..64ca4f192 100644 --- a/tests/typing/typing_lazy_exports.py +++ b/tests/typing/typing_lazy_exports.py @@ -1,11 +1,10 @@ """Static analyzer contract for lazy optional typing exports.""" -from typing import TypeVar +from typing import TypeVar, assert_type from litestar.dto.data_structures import DTOData as LitestarDTOData from pyarrow import Table as PyArrowTable from pydantic import BaseModel as PydanticBaseModel -from typing_extensions import assert_type from sqlspec import SQL, Select, SQLSpec, StatementConfig, sql from sqlspec.builder import SQLFactory diff --git a/tests/unit/core/test_capabilities.py b/tests/unit/core/test_capabilities.py index 54374beb6..2d70cd699 100644 --- a/tests/unit/core/test_capabilities.py +++ b/tests/unit/core/test_capabilities.py @@ -2,6 +2,7 @@ import copy import pickle +from datetime import UTC import pytest @@ -96,12 +97,12 @@ def test_database_config_default_capabilities() -> None: def test_arrow_odbc_datetime_binding_preserves_microseconds() -> None: """The declared policy matches the final ODBC parameter boundary.""" - from datetime import datetime, timezone + from datetime import datetime from sqlspec.adapters.arrow_odbc.config import ArrowOdbcConfig from sqlspec.adapters.arrow_odbc.driver import _odbc_parameters - value = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=timezone.utc) + value = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=UTC) capabilities = ArrowOdbcConfig.type_coercion_capabilities assert capabilities.datetime_binding == "iso_text" assert capabilities.timestamp_precision == "microsecond" diff --git a/tests/unit/core/test_cursor_codec.py b/tests/unit/core/test_cursor_codec.py index 3d1fe38aa..82b19011f 100644 --- a/tests/unit/core/test_cursor_codec.py +++ b/tests/unit/core/test_cursor_codec.py @@ -3,7 +3,7 @@ import base64 import json import re -from datetime import date, datetime, time, timedelta, timezone +from datetime import UTC, date, datetime, time, timedelta from decimal import Decimal from fractions import Fraction from typing import Any @@ -31,7 +31,7 @@ Decimal("1.10"), timedelta(days=1, seconds=2, microseconds=3), UUID("12345678-1234-5678-1234-567812345678"), - datetime(2026, 1, 2, 3, 4, 5, 123456, tzinfo=timezone.utc), + datetime(2026, 1, 2, 3, 4, 5, 123456, tzinfo=UTC), datetime(2026, 1, 2), date(2026, 1, 2), time(3, 4, 5, 6), diff --git a/tests/unit/core/test_filters.py b/tests/unit/core/test_filters.py index 893ba9023..aa1e2e745 100644 --- a/tests/unit/core/test_filters.py +++ b/tests/unit/core/test_filters.py @@ -8,11 +8,10 @@ from dataclasses import dataclass from datetime import datetime from pathlib import Path -from typing import TYPE_CHECKING, Any, cast +from typing import TYPE_CHECKING, Any, assert_type, cast import pytest from sqlglot import exp -from typing_extensions import assert_type import sqlspec.core.filters as filters_module from sqlspec import sql as sql_builder diff --git a/tests/unit/core/test_type_conversion.py b/tests/unit/core/test_type_conversion.py index 688f808d6..0a5f69d36 100644 --- a/tests/unit/core/test_type_conversion.py +++ b/tests/unit/core/test_type_conversion.py @@ -1,6 +1,6 @@ """Tests for centralized scalar conversion helpers.""" -from datetime import date, datetime, time, timezone +from datetime import UTC, date, datetime, time from decimal import Decimal from uuid import UUID @@ -86,7 +86,7 @@ def test_convert_decimal() -> None: def test_format_datetime_rfc3339() -> None: """Test RFC 3339 datetime formatting.""" - dt = datetime(2023, 12, 25, 10, 30, 0, tzinfo=timezone.utc) + dt = datetime(2023, 12, 25, 10, 30, 0, tzinfo=UTC) formatted = format_datetime_rfc3339(dt) assert formatted == "2023-12-25T10:30:00+00:00" @@ -119,7 +119,7 @@ def test_parse_datetime_rfc3339_delegates_to_iso_converter(monkeypatch: pytest.M import sqlspec.core.type_converter as type_converter - expected = datetime(2023, 12, 25, 10, 30, 0, tzinfo=timezone.utc) + expected = datetime(2023, 12, 25, 10, 30, 0, tzinfo=UTC) def fake_convert(value: str) -> datetime: assert value == "2023-12-25T10:30:00+00:00" @@ -132,7 +132,7 @@ def fake_convert(value: str) -> datetime: def test_datetime_round_trip() -> None: """Test datetime formatting and parsing round trip.""" - original = datetime(2023, 12, 25, 10, 30, 0, tzinfo=timezone.utc) + original = datetime(2023, 12, 25, 10, 30, 0, tzinfo=UTC) formatted = format_datetime_rfc3339(original) parsed = parse_datetime_rfc3339(formatted) diff --git a/tests/unit/exceptions/test_exception_handler.py b/tests/unit/exceptions/test_exception_handler.py index ebbd9b65a..18d9f27f9 100644 --- a/tests/unit/exceptions/test_exception_handler.py +++ b/tests/unit/exceptions/test_exception_handler.py @@ -2,9 +2,9 @@ """Tests for shared exception handler bases and representative adapter handlers.""" from types import TracebackType +from typing import Self import pytest -from typing_extensions import Self from sqlspec.driver import BaseAsyncExceptionHandler, BaseSyncExceptionHandler from sqlspec.driver._exception_handler import _run_with_async_exception_handler diff --git a/tests/unit/extensions/test_adk/test_artifact_service.py b/tests/unit/extensions/test_adk/test_artifact_service.py index af00745a5..e0fd5a589 100644 --- a/tests/unit/extensions/test_adk/test_artifact_service.py +++ b/tests/unit/extensions/test_adk/test_artifact_service.py @@ -1,7 +1,7 @@ """Unit tests for SQLSpec artifact service content coordination.""" import logging -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any import pytest @@ -22,7 +22,7 @@ def _record(version: int, filename: str = "report.txt") -> StoredArtifact: mime_type="text/plain", canonical_uri=f"{STORAGE_URI}/apps/agent_app/users/user-1/artifacts/{filename}/v{version}", custom_metadata=None, - created_at=datetime(2020, 1, 1, tzinfo=timezone.utc), + created_at=datetime(2020, 1, 1, tzinfo=UTC), ) @@ -95,7 +95,7 @@ async def test_delete_artifacts_older_than_forwards_cutoff_and_app_scope() -> No store = _RecordingStore([[_record(0), _record(1)]]) backend = _RecordingBackend() service, _registry = _service(store, backend) - cutoff = datetime(2024, 6, 1, tzinfo=timezone.utc) + cutoff = datetime(2024, 6, 1, tzinfo=UTC) deleted = await service.delete_artifacts_older_than(cutoff, app_name="agent_app") @@ -108,7 +108,7 @@ async def test_delete_artifacts_older_than_deletes_content_for_every_version() - backend = _RecordingBackend() service, registry = _service(store, backend) - deleted = await service.delete_artifacts_older_than(datetime(2024, 6, 1, tzinfo=timezone.utc)) + deleted = await service.delete_artifacts_older_than(datetime(2024, 6, 1, tzinfo=UTC)) assert deleted == 3 assert backend.deleted == [ @@ -124,7 +124,7 @@ async def test_delete_artifacts_older_than_without_matches_skips_storage() -> No backend = _RecordingBackend() service, registry = _service(store, backend) - deleted = await service.delete_artifacts_older_than(datetime(2024, 6, 1, tzinfo=timezone.utc)) + deleted = await service.delete_artifacts_older_than(datetime(2024, 6, 1, tzinfo=UTC)) assert deleted == 0 assert registry.resolved == [] @@ -138,7 +138,7 @@ async def test_delete_artifacts_older_than_continues_after_content_failure(caplo service, _registry = _service(store, backend) with caplog.at_level(logging.WARNING, logger="sqlspec.extensions.adk.artifact.service"): - deleted = await service.delete_artifacts_older_than(datetime(2024, 6, 1, tzinfo=timezone.utc)) + deleted = await service.delete_artifacts_older_than(datetime(2024, 6, 1, tzinfo=UTC)) assert deleted == 2 assert backend.deleted == [failing_path, "apps/agent_app/users/user-1/artifacts/report.txt/v1"] @@ -153,7 +153,7 @@ async def test_second_prune_does_not_retry_content_for_deleted_metadata() -> Non store = _RecordingStore([[_record(0)], []]) backend = _RecordingBackend(failing_paths={"apps/agent_app/users/user-1/artifacts/report.txt/v0"}) service, _registry = _service(store, backend) - cutoff = datetime(2024, 6, 1, tzinfo=timezone.utc) + cutoff = datetime(2024, 6, 1, tzinfo=UTC) first = await service.delete_artifacts_older_than(cutoff) second = await service.delete_artifacts_older_than(cutoff) @@ -168,7 +168,7 @@ async def test_delete_artifacts_older_than_propagates_metadata_failure() -> None service, registry = _service(store, backend) with pytest.raises(RuntimeError, match="metadata delete failed"): - await service.delete_artifacts_older_than(datetime(2024, 6, 1, tzinfo=timezone.utc)) + await service.delete_artifacts_older_than(datetime(2024, 6, 1, tzinfo=UTC)) assert registry.resolved == [] assert backend.deleted == [] diff --git a/tests/unit/extensions/test_adk/test_converters.py b/tests/unit/extensions/test_adk/test_converters.py index 7aed86ec0..699c49c1f 100644 --- a/tests/unit/extensions/test_adk/test_converters.py +++ b/tests/unit/extensions/test_adk/test_converters.py @@ -9,7 +9,7 @@ """ import importlib.util -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta, timezone import pytest @@ -58,7 +58,7 @@ def _make_event( author=author, content=content, actions=actions, - timestamp=datetime(2024, 1, 15, 12, 0, 0, tzinfo=timezone.utc).timestamp(), + timestamp=datetime(2024, 1, 15, 12, 0, 0, tzinfo=UTC).timestamp(), branch=branch, isolation_scope=isolation_scope, partial=partial, @@ -75,7 +75,7 @@ def _make_session( app_name=app_name, user_id=user_id, state=state or {}, - last_update_time=datetime(2024, 1, 15, 12, 0, 0, tzinfo=timezone.utc).timestamp(), + last_update_time=datetime(2024, 1, 15, 12, 0, 0, tzinfo=UTC).timestamp(), ) @@ -419,7 +419,7 @@ def test_record_to_event_roundtrip_preserves_turn_complete() -> None: def test_record_to_event_roundtrip_preserves_timestamp() -> None: """timestamp survives the round-trip within float precision.""" - fixed_ts = datetime(2024, 6, 1, 10, 30, 0, tzinfo=timezone.utc).timestamp() + fixed_ts = datetime(2024, 6, 1, 10, 30, 0, tzinfo=UTC).timestamp() event = Event(id="ts-evt", invocation_id="inv-1", author="user", actions=EventActions(), timestamp=fixed_ts) record = event_to_record(event, "app", "u1", "s1") restored = record_to_event(record) @@ -503,8 +503,8 @@ def test_record_to_session_with_events_round_trip() -> None: app_name="app", user_id="u1", state={"key": "val"}, - create_time=datetime.now(timezone.utc), - update_time=datetime.now(timezone.utc), + create_time=datetime.now(UTC), + update_time=datetime.now(UTC), ) event = _make_event(text="hello", author="user") event_record = event_to_record(event, "app", "u1", "s1") @@ -524,12 +524,7 @@ def test_record_to_session_empty_events() -> None: from sqlspec.extensions.adk._types import StoredSession session_record = StoredSession( - id="s2", - app_name="app", - user_id="u2", - state={}, - create_time=datetime.now(timezone.utc), - update_time=datetime.now(timezone.utc), + id="s2", app_name="app", user_id="u2", state={}, create_time=datetime.now(UTC), update_time=datetime.now(UTC) ) session = record_to_session(session_record, []) assert session.events == [] diff --git a/tests/unit/extensions/test_adk/test_maintenance.py b/tests/unit/extensions/test_adk/test_maintenance.py index cae545127..b90bc3887 100644 --- a/tests/unit/extensions/test_adk/test_maintenance.py +++ b/tests/unit/extensions/test_adk/test_maintenance.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any from unittest.mock import AsyncMock, MagicMock @@ -75,7 +75,7 @@ def __init__(self) -> None: def _elapsed_days(cutoff: datetime) -> float: - return (datetime.now(timezone.utc) - cutoff).total_seconds() / 86400.0 + return (datetime.now(UTC) - cutoff).total_seconds() / 86400.0 async def test_prune_sessions_async() -> None: diff --git a/tests/unit/extensions/test_adk/test_memory_converters.py b/tests/unit/extensions/test_adk/test_memory_converters.py index 85e7b493a..307c1b67b 100644 --- a/tests/unit/extensions/test_adk/test_memory_converters.py +++ b/tests/unit/extensions/test_adk/test_memory_converters.py @@ -1,7 +1,7 @@ """Unit tests for ADK memory converters.""" import importlib.util -from datetime import datetime, timezone +from datetime import UTC, datetime import pytest @@ -48,7 +48,7 @@ def _event(event_id: str, text: str | None) -> Event: author="user", content=content, actions=EventActions(), - timestamp=datetime.now(timezone.utc).timestamp(), + timestamp=datetime.now(UTC).timestamp(), partial=False, turn_complete=True, ) diff --git a/tests/unit/extensions/test_adk/test_service.py b/tests/unit/extensions/test_adk/test_service.py index c60978e2c..086a37a72 100644 --- a/tests/unit/extensions/test_adk/test_service.py +++ b/tests/unit/extensions/test_adk/test_service.py @@ -11,7 +11,7 @@ import importlib.util import inspect -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any import pytest @@ -63,8 +63,8 @@ def __init__(self) -> None: "app_name": "app", "user_id": "u1", "state": {}, - "create_time": datetime.now(timezone.utc), - "update_time": datetime.now(timezone.utc), + "create_time": datetime.now(UTC), + "update_time": datetime.now(UTC), } async def append_event_and_update_state( @@ -94,7 +94,7 @@ async def append_event_and_update_state( # Return the updated StoredSession — caller no longer needs a follow-up get_session(). updated = dict(self._session_record) updated["state"] = state - updated["update_time"] = datetime.now(timezone.utc) + updated["update_time"] = datetime.now(UTC) self._session_record = updated return updated @@ -120,8 +120,8 @@ async def create_session( "app_name": app_name, "user_id": user_id, "state": state, - "create_time": datetime.now(timezone.utc), - "update_time": datetime.now(timezone.utc), + "create_time": datetime.now(UTC), + "update_time": datetime.now(UTC), } return self._session_record @@ -191,8 +191,8 @@ def __init__(self) -> None: app_name="app", user_id="u1", state={}, - create_time=datetime.now(timezone.utc), - update_time=datetime.now(timezone.utc), + create_time=datetime.now(UTC), + update_time=datetime.now(UTC), ) def create_session( @@ -210,8 +210,8 @@ def create_session( app_name=app_name, user_id=user_id, state=state, - create_time=datetime.now(timezone.utc), - update_time=datetime.now(timezone.utc), + create_time=datetime.now(UTC), + update_time=datetime.now(UTC), ) return self._session_record @@ -261,7 +261,7 @@ def append_event_and_update_state( user_id=self._session_record["user_id"], state=state, create_time=self._session_record["create_time"], - update_time=datetime.now(timezone.utc), + update_time=datetime.now(UTC), ) return self._session_record @@ -310,7 +310,7 @@ def _make_session( app_name=app_name, user_id=user_id, state=state or {}, - last_update_time=datetime.now(timezone.utc).timestamp(), + last_update_time=datetime.now(UTC).timestamp(), ) @@ -322,7 +322,7 @@ def _make_event( invocation_id=invocation_id, author=author, actions=actions, - timestamp=datetime.now(timezone.utc).timestamp(), + timestamp=datetime.now(UTC).timestamp(), partial=partial, ) diff --git a/tests/unit/extensions/test_adk/test_store_common_mixins.py b/tests/unit/extensions/test_adk/test_store_common_mixins.py index 02327aaa8..b705fefd4 100644 --- a/tests/unit/extensions/test_adk/test_store_common_mixins.py +++ b/tests/unit/extensions/test_adk/test_store_common_mixins.py @@ -1,6 +1,6 @@ """Regression tests for common ADK store state mixins.""" -from datetime import datetime, timezone +from datetime import UTC, datetime import pytest @@ -88,7 +88,7 @@ def _aged_record(version: int) -> StoredArtifact: mime_type="text/plain", canonical_uri=f"file:///base/apps/agent_app/users/user-1/artifacts/report.txt/v{version}", custom_metadata=None, - created_at=datetime(2020, 1, 1, tzinfo=timezone.utc), + created_at=datetime(2020, 1, 1, tzinfo=UTC), ) @@ -167,19 +167,19 @@ def test_sync_artifact_store_retention_hook_defaults_to_not_implemented() -> Non store = _ConcreteArtifactStore(_sqlite_config()) with pytest.raises(NotImplementedError, match="does not support artifact retention"): - store.delete_artifacts_older_than(datetime(2024, 1, 1, tzinfo=timezone.utc)) + store.delete_artifacts_older_than(datetime(2024, 1, 1, tzinfo=UTC)) async def test_async_artifact_store_retention_hook_defaults_to_not_implemented() -> None: store = _ConcreteAsyncArtifactStore(_sqlite_config()) with pytest.raises(NotImplementedError, match="does not support artifact retention"): - await store.delete_artifacts_older_than(datetime(2024, 1, 1, tzinfo=timezone.utc)) + await store.delete_artifacts_older_than(datetime(2024, 1, 1, tzinfo=UTC)) async def test_artifact_store_retention_override_receives_cutoff_and_app_name() -> None: store = _RetainingArtifactStore(_sqlite_config()) - cutoff = datetime(2024, 6, 1, tzinfo=timezone.utc) + cutoff = datetime(2024, 6, 1, tzinfo=UTC) records = await store.delete_artifacts_older_than(cutoff, app_name="agent_app") diff --git a/tests/unit/extensions/test_events/test_backend_factories.py b/tests/unit/extensions/test_events/test_backend_factories.py index 13123e5a4..b4e604fd5 100644 --- a/tests/unit/extensions/test_events/test_backend_factories.py +++ b/tests/unit/extensions/test_events/test_backend_factories.py @@ -1,6 +1,7 @@ # pyright: reportPrivateUsage=false """Unit tests for adapter-specific event backend factories.""" +from datetime import UTC from types import SimpleNamespace from typing import Any @@ -485,11 +486,11 @@ def test_notify_payload_one_byte_over_maximum_is_rejected() -> None: def test_serialized_envelope_timestamp_width_is_constant(microsecond: int) -> None: """Envelope timestamps keep a constant width regardless of microsecond value.""" import json - from datetime import datetime, timezone + from datetime import datetime from sqlspec.extensions.events import _payload - published_at = datetime(2024, 1, 15, 10, 0, 0, microsecond, tzinfo=timezone.utc) + published_at = datetime(2024, 1, 15, 10, 0, 0, microsecond, tzinfo=UTC) encoded = _payload._serialize_notify_envelope("evt_ts", {"action": "test"}, None, published_at) assert json.loads(encoded)["published_at"] == f"2024-01-15T10:00:00.{microsecond:06d}+00:00" @@ -618,11 +619,11 @@ def test_shared_parse_timestamp_iso_string() -> None: def test_shared_parse_timestamp_datetime() -> None: """Shared parse_event_timestamp passes through datetime objects.""" - from datetime import datetime, timezone + from datetime import datetime from sqlspec.extensions.events import parse_event_timestamp - now = datetime.now(timezone.utc) + now = datetime.now(UTC) result = parse_event_timestamp(now) assert result is now @@ -641,14 +642,14 @@ def test_shared_parse_timestamp_invalid() -> None: def test_shared_parse_timestamp_naive_datetime() -> None: """Shared parse_event_timestamp adds UTC timezone to naive datetimes.""" - from datetime import datetime, timezone + from datetime import datetime from sqlspec.extensions.events import parse_event_timestamp result = parse_event_timestamp("2024-06-15T12:00:00") assert isinstance(result, datetime) - assert result.tzinfo == timezone.utc + assert result.tzinfo == UTC # Backend shutdown tests diff --git a/tests/unit/extensions/test_events/test_channel_extended.py b/tests/unit/extensions/test_events/test_channel_extended.py index c8387306e..15a725130 100644 --- a/tests/unit/extensions/test_events/test_channel_extended.py +++ b/tests/unit/extensions/test_events/test_channel_extended.py @@ -4,7 +4,7 @@ import asyncio import threading import time -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any, cast import pytest @@ -426,7 +426,7 @@ def test_sync_listener_delivers_and_acknowledges(tmp_path) -> None: config = SqliteConfig(connection_config={"database": str(tmp_path / "test.db")}) channel = SyncEventChannel(config) backend = _ControllableSyncBackend() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) event = EventMessage( event_id="evt-101", channel="test_channel", diff --git a/tests/unit/extensions/test_events/test_listener_hubs.py b/tests/unit/extensions/test_events/test_listener_hubs.py index 4421ddd66..068e80fd1 100644 --- a/tests/unit/extensions/test_events/test_listener_hubs.py +++ b/tests/unit/extensions/test_events/test_listener_hubs.py @@ -5,7 +5,7 @@ import asyncio import threading from collections.abc import AsyncIterator -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any from weakref import WeakKeyDictionary @@ -387,7 +387,7 @@ async def dequeue(self, _channel: str, _poll_interval: float) -> str: class _QueueFallback: def __init__(self) -> None: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) self.event = EventMessage( event_id="event-1", channel="alerts", @@ -430,7 +430,7 @@ async def dequeue(self, channel: str, poll_interval: float | None = None) -> Eve class _SyncQueueFallback: def __init__(self) -> None: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) self.event = EventMessage( event_id="event-1", channel="alerts", diff --git a/tests/unit/extensions/test_events/test_models.py b/tests/unit/extensions/test_events/test_models.py index 24db232c3..9a5c4590a 100644 --- a/tests/unit/extensions/test_events/test_models.py +++ b/tests/unit/extensions/test_events/test_models.py @@ -1,14 +1,14 @@ """Unit tests for EventMessage dataclass.""" -from datetime import datetime, timezone +from datetime import UTC, datetime from sqlspec.extensions.events import EventMessage def test_event_message_all_fields() -> None: """EventMessage stores all expected fields.""" - now = datetime.now(timezone.utc) - lease_time = datetime.now(timezone.utc) + now = datetime.now(UTC) + lease_time = datetime.now(UTC) message = EventMessage( event_id="evt_123", @@ -33,7 +33,7 @@ def test_event_message_all_fields() -> None: def test_event_message_none_metadata() -> None: """EventMessage allows None metadata.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) message = EventMessage( event_id="evt_789", @@ -52,7 +52,7 @@ def test_event_message_none_metadata() -> None: def test_event_message_empty_payload() -> None: """EventMessage accepts empty payload dict.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) message = EventMessage( event_id="evt_empty", @@ -70,7 +70,7 @@ def test_event_message_empty_payload() -> None: def test_event_message_complex_payload() -> None: """EventMessage handles complex nested payloads.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) complex_payload = { "users": [{"id": 1, "name": "Alice", "tags": ["admin", "active"]}, {"id": 2, "name": "Bob", "tags": ["user"]}], @@ -97,7 +97,7 @@ def test_event_message_complex_payload() -> None: def test_event_message_attempts_zero() -> None: """EventMessage handles zero attempts.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) message = EventMessage( event_id="evt_new", @@ -115,7 +115,7 @@ def test_event_message_attempts_zero() -> None: def test_event_message_high_attempts() -> None: """EventMessage handles high attempt counts.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) message = EventMessage( event_id="evt_retry", @@ -133,9 +133,9 @@ def test_event_message_high_attempts() -> None: def test_event_message_different_timestamps() -> None: """EventMessage can have different available_at and created_at times.""" - created = datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - available = datetime(2024, 1, 1, 1, 0, 0, tzinfo=timezone.utc) - lease = datetime(2024, 1, 1, 1, 0, 30, tzinfo=timezone.utc) + created = datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC) + available = datetime(2024, 1, 1, 1, 0, 0, tzinfo=UTC) + lease = datetime(2024, 1, 1, 1, 0, 30, tzinfo=UTC) message = EventMessage( event_id="evt_scheduled", diff --git a/tests/unit/extensions/test_events/test_primitives.py b/tests/unit/extensions/test_events/test_primitives.py index 9a2a36a23..fa6dec8df 100644 --- a/tests/unit/extensions/test_events/test_primitives.py +++ b/tests/unit/extensions/test_events/test_primitives.py @@ -2,7 +2,7 @@ import subprocess import sys -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta import pytest import sqlglot @@ -69,7 +69,7 @@ def test_select_limit_prefix_matrix(dialect: str, n: int, expected: str) -> None def test_claim_verified_truth_table() -> None: """Test claim_verified across row shapes and lease timestamps.""" - leased_until = datetime(2026, 9, 13, 16, 0, 0, tzinfo=timezone.utc) + leased_until = datetime(2026, 9, 13, 16, 0, 0, tzinfo=UTC) earlier = leased_until - timedelta(seconds=10) later = leased_until + timedelta(seconds=10) diff --git a/tests/unit/extensions/test_events/test_queue.py b/tests/unit/extensions/test_events/test_queue.py index 5c1cc9a4b..b09393dc9 100644 --- a/tests/unit/extensions/test_events/test_queue.py +++ b/tests/unit/extensions/test_events/test_queue.py @@ -3,7 +3,7 @@ from collections.abc import AsyncIterator, Iterator from contextlib import asynccontextmanager, contextmanager -from datetime import datetime, timezone +from datetime import UTC, datetime from types import SimpleNamespace from typing import Any, cast @@ -25,7 +25,7 @@ def _event_row(event_id: str = "event-1") -> dict[str, Any]: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) return { "event_id": event_id, "channel": "alerts", @@ -252,8 +252,8 @@ def test_table_event_queue_statement_config_property(tmp_path) -> None: def test_fetch_candidate_parameter_fingerprint_stable_across_datetime_values() -> None: - first = datetime(2026, 1, 1, tzinfo=timezone.utc) - second = datetime(2026, 1, 2, tzinfo=timezone.utc) + first = datetime(2026, 1, 1, tzinfo=UTC) + second = datetime(2026, 1, 2, tzinfo=UTC) first_fingerprint = structural_fingerprint({ "channel": "events", @@ -274,7 +274,7 @@ def test_fetch_candidate_parameter_fingerprint_stable_across_datetime_values() - def test_ack_parameter_fingerprint_stable_across_event_ids() -> None: - now = datetime(2026, 1, 1, tzinfo=timezone.utc) + now = datetime(2026, 1, 1, tzinfo=UTC) first = structural_fingerprint({"acked": "acked", "acked_at": now, "event_id": "event-1"}) second = structural_fingerprint({"acked": "acked", "acked_at": now, "event_id": "event-2"}) @@ -288,7 +288,7 @@ def test_statement_config_enables_caching_by_default() -> None: def test_event_message_dataclass_fields() -> None: """EventMessage dataclass has expected fields.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) event = EventMessage( event_id="abc123", channel="notifications", @@ -308,7 +308,7 @@ def test_event_message_dataclass_fields() -> None: def test_event_message_metadata_none() -> None: """EventMessage allows None metadata.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) event = EventMessage( event_id="abc123", channel="notifications", @@ -325,7 +325,7 @@ def test_event_message_metadata_none() -> None: def test_table_event_queue_hydrate_event_dict_payload(tmp_path) -> None: """_hydrate_event handles dict payloads directly.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) row = { "event_id": "test123", "channel": "notifications", @@ -347,7 +347,7 @@ def test_table_event_queue_hydrate_event_string_payload(tmp_path) -> None: """_hydrate_event deserializes JSON string payloads.""" import json - now = datetime.now(timezone.utc) + now = datetime.now(UTC) row = { "event_id": "test456", "channel": "events", @@ -370,7 +370,7 @@ def test_table_event_queue_hydrate_event_non_dict_payload(tmp_path) -> None: """Non-dict payloads are wrapped in a value key.""" import json - now = datetime.now(timezone.utc) + now = datetime.now(UTC) row = { "event_id": "test789", "channel": "events", @@ -398,12 +398,12 @@ def test_parse_event_timestamp_from_string() -> None: def test_parse_event_timestamp_naive_string() -> None: """Naive datetime strings get UTC timezone added.""" result = parse_event_timestamp("2024-01-15T10:30:00") - assert result.tzinfo == timezone.utc + assert result.tzinfo == UTC def test_parse_event_timestamp_from_datetime() -> None: """Datetime objects are passed through.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) result = parse_event_timestamp(now) assert result is now @@ -412,7 +412,7 @@ def test_parse_event_timestamp_naive_datetime() -> None: """Naive datetime objects get UTC timezone added.""" naive = datetime(2024, 1, 15, 10, 30, 0) result = parse_event_timestamp(naive) - assert result.tzinfo == timezone.utc + assert result.tzinfo == UTC def test_parse_event_timestamp_invalid() -> None: diff --git a/tests/unit/extensions/test_fastapi/test_providers.py b/tests/unit/extensions/test_fastapi/test_providers.py index a28c450e4..430f8b80a 100644 --- a/tests/unit/extensions/test_fastapi/test_providers.py +++ b/tests/unit/extensions/test_fastapi/test_providers.py @@ -112,7 +112,7 @@ def test_provide_filters_created_at() -> None: assert filters == [] # Before date only - before_dt = datetime.datetime(2025, 1, 1, tzinfo=datetime.timezone.utc) + before_dt = datetime.datetime(2025, 1, 1, tzinfo=datetime.UTC) filters = provider(created_filter=BeforeAfterFilter(field_name="created_at", before=before_dt, after=None)) assert len(filters) == 1 assert isinstance(filters[0], BeforeAfterFilter) @@ -120,7 +120,7 @@ def test_provide_filters_created_at() -> None: assert filters[0].before == before_dt # After date only - after_dt = datetime.datetime(2024, 1, 1, tzinfo=datetime.timezone.utc) + after_dt = datetime.datetime(2024, 1, 1, tzinfo=datetime.UTC) filters = provider(created_filter=BeforeAfterFilter(field_name="created_at", before=None, after=after_dt)) assert len(filters) == 1 assert filters[0].after == after_dt # type: ignore[union-attr] @@ -137,7 +137,7 @@ def test_provide_filters_updated_at() -> None: config: FilterConfig = {"updated_at": True} provider = provide_filters(config) - before_dt = datetime.datetime(2025, 1, 1, tzinfo=datetime.timezone.utc) + before_dt = datetime.datetime(2025, 1, 1, tzinfo=datetime.UTC) filters = provider(updated_filter=BeforeAfterFilter(field_name="updated_at", before=before_dt, after=None)) assert len(filters) == 1 assert isinstance(filters[0], BeforeAfterFilter) @@ -396,7 +396,7 @@ def test_provide_filters_combined() -> None: provider = provide_filters(config) test_id = uuid4() - before_dt = datetime.datetime(2025, 1, 1, tzinfo=datetime.timezone.utc) + before_dt = datetime.datetime(2025, 1, 1, tzinfo=datetime.UTC) filters = provider( id_filter=InCollectionFilter(field_name="id", values=[test_id]), diff --git a/tests/unit/extensions/test_litestar/test_providers.py b/tests/unit/extensions/test_litestar/test_providers.py index 17773d35e..d43d4516c 100644 --- a/tests/unit/extensions/test_litestar/test_providers.py +++ b/tests/unit/extensions/test_litestar/test_providers.py @@ -103,8 +103,8 @@ def test_not_in_fields_provider_returns_filter_when_values_present() -> None: def test_compiled_annotation_pair_providers_build_and_call() -> None: """Providers with paired annotation locals instantiate and call under compiled builds.""" - before = datetime.datetime(2026, 1, 1, tzinfo=datetime.timezone.utc) - after = datetime.datetime(2025, 1, 1, tzinfo=datetime.timezone.utc) + before = datetime.datetime(2026, 1, 1, tzinfo=datetime.UTC) + after = datetime.datetime(2025, 1, 1, tzinfo=datetime.UTC) deps = _create_statement_filters( FilterConfig( created_at=True, diff --git a/tests/unit/migrations/test_version.py b/tests/unit/migrations/test_version.py index 9da6148ac..013a64e92 100644 --- a/tests/unit/migrations/test_version.py +++ b/tests/unit/migrations/test_version.py @@ -2,7 +2,7 @@ import copy import pickle -from datetime import datetime, timezone +from datetime import UTC, datetime from pathlib import Path from unittest.mock import AsyncMock, MagicMock @@ -68,10 +68,10 @@ def test_parse_timestamp_version() -> None: assert v.raw == "20251011120000" assert v.type == VersionType.TIMESTAMP assert v.sequence is None - assert v.timestamp == datetime(2025, 10, 11, 12, 0, 0, tzinfo=timezone.utc) + assert v.timestamp == datetime(2025, 10, 11, 12, 0, 0, tzinfo=UTC) assert v.extension is None v = parse_version("20200101000000") - assert v.timestamp == datetime(2020, 1, 1, 0, 0, 0, tzinfo=timezone.utc) + assert v.timestamp == datetime(2020, 1, 1, 0, 0, 0, tzinfo=UTC) def test_parse_extension_version_sequential() -> None: @@ -91,7 +91,7 @@ def test_parse_extension_version_timestamp() -> None: v = parse_version("ext_litestar_20251011120000") assert v.raw == "ext_litestar_20251011120000" assert v.type == VersionType.TIMESTAMP - assert v.timestamp == datetime(2025, 10, 11, 12, 0, 0, tzinfo=timezone.utc) + assert v.timestamp == datetime(2025, 10, 11, 12, 0, 0, tzinfo=UTC) assert v.extension == "litestar" diff --git a/tests/unit/observability/test_observability_core.py b/tests/unit/observability/test_observability_core.py index fdaef8bce..dabceaab3 100644 --- a/tests/unit/observability/test_observability_core.py +++ b/tests/unit/observability/test_observability_core.py @@ -8,11 +8,10 @@ from contextlib import contextmanager from pathlib import Path from types import ModuleType -from typing import Any, Literal, cast +from typing import Any, Literal, Self, cast from unittest.mock import patch import pytest -from typing_extensions import Self from sqlspec import ObservabilityConfig, ObservabilityRuntime, RedactionConfig, SQLSpec, StatementObserver from sqlspec.adapters.sqlite import SqliteConfig diff --git a/tests/unit/utils/serializers/test_default_type_encoders.py b/tests/unit/utils/serializers/test_default_type_encoders.py index 1589059eb..40fa6c1a4 100644 --- a/tests/unit/utils/serializers/test_default_type_encoders.py +++ b/tests/unit/utils/serializers/test_default_type_encoders.py @@ -387,7 +387,7 @@ def test_behavioural_equivalence_battery() -> None: """ serializer = StandardLibSerializer() payload = { - "ts": datetime.datetime(2026, 1, 1, tzinfo=datetime.timezone.utc), + "ts": datetime.datetime(2026, 1, 1, tzinfo=datetime.UTC), "d": datetime.date(2026, 1, 1), "t": datetime.time(12, 30, 0), "td": datetime.timedelta(seconds=90), diff --git a/tests/unit/utils/test_env.py b/tests/unit/utils/test_env.py index c084837ae..890bb9f48 100644 --- a/tests/unit/utils/test_env.py +++ b/tests/unit/utils/test_env.py @@ -2,10 +2,9 @@ from collections.abc import Callable from pathlib import Path -from typing import Any +from typing import Any, assert_type import pytest -from typing_extensions import assert_type from sqlspec.utils.env import get_config_val, get_config_val_with_aliases, get_env, get_env_with_aliases, is_env_set diff --git a/tests/unit/utils/test_serialization.py b/tests/unit/utils/test_serialization.py index 207964239..c8c5358ca 100644 --- a/tests/unit/utils/test_serialization.py +++ b/tests/unit/utils/test_serialization.py @@ -6,7 +6,7 @@ import json import logging -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any from uuid import uuid4 @@ -124,7 +124,7 @@ def test_unicode_handling() -> None: def test_datetime_serialization() -> None: """Test datetime objects are properly handled.""" - dt = datetime(2023, 12, 25, 10, 30, 0, tzinfo=timezone.utc) + dt = datetime(2023, 12, 25, 10, 30, 0, tzinfo=UTC) data = {"timestamp": dt} encoded = encode_json(data, as_bytes=False) @@ -137,7 +137,7 @@ def test_datetime_serialization() -> None: def test_datetime_with_timezone() -> None: """Test datetime with timezone information.""" - dt = datetime.now(timezone.utc) + dt = datetime.now(UTC) data = {"created_at": dt} encoded = encode_json(data, as_bytes=True) @@ -404,7 +404,7 @@ def test_numpy_array_with_datetime_integration() -> None: """Test numpy array serialization alongside datetime objects.""" np = pytest.importorskip("numpy") - dt = datetime(2024, 1, 15, 10, 30, 0, tzinfo=timezone.utc) + dt = datetime(2024, 1, 15, 10, 30, 0, tzinfo=UTC) data = {"timestamp": dt, "values": np.array([100, 200, 300])} encoded = encode_json(data) @@ -474,7 +474,7 @@ def test_serialization_without_numpy_standard_types() -> None: def test_serialization_without_numpy_datetime_support() -> None: """Test datetime serialization works without numpy.""" - dt = datetime(2024, 6, 15, 14, 30, 0, tzinfo=timezone.utc) + dt = datetime(2024, 6, 15, 14, 30, 0, tzinfo=UTC) data = {"timestamp": dt, "message": "test"} encoded = encode_json(data) @@ -531,7 +531,7 @@ def test_numpy_mixed_content_serialization() -> None: "id": 123, "name": "test", "array": np.array([1, 2, 3]), - "timestamp": datetime(2024, 1, 1, 12, 0, 0, tzinfo=timezone.utc), + "timestamp": datetime(2024, 1, 1, 12, 0, 0, tzinfo=UTC), "uuid": str(uuid4()), "nested": {"value": 456, "data": np.array([7, 8, 9])}, } diff --git a/tests/unit/utils/test_sync_tools.py b/tests/unit/utils/test_sync_tools.py index a87b17f17..e5d445567 100644 --- a/tests/unit/utils/test_sync_tools.py +++ b/tests/unit/utils/test_sync_tools.py @@ -13,10 +13,9 @@ import threading import time from collections.abc import Coroutine -from typing import Any, cast +from typing import Any, Self, assert_type, cast import pytest -from typing_extensions import Self, assert_type # Detect whether the sync_tools module is mypyc-compiled. # When compiled, `patch.object` / `patch()` on C-extension modules is a no-op, diff --git a/tools/profiling.py b/tools/profiling.py index bf5473e0d..a124661af 100644 --- a/tools/profiling.py +++ b/tools/profiling.py @@ -7,9 +7,7 @@ import sys import time from dataclasses import dataclass, field -from typing import TYPE_CHECKING, Any - -from typing_extensions import Self +from typing import TYPE_CHECKING, Any, Self if TYPE_CHECKING: from collections.abc import Callable diff --git a/tools/scripts/pgo_training.py b/tools/scripts/pgo_training.py index 590bae588..542eb70ba 100644 --- a/tools/scripts/pgo_training.py +++ b/tools/scripts/pgo_training.py @@ -9,6 +9,7 @@ import sys import tempfile import time +from datetime import UTC from pathlib import Path __all__ = ("main",) @@ -160,7 +161,7 @@ def _train_hashable_keys() -> None: def _train_serialization() -> None: """Exercise JSON encode/decode paths.""" - from datetime import datetime, timezone + from datetime import datetime from sqlspec.utils.serializers._json import ( convert_date_to_iso, @@ -172,8 +173,8 @@ def _train_serialization() -> None: small_obj = {"key": "value", "num": 42} medium_obj = {f"field_{i}": i * 1.5 for i in range(20)} list_obj = [{"id": i, "name": f"item_{i}", "active": i % 2 == 0} for i in range(50)] - now = datetime.now(tz=timezone.utc) - today = datetime.now(tz=timezone.utc).date() + now = datetime.now(tz=UTC) + today = datetime.now(tz=UTC).date() for _ in range(10000): s1 = encode_json(small_obj) diff --git a/tools/sphinx_ext/playground.py b/tools/sphinx_ext/playground.py index 97e6b979e..6668876fe 100644 --- a/tools/sphinx_ext/playground.py +++ b/tools/sphinx_ext/playground.py @@ -2,13 +2,12 @@ import logging from pathlib import Path -from typing import Any +from typing import Any, Self from uuid import uuid4 from docutils import nodes from docutils.parsers.rst import Directive from jinja2 import Environment, FileSystemLoader, select_autoescape -from typing_extensions import Self __all__ = ("WasmPlayground", "setup") From b18792624f43300dd56c16a64acb935525221de1 Mon Sep 17 00:00:00 2001 From: Cody Fincher Date: Fri, 9 Oct 2026 01:41:48 +0000 Subject: [PATCH 4/8] refactor(adapters): modernize adapters, dialects, and tests for Python 3.11 --- sqlspec/adapters/adbc/adk/store.py | 16 +++++------ sqlspec/adapters/adbc/config.py | 4 +-- sqlspec/adapters/adbc/driver.py | 4 +-- sqlspec/adapters/adbc/litestar/store.py | 6 ++-- sqlspec/adapters/aiomysql/adk/store.py | 4 +-- sqlspec/adapters/aiomysql/config.py | 3 +- sqlspec/adapters/aiomysql/litestar/store.py | 10 +++---- sqlspec/adapters/aiosqlite/adk/store.py | 28 ++++++++----------- sqlspec/adapters/aiosqlite/config.py | 3 +- sqlspec/adapters/aiosqlite/events/store.py | 4 +-- sqlspec/adapters/aiosqlite/litestar/store.py | 12 ++++---- sqlspec/adapters/aiosqlite/pool.py | 8 +++--- sqlspec/adapters/arrow_odbc/adk/store.py | 24 ++++++++-------- sqlspec/adapters/arrow_odbc/config.py | 4 +-- sqlspec/adapters/arrow_odbc/core.py | 4 +-- sqlspec/adapters/arrow_odbc/driver.py | 4 +-- sqlspec/adapters/arrow_odbc/litestar/store.py | 12 ++++---- sqlspec/adapters/asyncmy/adk/store.py | 4 +-- sqlspec/adapters/asyncmy/config.py | 3 +- sqlspec/adapters/asyncmy/litestar/store.py | 10 +++---- sqlspec/adapters/asyncpg/adk/store.py | 4 +-- sqlspec/adapters/asyncpg/config.py | 3 +- sqlspec/adapters/asyncpg/events/_hub.py | 2 +- sqlspec/adapters/asyncpg/events/backend.py | 6 ++-- sqlspec/adapters/asyncpg/events/store.py | 2 +- sqlspec/adapters/asyncpg/litestar/store.py | 8 ++---- sqlspec/adapters/bigquery/adk/store.py | 10 +++---- sqlspec/adapters/bigquery/config.py | 4 +-- sqlspec/adapters/bigquery/events/store.py | 2 +- sqlspec/adapters/bigquery/litestar/store.py | 12 ++++---- .../adapters/cockroach_asyncpg/adk/store.py | 4 +-- sqlspec/adapters/cockroach_asyncpg/config.py | 4 +-- .../cockroach_asyncpg/litestar/store.py | 8 ++---- .../adapters/cockroach_psycopg/adk/store.py | 4 +-- sqlspec/adapters/cockroach_psycopg/config.py | 4 +-- .../cockroach_psycopg/litestar/store.py | 10 +++---- sqlspec/adapters/db2/adk/store.py | 10 +++---- sqlspec/adapters/db2/config.py | 3 +- sqlspec/adapters/db2/core.py | 6 ++-- sqlspec/adapters/db2/litestar/store.py | 10 +++---- sqlspec/adapters/db2/pool.py | 2 +- sqlspec/adapters/duckdb/adk/store.py | 18 ++++++------ sqlspec/adapters/duckdb/config.py | 4 +-- sqlspec/adapters/duckdb/litestar/store.py | 8 +++--- sqlspec/adapters/duckdb/pool.py | 4 +-- sqlspec/adapters/mssql_python/adk/store.py | 4 +-- sqlspec/adapters/mssql_python/config.py | 4 +-- sqlspec/adapters/mssql_python/driver.py | 4 +-- .../adapters/mssql_python/litestar/store.py | 8 +++--- sqlspec/adapters/mysqlconnector/adk/store.py | 4 +-- sqlspec/adapters/mysqlconnector/config.py | 4 +-- .../adapters/mysqlconnector/litestar/store.py | 14 ++++------ sqlspec/adapters/oracledb/adk/store.py | 4 +-- sqlspec/adapters/oracledb/config.py | 4 +-- sqlspec/adapters/oracledb/data_dictionary.py | 4 +-- sqlspec/adapters/oracledb/events/backend.py | 4 +-- sqlspec/adapters/oracledb/events/store.py | 4 +-- sqlspec/adapters/oracledb/litestar/store.py | 14 ++++------ sqlspec/adapters/psqlpy/adk/store.py | 4 +-- sqlspec/adapters/psqlpy/config.py | 3 +- sqlspec/adapters/psqlpy/events/_hub.py | 4 +-- sqlspec/adapters/psqlpy/events/backend.py | 6 ++-- sqlspec/adapters/psqlpy/events/store.py | 2 +- sqlspec/adapters/psqlpy/litestar/store.py | 8 ++---- sqlspec/adapters/psycopg/adk/store.py | 4 +-- sqlspec/adapters/psycopg/config.py | 3 +- sqlspec/adapters/psycopg/core.py | 4 +-- sqlspec/adapters/psycopg/driver.py | 4 +-- sqlspec/adapters/psycopg/events/_hub.py | 2 +- sqlspec/adapters/psycopg/events/backend.py | 8 +++--- sqlspec/adapters/psycopg/events/store.py | 2 +- sqlspec/adapters/psycopg/litestar/store.py | 10 +++---- sqlspec/adapters/pymssql/adk/store.py | 4 +-- sqlspec/adapters/pymssql/config.py | 4 +-- sqlspec/adapters/pymssql/litestar/store.py | 8 +++--- sqlspec/adapters/pymysql/adk/store.py | 4 +-- sqlspec/adapters/pymysql/config.py | 4 +-- sqlspec/adapters/pymysql/litestar/store.py | 10 +++---- sqlspec/adapters/spanner/adk/store.py | 16 +++++------ sqlspec/adapters/spanner/config.py | 4 +-- sqlspec/adapters/spanner/litestar/store.py | 14 ++++------ sqlspec/adapters/spanner/type_converter.py | 4 +-- sqlspec/adapters/sqlite/adk/store.py | 26 ++++++++--------- sqlspec/adapters/sqlite/config.py | 4 +-- sqlspec/adapters/sqlite/events/store.py | 4 +-- sqlspec/adapters/sqlite/litestar/store.py | 12 ++++---- sqlspec/dialects/spanner/_expressions.py | 3 +- .../adapters/_shared/adk_behaviors.py | 10 +++---- .../duckdb/extensions/adk/test_maintenance.py | 12 ++++---- .../extensions/adk/test_memory_store.py | 18 ++++++------ .../duckdb/extensions/adk/test_store.py | 12 ++++---- .../duckdb/test_type_coercion_capabilities.py | 4 +-- .../mssql/test_memory_deduplication.py | 4 +-- .../aiomysql/extensions/adk/test_store.py | 4 +-- .../asyncmy/extensions/adk/test_store.py | 4 +-- .../extensions/adk/test_store.py | 4 +-- .../extensions/adk/test_oracle_specific.py | 4 +-- .../adk/test_memory_vector_codec_free.py | 4 +-- .../test_type_coercion_capabilities.py | 8 +++--- .../spanner/extensions/adk/test_adk_store.py | 4 +-- .../adapters/spanner/spanner/test_driver.py | 4 +-- .../spanner/test_parameter_variants.py | 4 +-- .../adbc/extensions/adk/test_memory_store.py | 10 +++---- .../extensions/adk/test_memory_store.py | 20 ++++++------- .../sqlite/extensions/adk/test_maintenance.py | 10 +++---- .../extensions/adk/test_memory_store.py | 20 ++++++------- .../sqlite/test_type_coercion_capabilities.py | 6 ++-- .../test_channels_backend_concurrency.py | 6 ++-- .../adapters/test_aiomysql/test_adk_store.py | 8 +++--- .../adapters/test_aiomysql/test_driver.py | 3 +- .../test_aiosqlite/test_adk_config.py | 3 +- .../test_arrow_odbc/test_db2_stores.py | 6 ++-- .../test_arrow_odbc/test_tsql_stores.py | 6 ++-- .../adapters/test_asyncmy/test_adk_store.py | 8 +++--- .../adapters/test_asyncpg/test_adk_store.py | 3 +- .../unit/adapters/test_asyncpg/test_config.py | 3 +- .../adapters/test_bigquery/test_adk_store.py | 15 +++++----- .../test_cockroach_asyncpg/test_adk_store.py | 3 +- .../test_cockroach_asyncpg/test_config.py | 3 +- .../test_cockroach_psycopg/test_adk_store.py | 3 +- .../test_contract_streaming_deviations.py | 4 +-- tests/unit/adapters/test_db2/_fakes.py | 4 +-- tests/unit/adapters/test_db2/test_adk.py | 26 ++++++++--------- tests/unit/adapters/test_db2/test_litestar.py | 4 +-- .../unit/adapters/test_db2/test_migrations.py | 6 ++-- .../adapters/test_duckdb/test_adk_store.py | 3 +- .../unit/adapters/test_duckdb/test_config.py | 3 +- .../test_mssql_python/test_adk_store.py | 8 +++--- .../test_mssql_python/test_litestar_store.py | 4 +-- .../unit/adapters/test_mysql_store_errors.py | 8 +++--- .../test_mysqlconnector/test_adk_store.py | 12 ++++---- .../adapters/test_native_error_boundaries.py | 8 +++--- .../adapters/test_oracledb/test_config.py | 3 +- .../test_oracledb/test_litestar_store.py | 8 ++---- .../test_oracledb/test_oracle_adk_store.py | 9 +++--- .../adapters/test_psqlpy/test_adk_store.py | 3 +- .../adapters/test_psycopg/test_adk_store.py | 19 ++++++------- .../adapters/test_pymssql/test_adk_store.py | 5 ++-- .../adapters/test_pymysql/test_adk_store.py | 8 +++--- .../unit/adapters/test_pymysql/test_config.py | 3 +- .../test_spanner/test_async_driver.py | 3 +- .../test_spanner/test_batch_write_api.py | 3 +- .../unit/adapters/test_spanner/test_config.py | 3 +- .../test_spanner/test_litestar_store.py | 4 +-- .../test_spanner/test_session_controls.py | 3 +- .../test_spanner/test_type_converter.py | 10 +++---- .../adapters/test_sqlite/test_adk_config.py | 3 +- 147 files changed, 430 insertions(+), 563 deletions(-) diff --git a/sqlspec/adapters/adbc/adk/store.py b/sqlspec/adapters/adbc/adk/store.py index 84d8bd101..ccc4b0af3 100644 --- a/sqlspec/adapters/adbc/adk/store.py +++ b/sqlspec/adapters/adbc/adk/store.py @@ -1,7 +1,7 @@ """ADBC ADK store for Google Agent Development Kit session/event storage.""" import contextlib -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from functools import lru_cache from typing import TYPE_CHECKING, Any, Final, Literal @@ -1010,14 +1010,14 @@ def _append_event_and_update_state( self._execute( cursor, insert_app_state_sql, - (app_name, self._serialize_state(app_state), datetime.now(timezone.utc)), + (app_name, self._serialize_state(app_state), datetime.now(UTC)), ) if user_state is not None: self._execute(cursor, delete_user_state_sql, (app_name, user_id)) self._execute( cursor, insert_user_state_sql, - (app_name, user_id, self._serialize_state(user_state), datetime.now(timezone.utc)), + (app_name, user_id, self._serialize_state(user_state), datetime.now(UTC)), ) conn.commit() else: @@ -1237,7 +1237,7 @@ def _upsert_app_state(self, app_name: str, state: "dict[str, Any]") -> None: cursor = conn.cursor() try: self._execute(cursor, delete_sql, (app_name,)) - self._execute(cursor, insert_sql, (app_name, self._serialize_state(state), datetime.now(timezone.utc))) + self._execute(cursor, insert_sql, (app_name, self._serialize_state(state), datetime.now(UTC))) conn.commit() finally: cursor.close() @@ -1252,9 +1252,7 @@ def _upsert_user_state(self, app_name: str, user_id: str, state: "dict[str, Any] cursor = conn.cursor() try: self._execute(cursor, delete_sql, (app_name, user_id)) - self._execute( - cursor, insert_sql, (app_name, user_id, self._serialize_state(state), datetime.now(timezone.utc)) - ) + self._execute(cursor, insert_sql, (app_name, user_id, self._serialize_state(state), datetime.now(UTC))) conn.commit() finally: cursor.close() @@ -1393,7 +1391,7 @@ def _decode_timestamp(self, value: Any) -> datetime: if isinstance(value, datetime): return value if isinstance(value, (int, float)): - return datetime.fromtimestamp(float(value), tz=timezone.utc) + return datetime.fromtimestamp(float(value), tz=UTC) if isinstance(value, str): return datetime.fromisoformat(value) return datetime.fromisoformat(str(value)) @@ -1718,7 +1716,7 @@ def _delete_entries_older_than(self, days: int, app_name: "str | None" = None, s msg = "Memory store is disabled" raise RuntimeError(msg) - cutoff = self._encode_timestamp(datetime.now(timezone.utc) - timedelta(days=days)) + cutoff = self._encode_timestamp(datetime.now(UTC) - timedelta(days=days)) use_returning = self._dialect in {DIALECT_SQLITE, DIALECT_POSTGRESQL, DIALECT_DUCKDB} clauses = ["inserted_at < ?"] params: list[Any] = [cutoff] diff --git a/sqlspec/adapters/adbc/config.py b/sqlspec/adapters/adbc/config.py index 4267d8509..f527dae77 100644 --- a/sqlspec/adapters/adbc/config.py +++ b/sqlspec/adapters/adbc/config.py @@ -1,8 +1,6 @@ """ADBC database configuration.""" -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from sqlspec.adapters.adbc._typing import AdbcConnection, AdbcCursor, AdbcSessionContext from sqlspec.adapters.adbc.core import ( diff --git a/sqlspec/adapters/adbc/driver.py b/sqlspec/adapters/adbc/driver.py index 9e17a99c4..aa25f5e21 100644 --- a/sqlspec/adapters/adbc/driver.py +++ b/sqlspec/adapters/adbc/driver.py @@ -5,9 +5,7 @@ """ import contextlib -from typing import TYPE_CHECKING, Any, Literal, cast - -from typing_extensions import final +from typing import TYPE_CHECKING, Any, Literal, cast, final from sqlspec.adapters.adbc._typing import AdbcCursor, AdbcNativeError, AdbcSessionContext from sqlspec.adapters.adbc.core import ( diff --git a/sqlspec/adapters/adbc/litestar/store.py b/sqlspec/adapters/adbc/litestar/store.py index 5c10ac9f4..a7ecf8316 100644 --- a/sqlspec/adapters/adbc/litestar/store.py +++ b/sqlspec/adapters/adbc/litestar/store.py @@ -13,7 +13,7 @@ - Snowflake: BINARY data type, TIMESTAMP WITH TIME ZONE, ? parameters, MERGE """ -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING from sqlspec.extensions.litestar.store import BaseSQLSpecStore @@ -473,9 +473,9 @@ def _expires_in(self, key: str) -> "int | None": return None if expires_at.tzinfo is None: - expires_at = expires_at.replace(tzinfo=timezone.utc) + expires_at = expires_at.replace(tzinfo=UTC) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 diff --git a/sqlspec/adapters/aiomysql/adk/store.py b/sqlspec/adapters/aiomysql/adk/store.py index 6e943d65d..d4989264b 100644 --- a/sqlspec/adapters/aiomysql/adk/store.py +++ b/sqlspec/adapters/aiomysql/adk/store.py @@ -2,9 +2,7 @@ import re from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, Final, Literal, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast from sqlspec.adapters.aiomysql._typing import AiomysqlCursor, AiomysqlProgrammingError, AiomysqlRawCursor from sqlspec.config import ADKConfig diff --git a/sqlspec/adapters/aiomysql/config.py b/sqlspec/adapters/aiomysql/config.py index d4cee9b5b..b32bb6004 100644 --- a/sqlspec/adapters/aiomysql/config.py +++ b/sqlspec/adapters/aiomysql/config.py @@ -1,11 +1,10 @@ """aiomysql database configuration.""" import contextlib -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from weakref import WeakSet from mypy_extensions import mypyc_attr -from typing_extensions import NotRequired from sqlspec.adapters.aiomysql._typing import ( AiomysqlConnection, diff --git a/sqlspec/adapters/aiomysql/litestar/store.py b/sqlspec/adapters/aiomysql/litestar/store.py index 5bc493a54..d7c56d6b7 100644 --- a/sqlspec/adapters/aiomysql/litestar/store.py +++ b/sqlspec/adapters/aiomysql/litestar/store.py @@ -1,9 +1,7 @@ """aiomysql session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, Final, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, Final, NotRequired, cast from sqlspec.adapters.aiomysql._typing import AiomysqlCursor, AiomysqlProgrammingError, AiomysqlRawCursor from sqlspec.config import LitestarConfig @@ -236,8 +234,8 @@ async def expires_in(self, key: str) -> "int | None": return None expires_at_naive = row[0] - expires_at_utc = expires_at_naive.replace(tzinfo=timezone.utc) - now = datetime.now(timezone.utc) + expires_at_utc = expires_at_naive.replace(tzinfo=UTC) + now = datetime.now(UTC) if expires_at_utc <= now: return 0 diff --git a/sqlspec/adapters/aiosqlite/adk/store.py b/sqlspec/adapters/aiosqlite/adk/store.py index df7990113..9f19ba9ae 100644 --- a/sqlspec/adapters/aiosqlite/adk/store.py +++ b/sqlspec/adapters/aiosqlite/adk/store.py @@ -2,10 +2,8 @@ import re from collections.abc import Mapping -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, Final, Literal, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast from sqlspec.adapters.aiosqlite._typing import aiosqlite_sqlite_module as sqlite3 from sqlspec.adapters.aiosqlite.core import end_transaction, render_pragmas @@ -110,7 +108,7 @@ async def create_session( Returns: Created session record. """ - now = datetime.now(timezone.utc) + now = datetime.now(UTC) now_julian = _datetime_to_julian(now) state_json = to_json(state) @@ -168,7 +166,7 @@ async def get_session( SET update_time = ? WHERE app_name = ? AND user_id = ? AND id = ? """ - await conn.execute(update_sql, (_datetime_to_julian(datetime.now(timezone.utc)), *params)) + await conn.execute(update_sql, (_datetime_to_julian(datetime.now(UTC)), *params)) await end_transaction(conn, commit=True) cursor = await conn.execute(sql, params) row = await cursor.fetchone() @@ -198,7 +196,7 @@ async def update_session_state(self, app_name: str, user_id: str, session_id: st session_id: Session identifier. state: New state dictionary (replaces existing state). """ - now_julian = _datetime_to_julian(datetime.now(timezone.utc)) + now_julian = _datetime_to_julian(datetime.now(UTC)) state_json = to_json(state) sql = f""" @@ -340,7 +338,7 @@ async def append_event_and_update_state( """ timestamp_julian = _datetime_to_julian(event_record["timestamp"]) event_data_json = to_json(event_record["event_data"]) - now_julian = _datetime_to_julian(datetime.now(timezone.utc)) + now_julian = _datetime_to_julian(datetime.now(UTC)) state_json = to_json(state) insert_sql = f""" @@ -585,7 +583,7 @@ async def upsert_app_state(self, app_name: str, state: "dict[str, Any]") -> None async with self._config.provide_connection() as conn: await self._apply_pragmas(conn) - await conn.execute(sql, (app_name, to_json(state), _datetime_to_julian(datetime.now(timezone.utc)))) + await conn.execute(sql, (app_name, to_json(state), _datetime_to_julian(datetime.now(UTC)))) await end_transaction(conn, commit=True) async def upsert_user_state(self, app_name: str, user_id: str, state: "dict[str, Any]") -> None: @@ -600,9 +598,7 @@ async def upsert_user_state(self, app_name: str, user_id: str, state: "dict[str, async with self._config.provide_connection() as conn: await self._apply_pragmas(conn) - await conn.execute( - sql, (app_name, user_id, to_json(state), _datetime_to_julian(datetime.now(timezone.utc))) - ) + await conn.execute(sql, (app_name, user_id, to_json(state), _datetime_to_julian(datetime.now(UTC)))) await end_transaction(conn, commit=True) async def get_metadata(self, key: str) -> "str | None": @@ -957,7 +953,7 @@ async def delete_entries_older_than( msg = "Memory store is disabled" raise RuntimeError(msg) - cutoff = _datetime_to_julian(datetime.now(timezone.utc)) - days + cutoff = _datetime_to_julian(datetime.now(UTC)) - days sql = f"DELETE FROM {self._memory_table} WHERE inserted_at < ?" params: list[Any] = [cutoff] if app_name is not None: @@ -1112,8 +1108,8 @@ def _datetime_to_julian(dt: datetime) -> float: Julian Day number as REAL. """ if dt.tzinfo is None: - dt = dt.replace(tzinfo=timezone.utc) - epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) + dt = dt.replace(tzinfo=UTC) + epoch = datetime(1970, 1, 1, tzinfo=UTC) delta_days = (dt - epoch).total_seconds() / SECONDS_PER_DAY return JULIAN_EPOCH + delta_days @@ -1129,7 +1125,7 @@ def _julian_to_datetime(julian: float) -> datetime: """ days_since_epoch = julian - JULIAN_EPOCH timestamp = days_since_epoch * SECONDS_PER_DAY - return datetime.fromtimestamp(timestamp, tz=timezone.utc) + return datetime.fromtimestamp(timestamp, tz=UTC) def _build_sqlite_scope_clause( diff --git a/sqlspec/adapters/aiosqlite/config.py b/sqlspec/adapters/aiosqlite/config.py index d5c80338d..8e341ccd0 100644 --- a/sqlspec/adapters/aiosqlite/config.py +++ b/sqlspec/adapters/aiosqlite/config.py @@ -1,10 +1,9 @@ """Aiosqlite database configuration.""" from os import PathLike -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from mypy_extensions import mypyc_attr -from typing_extensions import NotRequired from sqlspec.adapters.aiosqlite._typing import ( AiosqliteConnection, diff --git a/sqlspec/adapters/aiosqlite/events/store.py b/sqlspec/adapters/aiosqlite/events/store.py index 90a842092..c4c9b2ba6 100644 --- a/sqlspec/adapters/aiosqlite/events/store.py +++ b/sqlspec/adapters/aiosqlite/events/store.py @@ -1,8 +1,6 @@ """AioSQLite event queue store.""" -from typing import Any - -from typing_extensions import NotRequired +from typing import Any, NotRequired from sqlspec.adapters.aiosqlite.config import AiosqliteConfig from sqlspec.adapters.aiosqlite.core import apply_extension_pragmas, extension_pragma_statements diff --git a/sqlspec/adapters/aiosqlite/litestar/store.py b/sqlspec/adapters/aiosqlite/litestar/store.py index d53de75bf..215414901 100644 --- a/sqlspec/adapters/aiosqlite/litestar/store.py +++ b/sqlspec/adapters/aiosqlite/litestar/store.py @@ -1,9 +1,7 @@ """AioSQLite session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, NotRequired from sqlspec.adapters.aiosqlite.core import apply_extension_pragmas, end_transaction, extension_pragma_statements from sqlspec.config import LitestarConfig @@ -204,7 +202,7 @@ async def expires_in(self, key: str) -> "int | None": if expires_at is None: return None - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 @@ -267,7 +265,7 @@ def _datetime_to_julian(self, dt: "datetime | None") -> "float | None": if dt is None: return None - epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) + epoch = datetime(1970, 1, 1, tzinfo=UTC) delta_days = (dt - epoch).total_seconds() / SECONDS_PER_DAY return JULIAN_EPOCH + delta_days @@ -285,4 +283,4 @@ def _julian_to_datetime(self, julian: "float | None") -> "datetime | None": days_since_epoch = julian - JULIAN_EPOCH timestamp = days_since_epoch * SECONDS_PER_DAY - return datetime.fromtimestamp(timestamp, tz=timezone.utc) + return datetime.fromtimestamp(timestamp, tz=UTC) diff --git a/sqlspec/adapters/aiosqlite/pool.py b/sqlspec/adapters/aiosqlite/pool.py index 3325a1650..0b8829df7 100644 --- a/sqlspec/adapters/aiosqlite/pool.py +++ b/sqlspec/adapters/aiosqlite/pool.py @@ -439,7 +439,7 @@ async def _force_stop_connection(self, connection: AiosqlitePoolConnection, *, r connection_id=connection.id, reason=reason, ) - except asyncio.TimeoutError: + except TimeoutError: log_with_context( logger, logging.WARNING, @@ -600,7 +600,7 @@ async def _claim_if_healthy(self, connection: AiosqlitePoolConnection) -> bool: if not is_alive: await self._retire_connection(connection, reason="health_check_failed") return False - except asyncio.TimeoutError: + except TimeoutError: await self._retire_connection(connection, reason="health_check_timeout") return False @@ -629,7 +629,7 @@ async def _retire_connection(self, connection: AiosqlitePoolConnection, *, reaso try: await asyncio.wait_for(connection.close(), timeout=self._operation_timeout) - except asyncio.TimeoutError: + except TimeoutError: log_with_context( logger, logging.WARNING, @@ -788,7 +788,7 @@ async def acquire(self) -> AiosqlitePoolConnection: connection = await asyncio.wait_for(self._get_connection(), timeout=self._connect_timeout) except AiosqlitePoolClosedError: raise - except asyncio.TimeoutError as e: + except TimeoutError as e: msg = f"Connection acquisition timed out after {self._connect_timeout}s" raise AiosqliteConnectTimeoutError(msg) from e diff --git a/sqlspec/adapters/arrow_odbc/adk/store.py b/sqlspec/adapters/arrow_odbc/adk/store.py index c15674f46..51d904ecc 100644 --- a/sqlspec/adapters/arrow_odbc/adk/store.py +++ b/sqlspec/adapters/arrow_odbc/adk/store.py @@ -1,9 +1,7 @@ """arrow-odbc ADK stores for Google Agent Development Kit session storage.""" -from datetime import datetime, timezone -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NotRequired, cast from sqlspec.adapters.arrow_odbc.core import ( DB2_INDEX_EXISTS_SQL, @@ -549,8 +547,8 @@ def delete_entries_older_than(self, days: int, app_name: "str | None" = None, sc if not self._enabled: msg = "Memory store is disabled" raise RuntimeError(msg) - cutoff = datetime.now(timezone.utc).timestamp() - (days * 86_400) - cutoff_dt = datetime.fromtimestamp(cutoff, tz=timezone.utc) + cutoff = datetime.now(UTC).timestamp() - (days * 86_400) + cutoff_dt = datetime.fromtimestamp(cutoff, tz=UTC) clauses = ["inserted_at < ?"] params: list[Any] = [self._sql.format_datetime(cutoff_dt)] if app_name is not None: @@ -903,8 +901,8 @@ def _optional_json_dict(value: Any) -> "dict[str, Any] | None": def _datetime_value(value: Any) -> datetime: if isinstance(value, datetime): if value.tzinfo is None: - return value.replace(tzinfo=timezone.utc) - return value.astimezone(timezone.utc) + return value.replace(tzinfo=UTC) + return value.astimezone(UTC) if isinstance(value, bytearray): value = bytes(value) if isinstance(value, bytes): @@ -913,15 +911,15 @@ def _datetime_value(value: Any) -> datetime: normalized = value.replace("Z", "+00:00") parsed = datetime.fromisoformat(normalized) if parsed.tzinfo is None: - return parsed.replace(tzinfo=timezone.utc) - return parsed.astimezone(timezone.utc) - return datetime.now(timezone.utc) + return parsed.replace(tzinfo=UTC) + return parsed.astimezone(UTC) + return datetime.now(UTC) def _format_datetime(value: "datetime | None") -> "str | None": if value is None: return None - normalized = value.replace(tzinfo=timezone.utc) if value.tzinfo is None else value.astimezone(timezone.utc) + normalized = value.replace(tzinfo=UTC) if value.tzinfo is None else value.astimezone(UTC) return normalized.replace(tzinfo=None).isoformat(timespec="microseconds") @@ -1113,7 +1111,7 @@ class _Db2AdkSql: def now_params(self) -> "tuple[Any, ...]": """Return the current naive-UTC time bound to ``now_sql``.""" - return (db2_timestamp_text(datetime.now(timezone.utc)),) + return (db2_timestamp_text(datetime.now(UTC)),) def table_ref(self, table: str) -> str: return table diff --git a/sqlspec/adapters/arrow_odbc/config.py b/sqlspec/adapters/arrow_odbc/config.py index 57ea7cc4f..34d226d80 100644 --- a/sqlspec/adapters/arrow_odbc/config.py +++ b/sqlspec/adapters/arrow_odbc/config.py @@ -1,9 +1,7 @@ """arrow-odbc database configuration.""" import threading -from typing import TYPE_CHECKING, Any, ClassVar, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, NotRequired, TypedDict, cast from sqlspec.adapters.arrow_odbc._typing import ( ArrowOdbcConnection, diff --git a/sqlspec/adapters/arrow_odbc/core.py b/sqlspec/adapters/arrow_odbc/core.py index 20590e480..c50d709e6 100644 --- a/sqlspec/adapters/arrow_odbc/core.py +++ b/sqlspec/adapters/arrow_odbc/core.py @@ -1,7 +1,7 @@ """arrow-odbc adapter core helpers.""" import re -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any, Final from sqlglot import exp @@ -543,7 +543,7 @@ def db2_timestamp_text(value: "datetime | None") -> "str | None": if value is None: return None if value.tzinfo is not None: - value = value.astimezone(timezone.utc).replace(tzinfo=None) + value = value.astimezone(UTC).replace(tzinfo=None) return value.isoformat(sep=" ", timespec="microseconds") diff --git a/sqlspec/adapters/arrow_odbc/driver.py b/sqlspec/adapters/arrow_odbc/driver.py index 580dacadc..fd465dffa 100644 --- a/sqlspec/adapters/arrow_odbc/driver.py +++ b/sqlspec/adapters/arrow_odbc/driver.py @@ -3,7 +3,7 @@ import contextlib import re from collections.abc import Iterable, Mapping -from datetime import datetime, timezone +from datetime import UTC, datetime from itertools import chain from typing import TYPE_CHECKING, Any, Final, cast @@ -593,7 +593,7 @@ def _unwrap_parameter(value: Any, naive_utc_datetimes: bool = False) -> Any: if wrapped is None: return None if naive_utc_datetimes and isinstance(wrapped, datetime) and wrapped.tzinfo is not None: - wrapped = wrapped.astimezone(timezone.utc).replace(tzinfo=None) + wrapped = wrapped.astimezone(UTC).replace(tzinfo=None) return str(wrapped) diff --git a/sqlspec/adapters/arrow_odbc/litestar/store.py b/sqlspec/adapters/arrow_odbc/litestar/store.py index f7f6130f1..a735dc8c1 100644 --- a/sqlspec/adapters/arrow_odbc/litestar/store.py +++ b/sqlspec/adapters/arrow_odbc/litestar/store.py @@ -1,7 +1,7 @@ """arrow-odbc Litestar Store implementation.""" import base64 -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING, Any from sqlspec.adapters.arrow_odbc.core import ( @@ -88,7 +88,7 @@ def _get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | return None expires_at = _normalize_utc(_row_value(row, "expires_at", 1)) - if expires_at is not None and expires_at < datetime.now(timezone.utc): + if expires_at is not None and expires_at < datetime.now(UTC): self._delete(key) return None @@ -151,7 +151,7 @@ def _expires_in(self, key: str) -> "int | None": expires_at = _normalize_utc(_row_value(row, "expires_at", 0)) if expires_at is None: return None - remaining = expires_at - datetime.now(timezone.utc) + remaining = expires_at - datetime.now(UTC) return max(0, int(remaining.total_seconds())) def _delete_expired(self) -> int: @@ -423,7 +423,7 @@ def delete_expired(self) -> "tuple[str, tuple[Any, ...]]": def _db2_now() -> "str | None": - return db2_timestamp_text(datetime.now(timezone.utc)) + return db2_timestamp_text(datetime.now(UTC)) def _row_value(row: object, key: str, index: int) -> Any: @@ -446,8 +446,8 @@ def _normalize_utc(value: Any) -> "datetime | None": if not isinstance(value, datetime): return None if value.tzinfo is None: - return value.replace(tzinfo=timezone.utc) - return value.astimezone(timezone.utc) + return value.replace(tzinfo=UTC) + return value.astimezone(UTC) def _format_datetime(value: "datetime | None") -> "str | None": diff --git a/sqlspec/adapters/asyncmy/adk/store.py b/sqlspec/adapters/asyncmy/adk/store.py index 8fe51925e..3f6be8238 100644 --- a/sqlspec/adapters/asyncmy/adk/store.py +++ b/sqlspec/adapters/asyncmy/adk/store.py @@ -2,9 +2,7 @@ import re from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, Final, Literal, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast from sqlspec.adapters.asyncmy._typing import AsyncmyProgrammingError from sqlspec.adapters.asyncmy.core import resolve_rowcount diff --git a/sqlspec/adapters/asyncmy/config.py b/sqlspec/adapters/asyncmy/config.py index e3af7c935..5f1a74b86 100644 --- a/sqlspec/adapters/asyncmy/config.py +++ b/sqlspec/adapters/asyncmy/config.py @@ -2,11 +2,10 @@ import contextlib import inspect -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from weakref import WeakSet from mypy_extensions import mypyc_attr -from typing_extensions import NotRequired from sqlspec.adapters.asyncmy._typing import ( AsyncmyConnection, diff --git a/sqlspec/adapters/asyncmy/litestar/store.py b/sqlspec/adapters/asyncmy/litestar/store.py index 86efa20bd..c88cc68e8 100644 --- a/sqlspec/adapters/asyncmy/litestar/store.py +++ b/sqlspec/adapters/asyncmy/litestar/store.py @@ -1,9 +1,7 @@ """AsyncMy session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, Final, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, Final, NotRequired, cast from sqlspec.adapters.asyncmy._typing import AsyncmyProgrammingError from sqlspec.adapters.asyncmy.core import resolve_rowcount @@ -222,8 +220,8 @@ async def expires_in(self, key: str) -> "int | None": return None expires_at_naive = row[0] - expires_at_utc = expires_at_naive.replace(tzinfo=timezone.utc) - now = datetime.now(timezone.utc) + expires_at_utc = expires_at_naive.replace(tzinfo=UTC) + now = datetime.now(UTC) if expires_at_utc <= now: return 0 diff --git a/sqlspec/adapters/asyncpg/adk/store.py b/sqlspec/adapters/asyncpg/adk/store.py index ac45083b2..132a7ba1d 100644 --- a/sqlspec/adapters/asyncpg/adk/store.py +++ b/sqlspec/adapters/asyncpg/adk/store.py @@ -1,8 +1,6 @@ """AsyncPG ADK store for Google Agent Development Kit session/event storage.""" -from typing import TYPE_CHECKING, Any, Final, Literal, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast from sqlspec.adapters.asyncpg._typing import asyncpg_module as asyncpg from sqlspec.config import ADKConfig, AsyncConfigT diff --git a/sqlspec/adapters/asyncpg/config.py b/sqlspec/adapters/asyncpg/config.py index 543c15bd3..ce5d40b01 100644 --- a/sqlspec/adapters/asyncpg/config.py +++ b/sqlspec/adapters/asyncpg/config.py @@ -1,10 +1,9 @@ """AsyncPG database configuration with direct field-based configuration.""" from contextlib import suppress -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, TypedDict, cast +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NotRequired, TypedDict, cast from mypy_extensions import mypyc_attr -from typing_extensions import NotRequired import sqlspec.adapters.asyncpg._typing as _asyncpg_typing from sqlspec.adapters.asyncpg._typing import ( diff --git a/sqlspec/adapters/asyncpg/events/_hub.py b/sqlspec/adapters/asyncpg/events/_hub.py index 175f07f1d..a9f99844e 100644 --- a/sqlspec/adapters/asyncpg/events/_hub.py +++ b/sqlspec/adapters/asyncpg/events/_hub.py @@ -110,7 +110,7 @@ async def dequeue(self, channel: str, poll_interval: float) -> "str | None": return None try: payload = await asyncio.wait_for(queue.get(), timeout=poll_interval) - except asyncio.TimeoutError: + except TimeoutError: return None else: self._record_queue_depth() diff --git a/sqlspec/adapters/asyncpg/events/backend.py b/sqlspec/adapters/asyncpg/events/backend.py index 20a6be6f3..0668ebbdb 100644 --- a/sqlspec/adapters/asyncpg/events/backend.py +++ b/sqlspec/adapters/asyncpg/events/backend.py @@ -2,7 +2,7 @@ """Native and hybrid PostgreSQL backends for EventChannel.""" import logging -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any, cast from sqlspec.adapters.asyncpg.events._hub import AsyncpgListenerHub @@ -167,7 +167,7 @@ async def _dequeue_reconciled(self, channel: str) -> EventMessage | None: async def _publish_durable( self, channel: str, event_id: str, payload: "dict[str, Any]", metadata: "dict[str, Any] | None" ) -> None: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) async with self._config.provide_session() as driver: await driver.execute( SQL( @@ -388,5 +388,5 @@ def _extract_marker_id(payload: "str | None") -> "str | None": def _record_dequeue_result(runtime: Any, event: "EventMessage | None") -> None: if event is None: return - latency_ms = max(0.0, (datetime.now(timezone.utc) - event.created_at).total_seconds() * 1000) + latency_ms = max(0.0, (datetime.now(UTC) - event.created_at).total_seconds() * 1000) runtime.record_metric("events.dequeue.latency_ms", latency_ms) diff --git a/sqlspec/adapters/asyncpg/events/store.py b/sqlspec/adapters/asyncpg/events/store.py index 1c1204d8b..9c55518df 100644 --- a/sqlspec/adapters/asyncpg/events/store.py +++ b/sqlspec/adapters/asyncpg/events/store.py @@ -1,6 +1,6 @@ """AsyncPG event queue store for PostgreSQL JSONB storage.""" -from typing_extensions import NotRequired +from typing import NotRequired from sqlspec.adapters.asyncpg.config import AsyncpgConfig from sqlspec.config import EventsConfig diff --git a/sqlspec/adapters/asyncpg/litestar/store.py b/sqlspec/adapters/asyncpg/litestar/store.py index e60e1c98f..262dd09df 100644 --- a/sqlspec/adapters/asyncpg/litestar/store.py +++ b/sqlspec/adapters/asyncpg/litestar/store.py @@ -1,9 +1,7 @@ """AsyncPG session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, NotRequired, cast from sqlspec.config import LitestarConfig from sqlspec.extensions.litestar.store import BaseSQLSpecStore @@ -194,7 +192,7 @@ async def expires_in(self, key: str) -> "int | None": if expires_at is None: return None - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 diff --git a/sqlspec/adapters/bigquery/adk/store.py b/sqlspec/adapters/bigquery/adk/store.py index 83cb17498..0070c98d5 100644 --- a/sqlspec/adapters/bigquery/adk/store.py +++ b/sqlspec/adapters/bigquery/adk/store.py @@ -10,10 +10,10 @@ """ import math -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, ClassVar, cast +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, ClassVar, NotRequired, cast -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from sqlspec.adapters.bigquery._typing import bigquery_module as bigquery from sqlspec.adapters.bigquery.config import BigQueryConfig @@ -231,7 +231,7 @@ def _json_param(self, name: str, value: "dict[str, Any] | None") -> Any: def _create_session( self, session_id: str, app_name: str, user_id: str, state: "dict[str, Any]", owner_id: "Any | None" = None ) -> StoredSession: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) owner_column = f", {self._owner_id_column_name}" if self._owner_id_column_name else "" owner_select = ", @owner_id AS owner_id" if self._owner_id_column_name else "" owner_update = f", {self._owner_id_column_name} = source.owner_id" if self._owner_id_column_name else "" @@ -341,7 +341,7 @@ def _list_sessions( if page_limit == 0: return [] - window_start = datetime.now(timezone.utc) - timedelta(days=self._lookup_window_days) + window_start = datetime.now(UTC) - timedelta(days=self._lookup_window_days) sql = f""" SELECT id, app_name, user_id, state, create_time, update_time FROM {self._qualified(self._session_table)} diff --git a/sqlspec/adapters/bigquery/config.py b/sqlspec/adapters/bigquery/config.py index 11072c786..ebf14ae99 100644 --- a/sqlspec/adapters/bigquery/config.py +++ b/sqlspec/adapters/bigquery/config.py @@ -1,9 +1,7 @@ """BigQuery database configuration.""" import threading -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from sqlspec.adapters.bigquery._typing import ( BigQueryConnection, diff --git a/sqlspec/adapters/bigquery/events/store.py b/sqlspec/adapters/bigquery/events/store.py index 1fd161ea0..822c1104a 100644 --- a/sqlspec/adapters/bigquery/events/store.py +++ b/sqlspec/adapters/bigquery/events/store.py @@ -12,7 +12,7 @@ } """ -from typing_extensions import NotRequired +from typing import NotRequired from sqlspec.adapters.bigquery.config import BigQueryConfig from sqlspec.config import EventsConfig diff --git a/sqlspec/adapters/bigquery/litestar/store.py b/sqlspec/adapters/bigquery/litestar/store.py index c63e0858f..cb742311c 100644 --- a/sqlspec/adapters/bigquery/litestar/store.py +++ b/sqlspec/adapters/bigquery/litestar/store.py @@ -1,9 +1,7 @@ """BigQuery session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, NotRequired, cast from sqlspec.config import LitestarConfig from sqlspec.extensions.litestar.store import BaseSQLSpecStore @@ -200,7 +198,7 @@ def _datetime_to_timestamp(self, dt: "datetime | None") -> "datetime | None": if dt is None: return None if dt.tzinfo is None: - return dt.replace(tzinfo=timezone.utc) + return dt.replace(tzinfo=UTC) return dt def _timestamp_to_datetime(self, ts: "datetime | None") -> "datetime | None": @@ -215,7 +213,7 @@ def _timestamp_to_datetime(self, ts: "datetime | None") -> "datetime | None": if ts is None: return None if ts.tzinfo is None: - return ts.replace(tzinfo=timezone.utc) + return ts.replace(tzinfo=UTC) return ts def _create_table(self) -> None: @@ -324,7 +322,7 @@ def _expires_in(self, key: str) -> "int | None": if expires_at_dt is None: return None - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at_dt <= now: return 0 diff --git a/sqlspec/adapters/cockroach_asyncpg/adk/store.py b/sqlspec/adapters/cockroach_asyncpg/adk/store.py index a536be1b8..d75e16aef 100644 --- a/sqlspec/adapters/cockroach_asyncpg/adk/store.py +++ b/sqlspec/adapters/cockroach_asyncpg/adk/store.py @@ -1,8 +1,6 @@ """CockroachDB ADK store for Google Agent Development Kit session/event storage (asyncpg).""" -from typing import TYPE_CHECKING, Any, Literal, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, Literal, NotRequired, cast from sqlspec.adapters.cockroach_asyncpg._typing import cockroach_asyncpg_module as asyncpg from sqlspec.config import ADKConfig diff --git a/sqlspec/adapters/cockroach_asyncpg/config.py b/sqlspec/adapters/cockroach_asyncpg/config.py index ba762ea4d..bdc2b4335 100644 --- a/sqlspec/adapters/cockroach_asyncpg/config.py +++ b/sqlspec/adapters/cockroach_asyncpg/config.py @@ -1,9 +1,7 @@ """CockroachDB AsyncPG configuration.""" from contextlib import suppress -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NotRequired, TypedDict, cast from sqlspec.adapters.asyncpg.core import ( apply_driver_features, diff --git a/sqlspec/adapters/cockroach_asyncpg/litestar/store.py b/sqlspec/adapters/cockroach_asyncpg/litestar/store.py index 4bd75bc04..b01cf5af1 100644 --- a/sqlspec/adapters/cockroach_asyncpg/litestar/store.py +++ b/sqlspec/adapters/cockroach_asyncpg/litestar/store.py @@ -1,9 +1,7 @@ """CockroachDB session store for Litestar integration using asyncpg.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, Literal, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, Literal, NotRequired, cast from sqlspec.config import LitestarConfig from sqlspec.extensions.litestar.store import BaseSQLSpecStore @@ -133,7 +131,7 @@ async def expires_in(self, key: str) -> "int | None": return None expires_at = row["expires_at"] - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 diff --git a/sqlspec/adapters/cockroach_psycopg/adk/store.py b/sqlspec/adapters/cockroach_psycopg/adk/store.py index 0d2ff1781..e7dcbb5f0 100644 --- a/sqlspec/adapters/cockroach_psycopg/adk/store.py +++ b/sqlspec/adapters/cockroach_psycopg/adk/store.py @@ -1,8 +1,6 @@ """CockroachDB ADK store for Google Agent Development Kit session/event storage (psycopg).""" -from typing import TYPE_CHECKING, Any, Literal, NoReturn, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, Literal, NoReturn, NotRequired, cast from sqlspec.adapters.cockroach_psycopg._typing import CockroachPsycopgJsonb as Jsonb from sqlspec.adapters.cockroach_psycopg._typing import cockroach_psycopg_dict_row as dict_row diff --git a/sqlspec/adapters/cockroach_psycopg/config.py b/sqlspec/adapters/cockroach_psycopg/config.py index a3b260d07..619360d36 100644 --- a/sqlspec/adapters/cockroach_psycopg/config.py +++ b/sqlspec/adapters/cockroach_psycopg/config.py @@ -2,9 +2,7 @@ import re from contextlib import suppress -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NotRequired, TypedDict, cast from sqlspec.adapters.cockroach_psycopg._typing import ( CockroachAsyncConnection, diff --git a/sqlspec/adapters/cockroach_psycopg/litestar/store.py b/sqlspec/adapters/cockroach_psycopg/litestar/store.py index 8b915ca1e..194f9eddb 100644 --- a/sqlspec/adapters/cockroach_psycopg/litestar/store.py +++ b/sqlspec/adapters/cockroach_psycopg/litestar/store.py @@ -1,9 +1,7 @@ """CockroachDB session stores for Litestar integration using psycopg.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, Literal, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, Literal, NotRequired, cast from sqlspec.adapters.cockroach_psycopg._typing import cockroach_psycopg_dict_row as dict_row from sqlspec.config import LitestarConfig @@ -151,7 +149,7 @@ async def expires_in(self, key: str) -> "int | None": return None expires_at = row["expires_at"] - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 @@ -347,7 +345,7 @@ def _expires_in(self, key: str) -> "int | None": return None expires_at = row["expires_at"] - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 diff --git a/sqlspec/adapters/db2/adk/store.py b/sqlspec/adapters/db2/adk/store.py index 9352a7a4e..938b21444 100644 --- a/sqlspec/adapters/db2/adk/store.py +++ b/sqlspec/adapters/db2/adk/store.py @@ -1,7 +1,7 @@ """IBM Db2 ADK stores for Google Agent Development Kit session and memory storage.""" from collections.abc import Sequence -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, cast from sqlspec.adapters.db2.config import Db2AsyncConfig, Db2SyncConfig @@ -1050,8 +1050,8 @@ def _datetime_value(value: Any) -> datetime: """ if isinstance(value, datetime): if value.tzinfo is None: - return value.replace(tzinfo=timezone.utc) - return value.astimezone(timezone.utc) + return value.replace(tzinfo=UTC) + return value.astimezone(UTC) if isinstance(value, bytearray): value = bytes(value) if isinstance(value, bytes): @@ -1060,8 +1060,8 @@ def _datetime_value(value: Any) -> datetime: normalized = value.replace("Z", "+00:00") parsed = datetime.fromisoformat(normalized) if parsed.tzinfo is None: - return parsed.replace(tzinfo=timezone.utc) - return parsed.astimezone(timezone.utc) + return parsed.replace(tzinfo=UTC) + return parsed.astimezone(UTC) msg = f"Unsupported Db2 timestamp value: {type(value).__name__}" raise TypeError(msg) diff --git a/sqlspec/adapters/db2/config.py b/sqlspec/adapters/db2/config.py index bec819e1c..b410bfbe7 100644 --- a/sqlspec/adapters/db2/config.py +++ b/sqlspec/adapters/db2/config.py @@ -1,9 +1,8 @@ """IBM Db2 database configuration.""" -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from mypy_extensions import mypyc_attr -from typing_extensions import NotRequired from sqlspec.adapters.db2._typing import ( Db2AsyncConnection, diff --git a/sqlspec/adapters/db2/core.py b/sqlspec/adapters/db2/core.py index aa34e7a5f..0580cc0d1 100644 --- a/sqlspec/adapters/db2/core.py +++ b/sqlspec/adapters/db2/core.py @@ -2,7 +2,7 @@ import re from collections.abc import Callable, Mapping, Sequence -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any, Final, Literal from urllib.parse import parse_qsl, unquote, urlsplit @@ -266,7 +266,7 @@ def utc_now() -> datetime: Returns: The current UTC time without a time zone. """ - return datetime.now(timezone.utc).replace(tzinfo=None) + return datetime.now(UTC).replace(tzinfo=None) def to_db_timestamp(value: "datetime | None") -> "datetime | None": @@ -283,7 +283,7 @@ def to_db_timestamp(value: "datetime | None") -> "datetime | None": """ if value is None or value.tzinfo is None: return value - return value.astimezone(timezone.utc).replace(tzinfo=None) + return value.astimezone(UTC).replace(tzinfo=None) def split_db2_table_name(name: str) -> "tuple[str | None, str]": diff --git a/sqlspec/adapters/db2/litestar/store.py b/sqlspec/adapters/db2/litestar/store.py index 536c87acb..aab14100b 100644 --- a/sqlspec/adapters/db2/litestar/store.py +++ b/sqlspec/adapters/db2/litestar/store.py @@ -1,6 +1,6 @@ """IBM Db2 Litestar Store implementation.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING, Any from sqlspec.adapters.db2.core import INDEX_EXISTS_SQL, TABLE_EXISTS_SQL, split_db2_table_name, to_db_timestamp, utc_now @@ -229,8 +229,8 @@ def _normalize_utc(dt: Any) -> "datetime | None": return None if isinstance(dt, datetime): if dt.tzinfo is None: - return dt.replace(tzinfo=timezone.utc) - return dt.astimezone(timezone.utc) + return dt.replace(tzinfo=UTC) + return dt.astimezone(UTC) return None @@ -348,7 +348,7 @@ def _expires_in(self, key: str) -> "int | None": expires_at = _normalize_utc(driver.select_value_or_none(expires_at_sql(self._table_name), (key,))) if expires_at is None: return None - remaining = int((expires_at - datetime.now(timezone.utc)).total_seconds()) + remaining = int((expires_at - datetime.now(UTC)).total_seconds()) return max(remaining, 0) def _delete_expired(self) -> int: @@ -429,7 +429,7 @@ async def expires_in(self, key: str) -> "int | None": expires_at = _normalize_utc(await driver.select_value_or_none(expires_at_sql(self._table_name), (key,))) if expires_at is None: return None - remaining = int((expires_at - datetime.now(timezone.utc)).total_seconds()) + remaining = int((expires_at - datetime.now(UTC)).total_seconds()) return max(remaining, 0) async def delete_expired(self) -> int: diff --git a/sqlspec/adapters/db2/pool.py b/sqlspec/adapters/db2/pool.py index 1e4ff74d4..801bba8bc 100644 --- a/sqlspec/adapters/db2/pool.py +++ b/sqlspec/adapters/db2/pool.py @@ -422,7 +422,7 @@ async def acquire(self) -> Any: semaphore = self._semaphore try: await asyncio.wait_for(semaphore.acquire(), self._acquire_timeout) - except asyncio.TimeoutError as exc: + except TimeoutError as exc: msg = f"Timed out after {self._acquire_timeout}s waiting for a Db2 connection" raise ConnectionTimeoutError(msg) from exc if self._closed: diff --git a/sqlspec/adapters/duckdb/adk/store.py b/sqlspec/adapters/duckdb/adk/store.py index 44b127880..f3d43cc7e 100644 --- a/sqlspec/adapters/duckdb/adk/store.py +++ b/sqlspec/adapters/duckdb/adk/store.py @@ -9,10 +9,10 @@ import contextlib from collections.abc import Mapping -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, Final, Literal, cast +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from sqlspec.config import ADKConfig from sqlspec.extensions.adk import BaseSyncADKStore, StoredEvent, StoredSession, normalize_session_list_options @@ -479,7 +479,7 @@ def _create_session( self, session_id: str, app_name: str, user_id: str, state: "dict[str, Any]", owner_id: "Any | None" = None ) -> StoredSession: """Synchronous implementation of create_session.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) state_json = to_json(state) params: tuple[Any, ...] @@ -516,7 +516,7 @@ def _get_session( WHERE app_name = ? AND user_id = ? AND id = ? RETURNING id, app_name, user_id, state, create_time, update_time """ - params: list[Any] = [datetime.now(timezone.utc), app_name, user_id, session_id] + params: list[Any] = [datetime.now(UTC), app_name, user_id, session_id] else: sql = f""" SELECT id, app_name, user_id, state, create_time, update_time @@ -552,7 +552,7 @@ def _get_session( def _update_session_state(self, app_name: str, user_id: str, session_id: str, state: "dict[str, Any]") -> None: """Synchronous implementation of update_session_state.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) state_json = to_json(state) sql = f""" @@ -652,7 +652,7 @@ def _append_event_and_update_state( user_state: "dict[str, Any] | None" = None, ) -> StoredSession: """Synchronous implementation of append_event_and_update_state.""" - now = datetime.now(timezone.utc) + now = datetime.now(UTC) state_json = to_json(state) event_data_str = to_json(event_record["event_data"]) @@ -870,7 +870,7 @@ def _get_user_state(self, app_name: str, user_id: str) -> "dict[str, Any] | None raise def _upsert_app_state(self, app_name: str, state: "dict[str, Any]") -> None: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) sql = f""" INSERT INTO {self._app_state_table} (app_name, state, update_time) VALUES (?, ?, ?) @@ -883,7 +883,7 @@ def _upsert_app_state(self, app_name: str, state: "dict[str, Any]") -> None: conn.commit() def _upsert_user_state(self, app_name: str, user_id: str, state: "dict[str, Any]") -> None: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) sql = f""" INSERT INTO {self._user_state_table} (app_name, user_id, state, update_time) VALUES (?, ?, ?, ?) diff --git a/sqlspec/adapters/duckdb/config.py b/sqlspec/adapters/duckdb/config.py index ae1b23264..3fea1f17f 100644 --- a/sqlspec/adapters/duckdb/config.py +++ b/sqlspec/adapters/duckdb/config.py @@ -1,9 +1,7 @@ """DuckDB database configuration with connection pooling.""" from collections.abc import Callable, Sequence -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from sqlspec.adapters.duckdb._typing import DuckDBConnection, DuckDBCursor, DuckDBSessionContext from sqlspec.adapters.duckdb.core import ( diff --git a/sqlspec/adapters/duckdb/litestar/store.py b/sqlspec/adapters/duckdb/litestar/store.py index 025ea3163..fdcb4509a 100644 --- a/sqlspec/adapters/duckdb/litestar/store.py +++ b/sqlspec/adapters/duckdb/litestar/store.py @@ -1,6 +1,6 @@ """DuckDB sync session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING from sqlspec.extensions.litestar.store import BaseSQLSpecStore @@ -166,11 +166,11 @@ def _timestamp_to_datetime(self, ts: "str | datetime | None") -> "datetime | Non return None if isinstance(ts, datetime): if ts.tzinfo is None: - return ts.replace(tzinfo=timezone.utc) + return ts.replace(tzinfo=UTC) return ts dt = datetime.fromisoformat(ts) if dt.tzinfo is None: - dt = dt.replace(tzinfo=timezone.utc) + dt = dt.replace(tzinfo=UTC) return dt def _create_table(self) -> None: @@ -281,7 +281,7 @@ def _expires_in(self, key: str) -> "int | None": if expires_at is None: return None - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 diff --git a/sqlspec/adapters/duckdb/pool.py b/sqlspec/adapters/duckdb/pool.py index 444045d7d..19591a13b 100644 --- a/sqlspec/adapters/duckdb/pool.py +++ b/sqlspec/adapters/duckdb/pool.py @@ -5,9 +5,7 @@ import threading import time from contextlib import contextmanager, suppress -from typing import TYPE_CHECKING, Any, Final, cast - -from typing_extensions import final +from typing import TYPE_CHECKING, Any, Final, cast, final from sqlspec.adapters.duckdb._typing import DuckDBConnection from sqlspec.adapters.duckdb._typing import duckdb_module as duckdb diff --git a/sqlspec/adapters/mssql_python/adk/store.py b/sqlspec/adapters/mssql_python/adk/store.py index 7aacf57c1..a2e7bbd7c 100644 --- a/sqlspec/adapters/mssql_python/adk/store.py +++ b/sqlspec/adapters/mssql_python/adk/store.py @@ -1,9 +1,7 @@ """mssql-python ADK stores for Google Agent Development Kit session storage.""" from datetime import datetime -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NotRequired, cast from sqlspec.adapters.mssql_python._typing import MssqlPythonCursor, MssqlPythonError from sqlspec.adapters.mssql_python.core import extract_error_number diff --git a/sqlspec/adapters/mssql_python/config.py b/sqlspec/adapters/mssql_python/config.py index d719410a6..89a667b8b 100644 --- a/sqlspec/adapters/mssql_python/config.py +++ b/sqlspec/adapters/mssql_python/config.py @@ -1,8 +1,6 @@ """mssql-python database configuration.""" -from typing import TYPE_CHECKING, Any, ClassVar, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, NotRequired, TypedDict, cast from sqlspec.adapters.mssql_python._typing import MssqlPythonConnection, MssqlPythonSessionContext, TokenProvider from sqlspec.adapters.mssql_python.core import apply_driver_features, build_connection_config, default_statement_config diff --git a/sqlspec/adapters/mssql_python/driver.py b/sqlspec/adapters/mssql_python/driver.py index fb152a780..8f3493de5 100644 --- a/sqlspec/adapters/mssql_python/driver.py +++ b/sqlspec/adapters/mssql_python/driver.py @@ -1,9 +1,7 @@ """mssql-python sync and async drivers.""" import contextlib -from typing import TYPE_CHECKING, Any, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, NotRequired, TypedDict, cast from sqlspec.adapters.mssql_python._typing import ( MssqlPythonConnection, diff --git a/sqlspec/adapters/mssql_python/litestar/store.py b/sqlspec/adapters/mssql_python/litestar/store.py index d48001e5b..0e9373ef6 100644 --- a/sqlspec/adapters/mssql_python/litestar/store.py +++ b/sqlspec/adapters/mssql_python/litestar/store.py @@ -1,6 +1,6 @@ """mssql-python Litestar Store implementation.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING, Any from sqlspec.adapters.mssql_python._typing import MssqlPythonCursor @@ -174,7 +174,7 @@ def _expires_in(self, key: str) -> "int | None": expires_at = _normalize_utc(_row_value(row, "expires_at", 0)) if expires_at is None: return None - remaining = expires_at - datetime.now(timezone.utc) + remaining = expires_at - datetime.now(UTC) return max(0, int(remaining.total_seconds())) def _delete_expired(self) -> int: @@ -212,8 +212,8 @@ def _normalize_utc(value: Any) -> "datetime | None": if not isinstance(value, datetime): return None if value.tzinfo is None: - return value.replace(tzinfo=timezone.utc) - return value.astimezone(timezone.utc) + return value.replace(tzinfo=UTC) + return value.astimezone(UTC) def _coerce_bytes(value: Any) -> bytes: diff --git a/sqlspec/adapters/mysqlconnector/adk/store.py b/sqlspec/adapters/mysqlconnector/adk/store.py index df8f23c7d..57c1b2e70 100644 --- a/sqlspec/adapters/mysqlconnector/adk/store.py +++ b/sqlspec/adapters/mysqlconnector/adk/store.py @@ -2,9 +2,7 @@ import re from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, Final, Literal, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast from sqlspec.adapters.mysqlconnector._typing import MysqlConnectorError from sqlspec.config import ADKConfig diff --git a/sqlspec/adapters/mysqlconnector/config.py b/sqlspec/adapters/mysqlconnector/config.py index 903031934..009c14799 100644 --- a/sqlspec/adapters/mysqlconnector/config.py +++ b/sqlspec/adapters/mysqlconnector/config.py @@ -2,11 +2,9 @@ import contextlib from collections.abc import Callable, Mapping -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, TypedDict, cast +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NotRequired, TypedDict, cast from weakref import WeakSet -from typing_extensions import NotRequired - from sqlspec.adapters.mysqlconnector._typing import ( MysqlConnectorAio, MysqlConnectorAsyncConnection, diff --git a/sqlspec/adapters/mysqlconnector/litestar/store.py b/sqlspec/adapters/mysqlconnector/litestar/store.py index 59c446033..ecc4d2018 100644 --- a/sqlspec/adapters/mysqlconnector/litestar/store.py +++ b/sqlspec/adapters/mysqlconnector/litestar/store.py @@ -1,9 +1,7 @@ """MysqlConnector session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, Final, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, Final, NotRequired, cast from sqlspec.adapters.mysqlconnector._typing import MysqlConnectorError from sqlspec.config import LitestarConfig @@ -195,8 +193,8 @@ async def expires_in(self, key: str) -> "int | None": return None expires_at_naive: datetime = cast("datetime", row[0]) - expires_at_utc = expires_at_naive.replace(tzinfo=timezone.utc) - now = datetime.now(timezone.utc) + expires_at_utc = expires_at_naive.replace(tzinfo=UTC) + now = datetime.now(UTC) if expires_at_utc <= now: return 0 @@ -440,8 +438,8 @@ def _expires_in(self, key: str) -> "int | None": return None expires_at_naive: datetime = cast("datetime", row[0]) - expires_at_utc = expires_at_naive.replace(tzinfo=timezone.utc) - now = datetime.now(timezone.utc) + expires_at_utc = expires_at_naive.replace(tzinfo=UTC) + now = datetime.now(UTC) if expires_at_utc <= now: return 0 diff --git a/sqlspec/adapters/oracledb/adk/store.py b/sqlspec/adapters/oracledb/adk/store.py index 37b73dd43..bb39f3cb4 100644 --- a/sqlspec/adapters/oracledb/adk/store.py +++ b/sqlspec/adapters/oracledb/adk/store.py @@ -1,9 +1,9 @@ """Oracle ADK store for Google Agent Development Kit session/event storage.""" from decimal import Decimal -from typing import TYPE_CHECKING, Any, Final, Literal, NoReturn, cast +from typing import TYPE_CHECKING, Any, Final, Literal, NoReturn, NotRequired, cast -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from sqlspec import SQL from sqlspec.adapters.oracledb._storage import oracle_table_feature_report, validate_oracle_identifier diff --git a/sqlspec/adapters/oracledb/config.py b/sqlspec/adapters/oracledb/config.py index 6a1ef2fda..a7954938e 100644 --- a/sqlspec/adapters/oracledb/config.py +++ b/sqlspec/adapters/oracledb/config.py @@ -4,9 +4,7 @@ from collections.abc import Awaitable, Callable from inspect import isawaitable from ssl import TLSVersion -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from sqlspec.adapters.oracledb._json_handlers import register_json_handlers from sqlspec.adapters.oracledb._typing import ( diff --git a/sqlspec/adapters/oracledb/data_dictionary.py b/sqlspec/adapters/oracledb/data_dictionary.py index d05dab152..c6d8db4d6 100644 --- a/sqlspec/adapters/oracledb/data_dictionary.py +++ b/sqlspec/adapters/oracledb/data_dictionary.py @@ -1,6 +1,6 @@ """Oracle-specific data dictionary for metadata queries.""" -from enum import Enum +from enum import StrEnum from typing import TYPE_CHECKING, Any, ClassVar, cast from mypy_extensions import mypyc_attr @@ -151,7 +151,7 @@ def __str__(self) -> str: return version_str -class JSONStorageType(str, Enum): +class JSONStorageType(StrEnum): """Oracle JSON storage rung selected from the server version. The full ladder is a support contract: SQLSpec targets the oldest possible diff --git a/sqlspec/adapters/oracledb/events/backend.py b/sqlspec/adapters/oracledb/events/backend.py index 9332fb538..fc2501ec3 100644 --- a/sqlspec/adapters/oracledb/events/backend.py +++ b/sqlspec/adapters/oracledb/events/backend.py @@ -2,7 +2,7 @@ import contextlib import logging -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any from sqlspec.adapters.oracledb._typing import DEQ_IMMEDIATE, DEQ_ON_COMMIT @@ -266,7 +266,7 @@ def _build_envelope( "event_id": event_id, "payload": payload, "metadata": metadata, - "published_at": datetime.now(timezone.utc).isoformat(), + "published_at": datetime.now(UTC).isoformat(), } diff --git a/sqlspec/adapters/oracledb/events/store.py b/sqlspec/adapters/oracledb/events/store.py index c4e6fa363..36e5f4156 100644 --- a/sqlspec/adapters/oracledb/events/store.py +++ b/sqlspec/adapters/oracledb/events/store.py @@ -18,9 +18,9 @@ """ import logging -from typing import TYPE_CHECKING, Any, Literal +from typing import TYPE_CHECKING, Any, Literal, NotRequired -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from sqlspec.adapters.oracledb._storage import oracle_table_feature_report from sqlspec.adapters.oracledb.data_dictionary import JSONStorageType, storage_type_from_version diff --git a/sqlspec/adapters/oracledb/litestar/store.py b/sqlspec/adapters/oracledb/litestar/store.py index e0ee33c8b..28a5ec0cb 100644 --- a/sqlspec/adapters/oracledb/litestar/store.py +++ b/sqlspec/adapters/oracledb/litestar/store.py @@ -1,9 +1,7 @@ """Oracle session store for Litestar integration.""" -from datetime import timedelta, timezone -from typing import TYPE_CHECKING, Any, TypedDict, cast - -from typing_extensions import NotRequired +from datetime import UTC, timedelta +from typing import TYPE_CHECKING, Any, NotRequired, TypedDict, cast from sqlspec.adapters.oracledb._storage import oracle_table_feature_report from sqlspec.adapters.oracledb.core import DB_TYPE_BLOB @@ -290,9 +288,9 @@ async def expires_in(self, key: str) -> "int | None": expires_at, db_now = row if expires_at.tzinfo is None: - expires_at = expires_at.replace(tzinfo=timezone.utc) + expires_at = expires_at.replace(tzinfo=UTC) if db_now.tzinfo is None: - db_now = db_now.replace(tzinfo=timezone.utc) + db_now = db_now.replace(tzinfo=UTC) if expires_at <= db_now: return 0 @@ -680,9 +678,9 @@ def _expires_in(self, key: str) -> "int | None": expires_at, db_now = row if expires_at.tzinfo is None: - expires_at = expires_at.replace(tzinfo=timezone.utc) + expires_at = expires_at.replace(tzinfo=UTC) if db_now.tzinfo is None: - db_now = db_now.replace(tzinfo=timezone.utc) + db_now = db_now.replace(tzinfo=UTC) if expires_at <= db_now: return 0 diff --git a/sqlspec/adapters/psqlpy/adk/store.py b/sqlspec/adapters/psqlpy/adk/store.py index 970a4976c..5350fcf1b 100644 --- a/sqlspec/adapters/psqlpy/adk/store.py +++ b/sqlspec/adapters/psqlpy/adk/store.py @@ -1,9 +1,7 @@ """Psqlpy ADK store for Google Agent Development Kit session/event storage.""" import re -from typing import TYPE_CHECKING, Any, Final, Literal, NoReturn, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, Final, Literal, NoReturn, NotRequired, cast from sqlspec.adapters.psqlpy._typing import PsqlpyConnectionExecuteError, PsqlpyDatabaseError from sqlspec.config import ADKConfig diff --git a/sqlspec/adapters/psqlpy/config.py b/sqlspec/adapters/psqlpy/config.py index 20dd41365..95a8bd04a 100644 --- a/sqlspec/adapters/psqlpy/config.py +++ b/sqlspec/adapters/psqlpy/config.py @@ -1,10 +1,9 @@ """Psqlpy database configuration.""" import sys -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from mypy_extensions import mypyc_attr -from typing_extensions import NotRequired from sqlspec.adapters.psqlpy._typing import PsqlpyConnection, PsqlpyCursor, PsqlpySessionContext from sqlspec.adapters.psqlpy._typing import PsqlpyConnectionPool as ConnectionPool diff --git a/sqlspec/adapters/psqlpy/events/_hub.py b/sqlspec/adapters/psqlpy/events/_hub.py index 24b30cfb7..d28e50ebb 100644 --- a/sqlspec/adapters/psqlpy/events/_hub.py +++ b/sqlspec/adapters/psqlpy/events/_hub.py @@ -138,7 +138,7 @@ async def dequeue(self, channel: str, poll_interval: float) -> "str | None": return None try: payload = await asyncio.wait_for(queue.get(), timeout=poll_interval) - except asyncio.TimeoutError: + except TimeoutError: return None else: self._record_queue_depth() @@ -273,7 +273,7 @@ async def _wait_until_ready(self, channel: str, *, timeout: float) -> None: await driver.execute_script(SQL("SELECT pg_notify($1, $2)", channel, payload)) await driver.commit() await asyncio.wait_for(ready.wait(), timeout=timeout) - except asyncio.TimeoutError: + except TimeoutError: logger.debug("psqlpy listener ready probe timed out for channel %s", channel) finally: payloads = self._ready_events.get(channel) diff --git a/sqlspec/adapters/psqlpy/events/backend.py b/sqlspec/adapters/psqlpy/events/backend.py index d050b09cd..3924557f6 100644 --- a/sqlspec/adapters/psqlpy/events/backend.py +++ b/sqlspec/adapters/psqlpy/events/backend.py @@ -3,7 +3,7 @@ # pyright: reportPrivateUsage=false import logging -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any, cast from sqlspec.adapters.psqlpy.events._hub import PsqlpyListenerHub @@ -303,7 +303,7 @@ def _ensure_hub(self) -> PsqlpyListenerHub: async def _publish_durable( self, channel: str, event_id: str, payload: "dict[str, Any]", metadata: "dict[str, Any] | None" ) -> None: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) async with self._config.provide_session() as driver: await driver.execute( SQL( @@ -390,5 +390,5 @@ def _extract_marker_id(payload: "str | None") -> "str | None": def _record_dequeue_result(runtime: Any, event: "EventMessage | None") -> None: if event is None: return - latency_ms = max(0.0, (datetime.now(timezone.utc) - event.created_at).total_seconds() * 1000) + latency_ms = max(0.0, (datetime.now(UTC) - event.created_at).total_seconds() * 1000) runtime.record_metric("events.dequeue.latency_ms", latency_ms) diff --git a/sqlspec/adapters/psqlpy/events/store.py b/sqlspec/adapters/psqlpy/events/store.py index e8fa34b7e..db99cc248 100644 --- a/sqlspec/adapters/psqlpy/events/store.py +++ b/sqlspec/adapters/psqlpy/events/store.py @@ -1,6 +1,6 @@ """Psqlpy event queue store.""" -from typing_extensions import NotRequired +from typing import NotRequired from sqlspec.adapters.psqlpy.config import PsqlpyConfig from sqlspec.config import EventsConfig diff --git a/sqlspec/adapters/psqlpy/litestar/store.py b/sqlspec/adapters/psqlpy/litestar/store.py index ff40e16f7..c4b764fa0 100644 --- a/sqlspec/adapters/psqlpy/litestar/store.py +++ b/sqlspec/adapters/psqlpy/litestar/store.py @@ -1,9 +1,7 @@ """Psqlpy session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, NotRequired, cast from sqlspec.config import LitestarConfig from sqlspec.extensions.litestar.store import BaseSQLSpecStore @@ -200,7 +198,7 @@ async def expires_in(self, key: str) -> "int | None": if expires_at is None: return None - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 diff --git a/sqlspec/adapters/psycopg/adk/store.py b/sqlspec/adapters/psycopg/adk/store.py index 8267bbc75..8ea955ee3 100644 --- a/sqlspec/adapters/psycopg/adk/store.py +++ b/sqlspec/adapters/psycopg/adk/store.py @@ -1,8 +1,6 @@ """Psycopg ADK store for Google Agent Development Kit session/event storage.""" -from typing import TYPE_CHECKING, Any, Literal, NoReturn, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, Literal, NoReturn, NotRequired, cast from sqlspec.adapters.psycopg._typing import PsycopgJsonb as Jsonb from sqlspec.adapters.psycopg._typing import psycopg_dict_row as dict_row diff --git a/sqlspec/adapters/psycopg/config.py b/sqlspec/adapters/psycopg/config.py index a4d9923ce..46c9cbeb0 100644 --- a/sqlspec/adapters/psycopg/config.py +++ b/sqlspec/adapters/psycopg/config.py @@ -1,12 +1,11 @@ """Psycopg database configuration with direct field-based configuration.""" from contextlib import suppress -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, TypedDict, cast +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NotRequired, Self, TypedDict, cast from mypy_extensions import mypyc_attr from psycopg.adapt import AdaptersMap from psycopg.types.json import set_json_dumps, set_json_loads -from typing_extensions import NotRequired, Self import sqlspec.adapters.psycopg._typing as _psycopg_typing from sqlspec.adapters.psycopg._typing import ( diff --git a/sqlspec/adapters/psycopg/core.py b/sqlspec/adapters/psycopg/core.py index 9f4d35290..d49c730ea 100644 --- a/sqlspec/adapters/psycopg/core.py +++ b/sqlspec/adapters/psycopg/core.py @@ -3,9 +3,7 @@ import contextlib import datetime from collections.abc import Sized -from typing import TYPE_CHECKING, Any, Final, NamedTuple, cast - -from typing_extensions import LiteralString +from typing import TYPE_CHECKING, Any, Final, LiteralString, NamedTuple, cast from sqlspec.adapters.psycopg._typing import PsycopgComposed, PsycopgIdentifier, PsycopgSQL from sqlspec.adapters.psycopg._typing import psycopg_errors as pg_errors diff --git a/sqlspec/adapters/psycopg/driver.py b/sqlspec/adapters/psycopg/driver.py index 7f48b38f2..1253f9921 100644 --- a/sqlspec/adapters/psycopg/driver.py +++ b/sqlspec/adapters/psycopg/driver.py @@ -2,9 +2,7 @@ from collections.abc import Sized from contextlib import AsyncExitStack, ExitStack -from typing import TYPE_CHECKING, Any, cast - -from typing_extensions import LiteralString +from typing import TYPE_CHECKING, Any, LiteralString, cast from sqlspec.adapters.psycopg._typing import ( PsycopgAsyncConnection, diff --git a/sqlspec/adapters/psycopg/events/_hub.py b/sqlspec/adapters/psycopg/events/_hub.py index 3245944ef..9d3ce7df5 100644 --- a/sqlspec/adapters/psycopg/events/_hub.py +++ b/sqlspec/adapters/psycopg/events/_hub.py @@ -104,7 +104,7 @@ async def dequeue(self, channel: str, poll_interval: float) -> "str | None": return None try: payload = await asyncio.wait_for(queue.get(), timeout=poll_interval) - except asyncio.TimeoutError: + except TimeoutError: return None else: self._record_queue_depth() diff --git a/sqlspec/adapters/psycopg/events/backend.py b/sqlspec/adapters/psycopg/events/backend.py index 61843c507..1e48285d6 100644 --- a/sqlspec/adapters/psycopg/events/backend.py +++ b/sqlspec/adapters/psycopg/events/backend.py @@ -3,7 +3,7 @@ import logging import threading -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any, cast from sqlspec.adapters.psycopg.events._hub import PsycopgAsyncListenerHub, PsycopgSyncListenerHub @@ -425,7 +425,7 @@ def _dequeue_reconciled(self, channel: str) -> EventMessage | None: def _publish_durable( self, channel: str, event_id: str, payload: "dict[str, Any]", metadata: "dict[str, Any] | None" ) -> None: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) with self._config.provide_session() as driver: driver.execute( SQL( @@ -587,7 +587,7 @@ async def _dequeue_reconciled(self, channel: str) -> EventMessage | None: async def _publish_durable( self, channel: str, event_id: str, payload: "dict[str, Any]", metadata: "dict[str, Any] | None" ) -> None: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) async with self._config.provide_session() as driver: await driver.execute( SQL( @@ -699,5 +699,5 @@ def _extract_marker_id(payload: "str | None") -> "str | None": def _record_dequeue_result(runtime: Any, event: "EventMessage | None") -> None: if event is None: return - latency_ms = max(0.0, (datetime.now(timezone.utc) - event.created_at).total_seconds() * 1000) + latency_ms = max(0.0, (datetime.now(UTC) - event.created_at).total_seconds() * 1000) runtime.record_metric("events.dequeue.latency_ms", latency_ms) diff --git a/sqlspec/adapters/psycopg/events/store.py b/sqlspec/adapters/psycopg/events/store.py index bc942c5f0..6a3b327f2 100644 --- a/sqlspec/adapters/psycopg/events/store.py +++ b/sqlspec/adapters/psycopg/events/store.py @@ -1,6 +1,6 @@ """Psycopg event queue stores for sync and async drivers.""" -from typing_extensions import NotRequired +from typing import NotRequired from sqlspec.adapters.psycopg.config import PsycopgAsyncConfig, PsycopgSyncConfig from sqlspec.config import EventsConfig diff --git a/sqlspec/adapters/psycopg/litestar/store.py b/sqlspec/adapters/psycopg/litestar/store.py index 8466d6338..1464ee038 100644 --- a/sqlspec/adapters/psycopg/litestar/store.py +++ b/sqlspec/adapters/psycopg/litestar/store.py @@ -3,10 +3,8 @@ Provides both async and sync PostgreSQL session stores using psycopg3. """ -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, NotRequired, cast from sqlspec.adapters.psycopg._typing import psycopg_dict_row as dict_row from sqlspec.config import LitestarConfig @@ -210,7 +208,7 @@ async def expires_in(self, key: str) -> "int | None": return None expires_at = row["expires_at"] - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 @@ -507,7 +505,7 @@ def _expires_in(self, key: str) -> "int | None": return None expires_at = row["expires_at"] - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 diff --git a/sqlspec/adapters/pymssql/adk/store.py b/sqlspec/adapters/pymssql/adk/store.py index 74d9593b5..ca0169936 100644 --- a/sqlspec/adapters/pymssql/adk/store.py +++ b/sqlspec/adapters/pymssql/adk/store.py @@ -1,9 +1,7 @@ """pymssql ADK stores for Google Agent Development Kit session storage.""" from datetime import datetime -from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Final, Literal, NotRequired, cast from sqlspec.adapters.pymssql._typing import PymssqlCursor, PymssqlError from sqlspec.adapters.pymssql.core import extract_error_number, resolve_rowcount diff --git a/sqlspec/adapters/pymssql/config.py b/sqlspec/adapters/pymssql/config.py index 4a6ecab4d..40fbb3fc7 100644 --- a/sqlspec/adapters/pymssql/config.py +++ b/sqlspec/adapters/pymssql/config.py @@ -1,9 +1,7 @@ """pymssql database configuration.""" from collections.abc import Callable, Mapping -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from sqlspec.adapters.pymssql._typing import PymssqlConnection, PymssqlCursor, PymssqlRawCursor, PymssqlSessionContext from sqlspec.adapters.pymssql.core import apply_driver_features, build_connection_config, default_statement_config diff --git a/sqlspec/adapters/pymssql/litestar/store.py b/sqlspec/adapters/pymssql/litestar/store.py index 6661d8b2a..96e950fe0 100644 --- a/sqlspec/adapters/pymssql/litestar/store.py +++ b/sqlspec/adapters/pymssql/litestar/store.py @@ -1,6 +1,6 @@ """pymssql Litestar Store implementation.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING, Any from sqlspec.adapters.pymssql._typing import PymssqlCursor @@ -174,7 +174,7 @@ def _expires_in(self, key: str) -> "int | None": expires_at = _normalize_utc(_row_value(row, "expires_at", 0)) if expires_at is None: return None - remaining = expires_at - datetime.now(timezone.utc) + remaining = expires_at - datetime.now(UTC) return max(0, int(remaining.total_seconds())) def _delete_expired(self) -> int: @@ -212,8 +212,8 @@ def _normalize_utc(value: Any) -> "datetime | None": if not isinstance(value, datetime): return None if value.tzinfo is None: - return value.replace(tzinfo=timezone.utc) - return value.astimezone(timezone.utc) + return value.replace(tzinfo=UTC) + return value.astimezone(UTC) def _coerce_bytes(value: Any) -> bytes: diff --git a/sqlspec/adapters/pymysql/adk/store.py b/sqlspec/adapters/pymysql/adk/store.py index a9eb19214..fea85fdbe 100644 --- a/sqlspec/adapters/pymysql/adk/store.py +++ b/sqlspec/adapters/pymysql/adk/store.py @@ -2,9 +2,7 @@ import re from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, Final, Literal, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast from sqlspec.adapters.pymysql._typing import PyMysqlMySQLError from sqlspec.config import ADKConfig diff --git a/sqlspec/adapters/pymysql/config.py b/sqlspec/adapters/pymysql/config.py index f4a01fdc0..899571975 100644 --- a/sqlspec/adapters/pymysql/config.py +++ b/sqlspec/adapters/pymysql/config.py @@ -2,9 +2,7 @@ import ssl from collections.abc import Callable, Mapping -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from sqlspec.adapters.pymysql._typing import PyMysqlCloudSqlConnector as Connector from sqlspec.adapters.pymysql._typing import PyMysqlConnection, PyMysqlCursor, PyMysqlRawCursor, PyMysqlSessionContext diff --git a/sqlspec/adapters/pymysql/litestar/store.py b/sqlspec/adapters/pymysql/litestar/store.py index 7ef6b120c..ae9ec743a 100644 --- a/sqlspec/adapters/pymysql/litestar/store.py +++ b/sqlspec/adapters/pymysql/litestar/store.py @@ -1,9 +1,7 @@ """PyMySQL session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, Final, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, Final, NotRequired, cast from sqlspec.adapters.pymysql._typing import PyMysqlDictCursor, PyMysqlMySQLError from sqlspec.config import LitestarConfig @@ -232,8 +230,8 @@ def _expires_in(self, key: str) -> "int | None": return None expires_at_naive = row[0] - expires_at_utc = expires_at_naive.replace(tzinfo=timezone.utc) - now = datetime.now(timezone.utc) + expires_at_utc = expires_at_naive.replace(tzinfo=UTC) + now = datetime.now(UTC) if expires_at_utc <= now: return 0 diff --git a/sqlspec/adapters/spanner/adk/store.py b/sqlspec/adapters/spanner/adk/store.py index 54ed78fb4..f8618d54e 100644 --- a/sqlspec/adapters/spanner/adk/store.py +++ b/sqlspec/adapters/spanner/adk/store.py @@ -1,12 +1,12 @@ """Spanner ADK store.""" from collections.abc import Iterable, Mapping -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, ClassVar, Literal, Protocol, cast +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, Protocol, cast import sqlglot from sqlglot import exp -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict import sqlspec.dialects.spanner # noqa: F401 from sqlspec.adapters.spanner._typing import SpannerNotFound as NotFound @@ -808,8 +808,8 @@ def _create_session( "app_name": app_name, "user_id": user_id, "state": state, - "create_time": datetime.now(timezone.utc), - "update_time": datetime.now(timezone.utc), + "create_time": datetime.now(UTC), + "update_time": datetime.now(UTC), } def _get_session( @@ -1137,8 +1137,8 @@ async def _create_session( "app_name": app_name, "user_id": user_id, "state": state, - "create_time": datetime.now(timezone.utc), - "update_time": datetime.now(timezone.utc), + "create_time": datetime.now(UTC), + "update_time": datetime.now(UTC), } async def _get_session( @@ -1623,7 +1623,7 @@ def _build_delete_entries_by_session_statement( def _build_delete_entries_older_than_statement( self, days: int, app_name: "str | None" = None, scope: "str | None" = None ) -> "tuple[str, dict[str, Any], dict[str, Any]]": - cutoff = datetime.now(timezone.utc) - timedelta(days=days) + cutoff = datetime.now(UTC) - timedelta(days=days) clauses = ["inserted_at < @cutoff"] params: dict[str, Any] = {"cutoff": cutoff} types: dict[str, Any] = {"cutoff": SPANNER_PARAM_TYPES.TIMESTAMP} diff --git a/sqlspec/adapters/spanner/config.py b/sqlspec/adapters/spanner/config.py index 292fb2884..17996a5af 100644 --- a/sqlspec/adapters/spanner/config.py +++ b/sqlspec/adapters/spanner/config.py @@ -1,9 +1,7 @@ """Spanner configuration.""" import contextlib -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict, cast from sqlspec.adapters.spanner._typing import SpannerAbstractSessionPool as AbstractSessionPool from sqlspec.adapters.spanner._typing import SpannerAsyncAbstractSessionPool as AsyncAbstractSessionPool diff --git a/sqlspec/adapters/spanner/litestar/store.py b/sqlspec/adapters/spanner/litestar/store.py index 2b88b2b0f..f118b23ee 100644 --- a/sqlspec/adapters/spanner/litestar/store.py +++ b/sqlspec/adapters/spanner/litestar/store.py @@ -1,9 +1,7 @@ """Spanner session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, NotRequired, cast from sqlspec.adapters.spanner._typing import spanner_param_types as param_types from sqlspec.adapters.spanner.core import ( @@ -73,14 +71,14 @@ def _datetime_to_timestamp(self, dt: "datetime | None") -> "datetime | None": if dt is None: return None if dt.tzinfo is None: - return dt.replace(tzinfo=timezone.utc) + return dt.replace(tzinfo=UTC) return dt def _timestamp_to_datetime(self, ts: "datetime | None") -> "datetime | None": if ts is None: return None if ts.tzinfo is None: - return ts.replace(tzinfo=timezone.utc) + return ts.replace(tzinfo=UTC) return ts def _build_params( @@ -308,7 +306,7 @@ def _expires_in(self, key: str) -> "int | None": expires_at = self._timestamp_to_datetime(row.get("expires_at")) if expires_at is None: return None - delta = expires_at - datetime.now(timezone.utc) + delta = expires_at - datetime.now(UTC) return max(int(delta.total_seconds()), 0) def _delete_expired(self) -> int: @@ -396,7 +394,7 @@ async def expires_in(self, key: str) -> "int | None": expires_at = self._timestamp_to_datetime(row.get("expires_at")) if expires_at is None: return None - delta = expires_at - datetime.now(timezone.utc) + delta = expires_at - datetime.now(UTC) return max(int(delta.total_seconds()), 0) async def delete_expired(self) -> int: diff --git a/sqlspec/adapters/spanner/type_converter.py b/sqlspec/adapters/spanner/type_converter.py index 7f11aa4c9..f20ab9eb0 100644 --- a/sqlspec/adapters/spanner/type_converter.py +++ b/sqlspec/adapters/spanner/type_converter.py @@ -17,7 +17,7 @@ """ import base64 -from datetime import date, datetime, timedelta, timezone +from datetime import UTC, date, datetime, timedelta from decimal import Decimal from typing import TYPE_CHECKING, Any, cast from uuid import UUID @@ -195,7 +195,7 @@ def coerce_params_for_spanner( coerced[key] = bytes_to_spanner(value) changed = True elif isinstance(value, datetime) and value.tzinfo is None: - coerced[key] = value.replace(tzinfo=timezone.utc) + coerced[key] = value.replace(tzinfo=UTC) changed = True elif isinstance(value, timedelta): coerced[key] = Interval(days=value.days, nanos=(value.seconds * 1_000_000 + value.microseconds) * 1000) diff --git a/sqlspec/adapters/sqlite/adk/store.py b/sqlspec/adapters/sqlite/adk/store.py index d59d755e3..cef7990ca 100644 --- a/sqlspec/adapters/sqlite/adk/store.py +++ b/sqlspec/adapters/sqlite/adk/store.py @@ -2,10 +2,8 @@ import re from collections.abc import Mapping -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any, Final, Literal, cast - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast from sqlspec.adapters.sqlite._typing import sqlite_module as sqlite3 from sqlspec.adapters.sqlite.core import end_transaction, render_pragmas @@ -111,7 +109,7 @@ def create_session( Returns: Created session record. """ - now = datetime.now(timezone.utc) + now = datetime.now(UTC) now_julian = _datetime_to_julian(now) state_json = to_json(state) @@ -161,7 +159,7 @@ def get_session( SET update_time = ? WHERE app_name = ? AND user_id = ? AND id = ? """ - now_julian = _datetime_to_julian(datetime.now(timezone.utc)) + now_julian = _datetime_to_julian(datetime.now(UTC)) update_params = (now_julian, app_name, user_id, session_id) else: update_sql = "" @@ -207,7 +205,7 @@ def update_session_state(self, app_name: str, user_id: str, session_id: str, sta session_id: Session identifier. state: New state dictionary (replaces existing state). """ - now_julian = _datetime_to_julian(datetime.now(timezone.utc)) + now_julian = _datetime_to_julian(datetime.now(UTC)) state_json = to_json(state) sql = f""" @@ -348,7 +346,7 @@ def append_event_and_update_state( """ timestamp_julian = _datetime_to_julian(event_record["timestamp"]) event_data_json = to_json(event_record["event_data"]) - now_julian = _datetime_to_julian(datetime.now(timezone.utc)) + now_julian = _datetime_to_julian(datetime.now(UTC)) state_json = to_json(state) insert_sql = f""" @@ -593,7 +591,7 @@ def upsert_app_state(self, app_name: str, state: "dict[str, Any]") -> None: with self._config.provide_connection() as conn: self._apply_pragmas(conn) - conn.execute(sql, (app_name, to_json(state), _datetime_to_julian(datetime.now(timezone.utc)))) + conn.execute(sql, (app_name, to_json(state), _datetime_to_julian(datetime.now(UTC)))) end_transaction(conn, commit=True) def upsert_user_state(self, app_name: str, user_id: str, state: "dict[str, Any]") -> None: @@ -608,7 +606,7 @@ def upsert_user_state(self, app_name: str, user_id: str, state: "dict[str, Any]" with self._config.provide_connection() as conn: self._apply_pragmas(conn) - conn.execute(sql, (app_name, user_id, to_json(state), _datetime_to_julian(datetime.now(timezone.utc)))) + conn.execute(sql, (app_name, user_id, to_json(state), _datetime_to_julian(datetime.now(UTC)))) end_transaction(conn, commit=True) def get_metadata(self, key: str) -> "str | None": @@ -942,7 +940,7 @@ def delete_entries_older_than(self, days: int, app_name: "str | None" = None, sc msg = "Memory store is disabled" raise RuntimeError(msg) - cutoff_julian = _datetime_to_julian(datetime.now(timezone.utc)) - days + cutoff_julian = _datetime_to_julian(datetime.now(UTC)) - days sql = f"DELETE FROM {self._memory_table} WHERE inserted_at < ?" params: list[Any] = [cutoff_julian] @@ -1166,8 +1164,8 @@ def _datetime_to_julian(dt: datetime) -> float: Julian Day number as REAL. """ if dt.tzinfo is None: - dt = dt.replace(tzinfo=timezone.utc) - epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) + dt = dt.replace(tzinfo=UTC) + epoch = datetime(1970, 1, 1, tzinfo=UTC) delta_days = (dt - epoch).total_seconds() / SECONDS_PER_DAY return JULIAN_EPOCH + delta_days @@ -1183,7 +1181,7 @@ def _julian_to_datetime(julian: float) -> datetime: """ days_since_epoch = julian - JULIAN_EPOCH timestamp = days_since_epoch * SECONDS_PER_DAY - return datetime.fromtimestamp(timestamp, tz=timezone.utc) + return datetime.fromtimestamp(timestamp, tz=UTC) def _build_sqlite_scope_clause( diff --git a/sqlspec/adapters/sqlite/config.py b/sqlspec/adapters/sqlite/config.py index 2916ab93b..513e07eeb 100644 --- a/sqlspec/adapters/sqlite/config.py +++ b/sqlspec/adapters/sqlite/config.py @@ -1,9 +1,7 @@ """SQLite database configuration with thread-local connections.""" from os import PathLike -from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict - -from typing_extensions import NotRequired +from typing import TYPE_CHECKING, Any, ClassVar, Literal, NotRequired, TypedDict from sqlspec.adapters.sqlite._typing import ( SqliteConnection, diff --git a/sqlspec/adapters/sqlite/events/store.py b/sqlspec/adapters/sqlite/events/store.py index 0bba39693..773de61f2 100644 --- a/sqlspec/adapters/sqlite/events/store.py +++ b/sqlspec/adapters/sqlite/events/store.py @@ -1,8 +1,6 @@ """SQLite event queue store.""" -from typing import Any - -from typing_extensions import NotRequired +from typing import Any, NotRequired from sqlspec.adapters.sqlite.config import SqliteConfig from sqlspec.adapters.sqlite.core import apply_extension_pragmas, extension_pragma_statements diff --git a/sqlspec/adapters/sqlite/litestar/store.py b/sqlspec/adapters/sqlite/litestar/store.py index b63892b0b..1fc1fbce4 100644 --- a/sqlspec/adapters/sqlite/litestar/store.py +++ b/sqlspec/adapters/sqlite/litestar/store.py @@ -1,9 +1,7 @@ """SQLite sync session store for Litestar integration.""" -from datetime import datetime, timedelta, timezone -from typing import TYPE_CHECKING, Any - -from typing_extensions import NotRequired +from datetime import UTC, datetime, timedelta +from typing import TYPE_CHECKING, Any, NotRequired from sqlspec.adapters.sqlite.core import apply_extension_pragmas, end_transaction, extension_pragma_statements from sqlspec.config import LitestarConfig @@ -177,7 +175,7 @@ def _datetime_to_julian(self, dt: "datetime | None") -> "float | None": if dt is None: return None - epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) + epoch = datetime(1970, 1, 1, tzinfo=UTC) delta_days = (dt - epoch).total_seconds() / SECONDS_PER_DAY return JULIAN_EPOCH + delta_days @@ -195,7 +193,7 @@ def _julian_to_datetime(self, julian: "float | None") -> "datetime | None": days_since_epoch = julian - JULIAN_EPOCH timestamp = days_since_epoch * SECONDS_PER_DAY - return datetime.fromtimestamp(timestamp, tz=timezone.utc) + return datetime.fromtimestamp(timestamp, tz=UTC) def _create_table(self) -> None: """Synchronous implementation of create_table.""" @@ -301,7 +299,7 @@ def _expires_in(self, key: str) -> "int | None": if expires_at is None: return None - now = datetime.now(timezone.utc) + now = datetime.now(UTC) if expires_at <= now: return 0 diff --git a/sqlspec/dialects/spanner/_expressions.py b/sqlspec/dialects/spanner/_expressions.py index deef6ea14..e77796bdf 100644 --- a/sqlspec/dialects/spanner/_expressions.py +++ b/sqlspec/dialects/spanner/_expressions.py @@ -6,8 +6,7 @@ if TYPE_CHECKING: from collections.abc import Sequence - - from typing_extensions import Self + from typing import Self _SpannerAnonymousBase = exp.Anonymous else: diff --git a/tests/integration/adapters/_shared/adk_behaviors.py b/tests/integration/adapters/_shared/adk_behaviors.py index db7a433f5..db8dc8c86 100644 --- a/tests/integration/adapters/_shared/adk_behaviors.py +++ b/tests/integration/adapters/_shared/adk_behaviors.py @@ -1,7 +1,7 @@ """Behavior helpers for shared ADK session/event store contract tests.""" from collections.abc import Awaitable -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from inspect import isawaitable from typing import Any, TypeVar @@ -121,7 +121,7 @@ async def assert_adk_delete_session_cascade_contract(make_store: Any) -> None: session_id = "session-delete" await _resolve(store.create_session(session_id, "app", "user", {})) await _resolve( - store.append_event(_event("app", "user", session_id, 0, datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc))) + store.append_event(_event("app", "user", session_id, 0, datetime(2026, 5, 10, 12, 0, tzinfo=UTC))) ) await _resolve(store.delete_session("app", "user", session_id)) @@ -139,7 +139,7 @@ async def assert_adk_append_and_get_events_contract(make_store: Any) -> None: session_id = "session-events" await _resolve(store.create_session(session_id, "app", "user", {})) await _resolve( - store.append_event(_event("app", "user", session_id, 1, datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc))) + store.append_event(_event("app", "user", session_id, 1, datetime(2026, 5, 10, 12, 0, tzinfo=UTC))) ) events = await _resolve(store.get_events("app", "user", session_id)) @@ -162,7 +162,7 @@ async def assert_adk_append_event_and_update_state_contract(make_store: Any) -> await _resolve(store.create_session(session_id, "app", "user", {})) updated = await _resolve( store.append_event_and_update_state( - _event("app", "user", session_id, 1, datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc)), + _event("app", "user", session_id, 1, datetime(2026, 5, 10, 12, 0, tzinfo=UTC)), "app", "user", session_id, @@ -192,7 +192,7 @@ async def assert_adk_get_events_filtering_contract(make_store: Any) -> None: await _resolve(store.create_tables()) session_id = "session-filter" await _resolve(store.create_session(session_id, "app", "user", {})) - base = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + base = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) for index in range(3): await _resolve( store.append_event(_event("app", "user", session_id, index, base + timedelta(seconds=index))) diff --git a/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_maintenance.py b/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_maintenance.py index c2a78bf9c..fcc484305 100644 --- a/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_maintenance.py +++ b/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_maintenance.py @@ -1,6 +1,6 @@ """Integration tests for ADK retention on DuckDB.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from pathlib import Path from uuid import uuid4 @@ -24,7 +24,7 @@ def _config(tmp_path: Path, name: str) -> DuckDBConfig: def _memory_record(*, app_name: str, inserted_at: datetime, scope: str = "user") -> StoredMemory: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) return StoredMemory( id=str(uuid4()), session_id="s1", @@ -60,7 +60,7 @@ def test_duckdb_prune_sessions_scopes_to_app_name(tmp_path: Path) -> None: store = DuckdbADKStore(config) store.create_tables() - stale = datetime.now(timezone.utc) - timedelta(days=120) + stale = datetime.now(UTC) - timedelta(days=120) for app in ("app_keep", "app_prune"): store.create_session(f"session_{app}", app, "user", {}) with config.provide_connection() as conn: @@ -80,7 +80,7 @@ def test_duckdb_prune_events_scopes_to_app_name(tmp_path: Path) -> None: store = DuckdbADKStore(config) store.create_tables() - stale = datetime.now(timezone.utc) - timedelta(days=200) + stale = datetime.now(UTC) - timedelta(days=200) for app in ("app_keep", "app_prune"): store.create_session(f"session_{app}", app, "user", {}) store.append_event(_event(app_name=app, session_id=f"session_{app}", timestamp=stale)) @@ -100,7 +100,7 @@ def test_duckdb_prune_user_state_scopes_to_app_name(tmp_path: Path) -> None: for app in ("app_keep", "app_prune"): store.upsert_user_state(app, "user", {"theme": "dark"}) - stale = datetime.now(timezone.utc) - timedelta(days=400) + stale = datetime.now(UTC) - timedelta(days=400) with config.provide_connection() as conn: conn.execute(f"UPDATE {store.user_state_table} SET update_time = ?", (stale,)) conn.commit() @@ -118,7 +118,7 @@ def test_duckdb_prune_memory_respects_scope(tmp_path: Path) -> None: store = DuckdbADKMemoryStore(config) store.create_tables() - stale = datetime.now(timezone.utc) - timedelta(days=200) + stale = datetime.now(UTC) - timedelta(days=200) store.insert_memory_entries([ _memory_record(app_name="app", inserted_at=stale, scope="user"), _memory_record(app_name="app", inserted_at=stale, scope="app"), diff --git a/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_memory_store.py b/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_memory_store.py index a21c093ef..1295b3eae 100644 --- a/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_memory_store.py +++ b/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_memory_store.py @@ -1,7 +1,7 @@ # pyright: reportPrivateUsage=false """Integration tests for DuckDB ADK memory store.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from pathlib import Path from uuid import uuid4 @@ -17,7 +17,7 @@ def _build_record( *, session_id: str, event_id: str, content_text: str, inserted_at: datetime, scope: str = "user" ) -> StoredMemory: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) return StoredMemory( id=str(uuid4()), session_id=session_id, @@ -60,7 +60,7 @@ def test_duckdb_memory_store_insert_search_dedup(tmp_path: Path) -> None: """Insert memory entries, search by text, and skip duplicates.""" store = _build_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="espresso", inserted_at=now) record2 = _build_record(session_id="s1", event_id="evt-2", content_text="latte", inserted_at=now) @@ -79,7 +79,7 @@ def test_duckdb_memory_store_delete_by_session(tmp_path: Path) -> None: """Delete memory entries by session id.""" store = _build_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="espresso", inserted_at=now) record2 = _build_record(session_id="s2", event_id="evt-2", content_text="latte", inserted_at=now) store.insert_memory_entries([record1, record2]) @@ -96,7 +96,7 @@ def test_duckdb_memory_store_delete_older_than(tmp_path: Path) -> None: """Delete memory entries older than a cutoff.""" store = _build_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) old = now - timedelta(days=40) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="old", inserted_at=old) record2 = _build_record(session_id="s1", event_id="evt-2", content_text="new", inserted_at=now) @@ -114,7 +114,7 @@ def test_duckdb_memory_store_fts_search_uses_bm25_path(tmp_path: Path) -> None: """FTS-enabled DuckDB stores search through the BM25 index after insert refresh.""" store = _build_fts_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-fts-1", content_text="espresso roast", inserted_at=now) record2 = _build_record(session_id="s1", event_id="evt-fts-2", content_text="latte foam", inserted_at=now) store.insert_memory_entries([record1, record2]) @@ -130,7 +130,7 @@ def test_duckdb_memory_store_scoped_search_combined_default(tmp_path: Path) -> N """Default search recall returns both user-scoped and app-scoped memories.""" store = _build_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record_user = _build_record( session_id="s1", event_id="evt-u1", content_text="project architecture guideline", inserted_at=now, scope="user" ) @@ -158,7 +158,7 @@ def test_duckdb_memory_store_explicit_scope_filters(tmp_path: Path) -> None: """Explicit scope filters restrict results to only user or only app memories.""" store = _build_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record_user = _build_record( session_id="s1", event_id="evt-u1", content_text="scoped query plan", inserted_at=now, scope="user" ) @@ -180,7 +180,7 @@ def test_duckdb_memory_store_scoped_retention(tmp_path: Path) -> None: """Scoped retention deletes entries matching app_name and scope filters.""" store = _build_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) old = now - timedelta(days=40) record_user_old = _build_record( session_id="s1", event_id="evt-uo", content_text="old user memo", inserted_at=old, scope="user" diff --git a/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_store.py b/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_store.py index bb652dbea..1f8663e98 100644 --- a/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_store.py +++ b/tests/integration/adapters/duckdb/duckdb/extensions/adk/test_store.py @@ -8,7 +8,7 @@ """ from collections.abc import Generator -from datetime import datetime, timezone +from datetime import UTC, datetime from pathlib import Path import pytest @@ -58,7 +58,7 @@ def test_event_with_optional_fields(duckdb_adk_store: DuckdbADKStore) -> None: "user_id": "user-008", "session_id": session_id, "invocation_id": "inv-123", - "timestamp": datetime.now(timezone.utc), + "timestamp": datetime.now(UTC), "event_data": { "id": "event-full", "author": "assistant", @@ -92,9 +92,9 @@ def test_event_ordering_by_timestamp(duckdb_adk_store: DuckdbADKStore) -> None: session_id = "session-009" duckdb_adk_store.create_session(session_id, "test-app", "user-009", {}) - t1 = datetime.now(timezone.utc) - t2 = datetime.now(timezone.utc) - t3 = datetime.now(timezone.utc) + t1 = datetime.now(UTC) + t2 = datetime.now(UTC) + t3 = datetime.now(UTC) ev_middle: StoredEvent = { "id": "event-middle", @@ -169,7 +169,7 @@ def test_event_data_round_trip(duckdb_adk_store: DuckdbADKStore) -> None: "user_id": "user-012", "session_id": session_id, "invocation_id": "", - "timestamp": datetime.now(timezone.utc), + "timestamp": datetime.now(UTC), "event_data": { "id": "event-json", "author": "system", diff --git a/tests/integration/adapters/duckdb/test_type_coercion_capabilities.py b/tests/integration/adapters/duckdb/test_type_coercion_capabilities.py index a283cbbdf..bbee16b89 100644 --- a/tests/integration/adapters/duckdb/test_type_coercion_capabilities.py +++ b/tests/integration/adapters/duckdb/test_type_coercion_capabilities.py @@ -1,6 +1,6 @@ """Integration test verifying TypeCoercionCapabilities against observed DuckDB behavior.""" -from datetime import datetime, timezone +from datetime import UTC, datetime from uuid import uuid4 import pytest @@ -19,7 +19,7 @@ def test_duckdb_type_coercion_capabilities_observed() -> None: assert caps.json_columns_decoded is False assert caps.uuid_binding == "text" - test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=timezone.utc) + test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=UTC) test_json = {"key": "value", "count": 42} test_uuid = uuid4() diff --git a/tests/integration/adapters/mssql/test_memory_deduplication.py b/tests/integration/adapters/mssql/test_memory_deduplication.py index f81fb8c1b..5addb9ad5 100644 --- a/tests/integration/adapters/mssql/test_memory_deduplication.py +++ b/tests/integration/adapters/mssql/test_memory_deduplication.py @@ -1,7 +1,7 @@ """SQL Server key-range locking for concurrent ADK memory deduplication.""" from concurrent.futures import ThreadPoolExecutor -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from threading import Barrier from uuid import uuid4 @@ -127,7 +127,7 @@ def test_memory_search_scopes_limits_and_retention(mssql_service: MSSQLService) assert [entry["id"] for entry in store.search_entries("searchable", "app", "user", scope_filter="app")] == ["2"] assert store.search_entries("missing", "app", "user") == [] with config.provide_session() as driver: - expired_at = datetime.now(timezone.utc).replace(tzinfo=None) - timedelta(days=60) + expired_at = datetime.now(UTC).replace(tzinfo=None) - timedelta(days=60) driver.execute(sql.update(table).set(inserted_at=expired_at)) driver.commit() assert store.delete_entries_older_than(30, app_name="app", scope="app") == 1 diff --git a/tests/integration/adapters/mysql/aiomysql/extensions/adk/test_store.py b/tests/integration/adapters/mysql/aiomysql/extensions/adk/test_store.py index 2a5db435f..ec7ccf117 100644 --- a/tests/integration/adapters/mysql/aiomysql/extensions/adk/test_store.py +++ b/tests/integration/adapters/mysql/aiomysql/extensions/adk/test_store.py @@ -7,7 +7,7 @@ concurrency, event ordering/JSON details) that is not portable across the contract matrix. """ -from datetime import datetime, timezone +from datetime import UTC, datetime import pytest @@ -75,7 +75,7 @@ async def test_timestamp_precision(aiomysql_adk_store: AiomysqlADKStore) -> None assert created["create_time"].microsecond > 0 or created["create_time"].microsecond == 0 assert hasattr(created["create_time"], "microsecond") - event_time = datetime.now(timezone.utc) + event_time = datetime.now(UTC) event: StoredEvent = { "id": "event-micro", "app_name": app_name, diff --git a/tests/integration/adapters/mysql/asyncmy/extensions/adk/test_store.py b/tests/integration/adapters/mysql/asyncmy/extensions/adk/test_store.py index 4ad39f60c..727941e99 100644 --- a/tests/integration/adapters/mysql/asyncmy/extensions/adk/test_store.py +++ b/tests/integration/adapters/mysql/asyncmy/extensions/adk/test_store.py @@ -7,7 +7,7 @@ concurrency, event ordering/JSON details) that is not portable across the contract matrix. """ -from datetime import datetime, timezone +from datetime import UTC, datetime import pytest @@ -74,7 +74,7 @@ async def test_timestamp_precision(asyncmy_adk_store: AsyncmyADKStore) -> None: assert created["create_time"].microsecond > 0 or created["create_time"].microsecond == 0 assert hasattr(created["create_time"], "microsecond") - event_time = datetime.now(timezone.utc) + event_time = datetime.now(UTC) event: StoredEvent = { "id": "event-micro", "app_name": app_name, diff --git a/tests/integration/adapters/mysql/mysqlconnector/extensions/adk/test_store.py b/tests/integration/adapters/mysql/mysqlconnector/extensions/adk/test_store.py index e1f88c49b..fbaddba97 100644 --- a/tests/integration/adapters/mysql/mysqlconnector/extensions/adk/test_store.py +++ b/tests/integration/adapters/mysql/mysqlconnector/extensions/adk/test_store.py @@ -7,7 +7,7 @@ concurrency, event ordering/JSON details) that is not portable across the contract matrix. """ -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import cast import pytest @@ -74,7 +74,7 @@ async def test_timestamp_precision(mysqlconnector_adk_store: MysqlConnectorAsync assert hasattr(created["create_time"], "microsecond") - event_time = datetime.now(timezone.utc) + event_time = datetime.now(UTC) event: StoredEvent = { "id": "event-micro", "app_name": app_name, diff --git a/tests/integration/adapters/oracle/oracledb/extensions/adk/test_oracle_specific.py b/tests/integration/adapters/oracle/oracledb/extensions/adk/test_oracle_specific.py index 4c2e1a1ad..6ff61f13a 100644 --- a/tests/integration/adapters/oracle/oracledb/extensions/adk/test_oracle_specific.py +++ b/tests/integration/adapters/oracle/oracledb/extensions/adk/test_oracle_specific.py @@ -2,7 +2,7 @@ import json from collections.abc import AsyncGenerator -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any, cast from uuid import uuid4 @@ -31,7 +31,7 @@ def _event_record( user_id=user_id, session_id=session_id, invocation_id=invocation_id, - timestamp=datetime.now(timezone.utc), + timestamp=datetime.now(UTC), event_data=event_data, ) diff --git a/tests/integration/adapters/postgres/psycopg/extensions/adk/test_memory_vector_codec_free.py b/tests/integration/adapters/postgres/psycopg/extensions/adk/test_memory_vector_codec_free.py index b333e153a..a81a3ee96 100644 --- a/tests/integration/adapters/postgres/psycopg/extensions/adk/test_memory_vector_codec_free.py +++ b/tests/integration/adapters/postgres/psycopg/extensions/adk/test_memory_vector_codec_free.py @@ -1,6 +1,6 @@ """PostgreSQL ADK vector search without pgvector client codecs.""" -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any, cast import pytest @@ -26,7 +26,7 @@ def _connection_config(service: PostgresService) -> dict[str, Any]: def _entries() -> list[StoredMemory]: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) return [ cast( "StoredMemory", diff --git a/tests/integration/adapters/postgres/test_type_coercion_capabilities.py b/tests/integration/adapters/postgres/test_type_coercion_capabilities.py index fbd49bb3a..608015da6 100644 --- a/tests/integration/adapters/postgres/test_type_coercion_capabilities.py +++ b/tests/integration/adapters/postgres/test_type_coercion_capabilities.py @@ -1,6 +1,6 @@ """Integration test verifying TypeCoercionCapabilities against observed PostgreSQL behavior.""" -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import TYPE_CHECKING from uuid import uuid4 @@ -33,7 +33,7 @@ async def test_asyncpg_type_coercion_capabilities_observed(asyncpg_config: "Asyn assert caps.json_columns_decoded is True assert caps.uuid_binding == "native" - test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=timezone.utc) + test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=UTC) test_json = {"key": "value", "count": 42} test_uuid = uuid4() @@ -65,7 +65,7 @@ def test_psycopg_sync_type_coercion_capabilities_observed(psycopg_sync_config: " assert caps.json_columns_decoded is True assert caps.uuid_binding == "native" - test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=timezone.utc) + test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=UTC) test_json = {"key": "value", "count": 42} test_uuid = uuid4() @@ -97,7 +97,7 @@ async def test_psycopg_async_type_coercion_capabilities_observed(psycopg_async_c assert caps.json_columns_decoded is True assert caps.uuid_binding == "native" - test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=timezone.utc) + test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=UTC) test_json = {"key": "value", "count": 42} test_uuid = uuid4() diff --git a/tests/integration/adapters/spanner/spanner/extensions/adk/test_adk_store.py b/tests/integration/adapters/spanner/spanner/extensions/adk/test_adk_store.py index c3f7a9b57..6a75a9935 100644 --- a/tests/integration/adapters/spanner/spanner/extensions/adk/test_adk_store.py +++ b/tests/integration/adapters/spanner/spanner/extensions/adk/test_adk_store.py @@ -6,7 +6,7 @@ """ from collections.abc import Awaitable, Callable -from datetime import datetime, timezone +from datetime import UTC, datetime from inspect import isawaitable from typing import Any, TypeVar @@ -61,7 +61,7 @@ async def test_spanner_adk_memory_store_round_trip( ) -> None: """Spanner ADK memory stores insert, search, and delete entries by session.""" config, store = spanner_adk_memory_store_factory() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) entry: StoredMemory = { "id": "memory-1", "session_id": "session-memory", diff --git a/tests/integration/adapters/spanner/spanner/test_driver.py b/tests/integration/adapters/spanner/spanner/test_driver.py index 855792497..da05e4ef6 100644 --- a/tests/integration/adapters/spanner/spanner/test_driver.py +++ b/tests/integration/adapters/spanner/spanner/test_driver.py @@ -5,7 +5,7 @@ fixtures. This module keeps those adapter-local driver/session assertions. """ -from datetime import datetime, timezone +from datetime import UTC, datetime from uuid import uuid4 import pytest @@ -225,7 +225,7 @@ def test_driver_data_type_bool(spanner_session: "SpannerSyncDriver") -> None: def test_driver_data_type_timestamp(spanner_session: "SpannerSyncDriver") -> None: """Test TIMESTAMP data type handling.""" - ts = datetime(2024, 1, 15, 12, 30, 45, tzinfo=timezone.utc) + ts = datetime(2024, 1, 15, 12, 30, 45, tzinfo=UTC) result = spanner_session.select_value("SELECT @val", val=ts) assert result.year == 2024 assert result.month == 1 diff --git a/tests/integration/adapters/spanner/spanner/test_parameter_variants.py b/tests/integration/adapters/spanner/spanner/test_parameter_variants.py index 142187d43..244f265da 100644 --- a/tests/integration/adapters/spanner/spanner/test_parameter_variants.py +++ b/tests/integration/adapters/spanner/spanner/test_parameter_variants.py @@ -5,7 +5,7 @@ shared C5 contract for active default adapters. """ -from datetime import date, datetime, timezone +from datetime import UTC, date, datetime from uuid import uuid4 import pytest @@ -31,7 +31,7 @@ def test_spanner_native_named_at_parameters_allow_reuse_and_identifier_variants( def test_spanner_native_types_round_trip_through_read_session(spanner_session: SpannerSyncDriver) -> None: """Spanner infers native scalar parameter types for read-only SELECT statements.""" - timestamp = datetime(2024, 6, 15, 14, 30, 0, tzinfo=timezone.utc) + timestamp = datetime(2024, 6, 15, 14, 30, 0, tzinfo=UTC) row = spanner_session.select_one( "SELECT @num AS num, @ratio AS ratio, @flag AS flag, @text AS text, @ts AS ts", {"num": 9223372036854775807, "ratio": 3.14159, "flag": True, "text": "", "ts": timestamp}, diff --git a/tests/integration/adapters/sqlite/adbc/extensions/adk/test_memory_store.py b/tests/integration/adapters/sqlite/adbc/extensions/adk/test_memory_store.py index 22cc30ebc..9895432d9 100644 --- a/tests/integration/adapters/sqlite/adbc/extensions/adk/test_memory_store.py +++ b/tests/integration/adapters/sqlite/adbc/extensions/adk/test_memory_store.py @@ -1,6 +1,6 @@ """Integration tests for ADBC ADK memory store.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from pathlib import Path from uuid import uuid4 @@ -16,7 +16,7 @@ def _build_record( *, session_id: str, event_id: str, content_text: str, inserted_at: datetime, scope: str = "user" ) -> StoredMemory: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) return StoredMemory( id=str(uuid4()), session_id=session_id, @@ -46,7 +46,7 @@ def test_adbc_memory_store_insert_search_dedup(tmp_path: Path) -> None: """Insert memory entries, search by text, and skip duplicates.""" store = _build_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="espresso", inserted_at=now) record2 = _build_record(session_id="s1", event_id="evt-2", content_text="latte", inserted_at=now) @@ -65,7 +65,7 @@ def test_adbc_memory_store_delete_by_session(tmp_path: Path) -> None: """Delete memory entries by session id.""" store = _build_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="espresso", inserted_at=now) record2 = _build_record(session_id="s2", event_id="evt-2", content_text="latte", inserted_at=now) store.insert_memory_entries([record1, record2]) @@ -82,7 +82,7 @@ def test_adbc_memory_store_delete_older_than(tmp_path: Path) -> None: """Delete memory entries older than a cutoff.""" store = _build_store(tmp_path) - now = datetime.now(timezone.utc) + now = datetime.now(UTC) old = now - timedelta(days=40) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="old", inserted_at=old) record2 = _build_record(session_id="s1", event_id="evt-2", content_text="new", inserted_at=now) diff --git a/tests/integration/adapters/sqlite/aiosqlite/extensions/adk/test_memory_store.py b/tests/integration/adapters/sqlite/aiosqlite/extensions/adk/test_memory_store.py index 6b97d86f9..ba3e95b57 100644 --- a/tests/integration/adapters/sqlite/aiosqlite/extensions/adk/test_memory_store.py +++ b/tests/integration/adapters/sqlite/aiosqlite/extensions/adk/test_memory_store.py @@ -1,7 +1,7 @@ """Integration tests for AioSQLite ADK memory store.""" import tempfile -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from uuid import uuid4 import pytest @@ -16,7 +16,7 @@ def _build_record( *, session_id: str, event_id: str, content_text: str, inserted_at: datetime, scope: str = "user" ) -> StoredMemory: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) return StoredMemory( id=str(uuid4()), session_id=session_id, @@ -41,7 +41,7 @@ async def test_aiosqlite_memory_store_insert_search_dedup() -> None: store = AiosqliteADKMemoryStore(config) await store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="espresso", inserted_at=now) record2 = _build_record(session_id="s1", event_id="evt-2", content_text="latte", inserted_at=now) @@ -67,7 +67,7 @@ async def test_aiosqlite_memory_store_fts_search() -> None: store = AiosqliteADKMemoryStore(config) await store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-fts-1", content_text="espresso roast", inserted_at=now) record2 = _build_record(session_id="s1", event_id="evt-fts-2", content_text="latte foam", inserted_at=now) await store.insert_memory_entries([record1, record2]) @@ -97,7 +97,7 @@ async def test_aiosqlite_memory_store_disabled_lifecycle() -> None: assert row is None - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record = _build_record(session_id="s1", event_id="evt-disabled", content_text="espresso", inserted_at=now) with pytest.raises(RuntimeError, match="Memory store is disabled"): await store.insert_memory_entries([record]) @@ -114,7 +114,7 @@ async def test_aiosqlite_memory_store_delete_by_session() -> None: store = AiosqliteADKMemoryStore(config) await store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="espresso", inserted_at=now) record2 = _build_record(session_id="s2", event_id="evt-2", content_text="latte", inserted_at=now) await store.insert_memory_entries([record1, record2]) @@ -137,7 +137,7 @@ async def test_aiosqlite_memory_store_delete_older_than() -> None: store = AiosqliteADKMemoryStore(config) await store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) old = now - timedelta(days=40) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="old", inserted_at=old) record2 = _build_record(session_id="s1", event_id="evt-2", content_text="new", inserted_at=now) @@ -161,7 +161,7 @@ async def test_aiosqlite_memory_store_scoped_search_combined_default() -> None: store = AiosqliteADKMemoryStore(config) await store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record_user = _build_record( session_id="s1", event_id="evt-u1", @@ -203,7 +203,7 @@ async def test_aiosqlite_memory_store_explicit_scope_filters() -> None: store = AiosqliteADKMemoryStore(config) await store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record_user = _build_record( session_id="s1", event_id="evt-u1", content_text="scoped query plan", inserted_at=now, scope="user" ) @@ -230,7 +230,7 @@ async def test_aiosqlite_memory_store_scoped_retention() -> None: store = AiosqliteADKMemoryStore(config) await store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) old = now - timedelta(days=40) record_user_old = _build_record( session_id="s1", event_id="evt-uo", content_text="old user memo", inserted_at=old, scope="user" diff --git a/tests/integration/adapters/sqlite/sqlite/extensions/adk/test_maintenance.py b/tests/integration/adapters/sqlite/sqlite/extensions/adk/test_maintenance.py index 42d0d90c8..ba57ae0d1 100644 --- a/tests/integration/adapters/sqlite/sqlite/extensions/adk/test_maintenance.py +++ b/tests/integration/adapters/sqlite/sqlite/extensions/adk/test_maintenance.py @@ -1,7 +1,7 @@ """Integration tests for ADK retention on SQLite.""" import tempfile -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from pathlib import Path from uuid import uuid4 @@ -19,7 +19,7 @@ def _build_memory_record( *, session_id: str, event_id: str, content_text: str, inserted_at: datetime, scope: str = "user" ) -> StoredMemory: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) return StoredMemory( id=str(uuid4()), session_id=session_id, @@ -46,7 +46,7 @@ def test_sqlite_prune_sessions_and_scoped_memory() -> None: session_store.create_tables() memory_store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) old_time = now - timedelta(days=60) with config.provide_connection() as conn: @@ -100,7 +100,7 @@ def test_sqlite_prune_sessions_scopes_to_app_name() -> None: store = SqliteADKStore(config) store.create_tables() - stale = datetime.now(timezone.utc) - timedelta(days=90) + stale = datetime.now(UTC) - timedelta(days=90) for app in ("app_keep", "app_prune"): store.create_session(f"session_{app}", app, "user_1", {}) with config.provide_connection() as conn: @@ -126,7 +126,7 @@ def test_sqlite_prune_events_scopes_to_app_name() -> None: store = SqliteADKStore(config) store.create_tables() - stale = datetime.now(timezone.utc) - timedelta(days=200) + stale = datetime.now(UTC) - timedelta(days=200) for app in ("app_keep", "app_prune"): store.create_session(f"session_{app}", app, "user_1", {}) store.append_event( diff --git a/tests/integration/adapters/sqlite/sqlite/extensions/adk/test_memory_store.py b/tests/integration/adapters/sqlite/sqlite/extensions/adk/test_memory_store.py index fef8dba86..018b4e1fb 100644 --- a/tests/integration/adapters/sqlite/sqlite/extensions/adk/test_memory_store.py +++ b/tests/integration/adapters/sqlite/sqlite/extensions/adk/test_memory_store.py @@ -1,7 +1,7 @@ """Integration tests for SQLite ADK memory store.""" import tempfile -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from uuid import uuid4 import pytest @@ -16,7 +16,7 @@ def _build_record( *, session_id: str, event_id: str, content_text: str, inserted_at: datetime, scope: str = "user" ) -> StoredMemory: - now = datetime.now(timezone.utc) + now = datetime.now(UTC) return StoredMemory( id=str(uuid4()), session_id=session_id, @@ -41,7 +41,7 @@ def test_sqlite_memory_store_insert_search_dedup() -> None: store = SqliteADKMemoryStore(config) store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="espresso", inserted_at=now) record2 = _build_record(session_id="s1", event_id="evt-2", content_text="latte", inserted_at=now) @@ -65,7 +65,7 @@ def test_sqlite_memory_store_fts_search() -> None: store = SqliteADKMemoryStore(config) store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-fts-1", content_text="espresso roast", inserted_at=now) record2 = _build_record(session_id="s1", event_id="evt-fts-2", content_text="latte foam", inserted_at=now) store.insert_memory_entries([record1, record2]) @@ -93,7 +93,7 @@ def test_sqlite_memory_store_disabled_lifecycle() -> None: assert row is None - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record = _build_record(session_id="s1", event_id="evt-disabled", content_text="espresso", inserted_at=now) with pytest.raises(RuntimeError, match="Memory store is disabled"): store.insert_memory_entries([record]) @@ -108,7 +108,7 @@ def test_sqlite_memory_store_delete_by_session() -> None: store = SqliteADKMemoryStore(config) store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="espresso", inserted_at=now) record2 = _build_record(session_id="s2", event_id="evt-2", content_text="latte", inserted_at=now) store.insert_memory_entries([record1, record2]) @@ -128,7 +128,7 @@ def test_sqlite_memory_store_delete_older_than() -> None: store = SqliteADKMemoryStore(config) store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) old = now - timedelta(days=40) record1 = _build_record(session_id="s1", event_id="evt-1", content_text="old", inserted_at=old) record2 = _build_record(session_id="s1", event_id="evt-2", content_text="new", inserted_at=now) @@ -149,7 +149,7 @@ def test_sqlite_memory_store_scoped_search_combined_default() -> None: store = SqliteADKMemoryStore(config) store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record_user = _build_record( session_id="s1", event_id="evt-u1", @@ -188,7 +188,7 @@ def test_sqlite_memory_store_explicit_scope_filters() -> None: store = SqliteADKMemoryStore(config) store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) record_user = _build_record( session_id="s1", event_id="evt-u1", content_text="scoped query plan", inserted_at=now, scope="user" ) @@ -213,7 +213,7 @@ def test_sqlite_memory_store_scoped_retention() -> None: store = SqliteADKMemoryStore(config) store.create_tables() - now = datetime.now(timezone.utc) + now = datetime.now(UTC) old = now - timedelta(days=40) record_user_old = _build_record( session_id="s1", event_id="evt-uo", content_text="old user memo", inserted_at=old, scope="user" diff --git a/tests/integration/adapters/sqlite/test_type_coercion_capabilities.py b/tests/integration/adapters/sqlite/test_type_coercion_capabilities.py index b4c4e5e4d..190a4908f 100644 --- a/tests/integration/adapters/sqlite/test_type_coercion_capabilities.py +++ b/tests/integration/adapters/sqlite/test_type_coercion_capabilities.py @@ -1,6 +1,6 @@ """Integration test verifying TypeCoercionCapabilities against observed SQLite behavior.""" -from datetime import datetime, timezone +from datetime import UTC, datetime from uuid import uuid4 import pytest @@ -20,7 +20,7 @@ def test_sqlite_type_coercion_capabilities_observed() -> None: assert caps.json_columns_decoded is False assert caps.uuid_binding == "text" - test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=timezone.utc) + test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=UTC) test_json = {"key": "value", "count": 42} test_uuid = uuid4() @@ -56,7 +56,7 @@ async def test_aiosqlite_type_coercion_capabilities_observed() -> None: assert caps.json_columns_decoded is False assert caps.uuid_binding == "text" - test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=timezone.utc) + test_dt = datetime(2024, 1, 15, 12, 30, 45, 123456, tzinfo=UTC) test_json = {"key": "value", "count": 42} test_uuid = uuid4() diff --git a/tests/integration/extensions/litestar/test_channels_backend_concurrency.py b/tests/integration/extensions/litestar/test_channels_backend_concurrency.py index 62faba99c..bb35ed5f7 100644 --- a/tests/integration/extensions/litestar/test_channels_backend_concurrency.py +++ b/tests/integration/extensions/litestar/test_channels_backend_concurrency.py @@ -106,7 +106,7 @@ async def test_sqlspec_channels_backend_multi_channel(postgres_service: Any, bac try: try: await asyncio.wait_for(_exercise(plugin, backend_key), timeout=_EXERCISE_TIMEOUT) - except asyncio.TimeoutError: + except TimeoutError: failure = AssertionError( f"{backend_key}: test hung — concurrent multi-channel deadlock under broken backend" ) @@ -139,7 +139,7 @@ async def _exercise(plugin: ChannelsPlugin, backend_key: str) -> None: alpha_payload = await asyncio.wait_for(_next_event(sub_alpha), timeout=_NEXT_EVENT_TIMEOUT) decoded_alpha = msgspec.json.decode(alpha_payload) assert decoded_alpha["action"] == "alpha" - except asyncio.TimeoutError as exc: + except TimeoutError as exc: raise AssertionError(f"{backend_key}: alpha subscriber timed out") from exc try: @@ -148,5 +148,5 @@ async def _exercise(plugin: ChannelsPlugin, backend_key: str) -> None: assert decoded_beta["action"] == "beta", ( f"{backend_key}: beta subscriber received no message (multi-channel race)" ) - except asyncio.TimeoutError as exc: + except TimeoutError as exc: raise AssertionError(f"{backend_key}: beta subscriber timed out (multi-channel race)") from exc diff --git a/tests/unit/adapters/test_aiomysql/test_adk_store.py b/tests/unit/adapters/test_aiomysql/test_adk_store.py index 0b970ba96..ea75d6e65 100644 --- a/tests/unit/adapters/test_aiomysql/test_adk_store.py +++ b/tests/unit/adapters/test_aiomysql/test_adk_store.py @@ -2,11 +2,11 @@ """Unit tests for aiomysql ADK store extension configuration.""" import asyncio -from typing import Any, cast, get_args, get_origin +from datetime import UTC +from typing import Any, NotRequired, Self, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired, Self from sqlspec.adapters.aiomysql.adk import AiomysqlADKConfig, AiomysqlADKMemoryStore, AiomysqlADKStore from sqlspec.config import ADKConfig @@ -216,10 +216,10 @@ async def test_aiomysql_list_sessions_rejects_invalid_options(options: "dict[str async def test_aiomysql_adk_memory_store_insert_and_search_json_handling() -> None: """AiomysqlADKMemoryStore handles missing author, metadata_json=None, and deserializes JSON strings.""" - from datetime import datetime, timezone + from datetime import datetime from unittest.mock import AsyncMock - now = datetime.now(tz=timezone.utc) + now = datetime.now(tz=UTC) cursor = MagicMock() cursor.rowcount = 1 cursor.execute = AsyncMock() diff --git a/tests/unit/adapters/test_aiomysql/test_driver.py b/tests/unit/adapters/test_aiomysql/test_driver.py index 7f3b610f7..b89da9454 100644 --- a/tests/unit/adapters/test_aiomysql/test_driver.py +++ b/tests/unit/adapters/test_aiomysql/test_driver.py @@ -1,9 +1,8 @@ """Unit tests for the aiomysql driver transaction-state contract.""" -from typing import Any, cast +from typing import Any, Self, cast import pytest -from typing_extensions import Self from sqlspec.adapters.aiomysql.driver import AiomysqlDriver diff --git a/tests/unit/adapters/test_aiosqlite/test_adk_config.py b/tests/unit/adapters/test_aiosqlite/test_adk_config.py index ebe8eb785..581196667 100644 --- a/tests/unit/adapters/test_aiosqlite/test_adk_config.py +++ b/tests/unit/adapters/test_aiosqlite/test_adk_config.py @@ -1,10 +1,9 @@ """Aiosqlite ADK adapter-local configuration tests.""" -from typing import Any, get_type_hints +from typing import Any, Self, get_type_hints from unittest.mock import MagicMock import pytest -from typing_extensions import Self from sqlspec.adapters.aiosqlite.adk import AiosqliteADKConfig, AiosqliteADKMemoryStore, AiosqliteADKStore from sqlspec.adapters.aiosqlite.config import AiosqliteConfig diff --git a/tests/unit/adapters/test_arrow_odbc/test_db2_stores.py b/tests/unit/adapters/test_arrow_odbc/test_db2_stores.py index 4a805f70a..16c8af0e0 100644 --- a/tests/unit/adapters/test_arrow_odbc/test_db2_stores.py +++ b/tests/unit/adapters/test_arrow_odbc/test_db2_stores.py @@ -1,6 +1,6 @@ """Unit tests for the Db2 variants of the arrow-odbc extension stores.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any import pyarrow as pa @@ -208,7 +208,7 @@ def test_db2_event_store_index_existence_target(queue_table: str, expected: "tup assert _event_store(queue_table)._index_existence_target() == expected # pyright: ignore[reportPrivateUsage] -_EVENT_TIME = datetime(2026, 1, 2, 3, 4, 5, 678901, tzinfo=timezone.utc) +_EVENT_TIME = datetime(2026, 1, 2, 3, 4, 5, 678901, tzinfo=UTC) _DB2_SESSION_ROW = pa.table({ "ID": ["s1"], "APP_NAME": ["app"], @@ -634,7 +634,7 @@ def test_db2_adk_memory_cutoff_is_utc() -> None: calls = normalized_calls(connection) cutoff = calls[0][1][0] if calls[0][1] else None - expected = datetime.now(timezone.utc).replace(tzinfo=None) - timedelta(days=30) + expected = datetime.now(UTC).replace(tzinfo=None) - timedelta(days=30) assert calls[0][0] == "SELECT COUNT(*) AS row_count FROM adk_memory WHERE inserted_at < ? AND app_name = ?" assert cutoff == DB2_TIMESTAMP assert abs(datetime.fromisoformat(str(cutoff)) - expected) < timedelta(minutes=1) diff --git a/tests/unit/adapters/test_arrow_odbc/test_tsql_stores.py b/tests/unit/adapters/test_arrow_odbc/test_tsql_stores.py index df38f58c5..a8eacffba 100644 --- a/tests/unit/adapters/test_arrow_odbc/test_tsql_stores.py +++ b/tests/unit/adapters/test_arrow_odbc/test_tsql_stores.py @@ -1,6 +1,6 @@ """Characterization tests for the SQL Server statements of the arrow-odbc extension stores.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any import pyarrow as pa @@ -160,7 +160,7 @@ async def test_tsql_session_exists_and_expires_in() -> None: ("exists_flag", pa.table({"exists_flag": [1]})), ( "SELECT expires_at FROM sess", - pa.table({"expires_at": [datetime.now(timezone.utc).replace(tzinfo=None) + timedelta(hours=1)]}), + pa.table({"expires_at": [datetime.now(UTC).replace(tzinfo=None) + timedelta(hours=1)]}), ), ), ) @@ -223,7 +223,7 @@ def test_tsql_event_store_create_and_drop_statements() -> None: assert store._index_existence_target() is None # pyright: ignore[reportPrivateUsage] -_ADK_TIME = datetime(2026, 1, 2, 3, 4, 5, 678901, tzinfo=timezone.utc) +_ADK_TIME = datetime(2026, 1, 2, 3, 4, 5, 678901, tzinfo=UTC) _ADK_SESSION_ROW = pa.table({ "id": ["s1"], "app_name": ["app"], diff --git a/tests/unit/adapters/test_asyncmy/test_adk_store.py b/tests/unit/adapters/test_asyncmy/test_adk_store.py index 5b6fca77b..e3b2d6759 100644 --- a/tests/unit/adapters/test_asyncmy/test_adk_store.py +++ b/tests/unit/adapters/test_asyncmy/test_adk_store.py @@ -2,11 +2,11 @@ """Unit tests for asyncmy ADK store extension configuration.""" import asyncio -from typing import Any, cast, get_args, get_origin +from datetime import UTC +from typing import Any, NotRequired, Self, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired, Self from sqlspec.adapters.asyncmy.adk import AsyncmyADKConfig, AsyncmyADKMemoryStore, AsyncmyADKStore from sqlspec.config import ADKConfig @@ -219,10 +219,10 @@ async def test_asyncmy_list_sessions_rejects_invalid_options(options: "dict[str, async def test_asyncmy_adk_memory_store_insert_and_search_json_handling() -> None: """AsyncmyADKMemoryStore handles missing author, metadata_json=None, and deserializes JSON strings.""" - from datetime import datetime, timezone + from datetime import datetime from unittest.mock import AsyncMock - now = datetime.now(tz=timezone.utc) + now = datetime.now(tz=UTC) cursor = MagicMock() cursor.rowcount = 1 cursor.execute = AsyncMock() diff --git a/tests/unit/adapters/test_asyncpg/test_adk_store.py b/tests/unit/adapters/test_asyncpg/test_adk_store.py index baefbd279..25a519155 100644 --- a/tests/unit/adapters/test_asyncpg/test_adk_store.py +++ b/tests/unit/adapters/test_asyncpg/test_adk_store.py @@ -1,11 +1,10 @@ # pyright: reportPrivateUsage=false """Unit tests for asyncpg ADK store extension configuration.""" -from typing import Any, cast +from typing import Any, Self, cast from unittest.mock import MagicMock import pytest -from typing_extensions import Self from sqlspec.adapters.asyncpg.adk import AsyncpgADKConfig, AsyncpgADKMemoryStore, AsyncpgADKStore from sqlspec.adapters.asyncpg.config import AsyncpgConfig diff --git a/tests/unit/adapters/test_asyncpg/test_config.py b/tests/unit/adapters/test_asyncpg/test_config.py index 80bdca140..a670cbedc 100644 --- a/tests/unit/adapters/test_asyncpg/test_config.py +++ b/tests/unit/adapters/test_asyncpg/test_config.py @@ -1,11 +1,10 @@ """AsyncPG configuration tests covering statement config builders.""" -from typing import Any, cast, get_args, get_origin +from typing import Any, NotRequired, cast, get_args, get_origin from unittest.mock import AsyncMock import pytest from asyncpg.pool import PoolConnectionProxy, PoolConnectionProxyMeta -from typing_extensions import NotRequired from sqlspec.adapters.asyncpg._typing import AsyncpgSessionContext from sqlspec.adapters.asyncpg.config import AsyncpgConfig, AsyncpgConnectionConfig, AsyncpgPoolConfig diff --git a/tests/unit/adapters/test_bigquery/test_adk_store.py b/tests/unit/adapters/test_bigquery/test_adk_store.py index 7c8cb2799..8b0d50bc5 100644 --- a/tests/unit/adapters/test_bigquery/test_adk_store.py +++ b/tests/unit/adapters/test_bigquery/test_adk_store.py @@ -3,11 +3,10 @@ import inspect from contextlib import nullcontext -from datetime import datetime, timezone -from typing import Any, cast, get_args, get_origin +from datetime import UTC, datetime +from typing import Any, NotRequired, cast, get_args, get_origin import pytest -from typing_extensions import NotRequired from sqlspec.adapters.bigquery import BigQueryConfig from sqlspec.adapters.bigquery.adk import BigQueryADKConfig, BigQueryADKRetentionConfig, BigQueryADKStore @@ -146,8 +145,8 @@ def capture(_store: BigQueryADKStore, sql: str, parameters: Any = None) -> list[ store.update_session_state("app", "user", "session", {"turn": 1}) store.delete_session("app", "user", "session") store.get_events("app", "user", "session") - store.delete_expired_events(datetime.now(timezone.utc)) - store.delete_idle_sessions(datetime.now(timezone.utc)) + store.delete_expired_events(datetime.now(UTC)) + store.delete_idle_sessions(datetime.now(UTC)) assert any("FROM test_dataset.adk_session" in sql and "create_time IS NOT NULL" in sql for sql in statements) assert any("UPDATE test_dataset.adk_session" in sql and "create_time IS NOT NULL" in sql for sql in statements) @@ -160,7 +159,7 @@ def test_bigquery_adk_get_events_reads_full_event_blob_without_json_value(monkey """Event reads preserve nested event_data instead of JSON_VALUE scalar projections.""" store = _make_store() - timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) statements: list[str] = [] def capture(_store: BigQueryADKStore, sql: str, parameters: Any = None) -> list[dict[str, Any]]: @@ -302,7 +301,7 @@ def test_bigquery_litestar_store_includes_partition_filter_when_required() -> No """BigQueryStore appends the expires_at partition predicate when require_partition_filter is enabled.""" executed: list[str] = [] selected: list[str] = [] - now = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + now = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) class _FakeDriver: def select_one(self, sql: str, **_kwargs: Any) -> dict[str, Any]: @@ -338,7 +337,7 @@ def test_bigquery_litestar_store_omits_partition_filter_by_default() -> None: """BigQueryStore omits the synthetic partition predicate when require_partition_filter is disabled.""" executed: list[str] = [] selected: list[str] = [] - now = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + now = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) class _FakeDriver: def select_one(self, sql: str, **_kwargs: Any) -> dict[str, Any]: diff --git a/tests/unit/adapters/test_cockroach_asyncpg/test_adk_store.py b/tests/unit/adapters/test_cockroach_asyncpg/test_adk_store.py index f96150640..55f91e177 100644 --- a/tests/unit/adapters/test_cockroach_asyncpg/test_adk_store.py +++ b/tests/unit/adapters/test_cockroach_asyncpg/test_adk_store.py @@ -1,11 +1,10 @@ # pyright: reportPrivateUsage=false """Unit tests for CockroachDB asyncpg ADK store extension configuration.""" -from typing import Any, cast, get_args, get_origin +from typing import Any, NotRequired, Self, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired, Self from sqlspec.adapters.cockroach_asyncpg.adk import ( CockroachAsyncpgADKConfig, diff --git a/tests/unit/adapters/test_cockroach_asyncpg/test_config.py b/tests/unit/adapters/test_cockroach_asyncpg/test_config.py index a7a608051..692bf8793 100644 --- a/tests/unit/adapters/test_cockroach_asyncpg/test_config.py +++ b/tests/unit/adapters/test_cockroach_asyncpg/test_config.py @@ -6,11 +6,10 @@ - Connection config normalization """ -from typing import Any, cast, get_args, get_origin +from typing import Any, NotRequired, cast, get_args, get_origin from unittest.mock import AsyncMock, MagicMock, patch import pytest -from typing_extensions import NotRequired from sqlspec.adapters.cockroach_asyncpg import ( CockroachAsyncpgConfig, diff --git a/tests/unit/adapters/test_cockroach_psycopg/test_adk_store.py b/tests/unit/adapters/test_cockroach_psycopg/test_adk_store.py index edbb0df6a..644270e86 100644 --- a/tests/unit/adapters/test_cockroach_psycopg/test_adk_store.py +++ b/tests/unit/adapters/test_cockroach_psycopg/test_adk_store.py @@ -1,11 +1,10 @@ # pyright: reportPrivateUsage=false """Unit tests for CockroachDB psycopg ADK store extension configuration.""" -from typing import Any, cast, get_args, get_origin +from typing import Any, NotRequired, Self, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired, Self from sqlspec.adapters.cockroach_psycopg.adk import ( CockroachPsycopgADKConfig, diff --git a/tests/unit/adapters/test_contract_streaming_deviations.py b/tests/unit/adapters/test_contract_streaming_deviations.py index e3018a44f..aaeb4098f 100644 --- a/tests/unit/adapters/test_contract_streaming_deviations.py +++ b/tests/unit/adapters/test_contract_streaming_deviations.py @@ -1,8 +1,6 @@ """Unit tests for adapter streaming contract deviations.""" -from typing import Any, cast - -from typing_extensions import Self +from typing import Any, Self, cast from tests.integration.adapters._shared._cases import DriverCase from tests.integration.adapters._shared._schema import DEFAULT_CONTRACT_TABLE diff --git a/tests/unit/adapters/test_db2/_fakes.py b/tests/unit/adapters/test_db2/_fakes.py index b6eba1cd8..7607bf1f8 100644 --- a/tests/unit/adapters/test_db2/_fakes.py +++ b/tests/unit/adapters/test_db2/_fakes.py @@ -17,9 +17,7 @@ import inspect from collections.abc import AsyncIterator, Callable, Iterator, Sequence from contextlib import asynccontextmanager, contextmanager -from typing import Any - -from typing_extensions import Self +from typing import Any, Self import sqlspec.adapters.db2._typing as db2_typing import sqlspec.adapters.db2.config as db2_config diff --git a/tests/unit/adapters/test_db2/test_adk.py b/tests/unit/adapters/test_db2/test_adk.py index d4127b8a8..c28104cd5 100644 --- a/tests/unit/adapters/test_db2/test_adk.py +++ b/tests/unit/adapters/test_db2/test_adk.py @@ -3,7 +3,7 @@ Store behaviors run against the sync and async stores through ``db2_mode``. """ -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta, timezone from typing import Any import pytest @@ -48,7 +48,7 @@ def _session_row() -> FakeDb2Cursor: def _utc_naive_now() -> datetime: - return datetime.now(timezone.utc).replace(tzinfo=None) + return datetime.now(UTC).replace(tzinfo=None) def _assert_naive_utc_near(value: Any, expected: datetime) -> None: @@ -73,7 +73,7 @@ async def test_create_session_binds_utc_times(db2_mode: DriverMode) -> None: assert insert_params[:4] == ("s1", "app", "u1", '{"step":1}') _assert_naive_utc_near(insert_params[4], _utc_naive_now()) assert insert_params[5] == insert_params[4] - assert session["create_time"] == datetime(2026, 9, 24, 12, 0, 0, tzinfo=timezone.utc) + assert session["create_time"] == datetime(2026, 9, 24, 12, 0, 0, tzinfo=UTC) assert session["state"] == {"step": 1} @@ -178,10 +178,10 @@ def test_datetime_value_rejects_unknown_types(value: object) -> None: @pytest.mark.parametrize( ("value", "expected"), [ - (datetime(2026, 1, 1, 12), datetime(2026, 1, 1, 12, tzinfo=timezone.utc)), - (datetime(2026, 1, 1, 14, tzinfo=timezone(timedelta(hours=2))), datetime(2026, 1, 1, 12, tzinfo=timezone.utc)), - ("2026-01-01T12:00:00", datetime(2026, 1, 1, 12, tzinfo=timezone.utc)), - (b"2026-01-01T12:00:00Z", datetime(2026, 1, 1, 12, tzinfo=timezone.utc)), + (datetime(2026, 1, 1, 12), datetime(2026, 1, 1, 12, tzinfo=UTC)), + (datetime(2026, 1, 1, 14, tzinfo=timezone(timedelta(hours=2))), datetime(2026, 1, 1, 12, tzinfo=UTC)), + ("2026-01-01T12:00:00", datetime(2026, 1, 1, 12, tzinfo=UTC)), + (b"2026-01-01T12:00:00Z", datetime(2026, 1, 1, 12, tzinfo=UTC)), ], ids=["naive", "aware", "text", "bytes"], ) @@ -326,7 +326,7 @@ async def test_retention_deletes_on_missing_table_return_zero(db2_mode: DriverMo """Retention deletes against an absent table report zero rows.""" store, _ = _session_store(db2_mode, FakeDb2Cursor(error=db2_error(-204, "42704", UNDEFINED_NAME_TEXT))) - assert await db2_mode.call(getattr(store, method), datetime(2026, 9, 24, tzinfo=timezone.utc)) == 0 + assert await db2_mode.call(getattr(store, method), datetime(2026, 9, 24, tzinfo=UTC)) == 0 async def test_scoped_state_and_metadata_reads(db2_mode: DriverMode) -> None: @@ -381,7 +381,7 @@ async def test_get_events_binds_naive_utc_after_timestamp(db2_mode: DriverMode) [(sql, params)] = config.executed assert params == ("app", "u1", "s1", datetime(2026, 9, 24, 11)) assert "FETCH FIRST 5 ROWS ONLY" in sql - assert event["timestamp"] == datetime(2026, 9, 24, 12, tzinfo=timezone.utc) + assert event["timestamp"] == datetime(2026, 9, 24, 12, tzinfo=UTC) assert event["event_data"] == {"text": "hi"} @@ -397,7 +397,7 @@ async def test_session_list_delete_and_drop_use_unquoted_tables(db2_mode: Driver assert list_params == ("app", "u1", 0, 10) assert delete_sql == f"DELETE FROM {store.session_table} WHERE app_name = ? AND user_id = ? AND id = ?" assert delete_params == ("app", "u1", "s1") - assert session["update_time"] == datetime(2026, 9, 24, 12, tzinfo=timezone.utc) + assert session["update_time"] == datetime(2026, 9, 24, 12, tzinfo=UTC) assert store._drop_tables_sql() == [ f"DROP TABLE {store.metadata_table}", f"DROP TABLE {store.user_state_table}", @@ -485,7 +485,7 @@ async def test_memory_search_decodes_rows_and_session_delete_counts(db2_mode: Dr [memory] = await db2_mode.call(store.search_entries, query="hi", app_name="app", user_id="u1", scope_filter="user") deleted = await db2_mode.call(store.delete_entries_by_session, "s1") - assert memory["inserted_at"] == datetime(2026, 9, 24, 12, tzinfo=timezone.utc) + assert memory["inserted_at"] == datetime(2026, 9, 24, 12, tzinfo=UTC) assert memory["author"] is None assert memory["metadata_json"] is None assert deleted == 1 @@ -531,7 +531,7 @@ async def test_zero_limit_reads_skip_the_database(db2_mode: DriverMode, call: An lambda store: store.get_app_state("app"), lambda store: store.list_sessions("app"), lambda store: store.get_events("app", "u1", "s1"), - lambda store: store.delete_idle_sessions(datetime(2026, 9, 24, tzinfo=timezone.utc)), + lambda store: store.delete_idle_sessions(datetime(2026, 9, 24, tzinfo=UTC)), ], ids=["scoped-read", "list-sessions", "events", "retention"], ) @@ -552,7 +552,7 @@ async def test_append_event_for_unknown_session_raises(db2_mode: DriverMode) -> user_id="u1", session_id="s1", invocation_id="i1", - timestamp=datetime(2026, 9, 24, tzinfo=timezone.utc), + timestamp=datetime(2026, 9, 24, tzinfo=UTC), event_data={}, ) diff --git a/tests/unit/adapters/test_db2/test_litestar.py b/tests/unit/adapters/test_db2/test_litestar.py index 5465ab657..3e05a8e84 100644 --- a/tests/unit/adapters/test_db2/test_litestar.py +++ b/tests/unit/adapters/test_db2/test_litestar.py @@ -4,7 +4,7 @@ """ import importlib -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta, timezone from types import SimpleNamespace from typing import Any @@ -29,7 +29,7 @@ def _store( def _utc_naive_now() -> datetime: - return datetime.now(timezone.utc).replace(tzinfo=None) + return datetime.now(UTC).replace(tzinfo=None) def _assert_naive_utc_near(value: Any, expected: datetime) -> None: diff --git a/tests/unit/adapters/test_db2/test_migrations.py b/tests/unit/adapters/test_db2/test_migrations.py index fcf8f3826..2bb525c4d 100644 --- a/tests/unit/adapters/test_db2/test_migrations.py +++ b/tests/unit/adapters/test_db2/test_migrations.py @@ -3,7 +3,7 @@ Tracker and schema-hook behaviors run in both driver modes through ``db2_mode``. """ -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any import pytest @@ -196,7 +196,7 @@ async def test_record_migration_binds_utc_applied_at(db2_mode: DriverMode) -> No applied_at = statement.parameters["applied_at"] assert applied_at.tzinfo is None - assert abs(applied_at - datetime.now(timezone.utc).replace(tzinfo=None)) < timedelta(seconds=1) + assert abs(applied_at - datetime.now(UTC).replace(tzinfo=None)) < timedelta(seconds=1) assert statement.parameters["version_num"] == "0001" assert statement.parameters["applied_by"] == "me" @@ -211,7 +211,7 @@ async def test_record_squashed_migration_binds_utc_applied_at(db2_mode: DriverMo applied_at = statement.parameters["applied_at"] assert applied_at.tzinfo is None - assert abs(applied_at - datetime.now(timezone.utc).replace(tzinfo=None)) < timedelta(seconds=1) + assert abs(applied_at - datetime.now(UTC).replace(tzinfo=None)) < timedelta(seconds=1) assert statement.parameters["replaces"] == "0001,0002" diff --git a/tests/unit/adapters/test_duckdb/test_adk_store.py b/tests/unit/adapters/test_duckdb/test_adk_store.py index aa1cc97c0..064d7dac4 100644 --- a/tests/unit/adapters/test_duckdb/test_adk_store.py +++ b/tests/unit/adapters/test_duckdb/test_adk_store.py @@ -2,11 +2,10 @@ """Unit tests for DuckDB ADK store extension configuration.""" from textwrap import dedent -from typing import Any, cast, get_args, get_origin +from typing import Any, NotRequired, Self, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired, Self import sqlspec.adapters.duckdb.adk as duckdb_adk from sqlspec.adapters.duckdb.adk import DuckdbADKMemoryStore, DuckdbADKStore diff --git a/tests/unit/adapters/test_duckdb/test_config.py b/tests/unit/adapters/test_duckdb/test_config.py index f4c5d3a0a..f4b4fc8b3 100644 --- a/tests/unit/adapters/test_duckdb/test_config.py +++ b/tests/unit/adapters/test_duckdb/test_config.py @@ -1,11 +1,10 @@ """DuckDB configuration tests covering statement config builders.""" -from typing import Any, get_type_hints +from typing import Any, NotRequired, get_type_hints from unittest.mock import patch from uuid import UUID import duckdb -from typing_extensions import NotRequired from sqlspec.adapters.duckdb.config import ( DuckDBConfig, diff --git a/tests/unit/adapters/test_mssql_python/test_adk_store.py b/tests/unit/adapters/test_mssql_python/test_adk_store.py index a06106fc9..2288ca35c 100644 --- a/tests/unit/adapters/test_mssql_python/test_adk_store.py +++ b/tests/unit/adapters/test_mssql_python/test_adk_store.py @@ -1,11 +1,11 @@ # pyright: reportPrivateUsage=false """Unit tests for mssql-python ADK store wiring and T-SQL generation.""" -from typing import Any, cast, get_args, get_origin +from datetime import UTC +from typing import Any, NotRequired, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired from sqlspec.adapters.mssql_python.adk import MssqlPythonADKConfig, MssqlPythonADKMemoryStore, MssqlPythonADKStore from sqlspec.config import ADKConfig @@ -270,14 +270,14 @@ def test_sync_store_can_force_fallback_json_from_extension_config() -> None: def test_mssql_python_adk_memory_store_insert_handles_none_metadata_and_missing_author() -> None: """insert_memory_entries binds None for metadata_json=None and missing author.""" - from datetime import datetime, timezone + from datetime import datetime config = _mock_config() conn = config.provide_connection.return_value.__enter__.return_value cursor = conn.cursor.return_value cursor.rowcount = 1 store = MssqlPythonADKMemoryStore(config) - now = datetime.now(tz=timezone.utc) + now = datetime.now(tz=UTC) entry = cast( "Any", { diff --git a/tests/unit/adapters/test_mssql_python/test_litestar_store.py b/tests/unit/adapters/test_mssql_python/test_litestar_store.py index e5926000f..3f35c3060 100644 --- a/tests/unit/adapters/test_mssql_python/test_litestar_store.py +++ b/tests/unit/adapters/test_mssql_python/test_litestar_store.py @@ -1,6 +1,6 @@ """Unit tests for the mssql-python Litestar store.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any, cast from unittest.mock import AsyncMock @@ -154,7 +154,7 @@ async def test_mssql_python_store_set_uses_merge_with_positional_parameters() -> async def test_mssql_python_store_get_renews_unexpired_session() -> None: """get should return bytes and renew expiry only when the existing row had an expiry.""" - future = datetime.now(timezone.utc) + timedelta(minutes=5) + future = datetime.now(UTC) + timedelta(minutes=5) connection = FakeConnection(rows=[{"data": b"payload", "expires_at": future}]) store = MssqlPythonStore(cast("Any", FakeConfig(connection=connection))) diff --git a/tests/unit/adapters/test_mysql_store_errors.py b/tests/unit/adapters/test_mysql_store_errors.py index 3f5e031df..304625c4f 100644 --- a/tests/unit/adapters/test_mysql_store_errors.py +++ b/tests/unit/adapters/test_mysql_store_errors.py @@ -2,7 +2,7 @@ import inspect from collections.abc import Callable -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any from unittest.mock import MagicMock @@ -38,9 +38,9 @@ ("get_session", ("app", "user", "session"), None), ("list_sessions", ("app", "user"), []), ("get_events", ("app", "user", "session"), []), - ("delete_expired_events", (datetime(2026, 1, 1, tzinfo=timezone.utc),), 0), - ("delete_idle_sessions", (datetime(2026, 1, 1, tzinfo=timezone.utc),), 0), - ("delete_idle_user_states", (datetime(2026, 1, 1, tzinfo=timezone.utc),), 0), + ("delete_expired_events", (datetime(2026, 1, 1, tzinfo=UTC),), 0), + ("delete_idle_sessions", (datetime(2026, 1, 1, tzinfo=UTC),), 0), + ("delete_idle_user_states", (datetime(2026, 1, 1, tzinfo=UTC),), 0), ("get_app_state", ("app",), None), ("get_user_state", ("app", "user"), None), ("get_metadata", ("key",), None), diff --git a/tests/unit/adapters/test_mysqlconnector/test_adk_store.py b/tests/unit/adapters/test_mysqlconnector/test_adk_store.py index 82dd3d582..7eb19839f 100644 --- a/tests/unit/adapters/test_mysqlconnector/test_adk_store.py +++ b/tests/unit/adapters/test_mysqlconnector/test_adk_store.py @@ -2,11 +2,11 @@ """Unit tests for mysql-connector ADK store extension configuration.""" import asyncio -from typing import Any, cast, get_args, get_origin +from datetime import UTC +from typing import Any, NotRequired, Self, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired, Self from sqlspec.adapters.mysqlconnector.adk import ( MysqlConnectorADKConfig, @@ -327,9 +327,9 @@ def test_mysqlconnector_sync_list_sessions_rejects_invalid_options(options: "dic def test_mysqlconnector_sync_adk_memory_store_insert_and_search_json_handling() -> None: """MysqlConnectorSyncADKMemoryStore handles missing author, metadata_json=None, and deserializes JSON strings.""" - from datetime import datetime, timezone + from datetime import datetime - now = datetime.now(tz=timezone.utc) + now = datetime.now(tz=UTC) cursor = MagicMock() cursor.rowcount = 1 cursor.description = [ @@ -399,10 +399,10 @@ def test_mysqlconnector_sync_adk_memory_store_insert_and_search_json_handling() async def test_mysqlconnector_async_adk_memory_store_insert_and_search_json_handling() -> None: """MysqlConnectorAsyncADKMemoryStore handles missing author, metadata_json=None, and deserializes JSON strings.""" - from datetime import datetime, timezone + from datetime import datetime from unittest.mock import AsyncMock - now = datetime.now(tz=timezone.utc) + now = datetime.now(tz=UTC) cursor = MagicMock() cursor.rowcount = 1 cursor.execute = AsyncMock() diff --git a/tests/unit/adapters/test_native_error_boundaries.py b/tests/unit/adapters/test_native_error_boundaries.py index 7b15ef77f..2d23ead25 100644 --- a/tests/unit/adapters/test_native_error_boundaries.py +++ b/tests/unit/adapters/test_native_error_boundaries.py @@ -1,7 +1,7 @@ """Driver exception handlers leave application exceptions untouched.""" from collections.abc import Callable -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import Any from unittest.mock import MagicMock @@ -37,9 +37,9 @@ def test_native_error_handler_preserves_application_error(handler_type: type[Bas ("get_session", ("app", "user", "session"), None), ("list_sessions", ("app", "user"), []), ("get_events", ("app", "user", "session"), []), - ("delete_expired_events", (datetime(2026, 1, 1, tzinfo=timezone.utc),), 0), - ("delete_idle_sessions", (datetime(2026, 1, 1, tzinfo=timezone.utc),), 0), - ("delete_idle_user_states", (datetime(2026, 1, 1, tzinfo=timezone.utc),), 0), + ("delete_expired_events", (datetime(2026, 1, 1, tzinfo=UTC),), 0), + ("delete_idle_sessions", (datetime(2026, 1, 1, tzinfo=UTC),), 0), + ("delete_idle_user_states", (datetime(2026, 1, 1, tzinfo=UTC),), 0), ("get_app_state", ("app",), None), ("get_user_state", ("app", "user"), None), ("get_metadata", ("key",), None), diff --git a/tests/unit/adapters/test_oracledb/test_config.py b/tests/unit/adapters/test_oracledb/test_config.py index f98acde0c..d357c73db 100644 --- a/tests/unit/adapters/test_oracledb/test_config.py +++ b/tests/unit/adapters/test_oracledb/test_config.py @@ -3,12 +3,11 @@ from collections.abc import Awaitable, Callable from inspect import isawaitable from ssl import TLSVersion -from typing import Any, cast, get_args, get_origin, get_type_hints +from typing import Any, NotRequired, cast, get_args, get_origin, get_type_hints from unittest.mock import AsyncMock, Mock, call import pytest from oracledb import AuthMode, PoolGetMode, Purity -from typing_extensions import NotRequired from sqlspec.adapters.oracledb import build_connection_config from sqlspec.adapters.oracledb import config as oracle_config_module diff --git a/tests/unit/adapters/test_oracledb/test_litestar_store.py b/tests/unit/adapters/test_oracledb/test_litestar_store.py index 9f97d52d5..11f6f0530 100644 --- a/tests/unit/adapters/test_oracledb/test_litestar_store.py +++ b/tests/unit/adapters/test_oracledb/test_litestar_store.py @@ -1,9 +1,7 @@ """Unit tests for Oracle Litestar session store behavior.""" -from datetime import datetime, timedelta, timezone -from typing import Any, cast - -from typing_extensions import Self +from datetime import UTC, datetime, timedelta +from typing import Any, Self, cast from sqlspec.adapters.oracledb.core import DB_TYPE_BLOB from sqlspec.adapters.oracledb.data_dictionary import OracleVersionCache @@ -105,7 +103,7 @@ def test_oracle_sync_store_set_calculates_expiry_from_database_clock() -> None: def test_oracle_sync_store_expires_in_uses_database_clock() -> None: """expires_in should compare expires_at to Oracle's SYSTIMESTAMP value.""" - db_now = datetime(2026, 1, 1, tzinfo=timezone.utc) + db_now = datetime(2026, 1, 1, tzinfo=UTC) expires_at = db_now + timedelta(seconds=5) cursor = _FakeCursor(rows=[(expires_at, db_now)]) connection = _FakeConnection(cursor) diff --git a/tests/unit/adapters/test_oracledb/test_oracle_adk_store.py b/tests/unit/adapters/test_oracledb/test_oracle_adk_store.py index e84e3618a..d527a7eb0 100644 --- a/tests/unit/adapters/test_oracledb/test_oracle_adk_store.py +++ b/tests/unit/adapters/test_oracledb/test_oracle_adk_store.py @@ -1,13 +1,12 @@ # pyright: reportPrivateUsage=false """Tests for Oracle ADK store behavior.""" -from datetime import datetime, timezone +from datetime import UTC, datetime from decimal import Decimal -from typing import Any, cast, get_args, get_origin +from typing import Any, NotRequired, Self, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired, Self from sqlspec.adapters.oracledb.adk import ( JSONStorageType, @@ -235,7 +234,7 @@ def test_oracle_adk_sync_memory_table_uses_same_lifecycle_clauses() -> None: async def test_oracle_async_adk_memory_rows_to_records_deserializes_json_fields() -> None: store = OracleAsyncADKMemoryStore.__new__(OracleAsyncADKMemoryStore) # type: ignore[call-arg] store._config = _config_for_storage(JSONStorageType.BLOB_JSON) - timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) row = ( "memory-1", "session-1", @@ -275,7 +274,7 @@ async def test_oracle_async_adk_memory_rows_to_records_deserializes_json_fields( def test_oracle_sync_adk_memory_rows_to_records_deserializes_json_fields() -> None: store = OracleSyncADKMemoryStore.__new__(OracleSyncADKMemoryStore) # type: ignore[call-arg] store._config = _config_for_storage(JSONStorageType.BLOB_JSON) - timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 5, 10, 12, 0, tzinfo=UTC) row = ( "memory-2", "session-2", diff --git a/tests/unit/adapters/test_psqlpy/test_adk_store.py b/tests/unit/adapters/test_psqlpy/test_adk_store.py index 14058b25d..a10f9ae74 100644 --- a/tests/unit/adapters/test_psqlpy/test_adk_store.py +++ b/tests/unit/adapters/test_psqlpy/test_adk_store.py @@ -1,11 +1,10 @@ # pyright: reportPrivateUsage=false """Unit tests for psqlpy ADK store extension configuration.""" -from typing import Any, cast, get_args, get_origin +from typing import Any, NotRequired, Self, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired, Self from sqlspec.adapters.psqlpy.adk import PsqlpyADKConfig, PsqlpyADKStore from sqlspec.config import ADKConfig diff --git a/tests/unit/adapters/test_psycopg/test_adk_store.py b/tests/unit/adapters/test_psycopg/test_adk_store.py index 693518c1a..d07ecdf90 100644 --- a/tests/unit/adapters/test_psycopg/test_adk_store.py +++ b/tests/unit/adapters/test_psycopg/test_adk_store.py @@ -1,12 +1,11 @@ """Unit tests for psycopg ADK store sync wrappers.""" -from datetime import datetime, timezone -from typing import Any, cast +from datetime import UTC, datetime +from typing import Any, Self, cast from unittest.mock import MagicMock import pytest from psycopg.types.json import Jsonb -from typing_extensions import Self from sqlspec.adapters.psycopg.adk import ( PsycopgADKConfig, @@ -205,7 +204,7 @@ def test_sync_append_event_inserts_without_session_update() -> None: "user_id": "user", "session_id": "session-1", "invocation_id": "", - "timestamp": datetime.now(timezone.utc), + "timestamp": datetime.now(UTC), "event_data": {"id": "event-1"}, } @@ -239,12 +238,12 @@ def test_psycopg_sync_memory_insert_binds_embedding_with_portable_cast( "scope": "user", "event_id": "event-1", "author": "user", - "timestamp": datetime.now(timezone.utc), + "timestamp": datetime.now(UTC), "embedding": embedding, "content_json": {"text": "hello"}, "content_text": "hello", "metadata_json": None, - "inserted_at": datetime.now(timezone.utc), + "inserted_at": datetime.now(UTC), } assert store.insert_memory_entries([cast("Any", entry)], owner_id="tenant-1") == 1 @@ -270,12 +269,12 @@ async def test_psycopg_async_memory_insert_binds_embedding_with_portable_cast(ow "scope": "user", "event_id": "event-1", "author": "user", - "timestamp": datetime.now(timezone.utc), + "timestamp": datetime.now(UTC), "embedding": [0.1, 0.2], "content_json": {"text": "hello"}, "content_text": "hello", "metadata_json": None, - "inserted_at": datetime.now(timezone.utc), + "inserted_at": datetime.now(UTC), } assert await store.insert_memory_entries([cast("Any", entry)], owner_id="tenant-1") == 1 @@ -314,7 +313,7 @@ def test_psycopg_sync_memory_search_casts_vector_operands(enable_bm25: bool, que def test_sync_get_events_passes_after_timestamp_and_limit() -> None: """get_events must forward after_timestamp and limit to the sync query.""" - base_time = datetime(2026, 1, 1, tzinfo=timezone.utc) + base_time = datetime(2026, 1, 1, tzinfo=UTC) rows = [ { "session_id": "session-1", @@ -348,7 +347,7 @@ def test_sync_get_events_limit_zero_returns_empty_without_query() -> None: def test_sync_append_event_and_update_state_writes_scoped_state_in_one_unit() -> None: """append_event_and_update_state must use event_data and optional scoped state.""" - base_time = datetime(2026, 1, 1, tzinfo=timezone.utc) + base_time = datetime(2026, 1, 1, tzinfo=UTC) rows = [ { "id": "session-1", diff --git a/tests/unit/adapters/test_pymssql/test_adk_store.py b/tests/unit/adapters/test_pymssql/test_adk_store.py index cafdc9e87..a83e81b2e 100644 --- a/tests/unit/adapters/test_pymssql/test_adk_store.py +++ b/tests/unit/adapters/test_pymssql/test_adk_store.py @@ -1,6 +1,7 @@ # pyright: reportPrivateUsage=false """Unit tests for pymssql ADK store session listing.""" +from datetime import UTC from typing import Any from unittest.mock import MagicMock @@ -101,7 +102,7 @@ def test_pymssql_list_sessions_rejects_invalid_options( def test_pymssql_adk_memory_store_insert_handles_none_metadata_and_missing_author() -> None: """PymssqlADKMemoryStore binds None for metadata_json=None and missing author.""" - from datetime import datetime, timezone + from datetime import datetime from typing import cast from sqlspec.adapters.pymssql.adk import PymssqlADKMemoryStore @@ -111,7 +112,7 @@ def test_pymssql_adk_memory_store_insert_handles_none_metadata_and_missing_autho cursor = conn.cursor.return_value cursor.rowcount = 1 store = PymssqlADKMemoryStore(config) - now = datetime.now(tz=timezone.utc) + now = datetime.now(tz=UTC) entry = cast( "Any", { diff --git a/tests/unit/adapters/test_pymysql/test_adk_store.py b/tests/unit/adapters/test_pymysql/test_adk_store.py index c952e77ea..76b3f2732 100644 --- a/tests/unit/adapters/test_pymysql/test_adk_store.py +++ b/tests/unit/adapters/test_pymysql/test_adk_store.py @@ -1,11 +1,11 @@ # pyright: reportPrivateUsage=false """Unit tests for PyMySQL ADK store extension configuration.""" -from typing import Any, cast, get_args, get_origin +from datetime import UTC +from typing import Any, NotRequired, Self, cast, get_args, get_origin from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired, Self from sqlspec.adapters.pymysql.adk import PyMysqlADKConfig, PyMysqlADKMemoryStore, PyMysqlADKStore from sqlspec.config import ADKConfig @@ -215,11 +215,11 @@ def test_pymysql_list_sessions_rejects_invalid_options(options: "dict[str, Any]" def test_pymysql_adk_memory_store_insert_and_search_json_handling() -> None: """PyMysqlADKMemoryStore handles missing author, metadata_json=None, and deserializes JSON strings.""" - from datetime import datetime, timezone + from datetime import datetime cursor = MagicMock() cursor.rowcount = 1 - now = datetime.now(tz=timezone.utc) + now = datetime.now(tz=UTC) cursor.description = [ ("id",), ("session_id",), diff --git a/tests/unit/adapters/test_pymysql/test_config.py b/tests/unit/adapters/test_pymysql/test_config.py index 1cde06fc6..ebd94990a 100644 --- a/tests/unit/adapters/test_pymysql/test_config.py +++ b/tests/unit/adapters/test_pymysql/test_config.py @@ -3,11 +3,10 @@ import ssl import threading from collections.abc import Mapping -from typing import get_args, get_origin, get_type_hints +from typing import NotRequired, get_args, get_origin, get_type_hints from unittest.mock import MagicMock import pytest -from typing_extensions import NotRequired from sqlspec.adapters.pymysql._typing import PyMysqlMySQLError from sqlspec.adapters.pymysql.config import PyMysqlConfig, PyMysqlConnectionParams, build_connection_config diff --git a/tests/unit/adapters/test_spanner/test_async_driver.py b/tests/unit/adapters/test_spanner/test_async_driver.py index bbba946d1..d14c15c93 100644 --- a/tests/unit/adapters/test_spanner/test_async_driver.py +++ b/tests/unit/adapters/test_spanner/test_async_driver.py @@ -2,7 +2,7 @@ from collections.abc import AsyncGenerator from types import SimpleNamespace -from typing import Any, cast +from typing import Any, Self, cast from unittest.mock import AsyncMock, MagicMock import pyarrow as pa @@ -10,7 +10,6 @@ from google.api_core import exceptions as api_exceptions from google.cloud.spanner_v1.data_types import JsonObject from google.cloud.spanner_v1.types.type import TypeCode -from typing_extensions import Self import sqlspec.adapters.spanner.driver as spanner_driver_module from sqlspec.adapters.spanner.core import SpannerAsyncStreamSource, default_statement_config, resolve_row_plan diff --git a/tests/unit/adapters/test_spanner/test_batch_write_api.py b/tests/unit/adapters/test_spanner/test_batch_write_api.py index 9dca5a161..01dc9bdc9 100644 --- a/tests/unit/adapters/test_spanner/test_batch_write_api.py +++ b/tests/unit/adapters/test_spanner/test_batch_write_api.py @@ -1,10 +1,9 @@ """Spanner opt-in Batch Write API transport for load_from_arrow.""" -from typing import Any, cast +from typing import Any, Self, cast import pyarrow as pa import pytest -from typing_extensions import Self import sqlspec.adapters.spanner.driver as spanner_driver from sqlspec.adapters.spanner.driver import SpannerSyncDriver diff --git a/tests/unit/adapters/test_spanner/test_config.py b/tests/unit/adapters/test_spanner/test_config.py index bf3f56b50..c545be198 100644 --- a/tests/unit/adapters/test_spanner/test_config.py +++ b/tests/unit/adapters/test_spanner/test_config.py @@ -1,6 +1,6 @@ from datetime import timedelta from types import SimpleNamespace -from typing import TYPE_CHECKING, Any, cast +from typing import TYPE_CHECKING, Any, Self, cast from unittest.mock import AsyncMock import pytest @@ -17,7 +17,6 @@ PingingPool, TransactionPingingPool, ) -from typing_extensions import Self import sqlspec.adapters.spanner.config as spanner_config from sqlspec.adapters.spanner.config import ( diff --git a/tests/unit/adapters/test_spanner/test_litestar_store.py b/tests/unit/adapters/test_spanner/test_litestar_store.py index a68e4d1df..5ee45e82b 100644 --- a/tests/unit/adapters/test_spanner/test_litestar_store.py +++ b/tests/unit/adapters/test_spanner/test_litestar_store.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any from unittest.mock import AsyncMock, MagicMock, patch @@ -191,7 +191,7 @@ async def test_async_store_set_delete_delete_all_delete_expired() -> None: async def test_async_store_get_exists_expires_in() -> None: """Verify SpannerAsyncStore read operations use async provide_session and optional renewal.""" db = _mock_async_database() - future_time = datetime.now(timezone.utc) + timedelta(seconds=120) + future_time = datetime.now(UTC) + timedelta(seconds=120) driver = MagicMock() driver.select_one_or_none = AsyncMock(return_value={"data": bytes_to_spanner(b"abc"), "expires_at": future_time}) diff --git a/tests/unit/adapters/test_spanner/test_session_controls.py b/tests/unit/adapters/test_spanner/test_session_controls.py index 748a83308..26c915e6b 100644 --- a/tests/unit/adapters/test_spanner/test_session_controls.py +++ b/tests/unit/adapters/test_spanner/test_session_controls.py @@ -1,10 +1,9 @@ """Unit tests for Spanner session-control behavior.""" from types import SimpleNamespace -from typing import Any, cast +from typing import Any, Self, cast import pytest -from typing_extensions import Self import sqlspec.adapters.spanner.config as spanner_config from sqlspec.adapters.spanner.config import SpannerSyncConfig diff --git a/tests/unit/adapters/test_spanner/test_type_converter.py b/tests/unit/adapters/test_spanner/test_type_converter.py index 44e3f23a5..73e951480 100644 --- a/tests/unit/adapters/test_spanner/test_type_converter.py +++ b/tests/unit/adapters/test_spanner/test_type_converter.py @@ -1,5 +1,5 @@ import base64 -from datetime import date, datetime, timezone +from datetime import UTC, date, datetime from decimal import Decimal from typing import Any, cast from uuid import UUID @@ -31,7 +31,7 @@ def test_spanner_json_uses_native_json_object() -> None: def test_coerce_params_unwraps_typed_datetime_parameter() -> None: - timestamp = datetime(2026, 7, 4, 22, 9, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 7, 4, 22, 9, 0, tzinfo=UTC) params = {"available_at": TypedParameter(timestamp, datetime)} coerced = coerce_params_for_spanner(params) @@ -40,7 +40,7 @@ def test_coerce_params_unwraps_typed_datetime_parameter() -> None: def test_coerce_params_preserves_driver_ready_parameters() -> None: - timestamp = datetime(2026, 7, 4, 22, 9, 0, tzinfo=timezone.utc) + timestamp = datetime(2026, 7, 4, 22, 9, 0, tzinfo=UTC) array = ["alpha", "beta"] payload = cast("Any", JsonObject)({"key": "value"}) params = { @@ -74,7 +74,7 @@ def test_coerce_params_copies_only_when_values_require_conversion() -> None: utils_uuid = uuid_utils.UUID(str(stdlib_uuid)) binary = b"binary" naive_timestamp = datetime(2026, 7, 4, 22, 9, 0) - typed_timestamp = datetime(2026, 7, 5, 22, 9, 0, tzinfo=timezone.utc) + typed_timestamp = datetime(2026, 7, 5, 22, 9, 0, tzinfo=UTC) plain_array = ["alpha", "beta"] params = { "stdlib_uuid": stdlib_uuid, @@ -95,7 +95,7 @@ def test_coerce_params_copies_only_when_values_require_conversion() -> None: assert coerced["stdlib_uuid"] == str(stdlib_uuid) assert coerced["utils_uuid"] == str(stdlib_uuid) assert coerced["binary"] == base64.b64encode(binary) - assert coerced["naive_timestamp"] == naive_timestamp.replace(tzinfo=timezone.utc) + assert coerced["naive_timestamp"] == naive_timestamp.replace(tzinfo=UTC) assert coerced["typed_timestamp"] is typed_timestamp assert isinstance(coerced["payload"], JsonObject) assert coerced["payload"] == {"key": "value"} diff --git a/tests/unit/adapters/test_sqlite/test_adk_config.py b/tests/unit/adapters/test_sqlite/test_adk_config.py index 7ba4ea4cf..22c846449 100644 --- a/tests/unit/adapters/test_sqlite/test_adk_config.py +++ b/tests/unit/adapters/test_sqlite/test_adk_config.py @@ -1,10 +1,9 @@ """SQLite ADK adapter-local configuration tests.""" -from typing import Any, get_type_hints +from typing import Any, Self, get_type_hints from unittest.mock import MagicMock import pytest -from typing_extensions import Self from sqlspec.adapters.sqlite.adk import SqliteADKConfig, SqliteADKMemoryStore, SqliteADKStore from sqlspec.adapters.sqlite.config import SqliteConfig From 7ff7bed8abcc64b7d0c9b80c86aa04add4a7d5dc Mon Sep 17 00:00:00 2001 From: Cody Fincher Date: Fri, 9 Oct 2026 01:45:12 +0000 Subject: [PATCH 5/8] ci(workflows): update CI and wheel matrices to Python 3.11-3.15 --- .github/workflows/ci.yml | 4 ++-- .github/workflows/publish.yml | 6 +++--- .github/workflows/test-build.yml | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c4b66fd57..a43302888 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -163,7 +163,7 @@ jobs: # checks before spending runner minutes on wheel matrices. fail-fast: true matrix: - python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"] timeout-minutes: 15 steps: - name: Check out repository @@ -253,7 +253,7 @@ jobs: strategy: fail-fast: true matrix: - python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"] timeout-minutes: 60 steps: - name: Check out repository diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5c823f5a0..c76abc461 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -74,7 +74,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest] - python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"] steps: - name: Check out repository uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -116,7 +116,7 @@ jobs: - name: Build wheels with cibuildwheel run: python -m cibuildwheel --output-dir wheelhouse env: - CIBW_BUILD: "cp${{ matrix.python-version == '3.10' && '310' || matrix.python-version == '3.11' && '311' || matrix.python-version == '3.12' && '312' || matrix.python-version == '3.13' && '313' || matrix.python-version == '3.14' && '314' }}-*" + CIBW_BUILD: "cp${{ matrix.python-version == '3.11' && '311' || matrix.python-version == '3.12' && '312' || matrix.python-version == '3.13' && '313' || matrix.python-version == '3.14' && '314' || matrix.python-version == '3.15' && '315' }}-*" CIBW_BUILD_VERBOSITY: 1 # Native host arch only — Linux aarch64 builds on ubuntu-24.04-arm, @@ -191,7 +191,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, macos-latest] - python-version: ["3.10", "3.12", "3.14"] + python-version: ["3.11", "3.13", "3.15"] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 92b973002..8e366aa16 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -17,11 +17,11 @@ on: default: '3.12' type: choice options: - - '3.10' - '3.11' - '3.12' - '3.13' - '3.14' + - '3.15' pull_request: paths: - '.github/workflows/test-build.yml' @@ -105,11 +105,11 @@ jobs: REPOSITORY: ${{ github.repository }} REQUIRED_CHECKS: | quality - test-unit (3.10) test-unit (3.11) test-unit (3.12) test-unit (3.13) test-unit (3.14) + test-unit (3.15) shell: bash run: | set -euo pipefail @@ -299,7 +299,7 @@ jobs: - name: Build wheels with cibuildwheel run: python -m cibuildwheel --output-dir wheelhouse env: - CIBW_BUILD: "cp${{ matrix.python-version == '3.10' && '310' || matrix.python-version == '3.11' && '311' || matrix.python-version == '3.12' && '312' || matrix.python-version == '3.13' && '313' || matrix.python-version == '3.14' && '314' }}-*" + CIBW_BUILD: "cp${{ matrix.python-version == '3.11' && '311' || matrix.python-version == '3.12' && '312' || matrix.python-version == '3.13' && '313' || matrix.python-version == '3.14' && '314' || matrix.python-version == '3.15' && '315' }}-*" CIBW_BUILD_VERBOSITY: 1 # PR validation builds host arch only — release covers full cross-arch matrix. From 4b745ed9e26abc44b5f6de0da7a4f0fe740e9a3a Mon Sep 17 00:00:00 2001 From: Cody Fincher Date: Fri, 9 Oct 2026 01:50:08 +0000 Subject: [PATCH 6/8] docs: update Python baseline to 3.11+ and MyPyC wheel matrix to 3.11-3.15 --- docs/releases.rst | 2 +- docs/usage/frameworks/litestar/installation.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releases.rst b/docs/releases.rst index 285c8ce11..4662ded47 100644 --- a/docs/releases.rst +++ b/docs/releases.rst @@ -78,7 +78,7 @@ CI/CD Publishing Pipeline When a GitHub Release is published, ``.github/workflows/publish.yml`` automatically executes: 1. **Standard Distributions**: Builds standard source distribution (``sdist``) and pure Python wheel packages. -2. **Compiled Mypyc Wheels**: Compiles high-performance C-extensions via `hatch-mypyc` across a matrix of operating systems (Linux, macOS, Windows) and Python versions (3.10 through 3.14). +2. **Compiled Mypyc Wheels**: Compiles high-performance C-extensions via `hatch-mypyc` across a matrix of operating systems (Linux, macOS, Windows) and Python versions (3.11 through 3.15). 3. **Profile-Guided Optimization (PGO)**: Compiles Linux binary wheels using execution profile data (GCC) to optimize critical statement translation and dispatch paths. macOS and Windows use standard mypyc C-extension compilation. 4. **Smoke Testing**: Validates binary wheel imports across supported architectures before publishing to `PyPI `_. diff --git a/docs/usage/frameworks/litestar/installation.rst b/docs/usage/frameworks/litestar/installation.rst index 78b5b1dc0..bbcd9b802 100644 --- a/docs/usage/frameworks/litestar/installation.rst +++ b/docs/usage/frameworks/litestar/installation.rst @@ -121,7 +121,7 @@ Install SQLSpec with the Litestar extra and a database adapter. Requirements ------------ -- **Python 3.10+** +- **Python 3.11+** - **Litestar 2.23+** - A compatible database adapter (async recommended for web request concurrency) From dcce172a7736748542d8a2f0f9cff0b068c2f27f Mon Sep 17 00:00:00 2001 From: Cody Fincher Date: Fri, 9 Oct 2026 15:05:59 +0000 Subject: [PATCH 7/8] ci(workflows): allow Python 3.15 failures and retain 3.14 in release smoke tests --- .github/workflows/ci.yml | 14 ++++++-------- .github/workflows/publish.yml | 4 +++- .github/workflows/test-build.yml | 7 ++++--- docs/releases.rst | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a43302888..86c98777d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -155,13 +155,9 @@ jobs: needs: [ci-scope] if: needs.ci-scope.outputs.ci_required == 'true' runs-on: ubuntu-latest + continue-on-error: ${{ matrix.python-version == '3.15' }} strategy: - # fail-fast: true — matrix dimension is Python version only. - # sqlspec failures are typically version-agnostic library bugs, so the - # other 4 jobs running to completion after one fails wastes ~60 min of - # billed runner time. test-build.yml gates package builds behind these - # checks before spending runner minutes on wheel matrices. - fail-fast: true + fail-fast: false matrix: python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"] timeout-minutes: 15 @@ -195,6 +191,7 @@ jobs: run: uv sync --all-extras --dev - name: Test + id: pytest # covdefaults sets fail_under=100 globally; the per-tier run only # covers a slice of sqlspec, so override to 0 here. The combined # view in Codecov is the source of truth. @@ -205,7 +202,7 @@ jobs: --cov-fail-under=0 - name: Upload coverage to Codecov - if: always() + if: always() && steps.pytest.outcome != 'skipped' uses: codecov/codecov-action@0b35c9ecc4f0529d0eb674914510c22f85b196b4 # v7.1.0 with: files: coverage-unit.xml @@ -250,8 +247,9 @@ jobs: needs: [ci-scope, test-unit] if: needs.ci-scope.outputs.ci_required == 'true' runs-on: ubuntu-24.04 + continue-on-error: ${{ matrix.python-version == '3.15' }} strategy: - fail-fast: true + fail-fast: false matrix: python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"] timeout-minutes: 60 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c76abc461..43ceab693 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -70,6 +70,7 @@ jobs: build-wheels-mypyc: name: Build MyPyC wheels (${{ matrix.os }} py${{ matrix.python-version }}) runs-on: ${{ matrix.os }} + continue-on-error: ${{ matrix.python-version == '3.15' }} strategy: fail-fast: false matrix: @@ -187,11 +188,12 @@ jobs: test-wheels: name: Test ${{ matrix.os }} py${{ matrix.python-version }} needs: [build-wheels-standard, build-wheels-mypyc] + continue-on-error: ${{ matrix.python-version == '3.15' }} strategy: fail-fast: false matrix: os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, macos-latest] - python-version: ["3.11", "3.13", "3.15"] + python-version: ["3.11", "3.13", "3.14", "3.15"] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 8e366aa16..d590fcc45 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -109,7 +109,6 @@ jobs: test-unit (3.12) test-unit (3.13) test-unit (3.14) - test-unit (3.15) shell: bash run: | set -euo pipefail @@ -231,8 +230,9 @@ jobs: name: Build MyPyC wheels (${{ matrix.os }} py${{ matrix.python-version }}) runs-on: ${{ matrix.os }} needs: [detect-mode, wait-for-cheap-ci] + continue-on-error: ${{ matrix.python-version == '3.15' }} strategy: - fail-fast: true + fail-fast: false matrix: os: ${{ needs.detect-mode.outputs.matrix_mode == 'full' && fromJSON('["ubuntu-latest", "macos-latest", "windows-latest"]') || fromJSON('["ubuntu-latest"]') }} python-version: @@ -358,8 +358,9 @@ jobs: test-wheels: name: Test ${{ matrix.os }} py${{ matrix.python-version }} needs: [build-wheels-standard, build-wheels-mypyc, detect-mode] + continue-on-error: ${{ matrix.python-version == '3.15' }} strategy: - fail-fast: true + fail-fast: false matrix: os: ${{ needs.detect-mode.outputs.matrix_mode == 'full' && fromJSON('["ubuntu-latest", "windows-latest", "macos-latest"]') || fromJSON('["ubuntu-latest"]') }} python-version: diff --git a/docs/releases.rst b/docs/releases.rst index 4662ded47..2c20e8255 100644 --- a/docs/releases.rst +++ b/docs/releases.rst @@ -78,7 +78,7 @@ CI/CD Publishing Pipeline When a GitHub Release is published, ``.github/workflows/publish.yml`` automatically executes: 1. **Standard Distributions**: Builds standard source distribution (``sdist``) and pure Python wheel packages. -2. **Compiled Mypyc Wheels**: Compiles high-performance C-extensions via `hatch-mypyc` across a matrix of operating systems (Linux, macOS, Windows) and Python versions (3.11 through 3.15). +2. **Compiled Mypyc Wheels**: Compiles high-performance C-extensions via `hatch-mypyc` across a matrix of operating systems (Linux, macOS, Windows) and Python versions (3.11 through 3.14, with experimental 3.15 builds). 3. **Profile-Guided Optimization (PGO)**: Compiles Linux binary wheels using execution profile data (GCC) to optimize critical statement translation and dispatch paths. macOS and Windows use standard mypyc C-extension compilation. 4. **Smoke Testing**: Validates binary wheel imports across supported architectures before publishing to `PyPI `_. From 4b67e83175478231a192d115152c362a3437b546 Mon Sep 17 00:00:00 2001 From: Cody Fincher Date: Fri, 9 Oct 2026 17:41:40 +0000 Subject: [PATCH 8/8] ci(workflows): add step-level continue-on-error and mssql-python fallback on Python 3.15 --- .github/workflows/ci.yml | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 86c98777d..ca30518b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -185,13 +185,22 @@ jobs: venv-unit-${{ runner.os }}-py${{ matrix.python-version }}- - name: Install dependencies + id: install-deps + continue-on-error: ${{ matrix.python-version == '3.15' }} # tests/unit/ imports every adapter module, so the install set is # the same as integration. Speed comes from skipping Docker # pre-pull and running only tests/unit/, not from a lighter sync. - run: uv sync --all-extras --dev + run: | + if [ "${{ matrix.python-version }}" = "3.15" ]; then + uv sync --all-extras --dev || uv sync --all-extras --no-extra mssql-python --dev + else + uv sync --all-extras --dev + fi - name: Test id: pytest + if: steps.install-deps.outcome == 'success' + continue-on-error: ${{ matrix.python-version == '3.15' }} # covdefaults sets fail_under=100 globally; the per-tier run only # covers a slice of sqlspec, so override to 0 here. The combined # view in Codecov is the source of truth. @@ -202,7 +211,7 @@ jobs: --cov-fail-under=0 - name: Upload coverage to Codecov - if: always() && steps.pytest.outcome != 'skipped' + if: always() && steps.pytest.outcome == 'success' uses: codecov/codecov-action@0b35c9ecc4f0529d0eb674914510c22f85b196b4 # v7.1.0 with: files: coverage-unit.xml @@ -277,9 +286,17 @@ jobs: venv-integration-${{ runner.os }}-py${{ matrix.python-version }}- - name: Install dependencies - run: uv sync --all-extras --dev + id: install-deps + continue-on-error: ${{ matrix.python-version == '3.15' }} + run: | + if [ "${{ matrix.python-version }}" = "3.15" ]; then + uv sync --all-extras --dev || uv sync --all-extras --no-extra mssql-python --dev + else + uv sync --all-extras --dev + fi - name: Free runner disk before docker work + if: steps.install-deps.outcome == 'success' run: | set -eu df -h / @@ -303,6 +320,7 @@ jobs: df -h / - name: Install SQL Server ODBC driver + if: steps.install-deps.outcome == 'success' run: | set -eu key_url="https://packages.microsoft.com/keys/microsoft.asc" @@ -337,19 +355,20 @@ jobs: - name: Cache docker images id: docker-image-cache + if: steps.install-deps.outcome == 'success' uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: /tmp/docker-images key: docker-images-v2-${{ hashFiles('.github/workflows/ci.yml') }} - name: Load cached docker images - if: steps.docker-image-cache.outputs.cache-hit == 'true' + if: steps.install-deps.outcome == 'success' && steps.docker-image-cache.outputs.cache-hit == 'true' run: | docker load -i /tmp/docker-images/sqlspec-test-images.tar rm -f /tmp/docker-images/sqlspec-test-images.tar - name: Pre-pull docker images - if: steps.docker-image-cache.outputs.cache-hit != 'true' + if: steps.install-deps.outcome == 'success' && steps.docker-image-cache.outputs.cache-hit != 'true' run: | set -eu images=( @@ -384,6 +403,8 @@ jobs: - name: Test id: pytest + if: steps.install-deps.outcome == 'success' + continue-on-error: ${{ matrix.python-version == '3.15' }} env: PYTHONFAULTHANDLER: "1" PYTEST_ADDOPTS: "--max-worker-restart=0" @@ -444,7 +465,7 @@ jobs: exit $rc - name: Upload coverage to Codecov - if: always() && steps.pytest.outcome != 'skipped' + if: always() && steps.pytest.outcome == 'success' uses: codecov/codecov-action@0b35c9ecc4f0529d0eb674914510c22f85b196b4 # v7.1.0 with: files: coverage-integration.xml