diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b142cbb40..eb36b74a1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -248,8 +248,26 @@ jobs: if-no-files-found: error include-hidden-files: true + test-windows-accel: + runs-on: windows-latest + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: "3.14" + - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b + - name: Install accel extra + run: uv sync --frozen --extra accel --group test + - name: Verify ciso8601 acceleration + run: | + uv run --frozen python -c "import ciso8601; import tortoise.timezone as tz; assert tz.parse_datetime is ciso8601.parse_datetime" + - name: Test parser compatibility + run: | + uv pip uninstall ciso8601 + uv run --no-sync pytest -n auto --cov=tortoise --cov-append --cov-branch --tb=native -q tests/fields/test_time.py + coverage: - needs: [test-sqlite, test-postgres, test-mysql, test-mssql] + needs: [test-sqlite, test-postgres, test-mysql, test-mssql, test-windows-accel] runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v6 diff --git a/pyproject.toml b/pyproject.toml index 69b8ba3b8..80c9ecb9a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,6 @@ dynamic = ["version"] requires-python = ">=3.10" dependencies = [ "pypika-tortoise (>=0.6.5,<1.0.0)", - "iso8601 (>=2.1.0,<3.0.0); python_version < '4.0'", "aiosqlite (>=0.16.0,<1.0.0)", "anyio", "tomlkit (>=0.11.4,<1.0.0); python_version < '3.11'", @@ -46,7 +45,7 @@ ptpython = [ "ptpython>=3.0.0", ] accel = [ - "ciso8601; sys_platform != 'win32' and implementation_name == 'cpython'", + "ciso8601; implementation_name == 'cpython'", "uvloop; sys_platform != 'win32' and implementation_name == 'cpython'", "orjson", ] diff --git a/tests/fields/test_time.py b/tests/fields/test_time.py index 438decf2a..44e66cb0b 100644 --- a/tests/fields/test_time.py +++ b/tests/fields/test_time.py @@ -7,7 +7,6 @@ from zoneinfo import ZoneInfoNotFoundError import pytest -from iso8601 import ParseError from tests import testmodels from tortoise import fields, timezone @@ -673,7 +672,7 @@ async def test_date_str(db): obj0 = await model.create(date="2020-08-17") obj1 = await model.get(date="2020-08-17") assert obj0.date == obj1.date - with pytest.raises((ParseError, ValueError)): + with pytest.raises(ValueError): await model.create(date="2020-08-xx") await model.filter(date="2020-08-17").update(date="2020-08-18") obj2 = await model.get(date="2020-08-18") @@ -758,6 +757,45 @@ def test_zoneinfo(): parse_timezone("Invalid/Zonename") +def test_parse_datetime_fallback(): + assert timezone._parse_datetime("2020-08-17") == datetime(2020, 8, 17) + assert timezone._parse_datetime("2020-08-17T00:00:00Z") == datetime(2020, 8, 17, tzinfo=UTC) + assert timezone._parse_datetime("2020-230T12:34:56Z") == datetime( + 2020, 8, 17, 12, 34, 56, tzinfo=UTC + ) + assert timezone._parse_datetime("2020-230t12:34:56") == datetime(2020, 8, 17, 12, 34, 56) + assert timezone._parse_datetime("2020230T123456") == datetime(2020, 8, 17, 12, 34, 56) + + +@pytest.mark.parametrize( + "value", + [ + "2020-08-17", + "20200817", + "2020-08-17T12:34:56", + "2020-08-17t12:34:56", + "2020-08-17 12:34:56", + "20200817T123456", + "2020-08-17T12:34:56Z", + "2020-08-17T12:34:56z", + "2020-08-17T12:34:56+08", + "2020-08-17T12:34:56+0800", + "2020-08-17T12:34:56+08:00", + "2020-W34-1", + "2020W341", + "2020-230", + "2020230", + "2020-230T12:34:56", + "2020-230t12:34:56", + "2020230T123456", + ], +) +def test_parse_datetime_fallback_matches_ciso8601(value): + ciso8601 = pytest.importorskip("ciso8601") + + assert timezone._parse_datetime(value) == ciso8601.parse_datetime(value) + + def test_timezone(tz_env): os.environ["USE_TZ"] = "True" timezone._reset_timezone_cache() diff --git a/tortoise/backends/oracle/client.py b/tortoise/backends/oracle/client.py index 4846751b8..372859ab6 100644 --- a/tortoise/backends/oracle/client.py +++ b/tortoise/backends/oracle/client.py @@ -1,17 +1,9 @@ from __future__ import annotations import datetime -import functools from typing import TYPE_CHECKING, Any, SupportsInt, cast import pyodbc - -try: - from ciso8601 import parse_datetime -except ImportError: # pragma: nocoverage - from iso8601 import parse_date - - parse_datetime = functools.partial(parse_date, default_timezone=None) from pypika_tortoise import OracleQuery from tortoise.backends.base.client import ( @@ -28,7 +20,7 @@ ) from tortoise.backends.oracle.executor import OracleExecutor from tortoise.backends.oracle.schema_generator import OracleSchemaGenerator -from tortoise.timezone import UTC, get_use_tz +from tortoise.timezone import UTC, get_use_tz, parse_datetime if TYPE_CHECKING: # pragma: nocoverage import asyncodbc # pylint: disable=W0611 diff --git a/tortoise/fields/data.py b/tortoise/fields/data.py index 6109d0022..ffadc29ae 100644 --- a/tortoise/fields/data.py +++ b/tortoise/fields/data.py @@ -18,16 +18,15 @@ from tortoise import timezone from tortoise.exceptions import ConfigurationError, FieldError from tortoise.fields.base import Field -from tortoise.timezone import get_default_timezone, get_timezone, get_use_tz, localtime +from tortoise.timezone import ( + get_default_timezone, + get_timezone, + get_use_tz, + localtime, + parse_datetime, +) from tortoise.validators import MaxLengthValidator -try: - from ciso8601 import parse_datetime -except ImportError: # pragma: nocoverage - from iso8601 import parse_date - - parse_datetime = functools.partial(parse_date, default_timezone=None) - try: from pydantic import BaseModel as _PydanticBaseModel from pydantic._internal._model_construction import ModelMetaclass as _PydanticModelMetaclass diff --git a/tortoise/timezone.py b/tortoise/timezone.py index c48c56de7..7e906eeef 100644 --- a/tortoise/timezone.py +++ b/tortoise/timezone.py @@ -2,7 +2,9 @@ import functools import os +import re import sys +from collections.abc import Callable from datetime import datetime, time, tzinfo from zoneinfo import ZoneInfo as _ZoneInfo from zoneinfo import ZoneInfoNotFoundError @@ -14,6 +16,29 @@ UTC = timezone.utc +_ORDINAL_DATE_RE = re.compile(r"^(\d{4})-?(\d{3})(?=$|[Tt ])") + + +def _parse_datetime(value: str) -> datetime: + if value.endswith(("Z", "z")): + value = f"{value[:-1]}+00:00" + try: + return datetime.fromisoformat(value) + except ValueError: + # Match ordinal dates accepted by ciso8601, such as 2020-230 or 2020230. + if m := _ORDINAL_DATE_RE.match(value): + date_format = "%Y-%j" if "-" in m.group() else "%Y%j" + date_value = datetime.strptime(m.group(), date_format).date() + return datetime.fromisoformat(f"{date_value.isoformat()}{value[m.end() :]}") + raise + + +parse_datetime: Callable[[str], datetime] +try: + from ciso8601 import parse_datetime as parse_datetime +except ImportError: # pragma: nocoverage + parse_datetime = _parse_datetime + class ZoneInfo(_ZoneInfo): @property diff --git a/uv.lock b/uv.lock index 179bb3961..98f62d950 100644 --- a/uv.lock +++ b/uv.lock @@ -708,6 +708,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/1f/662b51464c2873ba345db671048e441267437e1ce802f079e024e9305b5b/ciso8601-2.3.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe7b832298a70ac39ef0b3cd1ce860289a2b45d2fdca2c2acd26551e29273487", size = 40519, upload-time = "2025-08-20T16:30:22.369Z" }, { url = "https://files.pythonhosted.org/packages/14/ec/8f9ebbc8e3330d3c2374983cfe7553592d53cdeb59a35078ce135c81d83d/ciso8601-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0e81268f84f6ed5a8f07026abed8ffa4fa54953e5763802b259e170f7bd7fb0", size = 39986, upload-time = "2025-08-20T16:30:23.582Z" }, { url = "https://files.pythonhosted.org/packages/24/c4/cff2f87395514ae70938b71ce4ceba975e71b000fd507ad000a8cd917a0b/ciso8601-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:44fdb272acdc59e94282f6155eacbff8cd9687a2a84df0bbbed2b1bd53fa8406", size = 40236, upload-time = "2025-08-20T16:30:24.827Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7e/aef1d665c5097f71ed58684009d4b5c1cbfdb02373bbb04f22e0930dff6c/ciso8601-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:74b14ffaddb890a48d03b3b97cc3f56875a4a93b3116b023add408e45b010c22", size = 17520, upload-time = "2025-08-20T16:30:25.77Z" }, { url = "https://files.pythonhosted.org/packages/fc/30/5744492f9e7dbe60a3c92968cdb8987566f5389b8d0e5c60f6d633da45fe/ciso8601-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f068fb60b801640b4d729a3cf79f5b3075c071f0dad3a08e5bf68b89ca41aef7", size = 16076, upload-time = "2025-08-20T16:30:27.005Z" }, { url = "https://files.pythonhosted.org/packages/e0/c6/ce97f28a3b936a9a6c0abba9905382cb89022b8e1abb37a2150c1caf71d6/ciso8601-2.3.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:2f347401756cdd552420a4596a0535a4f8193298ff401e41fb31603e182ae302", size = 24110, upload-time = "2025-08-20T16:30:28.243Z" }, { url = "https://files.pythonhosted.org/packages/dc/89/1af026c7959d39bdbaa6400b76ffb54437fa52698b801d51ddaa14063f0e/ciso8601-2.3.3-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:77e8e691ade14dd0e2ae1bcdd98475c25cd76be34b1cf43d9138bbb7ea7a8a37", size = 15871, upload-time = "2025-08-20T16:30:30.059Z" }, @@ -715,6 +716,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/3c/8671bde2bbf6abb8ceee82db0bc6bcd08066e7104680e3866eda6047adc1/ciso8601-2.3.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de0476ced02b965ef82c20191757f26e14878c76ce8d32a94c1e9ee14658ec6e", size = 40914, upload-time = "2025-08-20T16:30:32.096Z" }, { url = "https://files.pythonhosted.org/packages/8e/bc/433f91f19ff553653f340e77dbb12afe46de8a84a407ae01483d22ea8f7a/ciso8601-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe9303131af07e3596583e9d7faebb755d44c52c16f8077beeea1b297541fb61", size = 40154, upload-time = "2025-08-20T16:30:33.325Z" }, { url = "https://files.pythonhosted.org/packages/48/b7/39b905b09f77f2140724707919edea2a3d34b00a9366cd7ad541aefb464e/ciso8601-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c443761b899e4e350a647b3439f8e999d6c925dc4e83887b3063b13c2a9b195", size = 40428, upload-time = "2025-08-20T16:30:34.626Z" }, + { url = "https://files.pythonhosted.org/packages/f2/11/e676e1ac5dd8523dfc2e06c799840103343dc13c650d6ed06c63a8e41d5a/ciso8601-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:e3a395ebc5932982a72841820a6bf6e5cd1d41a760cd15ffafd1d4e963c9b802", size = 17519, upload-time = "2025-08-20T16:30:35.539Z" }, { url = "https://files.pythonhosted.org/packages/62/aa/b723a6981cfc42bbe992da23179f5dd1556e9054067985108ec6cbe34dd3/ciso8601-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e7ef14610446211c4102bf6c67f32619ab341e56db15bad6884385b43c12b064", size = 16111, upload-time = "2025-08-20T16:30:36.781Z" }, { url = "https://files.pythonhosted.org/packages/0a/e9/e547ec4dd75f28d8d217488130fa07767bc42fd643d61a18870487133c0e/ciso8601-2.3.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:523901aec6b0ccdf255c863ef161f476197f177c5cd33f2fbb35955c5f97fdb4", size = 24193, upload-time = "2025-08-20T16:30:38.067Z" }, { url = "https://files.pythonhosted.org/packages/14/c8/801b78e30667cb31b4524e9dc26cbc2c03c012f9aa3f5ae21676461dc622/ciso8601-2.3.3-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:45f8254d1fb0a41e20f98e93075db7b56504adddf65e4c8b397671feba4861ca", size = 15917, upload-time = "2025-08-20T16:30:39.375Z" }, @@ -722,6 +724,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/57/cf66171cb5807fe345b03ce9e32fd91b3a8b6e5bd95710618a9a1b0f3fab/ciso8601-2.3.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7cec4e31c363e87221f2561e7083ce055a82de041e822e7c3775f8ce6250a7e", size = 41804, upload-time = "2025-08-20T16:30:41.204Z" }, { url = "https://files.pythonhosted.org/packages/75/91/15e8871d7ae2ff0f756128e246348bdede58c08edba13cd886450ceeb304/ciso8601-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:389fef3ccc3065fa21cb6ef7d03aee63ab980591b5d87b9f0bbe349f52b16bdc", size = 41209, upload-time = "2025-08-20T16:30:42.46Z" }, { url = "https://files.pythonhosted.org/packages/30/54/7563e20a158a4bdf3e8d13c63e02b71f9b73c662edc83cb4d5ab67171a7d/ciso8601-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c4499cfbe4da092dea95ab81aefc78b98e2d7464518e6e80107cf2b9b1f65fa2", size = 41368, upload-time = "2025-08-20T16:30:43.397Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d5/6182006dd86365bb21d1f658f70c41e266ce0f97eaf353f9d7069c51851f/ciso8601-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:1df1ca3791c6f2d543f091d88e728a60a31681ff900d9eb02f1403cf31e9c177", size = 17566, upload-time = "2025-08-20T16:30:44.706Z" }, { url = "https://files.pythonhosted.org/packages/01/16/88154fe8247e4dcfdbaed8c6b8ccf32b1dd4389c6c95b1986bf31649eb00/ciso8601-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8afa073802c926c3244e1e5fcc5818afd3acb90fb7826a90f91ddbda0636ea70", size = 16109, upload-time = "2025-08-20T16:30:45.655Z" }, { url = "https://files.pythonhosted.org/packages/be/46/8d46372b3802c7201c20c8b316569f27253aaafba0cdd2cd033985e8b77e/ciso8601-2.3.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:8a04e518b4adf8e35e030feaecdb4a835d39b9bb44d207e926aea8ce3447ad7c", size = 24189, upload-time = "2025-08-20T16:30:46.958Z" }, { url = "https://files.pythonhosted.org/packages/13/80/1890e097cb76e41995de82f29c0289ca590d7135e0be3707e5b78f54350d/ciso8601-2.3.3-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:f79ad8372463ba4265981016d1648bc05f4922bc8044c4243fcbaef7a12ee9f7", size = 15925, upload-time = "2025-08-20T16:30:48.082Z" }, @@ -729,6 +732,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2f/34/9a498ceb0ebd23f538e6685721c9fc4666701372c651874ed22ec46b1423/ciso8601-2.3.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09deebf3e326ec59d80019b4ad35175c90b99cde789c644b1496811fe3340587", size = 41866, upload-time = "2025-08-20T16:30:50.262Z" }, { url = "https://files.pythonhosted.org/packages/f7/0a/ee0981502aa1c9f28f7e89cf6cee08bdff2c6ed9d4289b00cceb8a1c500e/ciso8601-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3aa43ed59b2117baccc5bb760e5e53dad77cacba671d757c1e82e0a367b1f42a", size = 41271, upload-time = "2025-08-20T16:30:51.198Z" }, { url = "https://files.pythonhosted.org/packages/fb/65/24a888240324188d8350bc24fb58a6d759c0ca43adfa77210f3d60370b56/ciso8601-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:289515aa3a3b86a9c3450bf482f634138b98788332d136751507bfdfe46e6031", size = 41411, upload-time = "2025-08-20T16:30:52.439Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1f/febc9de191acb461e02e616e5366bc2b7757277a11b4bf215d4fb79516a8/ciso8601-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:e7288068a5bffbcc50cbe9cdaf3971f541fcd209c194fa6a59ad06066a3dcff0", size = 17573, upload-time = "2025-08-20T16:30:53.759Z" }, { url = "https://files.pythonhosted.org/packages/ef/3a/54ad0ae2257870076b4990545a8f16221470fecea0aa7a4e1f39506db8c5/ciso8601-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82db4047d74d8b1d129e7a8da578518729912c3bd19cb71541b147e41f426381", size = 16115, upload-time = "2025-08-20T16:30:54.971Z" }, { url = "https://files.pythonhosted.org/packages/23/fb/9fe767d44520691e2b706769466852fbdeb44a82dc294c2766bce1049d22/ciso8601-2.3.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:a553f3fc03a2ed5ca6f5716de0b314fa166461df01b45d8b36043ccac3a5e79f", size = 24214, upload-time = "2025-08-20T16:30:56.359Z" }, { url = "https://files.pythonhosted.org/packages/a1/ac/984fd3948f372c46c436a2b48da43f4fb7bc6f156a6f4bc858adaab79d42/ciso8601-2.3.3-cp314-cp314-macosx_11_0_x86_64.whl", hash = "sha256:ff59c26083b7bef6df4f0d96e4b649b484806d3d7bcc2de14ad43147c3aafb04", size = 15929, upload-time = "2025-08-20T16:30:58.352Z" }, @@ -736,6 +740,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5e/cf/07321ce5cf099b98de0c02cd4bab4818610da69743003e94c8fb6e8a59cb/ciso8601-2.3.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c35265c1b0bd2ac30ed29b49818dd38b0d1dfda43086af605d8b91722727dec0", size = 42085, upload-time = "2025-08-20T16:31:00.338Z" }, { url = "https://files.pythonhosted.org/packages/d3/c7/3c521d6779ee433d9596eb3fcded79549bbe371843f25e62006c04f74dc9/ciso8601-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aa9df2f84ab25454f14df92b2dd4f9aae03dbfa581565a716b3e89b8e2110c03", size = 41313, upload-time = "2025-08-20T16:31:01.313Z" }, { url = "https://files.pythonhosted.org/packages/f9/93/efd40db0d6b512be1cbe4e7e750882c2e88f580e17f35b3e9cc9c23004b5/ciso8601-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:32e06a35eb251cfc4bbe01a858c598da0a160e4ad7f42ff52477157ceaf48061", size = 41443, upload-time = "2025-08-20T16:31:02.357Z" }, + { url = "https://files.pythonhosted.org/packages/21/8e/515f9404faa39af8df5e2b899cafbca5dbe7cd2ffe5cc124ef393ffdaf1c/ciso8601-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:7657ba9730dc1340d73b9e61eca14f341c41dd308128c808b8b084d2b85bc03e", size = 17977, upload-time = "2025-08-20T16:31:03.429Z" }, { url = "https://files.pythonhosted.org/packages/83/e5/eee65bc8c91e5981ed3440dbd4e546ff14b67deba07f6f346de1a61f28c0/ciso8601-2.3.3-pp310-pypy310_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1d88ab28ecb3626e3417c564e8aec9d0245b4eb75e773d2e7f3f095ea9897ded", size = 16956, upload-time = "2025-08-20T16:31:24.869Z" }, { url = "https://files.pythonhosted.org/packages/38/fc/809cba0f1928d1d45a4e5c9d789b06fd092a145702d32a41394f4b9665ca/ciso8601-2.3.3-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8d5a37798bf0cab6144daa2b6d07657ab1a63df540de24c23a809fb2bdf36149", size = 18285, upload-time = "2025-08-20T16:31:26.143Z" }, { url = "https://files.pythonhosted.org/packages/f1/1d/025db546af38ab5236086f462292c50a1f9a4b248a309129a85bb1113996/ciso8601-2.3.3-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d5b18c75c66499ef22cb47b429e3b5a137db5a68674365b9ca3cd0e4488d229f", size = 16957, upload-time = "2025-08-20T16:31:27.503Z" }, @@ -1465,15 +1470,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, ] -[[package]] -name = "iso8601" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/f3/ef59cee614d5e0accf6fd0cbba025b93b272e626ca89fb70a3e9187c5d15/iso8601-2.1.0.tar.gz", hash = "sha256:6b1d3829ee8921c4301998c909f7829fa9ed3cbdac0d3b16af2d743aed1ba8df", size = 6522, upload-time = "2023-10-03T00:25:39.317Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/0c/f37b6a241f0759b7653ffa7213889d89ad49a2b76eb2ddf3b57b2738c347/iso8601-2.1.0-py3-none-any.whl", hash = "sha256:aac4145c4dcb66ad8b648a02830f5e2ff6c24af20f4f482689be402db2429242", size = 7545, upload-time = "2023-10-03T00:25:32.304Z" }, -] - [[package]] name = "isort" version = "8.0.1" @@ -2151,9 +2147,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523" }, ] [[package]] @@ -3375,7 +3371,6 @@ source = { editable = "." } dependencies = [ { name = "aiosqlite" }, { name = "anyio" }, - { name = "iso8601", marker = "python_full_version < '4'" }, { name = "pypika-tortoise" }, { name = "tomlkit", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, @@ -3383,7 +3378,7 @@ dependencies = [ [package.optional-dependencies] accel = [ - { name = "ciso8601", marker = "implementation_name == 'cpython' and sys_platform != 'win32'" }, + { name = "ciso8601", marker = "implementation_name == 'cpython'" }, { name = "orjson" }, { name = "uvloop", marker = "implementation_name == 'cpython' and sys_platform != 'win32'" }, ] @@ -3462,9 +3457,8 @@ requires-dist = [ { name = "asyncmy", marker = "extra == 'asyncmy'", specifier = ">=0.2.11,<1.0.0" }, { name = "asyncodbc", marker = "python_full_version < '4' and extra == 'asyncodbc'", specifier = ">=0.1.1,<1.0.0" }, { name = "asyncpg", marker = "extra == 'asyncpg'" }, - { name = "ciso8601", marker = "implementation_name == 'cpython' and sys_platform != 'win32' and extra == 'accel'" }, + { name = "ciso8601", marker = "implementation_name == 'cpython' and extra == 'accel'" }, { name = "ipython", marker = "extra == 'ipython'" }, - { name = "iso8601", marker = "python_full_version < '4'", specifier = ">=2.1.0,<3.0.0" }, { name = "nest-asyncio", marker = "extra == 'ipython'", specifier = ">=1.6.0" }, { name = "orjson", marker = "extra == 'accel'" }, { name = "psycopg", extras = ["binary", "pool"], marker = "extra == 'psycopg'", specifier = ">=3.0.12,<4.0.0" },