From b37b73d31a30a1d1c332a9ae92ea024a9dbc660e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 04:53:49 -0400 Subject: [PATCH 01/16] chore(deps): update bitnami/minio docker tag to v2024.9.13 (#10146) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose.yaml b/compose.yaml index 261faa7aa6f1..ffa765dd6bb0 100644 --- a/compose.yaml +++ b/compose.yaml @@ -99,7 +99,7 @@ services: - trino minio: - image: bitnami/minio:2024.9.9 + image: bitnami/minio:2024.9.13 environment: MINIO_ROOT_USER: accesskey MINIO_ROOT_PASSWORD: secretkey From 8681e50f4ba5e9c1228afc34cbdde2df12079771 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 04:54:01 -0400 Subject: [PATCH 02/16] chore(deps): update apache/druid docker tag to v30.0.1 (#10145) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- compose.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/compose.yaml b/compose.yaml index ffa765dd6bb0..9d0c07a5d836 100644 --- a/compose.yaml +++ b/compose.yaml @@ -204,7 +204,7 @@ services: - druid druid-coordinator: - image: apache/druid:30.0.0 + image: apache/druid:30.0.1 hostname: coordinator container_name: coordinator volumes: @@ -229,7 +229,7 @@ services: - druid druid-broker: - image: apache/druid:30.0.0 + image: apache/druid:30.0.1 hostname: broker container_name: broker volumes: @@ -257,7 +257,7 @@ services: - druid druid-historical: - image: apache/druid:30.0.0 + image: apache/druid:30.0.1 hostname: historical container_name: historical volumes: @@ -284,7 +284,7 @@ services: - druid druid-middlemanager: - image: apache/druid:30.0.0 + image: apache/druid:30.0.1 hostname: middlemanager container_name: middlemanager volumes: @@ -312,7 +312,7 @@ services: - druid druid: - image: apache/druid:30.0.0 + image: apache/druid:30.0.1 hostname: router container_name: router volumes: From e50642de95adb685acc844ea337aa7f63ec8e183 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 05:22:27 -0400 Subject: [PATCH 03/16] chore(deps): lock file maintenance (#10134) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Phillip Cloud <417981+cpcloud@users.noreply.github.com> --- ibis/backends/polars/compiler.py | 19 +- poetry.lock | 1099 ++++++++++++++++-------------- requirements-dev.txt | 56 +- 3 files changed, 611 insertions(+), 563 deletions(-) diff --git a/ibis/backends/polars/compiler.py b/ibis/backends/polars/compiler.py index 31b589e85a3a..7bc9c9f14715 100644 --- a/ibis/backends/polars/compiler.py +++ b/ibis/backends/polars/compiler.py @@ -1290,16 +1290,18 @@ def execute_count_distinct_star(op, **kw): # Convert polars series into a list # -> map the function element by element # -> convert back to a polars series - InputType.PYTHON: lambda func, dtype, args: pl.Series( - map(func, *(arg.to_list() for arg in args)), + InputType.PYTHON: lambda func, dtype, fields, args: pl.Series( + map(func, *(arg.to_list() for arg in map(args.struct.field, fields))), dtype=PolarsType.from_ibis(dtype), ), # Convert polars series into a pyarrow array # -> invoke the function on the pyarrow array # -> cast the result to match the ibis dtype # -> convert back to a polars series - InputType.PYARROW: lambda func, dtype, args: pl.from_arrow( - func(*(arg.to_arrow() for arg in args)).cast(dtype.to_pyarrow()), + InputType.PYARROW: lambda func, dtype, fields, args: pl.from_arrow( + func(*(arg.to_arrow() for arg in map(args.struct.field, fields))).cast( + dtype.to_pyarrow() + ), ), } @@ -1309,9 +1311,12 @@ def execute_scalar_udf(op, **kw): input_type = op.__input_type__ if input_type in _UDF_INVOKERS: dtype = op.dtype - return pl.map_batches( - exprs=[translate(arg, **kw) for arg in op.args], - function=partial(_UDF_INVOKERS[input_type], op.__func__, dtype), + argnames = op.argnames + args = pl.struct( + **dict(zip(argnames, (translate(arg, **kw) for arg in op.args))) + ) + return args.map_batches( + function=partial(_UDF_INVOKERS[input_type], op.__func__, dtype, argnames), return_dtype=PolarsType.from_ibis(dtype), ) elif input_type == InputType.BUILTIN: diff --git a/poetry.lock b/poetry.lock index c6db8dc8921b..46f34f9e74c5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2230,69 +2230,77 @@ test = ["coverage", "pytest (>=7,<8.1)", "pytest-cov", "pytest-mock (>=3)"] [[package]] name = "greenlet" -version = "3.0.3" +version = "3.1.0" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, + {file = "greenlet-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a814dc3100e8a046ff48faeaa909e80cdb358411a3d6dd5293158425c684eda8"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a771dc64fa44ebe58d65768d869fcfb9060169d203446c1d446e844b62bdfdca"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e49a65d25d7350cca2da15aac31b6f67a43d867448babf997fe83c7505f57bc"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cd8518eade968bc52262d8c46727cfc0826ff4d552cf0430b8d65aaf50bb91d"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76dc19e660baea5c38e949455c1181bc018893f25372d10ffe24b3ed7341fb25"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0a5b1c22c82831f56f2f7ad9bbe4948879762fe0d59833a4a71f16e5fa0f682"}, + {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2651dfb006f391bcb240635079a68a261b227a10a08af6349cba834a2141efa1"}, + {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3e7e6ef1737a819819b1163116ad4b48d06cfdd40352d813bb14436024fcda99"}, + {file = "greenlet-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:ffb08f2a1e59d38c7b8b9ac8083c9c8b9875f0955b1e9b9b9a965607a51f8e54"}, + {file = "greenlet-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19"}, + {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a"}, + {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b"}, + {file = "greenlet-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9"}, + {file = "greenlet-3.1.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a"}, + {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665"}, + {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811"}, + {file = "greenlet-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b"}, + {file = "greenlet-3.1.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17"}, + {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5"}, + {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484"}, + {file = "greenlet-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81eeec4403a7d7684b5812a8aaa626fa23b7d0848edb3a28d2eb3220daddcbd0"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3dae7492d16e85ea6045fd11cb8e782b63eac8c8d520c3a92c02ac4573b0a6"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b5ea3664eed571779403858d7cd0a9b0ebf50d57d2cdeafc7748e09ef8cd81a"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22f4e26400f7f48faef2d69c20dc055a1f3043d330923f9abe08ea0aecc44df"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13ff8c8e54a10472ce3b2a2da007f915175192f18e6495bad50486e87c7f6637"}, + {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9671e7282d8c6fcabc32c0fb8d7c0ea8894ae85cee89c9aadc2d7129e1a9954"}, + {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:184258372ae9e1e9bddce6f187967f2e08ecd16906557c4320e3ba88a93438c3"}, + {file = "greenlet-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:a0409bc18a9f85321399c29baf93545152d74a49d92f2f55302f122007cfda00"}, + {file = "greenlet-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9eb4a1d7399b9f3c7ac68ae6baa6be5f9195d1d08c9ddc45ad559aa6b556bce6"}, + {file = "greenlet-3.1.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a8870983af660798dc1b529e1fd6f1cefd94e45135a32e58bd70edd694540f33"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfcfb73aed40f550a57ea904629bdaf2e562c68fa1164fa4588e752af6efdc3f"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9482c2ed414781c0af0b35d9d575226da6b728bd1a720668fa05837184965b7"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d58ec349e0c2c0bc6669bf2cd4982d2f93bf067860d23a0ea1fe677b0f0b1e09"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd65695a8df1233309b701dec2539cc4b11e97d4fcc0f4185b4a12ce54db0491"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:665b21e95bc0fce5cab03b2e1d90ba9c66c510f1bb5fdc864f3a377d0f553f6b"}, + {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3c59a06c2c28a81a026ff11fbf012081ea34fb9b7052f2ed0366e14896f0a1d"}, + {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415b9494ff6240b09af06b91a375731febe0090218e2898d2b85f9b92abcda0"}, + {file = "greenlet-3.1.0-cp38-cp38-win32.whl", hash = "sha256:1544b8dd090b494c55e60c4ff46e238be44fdc472d2589e943c241e0169bcea2"}, + {file = "greenlet-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f346d24d74c00b6730440f5eb8ec3fe5774ca8d1c9574e8e57c8671bb51b910"}, + {file = "greenlet-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:db1b3ccb93488328c74e97ff888604a8b95ae4f35f4f56677ca57a4fc3a4220b"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cd313629ded43bb3b98737bba2f3e2c2c8679b55ea29ed73daea6b755fe8e7"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fad7a051e07f64e297e6e8399b4d6a3bdcad3d7297409e9a06ef8cbccff4f501"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3967dcc1cd2ea61b08b0b276659242cbce5caca39e7cbc02408222fb9e6ff39"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d45b75b0f3fd8d99f62eb7908cfa6d727b7ed190737dec7fe46d993da550b81a"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d004db911ed7b6218ec5c5bfe4cf70ae8aa2223dffbb5b3c69e342bb253cb28"}, + {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9505a0c8579899057cbefd4ec34d865ab99852baf1ff33a9481eb3924e2da0b"}, + {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fd6e94593f6f9714dbad1aaba734b5ec04593374fa6638df61592055868f8b8"}, + {file = "greenlet-3.1.0-cp39-cp39-win32.whl", hash = "sha256:d0dd943282231480aad5f50f89bdf26690c995e8ff555f26d8a5b9887b559bcc"}, + {file = "greenlet-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:ac0adfdb3a21dc2a24ed728b61e72440d297d0fd3a577389df566651fcd08f97"}, + {file = "greenlet-3.1.0.tar.gz", hash = "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0"}, ] [package.extras] @@ -2460,13 +2468,13 @@ tests = ["freezegun", "pytest", "pytest-cov"] [[package]] name = "hypothesis" -version = "6.112.0" +version = "6.112.1" description = "A library for property-based testing" optional = false python-versions = ">=3.8" files = [ - {file = "hypothesis-6.112.0-py3-none-any.whl", hash = "sha256:1e6adbd9534c0d691690b5006904327ea37c851d4e15262a22094aa77879e84d"}, - {file = "hypothesis-6.112.0.tar.gz", hash = "sha256:06ea8857e1e711a1a6f24154a3c8c4eab04b041993206aaa267f98b859fd6ef5"}, + {file = "hypothesis-6.112.1-py3-none-any.whl", hash = "sha256:93631b1498b20d2c205ed304cbd41d50e9c069d78a9c773c1324ca094c5e30ce"}, + {file = "hypothesis-6.112.1.tar.gz", hash = "sha256:b070d7a1bb9bd84706c31885c9aeddc138e2b36a9c112a91984f49501c567856"}, ] [package.dependencies] @@ -2493,13 +2501,13 @@ zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2024.1)"] [[package]] name = "identify" -version = "2.6.0" +version = "2.6.1" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, - {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] @@ -2507,43 +2515,50 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" -version = "8.4.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, - {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "importlib-resources" -version = "6.4.4" +version = "6.4.5" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.4-py3-none-any.whl", hash = "sha256:dda242603d1c9cd836c3368b1174ed74cb4049ecd209e7a1a0104620c18c5c11"}, - {file = "importlib_resources-6.4.4.tar.gz", hash = "sha256:20600c8b7361938dc0bb2d5ec0297802e575df486f5a544fa414da65e13721f7"}, + {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, + {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, ] [package.extras] @@ -3623,167 +3638,180 @@ files = [ [[package]] name = "msgpack" -version = "1.0.8" +version = "1.1.0" description = "MessagePack serializer" optional = false python-versions = ">=3.8" files = [ - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, - {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, - {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, - {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, - {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, - {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, - {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, - {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, - {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, - {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, - {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, + {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, + {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, + {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, + {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, + {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, + {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, + {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, + {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"}, + {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"}, + {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, + {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, + {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, + {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, ] [[package]] name = "multidict" -version = "6.0.5" +version = "6.1.0" description = "multidict implementation" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, - {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, - {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, -] + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] name = "mypy-extensions" @@ -3798,13 +3826,13 @@ files = [ [[package]] name = "narwhals" -version = "1.6.3" +version = "1.8.1" description = "Extremely lightweight compatibility layer between dataframe libraries" optional = false python-versions = ">=3.8" files = [ - {file = "narwhals-1.6.3-py3-none-any.whl", hash = "sha256:478b7bef635b9d9434bb2dbe6261380ed8558fad58b403e7f914745e60b5892c"}, - {file = "narwhals-1.6.3.tar.gz", hash = "sha256:02b73fb37fce78d7df5c72ec559718448225d64ca2a0854dc6472e3d8ce0906f"}, + {file = "narwhals-1.8.1-py3-none-any.whl", hash = "sha256:91a3af813733df39a74f590fdd1bb0d2d6d8a33e32aa409f56d941c0a29f8cdd"}, + {file = "narwhals-1.8.1.tar.gz", hash = "sha256:97527778e11f39a1e5e2113b8fbb9ead788be41c0337f21852e684e378f583e8"}, ] [package.extras] @@ -4386,13 +4414,13 @@ testing = ["pytest", "pytest-cov", "wheel"] [[package]] name = "platformdirs" -version = "4.3.2" +version = "4.3.3" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.3.2-py3-none-any.whl", hash = "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617"}, - {file = "platformdirs-4.3.2.tar.gz", hash = "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c"}, + {file = "platformdirs-4.3.3-py3-none-any.whl", hash = "sha256:50a5450e2e84f44539718293cbb1da0a0885c9d14adf21b77bae4e66fc99d9b5"}, + {file = "platformdirs-4.3.3.tar.gz", hash = "sha256:d4e0b7d8ec176b341fb03cb11ca12d0276faa8c485f9cd218f613840463fc2c0"}, ] [package.extras] @@ -4402,13 +4430,13 @@ type = ["mypy (>=1.11.2)"] [[package]] name = "plotly" -version = "5.24.0" +version = "5.24.1" description = "An open-source, interactive data visualization library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "plotly-5.24.0-py3-none-any.whl", hash = "sha256:0e54efe52c8cef899f7daa41be9ed97dfb6be622613a2a8f56a86a0634b2b67e"}, - {file = "plotly-5.24.0.tar.gz", hash = "sha256:eae9f4f54448682442c92c1e97148e3ad0c52f0cf86306e1b76daba24add554a"}, + {file = "plotly-5.24.1-py3-none-any.whl", hash = "sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089"}, + {file = "plotly-5.24.1.tar.gz", hash = "sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae"}, ] [package.dependencies] @@ -4527,13 +4555,13 @@ files = [ [[package]] name = "poetry-dynamic-versioning" -version = "1.4.0" +version = "1.4.1" description = "Plugin for Poetry to enable dynamic versioning based on VCS tags" optional = false python-versions = "<4.0,>=3.7" files = [ - {file = "poetry_dynamic_versioning-1.4.0-py3-none-any.whl", hash = "sha256:d6727d33d1c65850039cd804013a43780e0a3c9a3d693cf557ab87aa3891f148"}, - {file = "poetry_dynamic_versioning-1.4.0.tar.gz", hash = "sha256:725178bd50a22f2dd4035de7f965151e14ecf8f7f19996b9e536f4c5559669a7"}, + {file = "poetry_dynamic_versioning-1.4.1-py3-none-any.whl", hash = "sha256:44866ccbf869849d32baed4fc5fadf97f786180d8efa1719c88bf17a471bd663"}, + {file = "poetry_dynamic_versioning-1.4.1.tar.gz", hash = "sha256:21584d21ca405aa7d83d23d38372e3c11da664a8742995bdd517577e8676d0e1"}, ] [package.dependencies] @@ -4561,17 +4589,17 @@ poetry-core = ">=1.7.0,<3.0.0" [[package]] name = "polars" -version = "1.6.0" +version = "1.7.1" description = "Blazingly fast DataFrame library" optional = true python-versions = ">=3.8" files = [ - {file = "polars-1.6.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6d1665c23e3574ebd47a26a5d7b619e6e73e53718c3b0bfd7d08b6a0a4ae7daa"}, - {file = "polars-1.6.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d7f3abf085adf034720b358119c4c8e144bcc2d96010b7e7d0afa11b80da383c"}, - {file = "polars-1.6.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a166adb429f8ee099c9d803e7470a80c76368437a8b272c67cef9eef6d5e9da1"}, - {file = "polars-1.6.0-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:1c811b772c9476f7f0bb4445a8387d2ab6d86f5e79140b1bfba914a32788d261"}, - {file = "polars-1.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:ffae15ffa80fda5cc3af44a340b565bcf7f2ab6d7854d3f967baf505710c78e2"}, - {file = "polars-1.6.0.tar.gz", hash = "sha256:d7e8d5e577883a9755bc3be92ecbf6f20bced68267bdb8bdb440120e905cc19c"}, + {file = "polars-1.7.1-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:589c1b5a9b5167f3c49713212cbeccc39e3a0e12577e21331c50dbf7178e32ed"}, + {file = "polars-1.7.1-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c955cca9d109ed5d79f4498915ec80590aa2e4619bc40bafbbeb5a160fcb166e"}, + {file = "polars-1.7.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd675e4a306b2da57a1b688e65382aaa9e992dd7156b485fbd7f39892a3d784"}, + {file = "polars-1.7.1-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:45c255749b49bee244d10baeb69057580a0a397125b014bc8854b73ba5bdf45e"}, + {file = "polars-1.7.1-cp38-abi3-win_amd64.whl", hash = "sha256:a9004a907fc8e923dda27879f7e6eea8e06a753e160d08e606c8b9b5f914f911"}, + {file = "polars-1.7.1.tar.gz", hash = "sha256:3323bf6b3f1cf55212ddd35f044af8a1aa02033bca17d06f3852325e0da93a80"}, ] [package.extras] @@ -4676,22 +4704,22 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "5.28.0" +version = "5.28.1" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.28.0-cp310-abi3-win32.whl", hash = "sha256:66c3edeedb774a3508ae70d87b3a19786445fe9a068dd3585e0cefa8a77b83d0"}, - {file = "protobuf-5.28.0-cp310-abi3-win_amd64.whl", hash = "sha256:6d7cc9e60f976cf3e873acb9a40fed04afb5d224608ed5c1a105db4a3f09c5b6"}, - {file = "protobuf-5.28.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:532627e8fdd825cf8767a2d2b94d77e874d5ddb0adefb04b237f7cc296748681"}, - {file = "protobuf-5.28.0-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:018db9056b9d75eb93d12a9d35120f97a84d9a919bcab11ed56ad2d399d6e8dd"}, - {file = "protobuf-5.28.0-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:6206afcb2d90181ae8722798dcb56dc76675ab67458ac24c0dd7d75d632ac9bd"}, - {file = "protobuf-5.28.0-cp38-cp38-win32.whl", hash = "sha256:eef7a8a2f4318e2cb2dee8666d26e58eaf437c14788f3a2911d0c3da40405ae8"}, - {file = "protobuf-5.28.0-cp38-cp38-win_amd64.whl", hash = "sha256:d001a73c8bc2bf5b5c1360d59dd7573744e163b3607fa92788b7f3d5fefbd9a5"}, - {file = "protobuf-5.28.0-cp39-cp39-win32.whl", hash = "sha256:dde9fcaa24e7a9654f4baf2a55250b13a5ea701493d904c54069776b99a8216b"}, - {file = "protobuf-5.28.0-cp39-cp39-win_amd64.whl", hash = "sha256:853db610214e77ee817ecf0514e0d1d052dff7f63a0c157aa6eabae98db8a8de"}, - {file = "protobuf-5.28.0-py3-none-any.whl", hash = "sha256:510ed78cd0980f6d3218099e874714cdf0d8a95582e7b059b06cabad855ed0a0"}, - {file = "protobuf-5.28.0.tar.gz", hash = "sha256:dde74af0fa774fa98892209992295adbfb91da3fa98c8f67a88afe8f5a349add"}, + {file = "protobuf-5.28.1-cp310-abi3-win32.whl", hash = "sha256:fc063acaf7a3d9ca13146fefb5b42ac94ab943ec6e978f543cd5637da2d57957"}, + {file = "protobuf-5.28.1-cp310-abi3-win_amd64.whl", hash = "sha256:4c7f5cb38c640919791c9f74ea80c5b82314c69a8409ea36f2599617d03989af"}, + {file = "protobuf-5.28.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4304e4fceb823d91699e924a1fdf95cde0e066f3b1c28edb665bda762ecde10f"}, + {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:0dfd86d2b5edf03d91ec2a7c15b4e950258150f14f9af5f51c17fa224ee1931f"}, + {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:51f09caab818707ab91cf09cc5c156026599cf05a4520779ccbf53c1b352fb25"}, + {file = "protobuf-5.28.1-cp38-cp38-win32.whl", hash = "sha256:1b04bde117a10ff9d906841a89ec326686c48ececeb65690f15b8cabe7149495"}, + {file = "protobuf-5.28.1-cp38-cp38-win_amd64.whl", hash = "sha256:cabfe43044ee319ad6832b2fda332646f9ef1636b0130186a3ae0a52fc264bb4"}, + {file = "protobuf-5.28.1-cp39-cp39-win32.whl", hash = "sha256:4b4b9a0562a35773ff47a3df823177ab71a1f5eb1ff56d8f842b7432ecfd7fd2"}, + {file = "protobuf-5.28.1-cp39-cp39-win_amd64.whl", hash = "sha256:f24e5d70e6af8ee9672ff605d5503491635f63d5db2fffb6472be78ba62efd8f"}, + {file = "protobuf-5.28.1-py3-none-any.whl", hash = "sha256:c529535e5c0effcf417682563719e5d8ac8d2b93de07a56108b4c2d436d7a29a"}, + {file = "protobuf-5.28.1.tar.gz", hash = "sha256:42597e938f83bb7f3e4b35f03aa45208d49ae8d5bcb4bc10b9fc825e0ab5e423"}, ] [[package]] @@ -4909,24 +4937,24 @@ files = [ [[package]] name = "pyasn1" -version = "0.6.0" +version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = ">=3.8" files = [ - {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, - {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] [[package]] name = "pyasn1-modules" -version = "0.4.0" +version = "0.4.1" description = "A collection of ASN.1-based protocols modules" optional = false python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, - {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, ] [package.dependencies] @@ -5101,13 +5129,13 @@ sqlalchemy = ["sqlalchemy"] [[package]] name = "pyexasol" -version = "0.26.0" +version = "0.27.0" description = "Exasol python driver with extra features" optional = true python-versions = "<4.0,>=3.9" files = [ - {file = "pyexasol-0.26.0-py3-none-any.whl", hash = "sha256:b4bd2cf28bfb42352916efae7878beac847ca49bbab7be9f0066346ca0865de4"}, - {file = "pyexasol-0.26.0.tar.gz", hash = "sha256:d00fd8e05936767c332c50be5f953514579a2c7a80f8a8922cbf7d8a56603fbb"}, + {file = "pyexasol-0.27.0-py3-none-any.whl", hash = "sha256:041e1db1ae8f26fa24876056ce8da5830e346fc47734847a95cc960ac056d0c6"}, + {file = "pyexasol-0.27.0.tar.gz", hash = "sha256:795490cd810617bf927e0e90b88347facb5e66f58e0e16378fef5d22fadacd60"}, ] [package.dependencies] @@ -5438,13 +5466,13 @@ sql = ["numpy (>=1.15,<2)", "pandas (>=1.0.5)", "pyarrow (>=4.0.0)"] [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, - {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -5659,13 +5687,13 @@ files = [ [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -6065,90 +6093,105 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.7.24" +version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = true python-versions = ">=3.8" files = [ - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, - {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, - {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, - {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, - {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, - {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, - {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, - {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, - {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, - {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, - {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, - {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, + {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, + {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, + {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, + {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, + {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, + {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, + {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, + {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, + {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, + {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, ] [[package]] @@ -6375,59 +6418,59 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.6.4" +version = "0.6.5" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.6.4-py3-none-linux_armv6l.whl", hash = "sha256:c4b153fc152af51855458e79e835fb6b933032921756cec9af7d0ba2aa01a258"}, - {file = "ruff-0.6.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:bedff9e4f004dad5f7f76a9d39c4ca98af526c9b1695068198b3bda8c085ef60"}, - {file = "ruff-0.6.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d02a4127a86de23002e694d7ff19f905c51e338c72d8e09b56bfb60e1681724f"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7862f42fc1a4aca1ea3ffe8a11f67819d183a5693b228f0bb3a531f5e40336fc"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eebe4ff1967c838a1a9618a5a59a3b0a00406f8d7eefee97c70411fefc353617"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:932063a03bac394866683e15710c25b8690ccdca1cf192b9a98260332ca93408"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:50e30b437cebef547bd5c3edf9ce81343e5dd7c737cb36ccb4fe83573f3d392e"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c44536df7b93a587de690e124b89bd47306fddd59398a0fb12afd6133c7b3818"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ea086601b22dc5e7693a78f3fcfc460cceabfdf3bdc36dc898792aba48fbad6"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b52387d3289ccd227b62102c24714ed75fbba0b16ecc69a923a37e3b5e0aaaa"}, - {file = "ruff-0.6.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0308610470fcc82969082fc83c76c0d362f562e2f0cdab0586516f03a4e06ec6"}, - {file = "ruff-0.6.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:803b96dea21795a6c9d5bfa9e96127cc9c31a1987802ca68f35e5c95aed3fc0d"}, - {file = "ruff-0.6.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:66dbfea86b663baab8fcae56c59f190caba9398df1488164e2df53e216248baa"}, - {file = "ruff-0.6.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:34d5efad480193c046c86608dbba2bccdc1c5fd11950fb271f8086e0c763a5d1"}, - {file = "ruff-0.6.4-py3-none-win32.whl", hash = "sha256:f0f8968feea5ce3777c0d8365653d5e91c40c31a81d95824ba61d871a11b8523"}, - {file = "ruff-0.6.4-py3-none-win_amd64.whl", hash = "sha256:549daccee5227282289390b0222d0fbee0275d1db6d514550d65420053021a58"}, - {file = "ruff-0.6.4-py3-none-win_arm64.whl", hash = "sha256:ac4b75e898ed189b3708c9ab3fc70b79a433219e1e87193b4f2b77251d058d14"}, - {file = "ruff-0.6.4.tar.gz", hash = "sha256:ac3b5bfbee99973f80aa1b7cbd1c9cbce200883bdd067300c22a6cc1c7fba212"}, + {file = "ruff-0.6.5-py3-none-linux_armv6l.whl", hash = "sha256:7e4e308f16e07c95fc7753fc1aaac690a323b2bb9f4ec5e844a97bb7fbebd748"}, + {file = "ruff-0.6.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:932cd69eefe4daf8c7d92bd6689f7e8182571cb934ea720af218929da7bd7d69"}, + {file = "ruff-0.6.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3a8d42d11fff8d3143ff4da41742a98f8f233bf8890e9fe23077826818f8d680"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a50af6e828ee692fb10ff2dfe53f05caecf077f4210fae9677e06a808275754f"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:794ada3400a0d0b89e3015f1a7e01f4c97320ac665b7bc3ade24b50b54cb2972"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:381413ec47f71ce1d1c614f7779d88886f406f1fd53d289c77e4e533dc6ea200"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:52e75a82bbc9b42e63c08d22ad0ac525117e72aee9729a069d7c4f235fc4d276"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09c72a833fd3551135ceddcba5ebdb68ff89225d30758027280968c9acdc7810"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:800c50371bdcb99b3c1551d5691e14d16d6f07063a518770254227f7f6e8c178"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e25ddd9cd63ba1f3bd51c1f09903904a6adf8429df34f17d728a8fa11174253"}, + {file = "ruff-0.6.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7291e64d7129f24d1b0c947ec3ec4c0076e958d1475c61202497c6aced35dd19"}, + {file = "ruff-0.6.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9ad7dfbd138d09d9a7e6931e6a7e797651ce29becd688be8a0d4d5f8177b4b0c"}, + {file = "ruff-0.6.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:005256d977021790cc52aa23d78f06bb5090dc0bfbd42de46d49c201533982ae"}, + {file = "ruff-0.6.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:482c1e6bfeb615eafc5899127b805d28e387bd87db38b2c0c41d271f5e58d8cc"}, + {file = "ruff-0.6.5-py3-none-win32.whl", hash = "sha256:cf4d3fa53644137f6a4a27a2b397381d16454a1566ae5335855c187fbf67e4f5"}, + {file = "ruff-0.6.5-py3-none-win_amd64.whl", hash = "sha256:3e42a57b58e3612051a636bc1ac4e6b838679530235520e8f095f7c44f706ff9"}, + {file = "ruff-0.6.5-py3-none-win_arm64.whl", hash = "sha256:51935067740773afdf97493ba9b8231279e9beef0f2a8079188c4776c25688e0"}, + {file = "ruff-0.6.5.tar.gz", hash = "sha256:4d32d87fab433c0cf285c3683dd4dae63be05fd7a1d65b3f5bf7cdd05a6b96fb"}, ] [[package]] name = "scikit-learn" -version = "1.5.1" +version = "1.5.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745"}, - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21"}, - {file = "scikit_learn-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf"}, - {file = "scikit_learn-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d"}, - {file = "scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d"}, - {file = "scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, + {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, + {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, + {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, + {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, ] [package.dependencies] @@ -6439,11 +6482,11 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -6549,18 +6592,18 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "74.1.2" +version = "75.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, - {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, + {file = "setuptools-75.0.0-py3-none-any.whl", hash = "sha256:791ae94f04f78c880b5e614e560dd32d4b4af5d151bd9e7483e3377846caf90a"}, + {file = "setuptools-75.0.0.tar.gz", hash = "sha256:25af69c809d9334cd8e653d385277abeb5a102dca255954005a7092d282575ea"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] @@ -6660,37 +6703,37 @@ files = [ [[package]] name = "snowflake-connector-python" -version = "3.12.1" +version = "3.12.2" description = "Snowflake Connector for Python" optional = true python-versions = ">=3.8" files = [ - {file = "snowflake_connector_python-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0979324bd96019f500f6c987d4720c9e4d7176df54b1b5aa96875be8c8ff57b"}, - {file = "snowflake_connector_python-3.12.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:c889a85966ec6a3384799e594e97301a4be0705d7763a5177104866b75383d8c"}, - {file = "snowflake_connector_python-3.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bfb5fe8db051771480059ffddd5127653f4ac1168c76293655da33c2a2904d7"}, - {file = "snowflake_connector_python-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1061af4a3a3e66b0c99ab0f8bae5eda28e6324618143b3f5b2d81d1649b8557"}, - {file = "snowflake_connector_python-3.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3edcf3591b6071ddb02413a0000dea42ee6fe811693d176915edb8687b03ce89"}, - {file = "snowflake_connector_python-3.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:226a714eb68bbae328fe49b705ecb304fbd44ea6a7afbb329ba3c389ac9111bc"}, - {file = "snowflake_connector_python-3.12.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:7319f63c09efed853d7652cbb38ecc23068e86dbce8340444056787993a854d9"}, - {file = "snowflake_connector_python-3.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f86b42a076e14900dc6af2f096343ccf4314d324e7e1153b667d6ee53c60334b"}, - {file = "snowflake_connector_python-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d231f0d5fb8d7a96b9ab5e9500035bd9f259c80d4b3c482163d156928fb0e546"}, - {file = "snowflake_connector_python-3.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:d9f1bc6b35344b170e2fb30314aa64709b28539084be88e95aacf094e13259eb"}, - {file = "snowflake_connector_python-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0114370c274ed64fe4aee2333b01e9ff88272837bdaa65fb3a3ee4820dca61b4"}, - {file = "snowflake_connector_python-3.12.1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:dadd262196cce0132ca7e766f055e00c00497a88fdf83fd48143eb4a469a4527"}, - {file = "snowflake_connector_python-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473642c0e628b8b9f264cbf31c7f4de44974373db43052b6542a66e751159caf"}, - {file = "snowflake_connector_python-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bddc4cdcd991f9538726a7c293d2637bb5aed43db68246e06c92c49a6df2b692"}, - {file = "snowflake_connector_python-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b06c63ec0381df1f4da6c4326330a1a40c8fc21fd3dcc2f58df4de395d676893"}, - {file = "snowflake_connector_python-3.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c24119ad64c20a8a691760c81e7d846feea4a6103ba84470116c60f7f31a1b8"}, - {file = "snowflake_connector_python-3.12.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:a8ba32c91ebf4de6d3f981cfd6324fb4b833696b639c350f5e5984371957e6f9"}, - {file = "snowflake_connector_python-3.12.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cde5643d8237fc109fed68c6a806297ebe3adeb56ac6865430a78fcaba27f2ef"}, - {file = "snowflake_connector_python-3.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a4bc4212db73feab5a79ad28b1d03743cbe48df1e346d219747afde5425c35d"}, - {file = "snowflake_connector_python-3.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:7e5d7a0f1b827304b3ba250fa98c25385a7158ea5333e7857cda2ea91433a354"}, - {file = "snowflake_connector_python-3.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a56f9df9db2b03caf9bc7a45f51d7cdfe307b5e2cde7edaa93b67c2d81789db6"}, - {file = "snowflake_connector_python-3.12.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a1ead374d96cf21cb249bf91fe814ab1e1baaa3c3f2391116ccefab8bfa36374"}, - {file = "snowflake_connector_python-3.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38698260175321ddef5504170ac1f9e5e92b897844d55ac2fc77bf0783435299"}, - {file = "snowflake_connector_python-3.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7f8699ff60924105253e465a54ad150469ddf65082ce029387d65ca404a46cc"}, - {file = "snowflake_connector_python-3.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e79497ae0f0be1a10cf2649900db0011e391ede47cbef2803814c32e1d63d6"}, - {file = "snowflake_connector_python-3.12.1.tar.gz", hash = "sha256:e43b7d4b4488ecd97b5bf62539cc502d7e84d8215c547eaeb4dd928c0b7212b9"}, + {file = "snowflake_connector_python-3.12.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:635cc0c96abdf17e06a0817d14ecd653b187a9d02f78c98bcd8e7655b15e5019"}, + {file = "snowflake_connector_python-3.12.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:98a0a325597809c401de73d82aad0646104773483b3f397503503c28dd781ef6"}, + {file = "snowflake_connector_python-3.12.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da86df904b5c16854b2197376a12882000b518c5b2db49d475f371106886068f"}, + {file = "snowflake_connector_python-3.12.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee0f53c424ef3ba5d5fde50f695443763d713e31ab13cd01d75e95ad9dcf1ad7"}, + {file = "snowflake_connector_python-3.12.2-cp310-cp310-win_amd64.whl", hash = "sha256:f639db040d9d7bc96dbc5792df1caa78be757b4fbe2ff7bb1d4c0ffa21f12193"}, + {file = "snowflake_connector_python-3.12.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5c531dfe1cedbd7f7644eb4bd084aec97c5de27c6cf9f68c51caa3d111f4060"}, + {file = "snowflake_connector_python-3.12.2-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:3747a618c1c0495aaf5621712d591aab85fd806c732c3f273d02de1bc81fbada"}, + {file = "snowflake_connector_python-3.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:495f5063df6ddc1cf5eb0f94f63f605bed17eaa012cf16a97c394d1cb1a1b82e"}, + {file = "snowflake_connector_python-3.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50c791ac63eb7022ce725ec81fc8b07a354803fa6ce4f112201909945ba1581d"}, + {file = "snowflake_connector_python-3.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:92b04d56aa138f63a197c86ed898268dbaeb06329c90035b4d0153ee7c99cf51"}, + {file = "snowflake_connector_python-3.12.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:22c9ff52c95b4eb0f6566e5a2b3d59c6f55056dd4919a0888ee4a3b270581c21"}, + {file = "snowflake_connector_python-3.12.2-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:c388d867446fada4896ff7445554712109323971a87b642d350f71546dfb0dc0"}, + {file = "snowflake_connector_python-3.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1747ee1f9b66da628aa22cc89b076fbeca8ee76f394f0b45286d8579e1de0850"}, + {file = "snowflake_connector_python-3.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa7a406137282b74c0ad5602e01be825acc8cce8dd0b806b89cf67b2789a8447"}, + {file = "snowflake_connector_python-3.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:47e262e5b81ca4e2dc0ae5069904377c60b6f52401790b9bdec505c6147f565f"}, + {file = "snowflake_connector_python-3.12.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2aeb0ccf9cb87a3eaf9c0891d7b5243fba2e039cb0d6193c9e3e9f0c37f86d53"}, + {file = "snowflake_connector_python-3.12.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:66d98300cafc1e2891aad3d73edff757bc6d44ff51ddefb8fdd24fb08e1aa4cc"}, + {file = "snowflake_connector_python-3.12.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94158a2678c5a241e60ddac932dd1deff20a30b13a8bb739d6a26fcdde4de4ab"}, + {file = "snowflake_connector_python-3.12.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:713a3eb457d8fae3a6a247b94942ad8fb2d754ab270df0fc7b205e9c5681d359"}, + {file = "snowflake_connector_python-3.12.2-cp38-cp38-win_amd64.whl", hash = "sha256:49f2bc6f6bb60d0955655e5eb7d9030a56449729d5b54fdc97e71067f59d6cd6"}, + {file = "snowflake_connector_python-3.12.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b435ab7e20c6b36a02e37cb59ea559a7f0c1ed177cea4ff99baa00c8be6d4c1d"}, + {file = "snowflake_connector_python-3.12.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:89972063397e88e0383c95126c26a9e0816d99c7b5ccd7590451a9a6ff4e22d6"}, + {file = "snowflake_connector_python-3.12.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3b8fc492ba1cc7d3c760224147d11358672b26a1841ec9d6fd3d4e23d96663"}, + {file = "snowflake_connector_python-3.12.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d819b87c01bfdb5a1cbadbebd2b2653b757cbf46431f867966108279476ce14e"}, + {file = "snowflake_connector_python-3.12.2-cp39-cp39-win_amd64.whl", hash = "sha256:bf3bf7d35d17298e35b9be1dbce5947d3605a03fe48f659308aebc8ca35a9b7f"}, + {file = "snowflake_connector_python-3.12.2.tar.gz", hash = "sha256:fd9bc2ab1bf5384d2c8b65bc00bb0475557d52f0477a71129334aab53f9679fd"}, ] [package.dependencies] @@ -7148,13 +7191,13 @@ tests = ["black", "httpretty (<1.1)", "isort", "pre-commit", "pytest", "pytest-r [[package]] name = "trove-classifiers" -version = "2024.7.2" +version = "2024.9.12" description = "Canonical source for classifiers on PyPI (pypi.org)." optional = false python-versions = "*" files = [ - {file = "trove_classifiers-2024.7.2-py3-none-any.whl", hash = "sha256:ccc57a33717644df4daca018e7ec3ef57a835c48e96a1e71fc07eb7edac67af6"}, - {file = "trove_classifiers-2024.7.2.tar.gz", hash = "sha256:8328f2ac2ce3fd773cbb37c765a0ed7a83f89dc564c7d452f039b69249d0ac35"}, + {file = "trove_classifiers-2024.9.12-py3-none-any.whl", hash = "sha256:f88a27a892891c87c5f8bbdf110710ae9e0a4725ea8e0fb45f1bcadf088a491f"}, + {file = "trove_classifiers-2024.9.12.tar.gz", hash = "sha256:4b46b3e134a4d01999ac5bc6e528afcc10cc48f0f724f185f267e276005768f4"}, ] [[package]] @@ -7223,13 +7266,13 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -7588,103 +7631,103 @@ files = [ [[package]] name = "yarl" -version = "1.11.0" +version = "1.11.1" description = "Yet another URL library" optional = true python-versions = ">=3.8" files = [ - {file = "yarl-1.11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0a657db1b9982f3dac0e360614d0e8945d2873da6e681fb7fca23ef1c3eb37f8"}, - {file = "yarl-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65a1a05efca52b102691e64db5fcf973030a1c88fee393804ff91f99c95a6e74"}, - {file = "yarl-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f4cb417d380e2d77961eecec75aaaf6f7ab14e6de26eb3a498f498029a6556a1"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8aee7c8378c6aa3103b99d1eb9995268ef730fa9f88ea68b9eee4341e204eec9"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84624db40e2358cfd5cf2558b1aaffd93366d27ee32228a97785f2ec87d44a17"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a596bb15e036952549871a4ccd2205679902dc7f241e3ced6b2ab2e44c55795"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d4d2cc4b076c8ad0175a15ee9482a387b3303c97d4b71062db7356b2ac04c7"}, - {file = "yarl-1.11.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f8bc849004122591104793a576e9c747b0e5d9486d6a30225521b817255748"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e38176a559edde0cfff4b663791a007a5f9f90c73aee1d6f7ddbcf6bfb7287b3"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:706ac0f77b45e9e0278ec6c98929764e119d3ce3136792b6475e7ae961da53ec"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:48bac099586cf75ae5837b0ac17a674450d01f451f38afcb02acfc940110b60b"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:540fd5f62fe21f3d1d9efe8af5c4d9dbbb184ce03ce95acb0289500e46215dd2"}, - {file = "yarl-1.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05ab59db0bb64e847972373c5cda8924e6605480f6b13cc04573fa0d87bfc637"}, - {file = "yarl-1.11.0-cp310-cp310-win32.whl", hash = "sha256:ddab47748933ac9cf5f29d6e9e2e2060cff40b2751d02c55129661ea4e577152"}, - {file = "yarl-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:976d02274e6d88b24c7131e7b26a083412b2592f2bbcef53d3b00b2508cad26c"}, - {file = "yarl-1.11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:39e3087e1ef70862de81e22af9eb299faee580f41673ef92829949022791b521"}, - {file = "yarl-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7fd535cc41b81a566ad347081b671ab5c7e5f5b6a15526d85b4e748baf065cf0"}, - {file = "yarl-1.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f7cc02d8e9a612174869f4b983f159e87659096f7e2dc1fe9effd9902e408739"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f391ccf4b1b1e0ba4880075ba337d41a619a5350f67053927f67ebe764bf44"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c19a0d95943bb2c914b4e71043803be34bc75c08c4a6ca232bdc649a1e9ef1b"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ead4d89eade0e09b8ef97877664abb0e2e8704787db5564f83658fdee5c36497"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:195f7791bc23d5f2480efe53f935daf8a61661000dfbfbdd70dbd06397594fff"}, - {file = "yarl-1.11.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a7905e662665ca8e058635377522bc3c98bdb873be761ff42c86eb72b03914"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53c80b1927b75aed208d7fd965a3a705dc8c1db4d50b9112418fa0f7784363e6"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:11af21bbf807688d49b7d4915bb28cbc2e3aa028a2ee194738477eabcc413c65"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:732d56da00ea7a5da4f0d15adbbd22dcb37da7825510aafde40112e53f6baa52"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7bd54d79025b59d1dc5fb26a09734d6a9cc651a04bc381966ed264b28331a168"}, - {file = "yarl-1.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aacd62ff67efd54cb18cea2aa7ae4fb83cfbca19a07055d4777266b70561defe"}, - {file = "yarl-1.11.0-cp311-cp311-win32.whl", hash = "sha256:68e14ae71e5b51c8282ae5db53ccb3baffc40e1551370a8a2361f1c1d8a0bf8c"}, - {file = "yarl-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:3ade2265716667b6bd4123d6f684b5f7cf4a8d83dcf1d5581ac44643466bb00a"}, - {file = "yarl-1.11.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6e73dab98e3c3b5441720153e72a5f28e717aac2d22f1ec4b08ef33417d9987e"}, - {file = "yarl-1.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4a0d090d296ced05edfe29c6ff34869412fa6a97d0928c12b00939c4842884cd"}, - {file = "yarl-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d29e446cfb0a82d3df7745968b9fa286665a9be8b4d68de46bcc32d917cb218e"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8dc0efcf8266ecfe057b95e01f43eb62516196a4bbf3918fd1dcb8d0dc0dff"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:202f5ec49ff163dcc767426deb55020a28078e61d6bbe1f80331d92bca53b236"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8055b0d78ce1cafa657c4b455e22661e8d3b2834de66a0753c3567da47fcc4aa"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60ed3c7f64e820959d7f682ec2f559b4f4df723dc09df619d269853a4214a4b4"}, - {file = "yarl-1.11.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2371510367d39d74997acfdcd1dead17938c79c99365482821627f7838a8eba0"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e24bb6a8be89ccc3ce8c47e8940fdfcb7429e9efbf65ce6fa3e7d122fcf0bcf0"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:18ec42da256cfcb9b4cd5d253e04c291f69911a5228d1438a7d431c15ba0ae40"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:418eeb8f228ea36c368bf6782ebd6016ecebfb1a8b90145ef6726ffcbba65ef8"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:07e8cfb1dd7669a129f8fd5df1da65efa73aea77582bde2a3a837412e2863543"}, - {file = "yarl-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c458483711d393dad51340505c3fab3194748fd06bab311d2f8b5b7a7349e9a"}, - {file = "yarl-1.11.0-cp312-cp312-win32.whl", hash = "sha256:5b008c3127382503e7a1e12b4c3a3236e3dd833a4c62a066f4a0fbd650c655d2"}, - {file = "yarl-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc94be7472b9f88d7441340534a3ecae05c86ccfec7ba75ce5b6e4778b2bfc6e"}, - {file = "yarl-1.11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a45e51ba3777031e0b20c1e7ab59114ed4e1884b3c1db48962c1d8d08aefb418"}, - {file = "yarl-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:765128029218eade3a01187cdd7f375977cc827505ed31828196c8ae9b622928"}, - {file = "yarl-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2516e238daf0339c8ac4dfab9d7cda9afad652ff073517f200d653d5d8371f7e"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10be62bee117f05b1ad75a6c2538ca9e5367342dc8a4f3c206c87dadbc1189c"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50ceaeda771ee3e382291168c90c7ede62b63ecf3e181024bcfeb35c0ea6c84f"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a601c99fc20fd0eea84e7bc0dc9e7f196f55a0ded67242d724988c754295538"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42ff79371614764fc0a4ab8eaba9adb493bf9ad856e2a4664f6c754fc907a903"}, - {file = "yarl-1.11.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93fca4c9f88c17ead902b3f3285b2d039fc8f26d117e1441973ba64315109b54"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e7dddf5f41395c84fc59e0ed5493b24bfeb39fb04823e880b52c8c55085d4695"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ea501ea07e14ba6364ff2621bfc8b2381e5b1e10353927fa9a607057fd2b98e5"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a4f7e470f2c9c8b8774a5bda72adfb8e9dc4ec32311fe9bdaa4921e36cf6659b"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:361fdb3993431157302b7104d525092b5df4d7d346df5a5ffeee2d1ca8e0d15b"}, - {file = "yarl-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e300eaf5e0329ad31b3d53e2f3d26b4b6dff1217207c6ab1d4212967b54b2185"}, - {file = "yarl-1.11.0-cp313-cp313-win32.whl", hash = "sha256:f1e2d4ce72e06e38a16da3e9c24a0520dbc19018a69ef6ed57b6b38527cb275c"}, - {file = "yarl-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:fa9de2f87be58f714a230bd1f3ef3aad1ed65c9931146e3fc55f85fcbe6bacc3"}, - {file = "yarl-1.11.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:24da0b38274727fe9266d09229987e7f0efdb97beb94c0bb2d327d65f112e78d"}, - {file = "yarl-1.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0310eb2e63872de66047e05ad9982f2e53ad6405dc42fa60d7cc670bf6ca8aa8"}, - {file = "yarl-1.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:52433604340a4ab3d1f32281c6eb9ad9b47c99435b4212f763121bf7348c8c00"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e2eb182d59f0845a79434003f94b4f61cd69465248f9388c2e5bf2191c9f7f"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3dd10f0fe0e0f659926c1da791de5bef05fd48974ad74618c9168e302e2b7cc"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:121d3798e4bb35a4321b2422cb887f80ea39f94bf52f0eb5cb2c168bb0043c9b"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8bbac56c80610dd659ace534765d7bcd2488f6600023f6984f35108b2b3f4f0"}, - {file = "yarl-1.11.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79d420399f0e82e302236a762d8b8ceec89761ce3b30c83ac1d4d6e29f811444"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a726fb50588307dfe1d233b67535d493fb0bb157bdbfda6bb34e04189f2f57"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9057f5de2fade7440e6db358913bc7ae8de43ba72c83cf95420a1fc1a6c6b59e"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6471d747d0ac8059895e66d32ca8630c8db5b572ca7763150d0927eaa257df67"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:d97cb22ad380850754fa16ef8d490d9340d8573d81f73429f3975e8e87db0586"}, - {file = "yarl-1.11.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fe78dec8caeda1e7b353cbd8aa0cc5a5bc182b22998d64ec8fa9ee59c898ab3b"}, - {file = "yarl-1.11.0-cp38-cp38-win32.whl", hash = "sha256:7ff371002fbbb79613269d76a2932c99979dac15fac30107064ef70d25f35474"}, - {file = "yarl-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:4fa9d762eee63eed767895d68b994c58e29f809292a4d0fca483e9cc6fdc22c8"}, - {file = "yarl-1.11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4ae63bc65e5bf8843bd1eca46e75eaa9eb157e0312fb362123181512892daad8"}, - {file = "yarl-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d1bd3262e00043907e0a6d7d4f7b7a4815281acc25699a2384552870c79f1f0"}, - {file = "yarl-1.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c58656c2e0b41b5d325130b8da4f8e216aad10029e7de5c523a6be25faa9fe8"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9425c333575fce5e0fb414b766492c6ba4aa335ef910a7540dbdefe58a78232e"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dc66e2420e1e282105071934883bbb9c37c16901b5b8aa0a8aee370b477eac6"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2949067359d1ef5bf3228c7f1deb102c209832a13df5419239f99449bc1d3fa9"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c006fe73f851cf20b9986b3b4cc15239795bd5da9c3fda76bb3e043da5bec4ff"}, - {file = "yarl-1.11.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:969ad4ee3892e893471b6572bbf2bbb091f93e7c81de25d6b3a5c0a5126e5ccb"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c9fbe9dc6ee8bfe1af34137e3add6f0e49799dd5467dd6af189d27616879161e"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69a45c711fea9b783b592a75f26f6dc59b2e4a923b97bf6eec357566fcb1d922"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:1a29b82c42a7791ffe53ee6dfbf29acc61ea7ec05643dcacc50510ed6187b897"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ed0c090f00c3fc024f7b0799cab9dd7c419fcd8f1a00634d1f9952bab7e7bfb2"}, - {file = "yarl-1.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:31df9d9b3fe6e15decee629fc7976a5fb21eaa39e290f60e57e1d422827194c6"}, - {file = "yarl-1.11.0-cp39-cp39-win32.whl", hash = "sha256:fcb7c36ba8b663a5900e6d40533f0e698ba0f38f744aad5410d4e38129e41a70"}, - {file = "yarl-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c6c0d640bad721834a737e25267fb71d296684ada21ca7d5ad2e63da7b73f1b7"}, - {file = "yarl-1.11.0-py3-none-any.whl", hash = "sha256:03717a6627e55934b2a1d9caf24f299b461a2e8d048a90920f42ad5c20ae1b82"}, - {file = "yarl-1.11.0.tar.gz", hash = "sha256:f86f4f4a57a29ef08fa70c4667d04c5e3ba513500da95586208b285437cb9592"}, + {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00"}, + {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d"}, + {file = "yarl-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46"}, + {file = "yarl-1.11.1-cp310-cp310-win32.whl", hash = "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91"}, + {file = "yarl-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998"}, + {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68"}, + {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe"}, + {file = "yarl-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e"}, + {file = "yarl-1.11.1-cp311-cp311-win32.whl", hash = "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6"}, + {file = "yarl-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b"}, + {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0"}, + {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265"}, + {file = "yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45"}, + {file = "yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447"}, + {file = "yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639"}, + {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c"}, + {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e"}, + {file = "yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da"}, + {file = "yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979"}, + {file = "yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367"}, + {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4"}, + {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b"}, + {file = "yarl-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420"}, + {file = "yarl-1.11.1-cp38-cp38-win32.whl", hash = "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a"}, + {file = "yarl-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6"}, + {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269"}, + {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26"}, + {file = "yarl-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df"}, + {file = "yarl-1.11.1-cp39-cp39-win32.whl", hash = "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74"}, + {file = "yarl-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0"}, + {file = "yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38"}, + {file = "yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53"}, ] [package.dependencies] @@ -7693,13 +7736,13 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.20.1" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, - {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] diff --git a/requirements-dev.txt b/requirements-dev.txt index 49007e64d70f..0fbab1bb81f4 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -77,7 +77,7 @@ google-crc32c==1.6.0 ; python_version >= "3.10" and python_version < "4.0" google-resumable-media==2.7.2 ; python_version >= "3.10" and python_version < "4.0" googleapis-common-protos==1.65.0 ; python_version >= "3.10" and python_version < "4.0" graphviz==0.20.3 ; python_version >= "3.10" and python_version < "4.0" -greenlet==3.0.3 ; python_version < "3.13" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") and python_version >= "3.10" +greenlet==3.1.0 ; python_version < "3.13" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") and python_version >= "3.10" griffe==0.49.0 ; python_version >= "3.10" and python_version < "3.13" grpcio-status==1.66.1 ; python_version >= "3.10" and python_version < "4.0" grpcio==1.66.1 ; python_version >= "3.10" and python_version < "4.0" @@ -85,11 +85,11 @@ h11==0.14.0 ; python_version >= "3.10" and python_version < "3.13" httpcore==1.0.5 ; python_version >= "3.10" and python_version < "3.13" httpx==0.27.2 ; python_version >= "3.10" and python_version < "3.13" humanize==4.10.0 ; python_version >= "3.10" and python_version < "4.0" -hypothesis==6.112.0 ; python_version >= "3.10" and python_version < "4.0" -identify==2.6.0 ; python_version >= "3.10" and python_version < "4.0" -idna==3.8 ; python_version >= "3.10" and python_version < "4.0" -importlib-metadata==8.4.0 ; python_version >= "3.10" and python_version < "4.0" -importlib-resources==6.4.4 ; python_version >= "3.10" and python_version < "4.0" +hypothesis==6.112.1 ; python_version >= "3.10" and python_version < "4.0" +identify==2.6.1 ; python_version >= "3.10" and python_version < "4.0" +idna==3.10 ; python_version >= "3.10" and python_version < "4.0" +importlib-metadata==8.5.0 ; python_version >= "3.10" and python_version < "4.0" +importlib-resources==6.4.5 ; python_version >= "3.10" and python_version < "4.0" impyla==0.19.0 ; python_version >= "3.10" and python_version < "4.0" iniconfig==2.0.0 ; python_version >= "3.10" and python_version < "4.0" installer==0.7.0 ; python_version >= "3.10" and python_version < "4.0" @@ -134,10 +134,10 @@ mdurl==0.1.2 ; python_version >= "3.10" and python_version < "4.0" mistune==3.0.2 ; python_version >= "3.10" and python_version < "3.13" mizani==0.11.4 ; python_version >= "3.10" and python_version < "3.13" more-itertools==10.5.0 ; python_version >= "3.10" and python_version < "4.0" -msgpack==1.0.8 ; python_version >= "3.10" and python_version < "4.0" -multidict==6.0.5 ; python_version >= "3.10" and python_version < "4.0" +msgpack==1.1.0 ; python_version >= "3.10" and python_version < "4.0" +multidict==6.1.0 ; python_version >= "3.10" and python_version < "4.0" mypy-extensions==1.0.0 ; python_version >= "3.10" and python_version < "4.0" -narwhals==1.6.3 ; python_version >= "3.10" and python_version < "3.13" +narwhals==1.8.1 ; python_version >= "3.10" and python_version < "3.13" nbclient==0.10.0 ; python_version >= "3.10" and python_version < "3.13" nbconvert==7.16.4 ; python_version >= "3.10" and python_version < "3.13" nbformat==5.10.4 ; python_version >= "3.10" and python_version < "3.13" @@ -161,22 +161,22 @@ pexpect==4.9.0 ; python_version >= "3.10" and python_version < "4.0" pillow==10.4.0 ; python_version >= "3.10" and python_version < "3.13" pins[gcs]==0.8.6 ; python_version >= "3.10" and python_version < "4.0" pkginfo==1.11.1 ; python_version >= "3.10" and python_version < "4.0" -platformdirs==4.3.2 ; python_version >= "3.10" and python_version < "4.0" -plotly==5.24.0 ; python_version >= "3.10" and python_version < "3.13" +platformdirs==4.3.3 ; python_version >= "3.10" and python_version < "4.0" +plotly==5.24.1 ; python_version >= "3.10" and python_version < "3.13" plotnine==0.13.6 ; python_version >= "3.10" and python_version < "3.13" pluggy==1.5.0 ; python_version >= "3.10" and python_version < "4.0" plum-dispatch==2.5.2 ; python_version >= "3.10" and python_version < "3.13" poetry-core==1.9.0 ; python_version >= "3.10" and python_version < "4.0" -poetry-dynamic-versioning==1.4.0 ; python_version >= "3.10" and python_version < "4.0" +poetry-dynamic-versioning==1.4.1 ; python_version >= "3.10" and python_version < "4.0" poetry-plugin-export==1.8.0 ; python_version >= "3.10" and python_version < "4.0" poetry==1.8.3 ; python_version >= "3.10" and python_version < "4.0" -polars==1.6.0 ; python_version >= "3.10" and python_version < "4.0" +polars==1.7.1 ; python_version >= "3.10" and python_version < "4.0" pprintpp==0.4.0 ; python_version >= "3.10" and python_version < "4.0" pre-commit==3.8.0 ; python_version >= "3.10" and python_version < "4.0" prometheus-client==0.20.0 ; python_version >= "3.10" and python_version < "3.13" prompt-toolkit==3.0.47 ; python_version >= "3.10" and python_version < "4.0" proto-plus==1.24.0 ; python_version >= "3.10" and python_version < "4.0" -protobuf==5.28.0 ; python_version >= "3.10" and python_version < "4.0" +protobuf==5.28.1 ; python_version >= "3.10" and python_version < "4.0" psutil==6.0.0 ; python_version >= "3.10" and python_version < "3.13" psycopg2==2.9.9 ; python_version >= "3.10" and python_version < "4.0" psygnal==0.11.1 ; python_version >= "3.10" and python_version < "3.13" @@ -187,14 +187,14 @@ py-cpuinfo==9.0.0 ; python_version >= "3.10" and python_version < "4.0" py4j==0.10.9.7 ; python_version >= "3.10" and python_version < "4.0" pyarrow-hotfix==0.6 ; python_version >= "3.10" and python_version < "4.0" pyarrow==17.0.0 ; python_version >= "3.10" and python_version < "4.0" -pyasn1-modules==0.4.0 ; python_version >= "3.10" and python_version < "4.0" -pyasn1==0.6.0 ; python_version >= "3.10" and python_version < "4" +pyasn1-modules==0.4.1 ; python_version >= "3.10" and python_version < "4.0" +pyasn1==0.6.1 ; python_version >= "3.10" and python_version < "4" pycparser==2.22 ; python_version >= "3.10" and python_version < "4.0" pydantic-core==2.23.3 ; python_version >= "3.10" and python_version < "3.13" pydantic==2.9.1 ; python_version >= "3.10" and python_version < "3.13" pydata-google-auth==1.8.2 ; python_version >= "3.10" and python_version < "4.0" pydruid==0.6.9 ; python_version >= "3.10" and python_version < "4.0" -pyexasol[pandas]==0.26.0 ; python_version >= "3.10" and python_version < "4.0" +pyexasol[pandas]==0.27.0 ; python_version >= "3.10" and python_version < "4.0" pygments==2.18.0 ; python_version >= "3.10" and python_version < "4.0" pyinstrument==4.7.3 ; python_version >= "3.10" and python_version < "4.0" pyjwt==2.9.0 ; python_version >= "3.10" and python_version < "4.0" @@ -217,10 +217,10 @@ pytest-repeat==0.9.3 ; python_version >= "3.10" and python_version < "4.0" pytest-snapshot==0.9.0 ; python_version >= "3.10" and python_version < "4.0" pytest-timeout==2.3.1 ; python_version >= "3.10" and python_version < "4.0" pytest-xdist==3.6.1 ; python_version >= "3.10" and python_version < "4.0" -pytest==8.3.2 ; python_version >= "3.10" and python_version < "4.0" +pytest==8.3.3 ; python_version >= "3.10" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "4.0" python-json-logger==2.0.7 ; python_version >= "3.10" and python_version < "3.13" -pytz==2024.1 ; python_version >= "3.10" and python_version < "4.0" +pytz==2024.2 ; python_version >= "3.10" and python_version < "4.0" pywin32-ctypes==0.2.3 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32" pywin32==306 ; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_version >= "3.10" and python_version < "3.13" pywinpty==2.0.13 ; python_version >= "3.10" and python_version < "3.13" and os_name == "nt" @@ -229,7 +229,7 @@ pyzmq==26.2.0 ; python_version >= "3.10" and python_version < "3.13" quartodoc==0.7.6 ; python_version >= "3.10" and python_version < "3.13" rapidfuzz==3.9.7 ; python_version >= "3.10" and python_version < "4.0" referencing==0.35.1 ; python_version >= "3.10" and python_version < "3.13" -regex==2024.7.24 ; python_version >= "3.10" and python_version < "4.0" +regex==2024.9.11 ; python_version >= "3.10" and python_version < "4.0" requests-oauthlib==2.0.0 ; python_version >= "3.10" and python_version < "4.0" requests-toolbelt==1.0.0 ; python_version >= "3.10" and python_version < "4.0" requests==2.32.3 ; python_version >= "3.10" and python_version < "4.0" @@ -238,18 +238,18 @@ rfc3986-validator==0.1.1 ; python_version >= "3.10" and python_version < "3.13" rich==13.8.1 ; python_version >= "3.10" and python_version < "4.0" rpds-py==0.20.0 ; python_version >= "3.10" and python_version < "3.13" rsa==4.9 ; python_version >= "3.10" and python_version < "4" -ruff==0.6.4 ; python_version >= "3.10" and python_version < "4.0" -scikit-learn==1.5.1 ; python_version >= "3.10" and python_version < "3.13" +ruff==0.6.5 ; python_version >= "3.10" and python_version < "4.0" +scikit-learn==1.5.2 ; python_version >= "3.10" and python_version < "3.13" scipy==1.14.1 ; python_version >= "3.10" and python_version < "3.13" seaborn==0.13.2 ; python_version >= "3.10" and python_version < "3.13" secretstorage==3.3.3 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "linux" send2trash==1.8.3 ; python_version >= "3.10" and python_version < "3.13" -setuptools==74.1.2 ; python_version >= "3.10" and python_version < "4.0" +setuptools==75.0.0 ; python_version >= "3.10" and python_version < "4.0" shapely==2.0.6 ; python_version >= "3.10" and python_version < "4.0" shellingham==1.5.4 ; python_version >= "3.10" and python_version < "4.0" six==1.16.0 ; python_version >= "3.10" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.10" and python_version < "3.13" -snowflake-connector-python==3.12.1 ; python_version >= "3.10" and python_version < "4.0" +snowflake-connector-python==3.12.2 ; python_version >= "3.10" and python_version < "4.0" sortedcontainers==2.4.0 ; python_version >= "3.10" and python_version < "4.0" soupsieve==2.6 ; python_version >= "3.10" and python_version < "3.13" sphobjinv==2.3.1.1 ; python_version >= "3.10" and python_version < "3.13" @@ -271,13 +271,13 @@ tornado==6.4.1 ; python_version >= "3.10" and python_version < "3.13" tqdm==4.66.5 ; python_version >= "3.10" and python_version < "4.0" traitlets==5.14.3 ; python_version >= "3.10" and python_version < "4.0" trino==0.329.0 ; python_version >= "3.10" and python_version < "4.0" -trove-classifiers==2024.7.2 ; python_version >= "3.10" and python_version < "4.0" +trove-classifiers==2024.9.12 ; python_version >= "3.10" and python_version < "4.0" types-python-dateutil==2.9.0.20240906 ; python_version >= "3.10" and python_version < "3.13" typing-extensions==4.12.2 ; python_version >= "3.10" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.10" and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.10" and python_version < "4.0" uri-template==1.3.0 ; python_version >= "3.10" and python_version < "3.13" -urllib3==2.2.2 ; python_version >= "3.10" and python_version < "4.0" +urllib3==2.2.3 ; python_version >= "3.10" and python_version < "4.0" virtualenv==20.26.4 ; python_version >= "3.10" and python_version < "4.0" watchdog==5.0.2 ; python_version >= "3.10" and python_version < "3.13" wcwidth==0.2.13 ; python_version >= "3.10" and python_version < "4.0" @@ -288,6 +288,6 @@ werkzeug==3.0.4 ; python_version >= "3.10" and python_version < "4.0" widgetsnbextension==4.0.13 ; python_version >= "3.10" and python_version < "3.13" xattr==1.1.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "darwin" xxhash==3.5.0 ; python_version >= "3.10" and python_version < "4.0" -yarl==1.11.0 ; python_version >= "3.10" and python_version < "4.0" -zipp==3.20.1 ; python_version >= "3.10" and python_version < "4.0" +yarl==1.11.1 ; python_version >= "3.10" and python_version < "4.0" +zipp==3.20.2 ; python_version >= "3.10" and python_version < "4.0" zstandard==0.23.0 ; python_version >= "3.10" and python_version < "4.0" From b31fcc624755becae76781be1213e1a9ea8b1ff0 Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Tue, 17 Sep 2024 06:23:54 -0400 Subject: [PATCH 04/16] refactor(padding): follow python string padding conventions (#10096) BREAKING CHANGE: String padding operations now follow Python semantics and leave strings greater than the padding length untouched. --- .../test_string_builtins/lpad_char/out.sql | 2 +- .../test_string_builtins/lpad_default/out.sql | 2 +- .../test_string_builtins/rpad_char/out.sql | 2 +- .../test_string_builtins/rpad_default/out.sql | 2 +- ibis/backends/impala/tests/test_exprs.py | 4 +- ibis/backends/sql/compilers/base.py | 8 +- .../sql/compilers/bigquery/__init__.py | 2 - ibis/backends/sql/compilers/clickhouse.py | 10 ++ ibis/backends/sql/compilers/datafusion.py | 14 ++ ibis/backends/sql/compilers/duckdb.py | 14 ++ ibis/backends/sql/compilers/flink.py | 14 ++ ibis/backends/sql/compilers/mssql.py | 2 +- ibis/backends/sql/compilers/oracle.py | 8 +- ibis/backends/sqlite/udf.py | 4 +- .../test_sql/test_no_cart_join/out.sql | 19 ++- ibis/backends/tests/test_string.py | 137 +++++++++++++++--- 16 files changed, 206 insertions(+), 38 deletions(-) diff --git a/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/lpad_char/out.sql b/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/lpad_char/out.sql index 83db8a156a2f..79413b65c4aa 100644 --- a/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/lpad_char/out.sql +++ b/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/lpad_char/out.sql @@ -1,3 +1,3 @@ SELECT - LPAD(`t0`.`string_col`, 1, 'a') AS `LPad(string_col, 1, 'a')` + LPAD(`t0`.`string_col`, GREATEST(LENGTH(`t0`.`string_col`), 1), 'a') AS `LPad(string_col, 1, 'a')` FROM `functional_alltypes` AS `t0` \ No newline at end of file diff --git a/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/lpad_default/out.sql b/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/lpad_default/out.sql index 8776196103c9..d575554de10f 100644 --- a/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/lpad_default/out.sql +++ b/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/lpad_default/out.sql @@ -1,3 +1,3 @@ SELECT - LPAD(`t0`.`string_col`, 25, ' ') AS `LPad(string_col, 25, ' ')` + LPAD(`t0`.`string_col`, GREATEST(LENGTH(`t0`.`string_col`), 25), ' ') AS `LPad(string_col, 25, ' ')` FROM `functional_alltypes` AS `t0` \ No newline at end of file diff --git a/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/rpad_char/out.sql b/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/rpad_char/out.sql index 23314bf1cafa..762059fc07fc 100644 --- a/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/rpad_char/out.sql +++ b/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/rpad_char/out.sql @@ -1,3 +1,3 @@ SELECT - RPAD(`t0`.`string_col`, 1, 'a') AS `RPad(string_col, 1, 'a')` + RPAD(`t0`.`string_col`, GREATEST(LENGTH(`t0`.`string_col`), 1), 'a') AS `RPad(string_col, 1, 'a')` FROM `functional_alltypes` AS `t0` \ No newline at end of file diff --git a/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/rpad_default/out.sql b/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/rpad_default/out.sql index c2f18f32a5ce..440043d095e5 100644 --- a/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/rpad_default/out.sql +++ b/ibis/backends/impala/tests/snapshots/test_string_builtins/test_string_builtins/rpad_default/out.sql @@ -1,3 +1,3 @@ SELECT - RPAD(`t0`.`string_col`, 25, ' ') AS `RPad(string_col, 25, ' ')` + RPAD(`t0`.`string_col`, GREATEST(LENGTH(`t0`.`string_col`), 25), ' ') AS `RPad(string_col, 25, ' ')` FROM `functional_alltypes` AS `t0` \ No newline at end of file diff --git a/ibis/backends/impala/tests/test_exprs.py b/ibis/backends/impala/tests/test_exprs.py index 84949ba314be..98e548d4a28b 100644 --- a/ibis/backends/impala/tests/test_exprs.py +++ b/ibis/backends/impala/tests/test_exprs.py @@ -295,9 +295,9 @@ def test_decimal_builtins_2(con, func, expected): (L("0123").translate("012", "abc"), "abc3"), (L("abcd").find("a"), 0), (L("baaaab").find("b", 2), 5), - (L("abcd").lpad(1, "-"), "a"), + (L("abcd").lpad(1, "-"), "abcd"), (L("abcd").lpad(5), " abcd"), - (L("abcd").rpad(1, "-"), "a"), + (L("abcd").rpad(1, "-"), "abcd"), (L("abcd").rpad(5), "abcd "), (L("abcd").find_in_set(["a", "b", "abcd"]), 2), (L(", ").join(["a", "b"]), "a, b"), diff --git a/ibis/backends/sql/compilers/base.py b/ibis/backends/sql/compilers/base.py index b4af50aa3ceb..f8ceaf71f5f3 100644 --- a/ibis/backends/sql/compilers/base.py +++ b/ibis/backends/sql/compilers/base.py @@ -331,7 +331,6 @@ class SQLGlotCompiler(abc.ABC): ops.IsInf: "isinf", ops.IsNan: "isnan", ops.JSONGetItem: "json_extract", - ops.LPad: "lpad", LastValue: "last_value", ops.Levenshtein: "levenshtein", ops.Ln: "ln", @@ -347,7 +346,6 @@ class SQLGlotCompiler(abc.ABC): ops.PercentRank: "percent_rank", ops.Pi: "pi", ops.Power: "pow", - ops.RPad: "rpad", ops.Radians: "radians", ops.RegexSearch: "regexp_like", ops.RegexSplit: "regexp_split", @@ -985,6 +983,12 @@ def visit_RStrip(self, op, *, arg): def visit_LStrip(self, op, *, arg): return self.f.ltrim(arg, string.whitespace) + def visit_LPad(self, op, *, arg, length, pad): + return self.f.lpad(arg, self.f.greatest(self.f.length(arg), length), pad) + + def visit_RPad(self, op, *, arg, length, pad): + return self.f.rpad(arg, self.f.greatest(self.f.length(arg), length), pad) + def visit_Substring(self, op, *, arg, start, length): if isinstance(op.length, ops.Literal) and (value := op.length.value) < 0: raise com.IbisInputError( diff --git a/ibis/backends/sql/compilers/bigquery/__init__.py b/ibis/backends/sql/compilers/bigquery/__init__.py index b9c0ed990fde..0e8f3a7d3017 100644 --- a/ibis/backends/sql/compilers/bigquery/__init__.py +++ b/ibis/backends/sql/compilers/bigquery/__init__.py @@ -183,8 +183,6 @@ class BigQueryCompiler(SQLGlotCompiler): ops.IsInf: "is_inf", ops.IsNan: "is_nan", ops.Log10: "log10", - ops.LPad: "lpad", - ops.RPad: "rpad", ops.Levenshtein: "edit_distance", ops.Modulus: "mod", ops.RegexReplace: "regexp_replace", diff --git a/ibis/backends/sql/compilers/clickhouse.py b/ibis/backends/sql/compilers/clickhouse.py index f7fa8af6fd87..3b7ca75147b5 100644 --- a/ibis/backends/sql/compilers/clickhouse.py +++ b/ibis/backends/sql/compilers/clickhouse.py @@ -480,6 +480,16 @@ def visit_Strip(self, op, *, arg): this=arg, position="BOTH", expression=sge.Literal.string(whitespace) ) + def visit_LPad(self, op, *, arg, length, pad): + return self.f.leftPadUTF8( + arg, self.f.greatest(self.f.lengthUTF8(arg), length), pad + ) + + def visit_RPad(self, op, *, arg, length, pad): + return self.f.rightPadUTF8( + arg, self.f.greatest(self.f.lengthUTF8(arg), length), pad + ) + def visit_DayOfWeekIndex(self, op, *, arg): weekdays = len(calendar.day_name) return (((self.f.toDayOfWeek(arg) - 1) % weekdays) + weekdays) % weekdays diff --git a/ibis/backends/sql/compilers/datafusion.py b/ibis/backends/sql/compilers/datafusion.py index b12060a0b447..b527663a6394 100644 --- a/ibis/backends/sql/compilers/datafusion.py +++ b/ibis/backends/sql/compilers/datafusion.py @@ -207,6 +207,20 @@ def visit_RegexSearch(self, op, *, arg, pattern): def visit_StringContains(self, op, *, haystack, needle): return self.f.strpos(haystack, needle) > sg.exp.convert(0) + def visit_LPad(self, op, *, arg, length, pad): + return self.if_( + length <= self.f.length(arg), + arg, + self.f.concat(self.f.repeat(pad, length - self.f.length(arg)), arg), + ) + + def visit_RPad(self, op, *, arg, length, pad): + return self.if_( + length <= self.f.length(arg), + arg, + self.f.concat(arg, self.f.repeat(pad, length - self.f.length(arg))), + ) + def visit_ExtractFragment(self, op, *, arg): return self.f.extract_url_field(arg, "fragment") diff --git a/ibis/backends/sql/compilers/duckdb.py b/ibis/backends/sql/compilers/duckdb.py index 76082a5c29eb..da0ecd45dc7e 100644 --- a/ibis/backends/sql/compilers/duckdb.py +++ b/ibis/backends/sql/compilers/duckdb.py @@ -568,6 +568,20 @@ def visit_Hash(self, op, *, arg): def visit_StringConcat(self, op, *, arg): return reduce(lambda x, y: sge.DPipe(this=x, expression=y), arg) + def visit_LPad(self, op, *, arg, length, pad): + return self.if_( + length <= self.f.length(arg), + arg, + self.f.concat(self.f.repeat(pad, length - self.f.length(arg)), arg), + ) + + def visit_RPad(self, op, *, arg, length, pad): + return self.if_( + length <= self.f.length(arg), + arg, + self.f.concat(arg, self.f.repeat(pad, length - self.f.length(arg))), + ) + def visit_StringSlice(self, op, *, arg, start, end): if start is not None: start += 1 diff --git a/ibis/backends/sql/compilers/flink.py b/ibis/backends/sql/compilers/flink.py index ff50258b327c..9d9b0a45f69c 100644 --- a/ibis/backends/sql/compilers/flink.py +++ b/ibis/backends/sql/compilers/flink.py @@ -518,6 +518,20 @@ def visit_StringFind(self, op, *, arg, substr, start, end): return self.f.instr(arg, substr) + def visit_LPad(self, op, *, arg, length, pad): + return self.if_( + length <= self.f.length(arg), + arg, + self.f.concat(self.f.repeat(pad, length - self.f.length(arg)), arg), + ) + + def visit_RPad(self, op, *, arg, length, pad): + return self.if_( + length <= self.f.length(arg), + arg, + self.f.concat(arg, self.f.repeat(pad, length - self.f.length(arg))), + ) + def visit_StartsWith(self, op, *, arg, start): return self.f.left(arg, self.f.char_length(start)).eq(start) diff --git a/ibis/backends/sql/compilers/mssql.py b/ibis/backends/sql/compilers/mssql.py index cadc8b30cc1b..70215fed821a 100644 --- a/ibis/backends/sql/compilers/mssql.py +++ b/ibis/backends/sql/compilers/mssql.py @@ -528,7 +528,7 @@ def visit_LPad(self, op, *, arg, length, pad): return self.if_( length <= self.f.length(arg), arg, - self.f.left( + self.f.right( self.f.concat(self.f.replicate(pad, length - self.f.length(arg)), arg), length, ), diff --git a/ibis/backends/sql/compilers/oracle.py b/ibis/backends/sql/compilers/oracle.py index 103f5deeec7f..faee258b10e4 100644 --- a/ibis/backends/sql/compilers/oracle.py +++ b/ibis/backends/sql/compilers/oracle.py @@ -82,8 +82,6 @@ class OracleCompiler(SQLGlotCompiler): ops.BitXor: "bit_xor_agg", ops.BitwiseAnd: "bitand", ops.Hash: "ora_hash", - ops.LPad: "lpad", - ops.RPad: "rpad", ops.StringAscii: "ascii", ops.Mode: "stats_mode", } @@ -275,6 +273,12 @@ def visit_StringContains(self, op, *, haystack, needle): def visit_StringJoin(self, op, *, arg, sep): return self.f.concat(*toolz.interpose(sep, arg)) + def visit_LPad(self, op, *, arg, length, pad): + return self.f.lpad(arg, self.f.greatest(self.f.length(arg), length), pad) + + def visit_RPad(self, op, *, arg, length, pad): + return self.f.rpad(arg, self.f.greatest(self.f.length(arg), length), pad) + ## Aggregate stuff def visit_Correlation(self, op, *, left, right, where, how): diff --git a/ibis/backends/sqlite/udf.py b/ibis/backends/sqlite/udf.py index afaf1490ea19..536b622b2b05 100644 --- a/ibis/backends/sqlite/udf.py +++ b/ibis/backends/sqlite/udf.py @@ -258,12 +258,12 @@ def _ibis_string_ascii(string): @udf def _ibis_rpad(string, width, pad): - return string.ljust(width, pad)[:width] + return string.ljust(width, pad) @udf def _ibis_lpad(string, width, pad): - return string.rjust(width, pad)[:width] + return string.rjust(width, pad) @udf diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_no_cart_join/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_no_cart_join/out.sql index 9139f2ed68a5..b586ab67ebbd 100644 --- a/ibis/backends/tests/sql/snapshots/test_sql/test_no_cart_join/out.sql +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_no_cart_join/out.sql @@ -19,9 +19,22 @@ FROM ( "t1"."ancestor_level_number", "t1"."ancestor_node_sort_order", "t1"."descendant_node_natural_key", - LPAD('-', ( - "t1"."ancestor_level_number" - 1 - ) * 7, '-') || "t1"."ancestor_level_name" AS "product_level_name" + CASE + WHEN ( + ( + "t1"."ancestor_level_number" - 1 + ) * 7 + ) <= LENGTH('-') + THEN '-' + ELSE CONCAT( + REPEAT('-', ( + ( + "t1"."ancestor_level_number" - 1 + ) * 7 + ) - LENGTH('-')), + '-' + ) + END || "t1"."ancestor_level_name" AS "product_level_name" FROM "products" AS "t1" ) AS "t4" ON "t2"."product_id" = "t4"."descendant_node_natural_key" diff --git a/ibis/backends/tests/test_string.py b/ibis/backends/tests/test_string.py index 8e44e31d86e9..cb51c30aa273 100644 --- a/ibis/backends/tests/test_string.py +++ b/ibis/backends/tests/test_string.py @@ -1079,55 +1079,69 @@ def string_temp_table(backend, con): ), param( lambda t: t.string_col.rpad(4, "-"), - lambda t: t.str[:4].str.pad(4, side="right", fillchar="-"), + lambda t: t.str.pad(4, side="right", fillchar="-"), id="rpad", marks=[ pytest.mark.notyet( - ["flink", "oracle"], + ["oracle"], raises=AssertionError, - reason="Treats len(🐍) == 2 so padding is off", + reason="Treats len(🐍) == 2", ), pytest.mark.notyet( - ["impala"], + ["impala", "mysql"], raises=AssertionError, - reason="Treats len(🐍) == 4, len(Éé) == 4", + reason="Treats len(🐍) == 4 and accented characters as len 2", ), + ], + ), + param( + lambda t: t.string_col.rpad(8, "-"), + lambda t: t.str.pad(8, side="right", fillchar="-"), + id="rpad_gt", + marks=[ pytest.mark.notyet( - ["mssql", "polars"], + ["oracle"], raises=AssertionError, - reason="Python style padding, e.g. doesn't trim strings to pad-length", + reason="Treats len(🐍) == 2", ), pytest.mark.notyet( - ["clickhouse"], + ["impala", "mysql"], raises=AssertionError, - reason="Can use rightPadUTF8 instead", + reason="Treats len(🐍) == 4 and accented characters as len 2", ), ], ), param( lambda t: t.string_col.lpad(4, "-"), - lambda t: t.str[:4].str.pad(4, side="left", fillchar="-"), - id="lpad", + lambda t: t.str.pad(4, side="left", fillchar="-"), + id="lpad_lt", marks=[ pytest.mark.notyet( - ["flink", "oracle"], + ["oracle"], raises=AssertionError, - reason="Treats len(🐍) == 2 so padding is off", + reason="Treats len(🐍) == 2", ), pytest.mark.notyet( - ["impala"], + ["impala", "mysql"], raises=AssertionError, - reason="Treats len(🐍) == 4, len(Éé) == 4", + reason="Treats len(🐍) == 4 and accented characters as len 2", ), + ], + ), + param( + lambda t: t.string_col.lpad(8, "-"), + lambda t: t.str.pad(8, side="left", fillchar="-"), + id="lpad_gt", + marks=[ pytest.mark.notyet( - ["mssql", "polars"], + ["oracle"], raises=AssertionError, - reason="Python style padding, e.g. doesn't trim strings to pad-length", + reason="Treats len(🐍) == 2", ), pytest.mark.notyet( - ["clickhouse"], + ["impala", "mysql"], raises=AssertionError, - reason="Can use leftPadUTF8 instead", + reason="Treats len(🐍) == 4 and accented characters as len 2", ), ], ), @@ -1279,7 +1293,9 @@ def string_temp_table(backend, con): ), ], ) -def test_string_methods_no_regex(string_temp_table, backend, result_mut, expected_func): +def test_string_methods_accents_and_emoji( + string_temp_table, backend, result_mut, expected_func +): """ ┏━━━━━━━━━━━━┓ ┃ string_col ┃ @@ -1304,3 +1320,84 @@ def test_string_methods_no_regex(string_temp_table, backend, result_mut, expecte expected = expected_func(series) backend.assert_series_equal(result, expected) + + +@pytest.fixture(scope="session") +def string_temp_table_no_complications(backend, con): + better_strings = pd.DataFrame( + { + "string_col": [ + "AbC\t", + "\n123\n ", + "abc, 123", + "123", + "aBc", + ], + "index_col": [0, 1, 2, 3, 4], + } + ) + + temp_table_name = gen_name("strings") + temp = backend.name() not in ["exasol", "impala", "pyspark", "risingwave", "trino"] + if backend.name() == "datafusion": + temp = None + if backend.name() == "druid": + yield "I HATE DRUID" + else: + t = con.create_table(temp_table_name, better_strings, temp=temp) + yield t + con.drop_table(temp_table_name, force=True) + + +@pytest.mark.never(["druid"], reason="can't create tables") +@pytest.mark.parametrize( + "result_mut, expected_func", + [ + param( + lambda t: t.string_col.rpad(4, "-"), + lambda t: t.str.pad(4, side="right", fillchar="-"), + id="rpad_lt", + ), + param( + lambda t: t.string_col.rpad(8, "-"), + lambda t: t.str.pad(8, side="right", fillchar="-"), + id="rpad_gt", + ), + param( + lambda t: t.string_col.lpad(4, "-"), + lambda t: t.str.pad(4, side="left", fillchar="-"), + id="lpad_lt", + ), + param( + lambda t: t.string_col.lpad(8, "-"), + lambda t: t.str.pad(8, side="left", fillchar="-"), + id="lpad_gt", + ), + ], +) +def test_string_methods_no_accents_and_no_emoji( + string_temp_table_no_complications, backend, result_mut, expected_func +): + """ + ┏━━━━━━━━━━━━┓ + ┃ string_col ┃ + ┡━━━━━━━━━━━━┩ + │ string │ + ├────────────┤ + │ AbC\t │ + │ \n123\n │ + │ abc, 123 │ + │ 123 │ + │ aBc │ + └────────────┘ + """ + # TODO: figure out a better organization for this + t = string_temp_table_no_complications + series = t.order_by(t.index_col).string_col.name("tmp").to_pandas() + + expr = t.mutate(string_col=result_mut).order_by(t.index_col) + result = expr.string_col.name("tmp").to_pandas() + + expected = expected_func(series) + + backend.assert_series_equal(result, expected) From e7cfc11b6b2644419281658957181000384ed096 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 10:28:16 +0000 Subject: [PATCH 05/16] fix(deps): update dependency datafusion to v41 (#10147) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Phillip Cloud <417981+cpcloud@users.noreply.github.com> --- ibis/backends/datafusion/__init__.py | 6 +-- ibis/backends/tests/test_aggregation.py | 4 +- ibis/backends/tests/test_map.py | 45 +++++++++++++++++++--- ibis/backends/tests/tpc/ds/test_queries.py | 17 +------- poetry.lock | 15 ++++---- pyproject.toml | 2 +- requirements-dev.txt | 2 +- 7 files changed, 57 insertions(+), 34 deletions(-) diff --git a/ibis/backends/datafusion/__init__.py b/ibis/backends/datafusion/__init__.py index 8572ceadfe22..0570f163e9f9 100644 --- a/ibis/backends/datafusion/__init__.py +++ b/ibis/backends/datafusion/__init__.py @@ -421,7 +421,7 @@ def _register_in_memory_table(self, op: ops.InMemoryTable) -> None: # self.con.register_table is broken, so we do this roundabout thing # of constructing a datafusion DataFrame, which has a side effect # of registering the table - self.con.from_arrow_table(op.data.to_pyarrow(op.schema), op.name) + self.con.from_arrow(op.data.to_pyarrow(op.schema), op.name) def read_csv( self, path: str | Path, table_name: str | None = None, **kwargs: Any @@ -757,14 +757,14 @@ def _polars(source, table_name, _conn, overwrite: bool = False): def _pyarrow_table(source, table_name, _conn, overwrite: bool = False): tmp_name = gen_name("pyarrow") with _create_and_drop_memtable(_conn, table_name, tmp_name, overwrite): - _conn.con.from_arrow_table(source, name=tmp_name) + _conn.con.from_arrow(source, name=tmp_name) @_read_in_memory.register("pyarrow.RecordBatchReader") def _pyarrow_rbr(source, table_name, _conn, overwrite: bool = False): tmp_name = gen_name("pyarrow") with _create_and_drop_memtable(_conn, table_name, tmp_name, overwrite): - _conn.con.from_arrow_table(source.read_all(), name=tmp_name) + _conn.con.from_arrow(source.read_all(), name=tmp_name) @_read_in_memory.register("pyarrow.RecordBatch") diff --git a/ibis/backends/tests/test_aggregation.py b/ibis/backends/tests/test_aggregation.py index b0706acf0080..1db71e2eccc9 100644 --- a/ibis/backends/tests/test_aggregation.py +++ b/ibis/backends/tests/test_aggregation.py @@ -1586,7 +1586,9 @@ def test_grouped_case(backend, con): @pytest.mark.notimpl(["polars"], raises=com.OperationNotDefinedError) @pytest.mark.notimpl( - ["datafusion"], raises=Exception, reason="not supported in datafusion" + ["datafusion"], + raises=BaseException, + reason="because pyo3 panic exception is raised", ) @pytest.mark.notyet(["flink"], raises=Py4JJavaError) @pytest.mark.notyet(["impala"], raises=ImpalaHiveServer2Error) diff --git a/ibis/backends/tests/test_map.py b/ibis/backends/tests/test_map.py index 851c0810732a..e8a80757cff9 100644 --- a/ibis/backends/tests/test_map.py +++ b/ibis/backends/tests/test_map.py @@ -21,7 +21,7 @@ ["bigquery", "impala"], reason="Backend doesn't yet implement map types" ), pytest.mark.notimpl( - ["datafusion", "exasol", "polars", "druid", "oracle"], + ["exasol", "polars", "druid", "oracle"], reason="Not yet implemented in ibis", ), ] @@ -39,6 +39,10 @@ reason="function hstore(character varying[], character varying[]) does not exist", ) +mark_notyet_datafusion = pytest.mark.notyet( + ["datafusion"], raises=Exception, reason="only map and make_map are available" +) + @pytest.mark.notyet("clickhouse", reason="nested types can't be NULL") @pytest.mark.notimpl( @@ -54,6 +58,7 @@ param(None, None, id="null_both"), ], ) +@mark_notyet_datafusion def test_map_nulls(con, k, v): k = ibis.literal(k, type="array") v = ibis.literal(v, type="array") @@ -74,6 +79,7 @@ def test_map_nulls(con, k, v): param(None, None, id="null_both"), ], ) +@mark_notyet_datafusion def test_map_keys_nulls(con, k, v): k = ibis.literal(k, type="array") v = ibis.literal(v, type="array") @@ -106,6 +112,7 @@ def test_map_keys_nulls(con, k, v): param(ibis.literal(None, type="map"), id="null_map"), ], ) +@mark_notyet_datafusion def test_map_values_nulls(con, map): assert con.execute(map.values()) is None @@ -174,6 +181,7 @@ def test_map_values_nulls(con, map): ], ) @pytest.mark.parametrize("method", ["get", "contains"]) +@mark_notyet_datafusion def test_map_get_contains_nulls(con, map, key, method): expr = getattr(map, method) assert con.execute(expr(key)) is None @@ -205,11 +213,13 @@ def test_map_get_contains_nulls(con, map, key, method): ), ], ) +@mark_notyet_datafusion def test_map_merge_nulls(con, m1, m2): concatted = m1 + m2 assert con.execute(concatted) is None +@mark_notyet_datafusion def test_map_table(backend): table = backend.map assert table.kv.type().is_map() @@ -217,6 +227,7 @@ def test_map_table(backend): @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_column_map_values(backend): table = backend.map expr = table.select("idx", vals=table.kv.values()).order_by("idx") @@ -225,6 +236,7 @@ def test_column_map_values(backend): backend.assert_series_equal(result, expected) +@mark_notyet_datafusion def test_column_map_merge(backend): table = backend.map expr = table.select( @@ -239,6 +251,7 @@ def test_column_map_merge(backend): @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_literal_map_keys(con): mapping = ibis.literal({"1": "a", "2": "b"}) expr = mapping.keys().name("tmp") @@ -250,6 +263,7 @@ def test_literal_map_keys(con): @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_literal_map_values(con): mapping = ibis.literal({"1": "a", "2": "b"}) expr = mapping.values().name("tmp") @@ -260,6 +274,7 @@ def test_literal_map_values(con): @mark_notimpl_risingwave_hstore @mark_notyet_postgres +@mark_notyet_datafusion def test_scalar_isin_literal_map_keys(con): mapping = ibis.literal({"a": 1, "b": 2}) a = ibis.literal("a") @@ -272,6 +287,7 @@ def test_scalar_isin_literal_map_keys(con): @mark_notimpl_risingwave_hstore @mark_notyet_postgres +@mark_notyet_datafusion def test_map_scalar_contains_key_scalar(con): mapping = ibis.literal({"a": 1, "b": 2}) a = ibis.literal("a") @@ -283,6 +299,7 @@ def test_map_scalar_contains_key_scalar(con): @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_map_scalar_contains_key_column(backend, alltypes, df): value = {"1": "a", "3": "c"} mapping = ibis.literal(value) @@ -294,6 +311,7 @@ def test_map_scalar_contains_key_column(backend, alltypes, df): @mark_notimpl_risingwave_hstore @mark_notyet_postgres +@mark_notyet_datafusion def test_map_column_contains_key_scalar(backend, alltypes, df): expr = ibis.map(ibis.array([alltypes.string_col]), ibis.array([alltypes.int_col])) series = df.apply(lambda row: {row["string_col"]: row["int_col"]}, axis=1) @@ -306,6 +324,7 @@ def test_map_column_contains_key_scalar(backend, alltypes, df): @mark_notimpl_risingwave_hstore @mark_notyet_postgres +@mark_notyet_datafusion def test_map_column_contains_key_column(alltypes): map_expr = ibis.map( ibis.array([alltypes.string_col]), ibis.array([alltypes.int_col]) @@ -317,6 +336,7 @@ def test_map_column_contains_key_column(alltypes): @mark_notimpl_risingwave_hstore @mark_notyet_postgres +@mark_notyet_datafusion def test_literal_map_merge(con): a = ibis.literal({"a": 0, "b": 2}) b = ibis.literal({"a": 1, "c": 3}) @@ -326,6 +346,7 @@ def test_literal_map_merge(con): @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_literal_map_getitem_broadcast(backend, alltypes, df): value = {"1": "a", "2": "b"} @@ -472,6 +493,7 @@ def test_literal_map_getitem_broadcast(backend, alltypes, df): @values @keys @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_map_get_all_types(con, keys, values): m = ibis.map(ibis.array(keys), ibis.array(values)) for key, val in zip(keys, values): @@ -482,6 +504,7 @@ def test_map_get_all_types(con, keys, values): @keys @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_map_contains_all_types(con, keys): a = ibis.array(keys) m = ibis.map(a, a) @@ -490,6 +513,7 @@ def test_map_contains_all_types(con, keys): @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_literal_map_get_broadcast(backend, alltypes, df): value = {"1": "a", "2": "b"} @@ -524,13 +548,14 @@ def test_map_construct_dict(con, keys, values): assert result == dict(zip(keys, values)) -@mark_notimpl_risingwave_hstore -@mark_notyet_postgres @pytest.mark.notimpl( ["flink"], raises=pa.lib.ArrowInvalid, reason="Map array child array should have no nulls", ) +@mark_notimpl_risingwave_hstore +@mark_notyet_postgres +@mark_notyet_datafusion def test_map_construct_array_column(con, alltypes, df): expr = ibis.map(ibis.array([alltypes.string_col]), ibis.array([alltypes.int_col])) result = con.execute(expr) @@ -541,6 +566,7 @@ def test_map_construct_array_column(con, alltypes, df): @mark_notimpl_risingwave_hstore @mark_notyet_postgres +@mark_notyet_datafusion def test_map_get_with_compatible_value_smaller(con): value = ibis.literal({"A": 1000, "B": 2000}) expr = value.get("C", 3) @@ -549,6 +575,7 @@ def test_map_get_with_compatible_value_smaller(con): @mark_notimpl_risingwave_hstore @mark_notyet_postgres +@mark_notyet_datafusion def test_map_get_with_compatible_value_bigger(con): value = ibis.literal({"A": 1, "B": 2}) expr = value.get("C", 3000) @@ -557,6 +584,7 @@ def test_map_get_with_compatible_value_bigger(con): @mark_notimpl_risingwave_hstore @mark_notyet_postgres +@mark_notyet_datafusion def test_map_get_with_incompatible_value_different_kind(con): value = ibis.literal({"A": 1000, "B": 2000}) expr = value.get("C", 3.0) @@ -565,6 +593,7 @@ def test_map_get_with_incompatible_value_different_kind(con): @mark_notimpl_risingwave_hstore @mark_notyet_postgres +@mark_notyet_datafusion @pytest.mark.parametrize("null_value", [None, ibis.null()]) def test_map_get_with_null_on_not_nullable(con, null_value): map_type = dt.Map(dt.string, dt.Int16(nullable=False)) @@ -579,6 +608,7 @@ def test_map_get_with_null_on_not_nullable(con, null_value): ["flink"], raises=Py4JJavaError, reason="Flink cannot handle typeless nulls" ) @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_map_get_with_null_on_null_type_with_null(con, null_value): value = ibis.literal({"A": None, "B": None}) expr = value.get("C", null_value) @@ -586,11 +616,12 @@ def test_map_get_with_null_on_null_type_with_null(con, null_value): assert pd.isna(result) -@mark_notimpl_risingwave_hstore -@mark_notyet_postgres @pytest.mark.notyet( ["flink"], raises=Py4JJavaError, reason="Flink cannot handle typeless nulls" ) +@mark_notimpl_risingwave_hstore +@mark_notyet_postgres +@mark_notyet_datafusion def test_map_get_with_null_on_null_type_with_non_null(con): value = ibis.literal({"A": None, "B": None}) expr = value.get("C", 1) @@ -603,6 +634,7 @@ def test_map_get_with_null_on_null_type_with_non_null(con): reason="`tbl_properties` is required when creating table with schema", ) @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_map_create_table(con, temp_table): t = con.create_table( temp_table, @@ -617,11 +649,13 @@ def test_map_create_table(con, temp_table): reason="No translation rule for ", ) @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_map_length(con): expr = ibis.literal(dict(a="A", b="B")).length() assert con.execute(expr) == 2 +@mark_notyet_datafusion def test_map_keys_unnest(backend): expr = backend.map.kv.keys().unnest() result = expr.to_pandas() @@ -629,6 +663,7 @@ def test_map_keys_unnest(backend): @mark_notimpl_risingwave_hstore +@mark_notyet_datafusion def test_map_contains_null(con): expr = ibis.map(["a"], ibis.literal([None], type="array")) assert con.execute(expr.contains("a")) diff --git a/ibis/backends/tests/tpc/ds/test_queries.py b/ibis/backends/tests/tpc/ds/test_queries.py index e6fd2b3272c3..04a77f894e2e 100644 --- a/ibis/backends/tests/tpc/ds/test_queries.py +++ b/ibis/backends/tests/tpc/ds/test_queries.py @@ -9,11 +9,7 @@ from ibis import _, coalesce, cumulative_window, date, ifelse, null, rank, union from ibis import literal as lit from ibis import selectors as s -from ibis.backends.tests.errors import ( - ArrowNotImplementedError, - ClickHouseDatabaseError, - TrinoUserError, -) +from ibis.backends.tests.errors import ClickHouseDatabaseError, TrinoUserError from ibis.backends.tests.tpc.conftest import tpc_test from ibis.common.exceptions import OperationNotDefinedError @@ -1416,7 +1412,6 @@ def test_26(catalog_sales, customer_demographics, date_dim, item, promotion): @tpc_test("ds") -@pytest.mark.notyet(["datafusion"], reason="Failed to plan") def test_27(store_sales, customer_demographics, date_dim, store, item): results = ( store_sales.join(customer_demographics, [("ss_cdemo_sk", "cd_demo_sk")]) @@ -1999,11 +1994,6 @@ def test_38(store_sales, catalog_sales, web_sales, date_dim, customer): @tpc_test("ds") -@pytest.mark.notyet( - ["datafusion"], - raises=ArrowNotImplementedError, - reason="Unsupported cast from double to null using function cast_null", -) def test_39(inventory, item, warehouse, date_dim): inv = ( inventory.join(item, [("inv_item_sk", "i_item_sk")]) @@ -4894,11 +4884,6 @@ def test_89(item, store_sales, date_dim, store): ).limit(100) -@pytest.mark.notyet( - ["datafusion"], - raises=ArrowNotImplementedError, - reason="Unsupported cast from double to null using function cast_null", -) @tpc_test("ds") def test_90(web_sales, household_demographics, time_dim, web_page): def am_pm(*, hour: int, name: str): diff --git a/poetry.lock b/poetry.lock index 46f34f9e74c5..96e4b251d42a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1341,16 +1341,17 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "datafusion" -version = "40.1.0" +version = "41.0.0" description = "Build and run queries against data" optional = true python-versions = ">=3.6" files = [ - {file = "datafusion-40.1.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:983b5b89a3aaaf2789f0423564cc24dbe5eb3f4f0a7daa8e87b35ce4d2920d6b"}, - {file = "datafusion-40.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be44d24971e73d324a3f41503bb091f48d171d50d1d2415b469ca5e3953b5a0e"}, - {file = "datafusion-40.1.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fd8c3689e9d195a9603a00e399b995a6343587d0763358f2eee65b85d5f56a37"}, - {file = "datafusion-40.1.0-cp38-abi3-win_amd64.whl", hash = "sha256:2960871ce31ee489ef3b210e77c4048278e9ee873517eff9f46ca52c82eb166d"}, - {file = "datafusion-40.1.0.tar.gz", hash = "sha256:7c7cfd2bcf491adcf6580f0ff5882ca9fc658dbdab30802ad46889e417965cc6"}, + {file = "datafusion-41.0.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:4b484035765a4f239737d6313af3cc3822448dfa86738ec44db02dfc4e08057f"}, + {file = "datafusion-41.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:fe324048a63bf462d49cca3b046821fcb546cdab3a13b1fe860aab038c4e4ad4"}, + {file = "datafusion-41.0.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7c6987ad20b238a555fac09851f2329cd8b7e829de98446159ea27a172a5f1f"}, + {file = "datafusion-41.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a10179610c8d211d215ff3533bbd8f5faf3b47b00c0e8371ca9656e98c420380"}, + {file = "datafusion-41.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:a862f6667979a367c30ae58d8770bba044bab09d1da9012ee37cb3bb86fccdf2"}, + {file = "datafusion-41.0.0.tar.gz", hash = "sha256:b2124bcd976520a8dbcb456c200f2cb8b1343285e9329fe757aa628bbd0b08f7"}, ] [package.dependencies] @@ -7893,4 +7894,4 @@ visualization = ["graphviz"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "c3905989eab1b3ab585b029a685e38ac6fa10febb022f15f3b1aea5e449e23fd" +content-hash = "82384564308f7be107e844339bbcaaf90643f677702f39cf19231f121d2bc7f5" diff --git a/pyproject.toml b/pyproject.toml index c70a7682dfed..f2fa45d43ac9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ clickhouse-connect = { version = ">=0.5.23,<1", optional = true, extras = [ "numpy", "pandas", ] } -datafusion = { version = ">=0.6,<41", optional = true } +datafusion = { version = ">=0.6,<42", optional = true } db-dtypes = { version = ">=0.3,<2", optional = true } deltalake = { version = ">=0.9.0,<1", optional = true } duckdb = { version = ">=0.8.1,<1.2", optional = true } diff --git a/requirements-dev.txt b/requirements-dev.txt index 0fbab1bb81f4..28f9348419d3 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -42,7 +42,7 @@ coverage[toml]==7.6.1 ; python_version >= "3.10" and python_version < "4.0" crashtest==0.4.1 ; python_version >= "3.10" and python_version < "4.0" cryptography==43.0.1 ; python_version >= "3.10" and python_version < "4.0" cycler==0.12.1 ; python_version >= "3.10" and python_version < "3.13" -datafusion==40.1.0 ; python_version >= "3.10" and python_version < "4.0" +datafusion==41.0.0 ; python_version >= "3.10" and python_version < "4.0" db-dtypes==1.3.0 ; python_version >= "3.10" and python_version < "4.0" debugpy==1.8.5 ; python_version >= "3.10" and python_version < "3.13" decorator==5.1.1 ; python_version >= "3.10" and python_version < "4.0" From c6008e80c5083867958cde20cb8d272a8c98bcda Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Tue, 17 Sep 2024 10:28:35 -0400 Subject: [PATCH 06/16] docs(datafusion): assorted edits to datafusion meetup talk (#10144) This can be left open until I'm done editing (pretty close, I think) --- .../images/competing_standards.png | Bin 0 -> 24305 bytes .../images/datafusion-meetup-slides.png | Bin 0 -> 60323 bytes .../datafusion-meetup-nyc-2024/talk.qmd | 125 +++++++++++++++--- 3 files changed, 109 insertions(+), 16 deletions(-) create mode 100644 docs/presentations/datafusion-meetup-nyc-2024/images/competing_standards.png create mode 100644 docs/presentations/datafusion-meetup-nyc-2024/images/datafusion-meetup-slides.png diff --git a/docs/presentations/datafusion-meetup-nyc-2024/images/competing_standards.png b/docs/presentations/datafusion-meetup-nyc-2024/images/competing_standards.png new file mode 100644 index 0000000000000000000000000000000000000000..5d38303773dd4f1b798a91bec62d05e0423a6a0d GIT binary patch literal 24305 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 Z{~reG9>dZBmF55d002ovPDHLkV1j~{Q(gc7 literal 0 HcmV?d00001 diff --git a/docs/presentations/datafusion-meetup-nyc-2024/images/datafusion-meetup-slides.png b/docs/presentations/datafusion-meetup-nyc-2024/images/datafusion-meetup-slides.png new file mode 100644 index 0000000000000000000000000000000000000000..89fde82b4df1fa023c65be28419a4996fcf1333c GIT binary patch literal 60323 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�SiwQ&_l5 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 TnVa}IF8IM3nw}{&a0ve&Cj*je literal 0 HcmV?d00001 diff --git a/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd b/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd index a7cfd32eb6d7..95c2c21d2787 100644 --- a/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd +++ b/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd @@ -5,7 +5,7 @@ title-slide-attributes: data-background-size: 50% data-background-opacity: "0.25" author: Gil Forsyth -date: "2024-09-14" +date: "2024-09-17" execute: echo: true format: @@ -37,6 +37,10 @@ format: :::: +## Link to slides + +![](./images/datafusion-meetup-slides.png){fig-align="center"} + # Show of hands ## Who here is a... @@ -48,19 +52,25 @@ format: - ML something-something? ::: +::: {.notes} +ML something-something is used as a catchall because the job titles are varied +and tend to mean wildly different things, but it is not a disparagement of ML +jobs. +::: + ## Who here uses... ::: {.incremental} -- Rust? -- Python? -- SQL? -- R? -- KDB+ Q? +- 🦀Rust? +- 🐍Python? +- 🤖SQL? +- 🇷R? +- 🧨KDB+ Q? ::: # So you want to design a Python Dataframe API? -## Python/pandas terminology or SQL terminology? +## Python🐍/pandas🐼 terminology or SQL🤖 terminology? ::: {.incremental} - `order_by` or `orderby` or `sort` or `sort_by` or `sortby`? @@ -69,11 +79,17 @@ format: ::: {.fragment} ::: {.r-fit-text} -_please_ only choose one +🙏_please_ only choose one🙏 +::: +::: + +::: {.fragment} +::: {.r-fit-text} +when in doubt, copy `dplyr` ::: ::: -## Python/pandas semantics or SQL semantics? +## Python🐍/pandas🐼 semantics or SQL🤖 semantics? ::: {.incremental} @@ -98,7 +114,7 @@ _please_ only choose one ## SQL ain't standard -#### Which is (a small part of) why asking "How many Star Wars characters have 'Darth' in their name" looks like this: +#### Which is why, when you ask: `How many Star Wars characters have 'Darth' in their name?` ::: {.fragment} ::: {.r-fit-text} ```sql @@ -125,6 +141,13 @@ SELECT SUM(CAST(STRPOS(LOWER("t0"."name"), 'darth') > 0 AS INT)) FROM "starwars" ::: ::: + +::: {.notes} +Datafusion, BigQuery, MSSQL, Postgres + +Datatype names, function names, quoting behavior, whether bools exist +::: + ## SQL ain't standard
@@ -222,19 +245,52 @@ t.name.lower().contains("darth").sum() ``` ::: +## And yes... + +![](./images/competing_standards.png) + +::: {.notes} +First, I refuse to submit to nihilism that things can ever get better. + +Second I don't think there are actually very many proposed _standards_ for DataFrame APIs. + +There is the some work (https://data-apis.org/dataframe-api/draft/) but largely +each engine makes it's own API and says "USE THIS". +::: ## Ibis is _only_ an interface * Not an engine * We don't compute anything +* We work with a _lot_ of engines # Demo Time +## Why use DataFusion? + +* It's _fast_ +* It's _flexible_ +* Interface agnostic (SQL, Substrait, Dataframe API) + + +You should choose the _engine_ that suits your problem. + ## Why use Ibis? -Gives you flexibility +* It's flexible +* It's a pretty good API (no really!) +* Engine agnostic + +You should choose the _interface_ that suits your problem.^[If your problem involves a bunch of complex DDL, for instance, don't use Ibis] + +## The interface is not the engine is not the interface + + +::: {.incremental} +- Don't let the _engine_ dictate the _interface_ +- Don't let the _interface_ dictate the _engine_ +::: -It's a pretty good API (no really!) ## Try it out @@ -270,6 +326,45 @@ See: Apache Arrow and the “10 Things I Hate About pandas” ::: +## What other backends does Ibis support? + + +:::: {.columns} + +::: {.column width="33%"} + +- BigQuery +- ClickHouse +- DataFusion +- Druid +- DuckDB +- Exasol +::: + +::: {.column width="33%"} +- Flink +- Impala +- MSSQL +- MySQL +- Oracle +- Polars +::: + + +::: {.column width="33%"} +- Postgres +- Spark +- Risingwave +- Snowflake +- SQLite +- Trino +::: +:::: + +## Should I use Ibis _instead_ of `X`? + +Nope. You should use Ibis _with_ `X`. + ## Demo code (for reference) ::: {.panel-tabset} @@ -311,10 +406,9 @@ def main(): .reset_index() .sort_values(["month", "project_count"], ascending=False) ) - ``` -### Ibis+Datafusion PyPI +### Ibis+DataFusion PyPI ```python import glob @@ -354,7 +448,7 @@ expr = ( ) ``` -### Ibis+Datafusion PyPI (full) +### Ibis+DataFusion PyPI (full) ```python import ibis @@ -387,7 +481,6 @@ expr = ( .drop_null("ext") .order_by([_.month.desc(), _.project_count.desc()]) ) - ``` ::: From c799f6bc92de9bb18aee3a3ad5196b2f9786f3b1 Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Tue, 17 Sep 2024 17:29:52 -0400 Subject: [PATCH 07/16] docs(datafusion): update talk title (#10150) --- docs/presentations/datafusion-meetup-nyc-2024/talk.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd b/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd index 95c2c21d2787..f089c6b594eb 100644 --- a/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd +++ b/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd @@ -1,5 +1,5 @@ --- -title: "Dataframe Interfaces are a nightmare" +title: "Designing Interfaces is hard" title-slide-attributes: data-background-image: ./images/patrick.png data-background-size: 50% From 7b544ef928169be633071d4cec1a1213851c3e36 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 04:22:16 -0400 Subject: [PATCH 08/16] chore(deps): update ghcr.io/risingwavelabs/risingwave docker tag to v2 (#10152) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Phillip Cloud <417981+cpcloud@users.noreply.github.com> --- .github/renovate.json | 4 ++++ compose.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index 90f52c765966..245cad02c651 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -78,6 +78,10 @@ "matchPackagePatterns": ["pyspark"], "addLabels": ["pyspark"] }, + { + "matchPackagePatterns": ["risingwave"], + "addLabels": ["risingwave"] + }, { "matchPackagePatterns": ["snowflake-connector-python"], "addLabels": ["snowflake"] diff --git a/compose.yaml b/compose.yaml index 9d0c07a5d836..a8bf4bfd4fda 100644 --- a/compose.yaml +++ b/compose.yaml @@ -557,7 +557,7 @@ services: - impala risingwave: - image: ghcr.io/risingwavelabs/risingwave:v1.10.1 + image: ghcr.io/risingwavelabs/risingwave:v2.0.0 command: "standalone --meta-opts=\" \ --advertise-addr 0.0.0.0:5690 \ --backend mem \ From 3c892e6f025b2b9e6705118d58374a0afa6029f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 04:52:43 -0400 Subject: [PATCH 09/16] chore(deps): update trinodb/trino docker tag to v458 (#10155) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Phillip Cloud <417981+cpcloud@users.noreply.github.com> --- compose.yaml | 2 +- docker/trino/catalog/hive.properties | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/compose.yaml b/compose.yaml index a8bf4bfd4fda..d82c4bc5be33 100644 --- a/compose.yaml +++ b/compose.yaml @@ -161,7 +161,7 @@ services: test: - CMD-SHELL - trino --output-format null --execute 'show schemas in hive; show schemas in memory' - image: trinodb/trino:457 + image: trinodb/trino:458 ports: - 8080:8080 networks: diff --git a/docker/trino/catalog/hive.properties b/docker/trino/catalog/hive.properties index f66c5fafb839..9be8e2afe63a 100644 --- a/docker/trino/catalog/hive.properties +++ b/docker/trino/catalog/hive.properties @@ -1,12 +1,18 @@ connector.name=hive +# this enables the native s3 connector and the various s3.* properties +fs.native-s3.enabled=true + +# region is bogus, but trino requires it +s3.region=us-east-1 +s3.endpoint=http://minio:9000 +s3.aws-access-key=accesskey +s3.aws-secret-key=secretkey +s3.path-style-access=true + hive.ignore-absent-partitions=true hive.metastore.thrift.delete-files-on-drop=true hive.metastore.uri=thrift://hive-metastore:9083 hive.metastore.username=admin hive.non-managed-table-writes-enabled=true -hive.s3.aws-access-key=accesskey -hive.s3.aws-secret-key=secretkey -hive.s3.endpoint=http://minio:9000 -hive.s3.path-style-access=true hive.timestamp-precision=MICROSECONDS From 6ffd26ce2e2a3546f69d6593e61d28d993f3f950 Mon Sep 17 00:00:00 2001 From: Nick Crews Date: Wed, 18 Sep 2024 01:41:26 -0800 Subject: [PATCH 10/16] chore: show deprecation warning at caller level (#10154) --- ibis/expr/types/relations.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ibis/expr/types/relations.py b/ibis/expr/types/relations.py index 0a6dd1f364be..7e58417609ce 100644 --- a/ibis/expr/types/relations.py +++ b/ibis/expr/types/relations.py @@ -688,6 +688,7 @@ def __getitem__(self, what: str | int | slice | Sequence[str | int]): "deprecated and will be removed in version 10.0. Please use " "`Table.select` or `Table.filter` instead.", FutureWarning, + stacklevel=2, ) values = self.bind(args) From 139c86f15ceccada6e7b85435b6165edc3d362b5 Mon Sep 17 00:00:00 2001 From: Phillip Cloud <417981+cpcloud@users.noreply.github.com> Date: Wed, 18 Sep 2024 07:08:37 -0400 Subject: [PATCH 11/16] ci(pyspark): name the output path when downloading jar (#10156) --- .github/workflows/ibis-backends.yml | 12 ++- ibis/backends/pyspark/__init__.py | 111 +++++++++++++-------- ibis/backends/pyspark/tests/conftest.py | 14 ++- ibis/backends/pyspark/tests/test_client.py | 6 +- justfile | 17 ++++ poetry-overrides.nix | 17 +++- 6 files changed, 120 insertions(+), 57 deletions(-) diff --git a/.github/workflows/ibis-backends.yml b/.github/workflows/ibis-backends.yml index a8646280400c..f90144ddb23b 100644 --- a/.github/workflows/ibis-backends.yml +++ b/.github/workflows/ibis-backends.yml @@ -650,7 +650,7 @@ jobs: run: docker compose logs test_pyspark: - name: PySpark ${{ matrix.pyspark-version }} ubuntu-latest python-${{ matrix.python-version }} + name: PySpark ${{ matrix.pyspark-minor-version }} ubuntu-latest python-${{ matrix.python-version }} runs-on: ubuntu-latest strategy: fail-fast: false @@ -658,16 +658,19 @@ jobs: include: - python-version: "3.10" pyspark-version: "3.3.3" + pyspark-minor-version: "3.3" deps: - "'pandas@<2'" - "'numpy@<1.24'" - python-version: "3.11" - pyspark-version: "3.5" + pyspark-version: "3.5.2" + pyspark-minor-version: "3.5" deps: - "'pandas@>2'" - "'numpy@>1.24'" - python-version: "3.12" - pyspark-version: "3.5" + pyspark-version: "3.5.2" + pyspark-minor-version: "3.5" deps: - "'pandas@>2'" - "'numpy@>1.24'" @@ -722,8 +725,7 @@ jobs: - name: install iceberg shell: bash - if: matrix.pyspark-version == '3.5' - run: pushd "$(poetry run python -c "import pyspark; print(pyspark.__file__.rsplit('/', 1)[0])")/jars" && curl -LO https://search.maven.org/remotecontent?filepath=org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar + run: just download-iceberg-jar ${{ matrix.pyspark-minor-version }} - name: run tests run: just ci-check -m pyspark diff --git a/ibis/backends/pyspark/__init__.py b/ibis/backends/pyspark/__init__.py index 063fbc214d0a..babbd124eeb6 100644 --- a/ibis/backends/pyspark/__init__.py +++ b/ibis/backends/pyspark/__init__.py @@ -11,13 +11,6 @@ import sqlglot.expressions as sge from packaging.version import parse as vparse from pyspark import SparkConf - -try: - from pyspark.errors.exceptions.base import AnalysisException # PySpark 3.5+ -except ImportError: - from pyspark.sql.utils import AnalysisException # PySpark 3.3 - - from pyspark.sql import SparkSession from pyspark.sql.types import BooleanType, DoubleType, LongType, StringType @@ -38,9 +31,9 @@ from ibis.util import deprecated try: - from pyspark.errors import ParseException as PySparkParseException + from pyspark.errors import AnalysisException, ParseException except ImportError: - from pyspark.sql.utils import ParseException as PySparkParseException + from pyspark.sql.utils import AnalysisException, ParseException if TYPE_CHECKING: from collections.abc import Mapping, Sequence @@ -53,8 +46,9 @@ from ibis.expr.api import Watermark -PYSPARK_LT_34 = vparse(pyspark.__version__) < vparse("3.4") -PYSPARK_LT_35 = vparse(pyspark.__version__) < vparse("3.5") +PYSPARK_VERSION = vparse(pyspark.__version__) +PYSPARK_LT_34 = PYSPARK_VERSION < vparse("3.4") +PYSPARK_LT_35 = PYSPARK_VERSION < vparse("3.5") ConnectionMode = Literal["streaming", "batch"] @@ -279,55 +273,89 @@ def _active_catalog_database(self, catalog: str | None, db: str | None): # # We attempt to use the Unity-specific Spark SQL to set CATALOG and DATABASE # and if that causes a parser exception we fall back to using the catalog API. + v = self.compiler.v + quoted = self.compiler.quoted + dialect = self.dialect + catalog_api = self._session.catalog + try: if catalog is not None: + catalog_sql = sge.Use( + kind=v.CATALOG, this=sg.to_identifier(catalog, quoted=quoted) + ).sql(dialect) + try: - catalog_sql = sg.to_identifier(catalog).sql(self.dialect) - self.raw_sql(f"USE CATALOG {catalog_sql}") - except PySparkParseException: - self._session.catalog.setCurrentCatalog(catalog) + self.raw_sql(catalog_sql) + except ParseException: + catalog_api.setCurrentCatalog(catalog) + + db_sql = sge.Use( + kind=v.DATABASE, this=sg.to_identifier(db, quoted=quoted) + ).sql(dialect) + try: - db_sql = sg.to_identifier(db).sql(self.dialect) - self.raw_sql(f"USE DATABASE {db_sql}") - except PySparkParseException: - self._session.catalog.setCurrentDatabase(db) + self.raw_sql(db_sql) + except ParseException: + catalog_api.setCurrentDatabase(db) yield finally: if catalog is not None: + catalog_sql = sge.Use( + kind=v.CATALOG, + this=sg.to_identifier(current_catalog, quoted=quoted), + ).sql(dialect) try: - catalog_sql = sg.to_identifier(current_catalog).sql(self.dialect) - self.raw_sql(f"USE CATALOG {catalog_sql}") - except PySparkParseException: - self._session.catalog.setCurrentCatalog(current_catalog) + self.raw_sql(catalog_sql) + except ParseException: + catalog_api.setCurrentCatalog(current_catalog) + + db_sql = sge.Use( + kind=v.DATABASE, this=sg.to_identifier(current_db, quoted=quoted) + ).sql(dialect) + try: - db_sql = sg.to_identifier(current_db).sql(self.dialect) - self.raw_sql(f"USE DATABASE {db_sql}") - except PySparkParseException: - self._session.catalog.setCurrentDatabase(current_db) + self.raw_sql(db_sql) + except ParseException: + catalog_api.setCurrentDatabase(current_db) @contextlib.contextmanager def _active_catalog(self, name: str | None): if name is None or PYSPARK_LT_34: yield return + prev_catalog = self.current_catalog prev_database = self.current_database + + v = self.compiler.v + quoted = self.compiler.quoted + dialect = self.dialect + + catalog_sql = sge.Use( + kind=v.CATALOG, this=sg.to_identifier(name, quoted=quoted) + ).sql(dialect) + catalog_api = self._session.catalog + try: try: - catalog_sql = sg.to_identifier(name).sql(self.dialect) - self.raw_sql(f"USE CATALOG {catalog_sql};") - except PySparkParseException: - self._session.catalog.setCurrentCatalog(name) + self.raw_sql(catalog_sql) + except ParseException: + catalog_api.setCurrentCatalog(name) yield finally: + catalog_sql = sge.Use( + kind=v.CATALOG, this=sg.to_identifier(prev_catalog, quoted=quoted) + ).sql(dialect) + db_sql = sge.Use( + kind=v.DATABASE, this=sg.to_identifier(prev_database, quoted=quoted) + ).sql(dialect) + try: - catalog_sql = sg.to_identifier(prev_catalog).sql(self.dialect) - db_sql = sg.to_identifier(prev_database).sql(self.dialect) - self.raw_sql(f"USE CATALOG {catalog_sql};") - self.raw_sql(f"USE DATABASE {db_sql};") - except PySparkParseException: - self._session.catalog.setCurrentCatalog(prev_catalog) - self._session.catalog.setCurrentDatabase(prev_database) + self.raw_sql(catalog_sql) + self.raw_sql(db_sql) + except ParseException: + catalog_api.setCurrentCatalog(prev_catalog) + catalog_api.setCurrentDatabase(prev_database) def list_catalogs(self, like: str | None = None) -> list[str]: catalogs = [res.catalog for res in self._session.sql("SHOW CATALOGS").collect()] @@ -491,7 +519,7 @@ def create_database( sql = sge.Create( kind="DATABASE", exist=force, - this=sg.to_identifier(name), + this=sg.to_identifier(name, quoted=self.compiler.quoted), properties=properties, ) with self._active_catalog(catalog): @@ -515,7 +543,10 @@ def drop_database( """ sql = sge.Drop( - kind="DATABASE", exist=force, this=sg.to_identifier(name), cascade=force + kind="DATABASE", + exist=force, + this=sg.to_identifier(name, quoted=self.compiler.quoted), + cascade=force, ) with self._active_catalog(catalog): with self._safe_raw_sql(sql): diff --git a/ibis/backends/pyspark/tests/conftest.py b/ibis/backends/pyspark/tests/conftest.py index 8c7a977d9653..3d53e52e24be 100644 --- a/ibis/backends/pyspark/tests/conftest.py +++ b/ibis/backends/pyspark/tests/conftest.py @@ -9,6 +9,7 @@ import pandas as pd import pytest from filelock import FileLock +from packaging.version import parse as vparse import ibis from ibis import util @@ -144,8 +145,12 @@ def connect(*, tmpdir, worker_id, **kw): # converted as local time to UTC with microsecond resolution. # https://spark.apache.org/docs/latest/sql-pyspark-pandas-with-arrow.html#timestamp-with-time-zone-semantics + import pyspark from pyspark.sql import SparkSession + pyspark_version = vparse(pyspark.__version__) + pyspark_minor_version = f"{pyspark_version.major:d}.{pyspark_version.minor:d}" + config = ( SparkSession.builder.appName("ibis_testing") .master("local[1]") @@ -169,13 +174,14 @@ def connect(*, tmpdir, worker_id, **kw): .config("spark.ui.showConsoleProgress", False) .config("spark.sql.execution.arrow.pyspark.enabled", False) .config("spark.sql.streaming.schemaInference", True) - ) - - config = ( - config.config( + .config( "spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", ) + .config( + "spark.jars.packages", + f"org.apache.iceberg:iceberg-spark-runtime-{pyspark_minor_version}_2.12:1.5.2", + ) .config("spark.sql.catalog.local", "org.apache.iceberg.spark.SparkCatalog") .config("spark.sql.catalog.local.type", "hadoop") .config("spark.sql.catalog.local.warehouse", "icehouse") diff --git a/ibis/backends/pyspark/tests/test_client.py b/ibis/backends/pyspark/tests/test_client.py index 6c977118cafd..474938b880d9 100644 --- a/ibis/backends/pyspark/tests/test_client.py +++ b/ibis/backends/pyspark/tests/test_client.py @@ -6,8 +6,7 @@ @pytest.mark.xfail_version(pyspark=["pyspark<3.4"], reason="no catalog support") -def test_catalog_db_args(con, monkeypatch): - monkeypatch.setattr(ibis.options, "default_backend", con) +def test_catalog_db_args(con): t = ibis.memtable({"epoch": [1712848119, 1712848121, 1712848155]}) assert con.current_catalog == "spark_catalog" @@ -40,8 +39,7 @@ def test_catalog_db_args(con, monkeypatch): assert con.current_database == "ibis_testing" -def test_create_table_no_catalog(con, monkeypatch): - monkeypatch.setattr(ibis.options, "default_backend", con) +def test_create_table_no_catalog(con): t = ibis.memtable({"epoch": [1712848119, 1712848121, 1712848155]}) assert con.current_database != "default" diff --git a/justfile b/justfile index e55754ef4d3f..777b45ca44c3 100644 --- a/justfile +++ b/justfile @@ -135,6 +135,23 @@ download-data owner="ibis-project" repo="testing-data" rev="master": git -C "${outdir}" checkout "{{ rev }}" fi +# download the iceberg jar used for testing pyspark and iceberg integration +download-iceberg-jar pyspark scala="2.12" iceberg="1.5.2": + #!/usr/bin/env bash + set -eo pipefail + + runner=(python) + + if [ -n "${CI}" ]; then + runner=(poetry run python) + fi + pyspark="$("${runner[@]}" -c "import pyspark; print(pyspark.__file__.rsplit('/', 1)[0])")" + pushd "${pyspark}/jars" + jar="iceberg-spark-runtime-{{ pyspark }}_{{ scala }}-{{ iceberg }}.jar" + url="https://search.maven.org/remotecontent?filepath=org/apache/iceberg/iceberg-spark-runtime-{{ pyspark }}_{{ scala }}/{{ iceberg }}/${jar}" + curl -qSsL -o "${jar}" "${url}" + ls "${jar}" + # start backends using docker compose; no arguments starts all backends up *backends: docker compose up --build --wait {{ backends }} diff --git a/poetry-overrides.nix b/poetry-overrides.nix index ee5829919c46..6eb36d139d51 100644 --- a/poetry-overrides.nix +++ b/poetry-overrides.nix @@ -1,11 +1,20 @@ final: prev: { pyspark = prev.pyspark.overridePythonAttrs (attrs: let - icebergJarUrl = "https://search.maven.org/remotecontent?filepath=org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar"; - icebergJar = final.pkgs.fetchurl { - name = "iceberg-spark-runtime-3.5_2.12-1.5.2.jar"; + inherit (final) pkgs lib; + pysparkVersion = lib.versions.majorMinor attrs.version; + jarHashes = { + "3.5" = "sha256-KuxLeNgGzIHU5QMls1H2NJyQ3mQVROZExgMvAAk4YYs="; + "3.3" = "sha256-W3ij6mwrIDOc4zGqtpCsbg563qHmdMc8eZnLX6bnl2M="; + }; + icebergVersion = "1.5.2"; + scalaVersion = "2.12"; + jarName = "iceberg-spark-runtime-${pysparkVersion}_${scalaVersion}-${icebergVersion}.jar"; + icebergJarUrl = "https://search.maven.org/remotecontent?filepath=org/apache/iceberg/iceberg-spark-runtime-${pysparkVersion}_${scalaVersion}/${icebergVersion}/${jarName}"; + icebergJar = pkgs.fetchurl { + name = jarName; url = icebergJarUrl; - sha256 = "12v1704h0bq3qr2fci0mckg9171lyr8v6983wpa83k06v1w4pv1a"; + sha256 = jarHashes."${pysparkVersion}"; }; in { From e35d639978aa0337c9dba6de480c62bbb05ae634 Mon Sep 17 00:00:00 2001 From: Phillip Cloud <417981+cpcloud@users.noreply.github.com> Date: Wed, 18 Sep 2024 07:42:20 -0400 Subject: [PATCH 12/16] ci: run datafusion tests in series to avoid high memory usage (#10158) --- .github/workflows/ibis-backends.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ibis-backends.yml b/.github/workflows/ibis-backends.yml index f90144ddb23b..1a120a80b816 100644 --- a/.github/workflows/ibis-backends.yml +++ b/.github/workflows/ibis-backends.yml @@ -123,6 +123,7 @@ jobs: - sqlite - name: datafusion title: DataFusion + serial: true extras: - datafusion - name: polars From 966c5e8f3efb16d40887c1e7670ea4a8c751d5f3 Mon Sep 17 00:00:00 2001 From: Phillip Cloud <417981+cpcloud@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:39:19 -0400 Subject: [PATCH 13/16] ci(bigquery): avoid race condition in create table by using a dataset scoped to a specific user and python version (#10159) --- ibis/backends/bigquery/tests/system/test_connect.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/ibis/backends/bigquery/tests/system/test_connect.py b/ibis/backends/bigquery/tests/system/test_connect.py index f62d416ba707..cd3eebd2f743 100644 --- a/ibis/backends/bigquery/tests/system/test_connect.py +++ b/ibis/backends/bigquery/tests/system/test_connect.py @@ -241,15 +241,10 @@ def test_client_with_regional_endpoints(project_id, credentials, dataset_id): assert not len(alltypes.to_pyarrow()) -def test_create_table_from_memtable_needs_quotes(project_id, credentials): +def test_create_table_from_memtable_needs_quotes(project_id, dataset_id, credentials): con = ibis.bigquery.connect( - project_id=project_id, - dataset_id=f"{project_id}.testing", - credentials=credentials, + project_id=project_id, dataset_id=dataset_id, credentials=credentials ) - con.create_table( - "region-table", - schema=ibis.schema(dict(its_always="str", quoting="int")), - ) + con.create_table("region-table", schema=dict(its_always="str", quoting="int")) con.drop_table("region-table") From 2b6633cb3805752314bd73994cd1f034f6abea06 Mon Sep 17 00:00:00 2001 From: Phillip Cloud <417981+cpcloud@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:43:32 -0400 Subject: [PATCH 14/16] chore(mysql): port to MySQLdb instead of pymysql (#10077) Replaces pymysql with mysqlclient, mostly out of frustration with bizarre GC behavior discovered during #10055. I think this is probably a breaking change due to some changes in how types are inferred for JSON, INET and UUID types. BREAKING CHANGE: Ibis now uses the `MySQLdb` driver. You may need to install MySQL client libraries to **build** the extension. --- .github/renovate.json | 2 +- .github/workflows/ibis-backends.yml | 2 + conda/environment-arm64-flink.yml | 2 +- conda/environment-arm64.yml | 2 +- conda/environment.yml | 2 +- ibis/backends/mysql/__init__.py | 158 +++++++++++------------ ibis/backends/mysql/datatypes.py | 47 +++---- ibis/backends/mysql/tests/conftest.py | 2 +- ibis/backends/mysql/tests/test_client.py | 6 +- ibis/backends/tests/errors.py | 6 +- ibis/backends/tests/test_client.py | 5 - poetry.lock | 37 +++--- pyproject.toml | 4 +- requirements-dev.txt | 2 +- 14 files changed, 136 insertions(+), 141 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 245cad02c651..3dad82e3ecb1 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -67,7 +67,7 @@ "addLabels": ["druid"] }, { - "matchPackagePatterns": ["pymysql", "mariadb"], + "matchPackagePatterns": ["mysqlclient", "mariadb"], "addLabels": ["mysql"] }, { diff --git a/.github/workflows/ibis-backends.yml b/.github/workflows/ibis-backends.yml index 1a120a80b816..d44fbd0b0c48 100644 --- a/.github/workflows/ibis-backends.yml +++ b/.github/workflows/ibis-backends.yml @@ -141,6 +141,7 @@ jobs: - polars sys-deps: - libgeos-dev + - default-libmysqlclient-dev - name: postgres title: PostgreSQL extras: @@ -271,6 +272,7 @@ jobs: - mysql sys-deps: - libgeos-dev + - default-libmysqlclient-dev - os: windows-latest backend: name: clickhouse diff --git a/conda/environment-arm64-flink.yml b/conda/environment-arm64-flink.yml index c444cc2e34c0..4a4a45d1c3c6 100644 --- a/conda/environment-arm64-flink.yml +++ b/conda/environment-arm64-flink.yml @@ -33,7 +33,7 @@ dependencies: - pyarrow-hotfix >=0.4 - pydata-google-auth - pydruid >=0.6.5 - - pymysql >=1 + - mysqlclient >=2.2.4 - pyspark >=3 - python-dateutil >=2.8.2 - python-duckdb >=0.8.1 diff --git a/conda/environment-arm64.yml b/conda/environment-arm64.yml index 6a4bde8f8b10..6a6ce8943e85 100644 --- a/conda/environment-arm64.yml +++ b/conda/environment-arm64.yml @@ -33,7 +33,7 @@ dependencies: - pyarrow-hotfix >=0.4 - pydata-google-auth - pydruid >=0.6.5 - - pymysql >=1 + - mysqlclient >=2.2.4 - pyodbc >=4.0.39 - pyspark >=3 - python-dateutil >=2.8.2 diff --git a/conda/environment.yml b/conda/environment.yml index fb52c768b17e..9aae1e79f974 100644 --- a/conda/environment.yml +++ b/conda/environment.yml @@ -33,7 +33,7 @@ dependencies: - pyarrow-hotfix >=0.4 - pydata-google-auth - pydruid >=0.6.5 - - pymysql >=1 + - mysqlclient >=2.2.4 - pyodbc >=4.0.39 - pyspark >=3 - python >=3.10 diff --git a/ibis/backends/mysql/__init__.py b/ibis/backends/mysql/__init__.py index 664a1eff1da8..c477c191ffb7 100644 --- a/ibis/backends/mysql/__init__.py +++ b/ibis/backends/mysql/__init__.py @@ -3,18 +3,17 @@ from __future__ import annotations import contextlib -import re import warnings from functools import cached_property from operator import itemgetter from typing import TYPE_CHECKING, Any from urllib.parse import unquote_plus -import pymysql +import MySQLdb import sqlglot as sg import sqlglot.expressions as sge -from pymysql.constants import ER -from pymysql.err import ProgrammingError +from MySQLdb import ProgrammingError +from MySQLdb.constants import ER import ibis import ibis.backends.sql.compilers as sc @@ -24,7 +23,6 @@ import ibis.expr.types as ir from ibis import util from ibis.backends import CanCreateDatabase -from ibis.backends.mysql.datatypes import _type_from_cursor_info from ibis.backends.sql import SQLBackend from ibis.backends.sql.compilers.base import STAR, TRUE, C @@ -89,8 +87,7 @@ def _from_url(self, url: ParseResult, **kwargs): @cached_property def version(self): - matched = re.search(r"(\d+)\.(\d+)\.(\d+)", self.con.server_version) - return ".".join(matched.groups()) + return ".".join(map(str, self.con._server_version)) def do_connect( self, @@ -98,7 +95,6 @@ def do_connect( user: str | None = None, password: str | None = None, port: int = 3306, - database: str | None = None, autocommit: bool = True, **kwargs, ) -> None: @@ -114,12 +110,10 @@ def do_connect( Password port Port - database - Database to connect to autocommit Autocommit mode kwargs - Additional keyword arguments passed to `pymysql.connect` + Additional keyword arguments passed to `MySQLdb.connect` Examples -------- @@ -149,14 +143,12 @@ def do_connect( year int32 month int32 """ - self.con = pymysql.connect( + self.con = MySQLdb.connect( user=user, - host=host, + host="127.0.0.1" if host == "localhost" else host, port=port, password=password, - database=database, autocommit=autocommit, - conv=pymysql.converters.conversions, **kwargs, ) @@ -164,7 +156,7 @@ def do_connect( @util.experimental @classmethod - def from_connection(cls, con: pymysql.Connection) -> Backend: + def from_connection(cls, con) -> Backend: """Create an Ibis client from an existing connection to a MySQL database. Parameters @@ -179,7 +171,7 @@ def from_connection(cls, con: pymysql.Connection) -> Backend: return new_backend def _post_connect(self) -> None: - with contextlib.closing(self.con.cursor()) as cur: + with self.con.cursor() as cur: try: cur.execute("SET @@session.time_zone = 'UTC'") except Exception as e: # noqa: BLE001 @@ -198,23 +190,34 @@ def list_databases(self, like: str | None = None) -> list[str]: return self._filter_with_like(databases, like) def _get_schema_using_query(self, query: str) -> sch.Schema: - with self.begin() as cur: - cur.execute( - sg.select(STAR) - .from_( - sg.parse_one(query, dialect=self.dialect).subquery( - sg.to_identifier("tmp", quoted=self.compiler.quoted) - ) + from ibis.backends.mysql.datatypes import _type_from_cursor_info + + sql = ( + sg.select(STAR) + .from_( + sg.parse_one(query, dialect=self.dialect).subquery( + sg.to_identifier("tmp", quoted=self.compiler.quoted) ) - .limit(0) - .sql(self.dialect) ) - return sch.Schema( - { - field.name: _type_from_cursor_info(descr, field) - for descr, field in zip(cur.description, cur._result.fields) - } + .limit(0) + .sql(self.dialect) + ) + with self.begin() as cur: + cur.execute(sql) + descr, flags = cur.description, cur.description_flags + + items = {} + for (name, type_code, _, _, field_length, scale, _), raw_flags in zip( + descr, flags + ): + item = _type_from_cursor_info( + flags=raw_flags, + type_code=type_code, + field_length=field_length, + scale=scale, ) + items[name] = item + return sch.Schema(items) def get_schema( self, name: str, *, catalog: str | None = None, database: str | None = None @@ -258,13 +261,20 @@ def drop_database(self, name: str, force: bool = False) -> None: def begin(self): con = self.con cur = con.cursor() + autocommit = con.get_autocommit() + + if not autocommit: + con.begin() + try: yield cur except Exception: - con.rollback() + if not autocommit: + con.rollback() raise else: - con.commit() + if not autocommit: + con.commit() finally: cur.close() @@ -272,7 +282,7 @@ def begin(self): # from .execute() @contextlib.contextmanager def _safe_raw_sql(self, *args, **kwargs): - with contextlib.closing(self.raw_sql(*args, **kwargs)) as result: + with self.raw_sql(*args, **kwargs) as result: yield result def raw_sql(self, query: str | sg.Expression, **kwargs: Any) -> Any: @@ -280,16 +290,23 @@ def raw_sql(self, query: str | sg.Expression, **kwargs: Any) -> Any: query = query.sql(dialect=self.name) con = self.con + autocommit = con.get_autocommit() + cursor = con.cursor() + if not autocommit: + con.begin() + try: cursor.execute(query, **kwargs) except Exception: - con.rollback() + if not autocommit: + con.rollback() cursor.close() raise else: - con.commit() + if not autocommit: + con.commit() return cursor # TODO: disable positional arguments @@ -406,11 +423,9 @@ def create_table( if temp: properties.append(sge.TemporaryProperty()) - temp_memtable_view = None if obj is not None: if not isinstance(obj, ir.Expr): table = ibis.memtable(obj) - temp_memtable_view = table.op().name else: table = obj @@ -428,39 +443,33 @@ def create_table( if not schema: schema = table.schema() - table_expr = sg.table(temp_name, catalog=database, quoted=self.compiler.quoted) - target = sge.Schema( - this=table_expr, expressions=schema.to_sqlglot(self.dialect) - ) + quoted = self.compiler.quoted + dialect = self.dialect + + table_expr = sg.table(temp_name, catalog=database, quoted=quoted) + target = sge.Schema(this=table_expr, expressions=schema.to_sqlglot(dialect)) create_stmt = sge.Create( - kind="TABLE", - this=target, - properties=sge.Properties(expressions=properties), + kind="TABLE", this=target, properties=sge.Properties(expressions=properties) ) - this = sg.table(name, catalog=database, quoted=self.compiler.quoted) + this = sg.table(name, catalog=database, quoted=quoted) with self._safe_raw_sql(create_stmt) as cur: if query is not None: - insert_stmt = sge.Insert(this=table_expr, expression=query).sql( - self.name - ) - cur.execute(insert_stmt) + cur.execute(sge.Insert(this=table_expr, expression=query).sql(dialect)) if overwrite: + cur.execute(sge.Drop(kind="TABLE", this=this, exists=True).sql(dialect)) cur.execute( - sge.Drop(kind="TABLE", this=this, exists=True).sql(self.name) - ) - cur.execute( - f"ALTER TABLE IF EXISTS {table_expr.sql(self.name)} RENAME TO {this.sql(self.name)}" + sge.Alter( + kind="TABLE", + this=table_expr, + exists=True, + actions=[sge.RenameTable(this=this)], + ).sql(dialect) ) if schema is None: - # Clean up temporary memtable if we've created one - # for in-memory reads - if temp_memtable_view is not None: - self.drop_table(temp_memtable_view) - return self.table(name, database=database) # preserve the input schema if it was provided @@ -477,7 +486,7 @@ def _in_memory_table_exists(self, name: str) -> bool: with self.begin() as cur: cur.execute(sql) cur.fetchall() - except pymysql.err.ProgrammingError as e: + except MySQLdb.ProgrammingError as e: err_code, _ = e.args if err_code == ER.NO_SUCH_TABLE: return False @@ -495,16 +504,17 @@ def _register_in_memory_table(self, op: ops.InMemoryTable) -> None: name = op.name quoted = self.compiler.quoted + dialect = self.dialect create_stmt = sg.exp.Create( kind="TABLE", this=sg.exp.Schema( this=sg.to_identifier(name, quoted=quoted), - expressions=schema.to_sqlglot(self.dialect), + expressions=schema.to_sqlglot(dialect), ), properties=sg.exp.Properties(expressions=[sge.TemporaryProperty()]), ) - create_stmt_sql = create_stmt.sql(self.name) + create_stmt_sql = create_stmt.sql(dialect) df = op.data.to_frame() # nan can not be used with MySQL @@ -549,23 +559,7 @@ def _fetch_from_cursor(self, cursor, schema: sch.Schema) -> pd.DataFrame: from ibis.backends.mysql.converter import MySQLPandasData - try: - df = pd.DataFrame.from_records( - cursor, columns=schema.names, coerce_float=True - ) - except Exception: - # clean up the cursor if we fail to create the DataFrame - # - # in the sqlite case failing to close the cursor results in - # artificially locked tables - cursor.close() - raise - df = MySQLPandasData.convert_table(df, schema) - return df - - def _finalize_memtable(self, name: str) -> None: - """No-op. - - Executing **any** SQL in a finalizer causes the underlying connection - socket to be set to `None`. It is unclear why this happens. - """ + df = pd.DataFrame.from_records( + cursor.fetchall(), columns=schema.names, coerce_float=True + ) + return MySQLPandasData.convert_table(df, schema) diff --git a/ibis/backends/mysql/datatypes.py b/ibis/backends/mysql/datatypes.py index 414a758ce38c..f758f0288197 100644 --- a/ibis/backends/mysql/datatypes.py +++ b/ibis/backends/mysql/datatypes.py @@ -3,16 +3,24 @@ import inspect from functools import partial -from pymysql.constants import FIELD_TYPE +from MySQLdb.constants import FIELD_TYPE, FLAG import ibis.expr.datatypes as dt -# binary character set -# used to distinguish blob binary vs blob text -MY_CHARSET_BIN = 63 +TEXT_TYPES = ( + FIELD_TYPE.BIT, + FIELD_TYPE.BLOB, + FIELD_TYPE.LONG_BLOB, + FIELD_TYPE.MEDIUM_BLOB, + FIELD_TYPE.STRING, + FIELD_TYPE.TINY_BLOB, + FIELD_TYPE.VAR_STRING, + FIELD_TYPE.VARCHAR, + FIELD_TYPE.GEOMETRY, +) -def _type_from_cursor_info(descr, field) -> dt.DataType: +def _type_from_cursor_info(*, flags, type_code, field_length, scale) -> dt.DataType: """Construct an ibis type from MySQL field descr and field result metadata. This method is complex because the MySQL protocol is complex. @@ -24,19 +32,14 @@ def _type_from_cursor_info(descr, field) -> dt.DataType: strings, because the protocol does not appear to preserve the logical type, only the physical type. """ - from pymysql.connections import TEXT_TYPES - - _, type_code, _, _, field_length, scale, _ = descr - flags = _FieldFlags(field.flags) + flags = _FieldFlags(flags) typename = _type_codes.get(type_code) if typename is None: raise NotImplementedError(f"MySQL type code {type_code:d} is not supported") if typename in ("DECIMAL", "NEWDECIMAL"): precision = _decimal_length_to_precision( - length=field_length, - scale=scale, - is_unsigned=flags.is_unsigned, + length=field_length, scale=scale, is_unsigned=flags.is_unsigned ) typ = partial(_type_mapping[typename], precision=precision, scale=scale) elif typename == "BIT": @@ -54,8 +57,7 @@ def _type_from_cursor_info(descr, field) -> dt.DataType: # sets are limited to strings typ = dt.Array(dt.string) elif type_code in TEXT_TYPES: - # binary text - if field.charsetnr == MY_CHARSET_BIN: + if flags.is_binary: typ = dt.Binary else: typ = dt.String @@ -115,11 +117,6 @@ class _FieldFlags: is a primary key or not. """ - UNSIGNED = 1 << 5 - TIMESTAMP = 1 << 10 - SET = 1 << 11 - NUM = 1 << 15 - __slots__ = ("value",) def __init__(self, value: int) -> None: @@ -127,16 +124,20 @@ def __init__(self, value: int) -> None: @property def is_unsigned(self) -> bool: - return (self.UNSIGNED & self.value) != 0 + return (FLAG.UNSIGNED & self.value) != 0 @property def is_timestamp(self) -> bool: - return (self.TIMESTAMP & self.value) != 0 + return (FLAG.TIMESTAMP & self.value) != 0 @property def is_set(self) -> bool: - return (self.SET & self.value) != 0 + return (FLAG.SET & self.value) != 0 @property def is_num(self) -> bool: - return (self.NUM & self.value) != 0 + return (FLAG.NUM & self.value) != 0 + + @property + def is_binary(self) -> bool: + return (FLAG.BINARY & self.value) != 0 diff --git a/ibis/backends/mysql/tests/conftest.py b/ibis/backends/mysql/tests/conftest.py index f7c463048767..f343dd2aa211 100644 --- a/ibis/backends/mysql/tests/conftest.py +++ b/ibis/backends/mysql/tests/conftest.py @@ -29,7 +29,7 @@ class TestConf(ServiceBackendTest): supports_structs = False rounding_method = "half_to_even" service_name = "mysql" - deps = ("pymysql",) + deps = ("MySQLdb",) @property def test_files(self) -> Iterable[Path]: diff --git a/ibis/backends/mysql/tests/test_client.py b/ibis/backends/mysql/tests/test_client.py index 456dace97e57..95f4bd048c8e 100644 --- a/ibis/backends/mysql/tests/test_client.py +++ b/ibis/backends/mysql/tests/test_client.py @@ -57,7 +57,6 @@ param("bit(17)", dt.int32, id="bit_17"), param("bit(33)", dt.int64, id="bit_33"), # mariadb doesn't have a distinct json type - param("json", dt.string, id="json"), param("enum('small', 'medium', 'large')", dt.string, id="enum"), param("set('a', 'b', 'c', 'd')", dt.Array(dt.string), id="set"), param("mediumblob", dt.binary, id="mediumblob"), @@ -93,8 +92,9 @@ def test_get_schema_from_query(con, mysql_type, expected_type): @pytest.mark.parametrize( ("mysql_type", "get_schema_expected_type", "table_expected_type"), [ - param("inet6", dt.string, dt.inet, id="inet"), - param("uuid", dt.string, dt.uuid, id="uuid"), + param("json", dt.binary, dt.string, id="json"), + param("inet6", dt.binary, dt.inet, id="inet"), + param("uuid", dt.binary, dt.uuid, id="uuid"), ], ) def test_get_schema_from_query_special_cases( diff --git a/ibis/backends/tests/errors.py b/ibis/backends/tests/errors.py index 05eabee76d1d..cc21b1582850 100644 --- a/ibis/backends/tests/errors.py +++ b/ibis/backends/tests/errors.py @@ -121,9 +121,9 @@ ) = PsycoPg2UndefinedObject = None try: - from pymysql.err import NotSupportedError as MySQLNotSupportedError - from pymysql.err import OperationalError as MySQLOperationalError - from pymysql.err import ProgrammingError as MySQLProgrammingError + from MySQLdb import NotSupportedError as MySQLNotSupportedError + from MySQLdb import OperationalError as MySQLOperationalError + from MySQLdb import ProgrammingError as MySQLProgrammingError except ImportError: MySQLNotSupportedError = MySQLProgrammingError = MySQLOperationalError = None diff --git a/ibis/backends/tests/test_client.py b/ibis/backends/tests/test_client.py index 8e3618b4454b..57943042daf6 100644 --- a/ibis/backends/tests/test_client.py +++ b/ibis/backends/tests/test_client.py @@ -1709,11 +1709,6 @@ def test_insert_into_table_missing_columns(con, temp_table): raises=AssertionError, reason="memtables are assembled every time", ) -@pytest.mark.notyet( - ["mysql"], - raises=AssertionError, - reason="can't execute SQL inside of a finalizer without breaking everything", -) @pytest.mark.notyet( ["bigquery"], raises=AssertionError, reason="test is flaky", strict=False ) diff --git a/poetry.lock b/poetry.lock index 96e4b251d42a..4a6eb4a87f13 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3825,6 +3825,24 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "mysqlclient" +version = "2.2.4" +description = "Python interface to MySQL" +optional = true +python-versions = ">=3.8" +files = [ + {file = "mysqlclient-2.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac44777eab0a66c14cb0d38965572f762e193ec2e5c0723bcd11319cc5b693c5"}, + {file = "mysqlclient-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:329e4eec086a2336fe3541f1ce095d87a6f169d1cc8ba7b04ac68bcb234c9711"}, + {file = "mysqlclient-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:e1ebe3f41d152d7cb7c265349fdb7f1eca86ccb0ca24a90036cde48e00ceb2ab"}, + {file = "mysqlclient-2.2.4-cp38-cp38-win_amd64.whl", hash = "sha256:3c318755e06df599338dad7625f884b8a71fcf322a9939ef78c9b3db93e1de7a"}, + {file = "mysqlclient-2.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:9d4c015480c4a6b2b1602eccd9846103fc70606244788d04aa14b31c4bd1f0e2"}, + {file = "mysqlclient-2.2.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d43987bb9626096a302ca6ddcdd81feaeca65ced1d5fe892a6a66b808326aa54"}, + {file = "mysqlclient-2.2.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4e80dcad884dd6e14949ac6daf769123223a52a6805345608bf49cdaf7bc8b3a"}, + {file = "mysqlclient-2.2.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9d3310295cb682232cadc28abd172f406c718b9ada41d2371259098ae37779d3"}, + {file = "mysqlclient-2.2.4.tar.gz", hash = "sha256:33bc9fb3464e7d7c10b1eaf7336c5ff8f2a3d3b88bab432116ad2490beb3bf41"}, +] + [[package]] name = "narwhals" version = "1.8.1" @@ -5262,21 +5280,6 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] -[[package]] -name = "pymysql" -version = "1.1.1" -description = "Pure Python MySQL Driver" -optional = true -python-versions = ">=3.7" -files = [ - {file = "PyMySQL-1.1.1-py3-none-any.whl", hash = "sha256:4de15da4c61dc132f4fb9ab763063e693d521a80fd0e87943b9a453dd4c19d6c"}, - {file = "pymysql-1.1.1.tar.gz", hash = "sha256:e127611aaf2b417403c60bf4dc570124aeb4a57f5f37b8e95ae399a42f904cd0"}, -] - -[package.extras] -ed25519 = ["PyNaCl (>=1.4.0)"] -rsa = ["cryptography"] - [[package]] name = "pyodbc" version = "5.1.0" @@ -7880,7 +7883,7 @@ flink = ["numpy", "pandas", "pyarrow", "pyarrow-hotfix", "rich"] geospatial = ["geoarrow-types", "geopandas", "pyproj", "shapely"] impala = ["impyla", "numpy", "pandas", "pyarrow", "pyarrow-hotfix", "rich"] mssql = ["numpy", "pandas", "pyarrow", "pyarrow-hotfix", "pyodbc", "rich"] -mysql = ["numpy", "pandas", "pyarrow", "pyarrow-hotfix", "pymysql", "rich"] +mysql = ["mysqlclient", "numpy", "pandas", "pyarrow", "pyarrow-hotfix", "rich"] oracle = ["numpy", "oracledb", "packaging", "pandas", "pyarrow", "pyarrow-hotfix", "rich"] polars = ["numpy", "packaging", "pandas", "polars", "pyarrow", "pyarrow-hotfix", "rich"] postgres = ["numpy", "pandas", "psycopg2", "pyarrow", "pyarrow-hotfix", "rich"] @@ -7894,4 +7897,4 @@ visualization = ["graphviz"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "82384564308f7be107e844339bbcaaf90643f677702f39cf19231f121d2bc7f5" +content-hash = "7acc0d4effb3c7f5476d41411f0a84982ab618fde1912ff6a32092b5c14787bf" diff --git a/pyproject.toml b/pyproject.toml index f2fa45d43ac9..f47c0574b714 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,7 @@ psycopg2 = { version = ">=2.8.4,<3", optional = true } pydata-google-auth = { version = ">=1.4.0,<2", optional = true } pydruid = { version = ">=0.6.7,<1", optional = true } pyexasol = { version = ">=0.25.2,<1", optional = true, extras = ["pandas"] } -pymysql = { version = ">=1,<2", optional = true } +mysqlclient = { version = ">=2.2.4,<3", optional = true } pyodbc = { version = ">=4.0.39,<6", optional = true } pyspark = { version = ">=3.3.3,<4", optional = true } # used to support posix regexen in the pandas and sqlite backends @@ -184,7 +184,7 @@ exasol = ["pyexasol", "pyarrow", "pyarrow-hotfix", "numpy", "pandas", "rich"] flink = ["pyarrow", "pyarrow-hotfix", "numpy", "pandas", "rich"] impala = ["impyla", "pyarrow", "pyarrow-hotfix", "numpy", "pandas", "rich"] mssql = ["pyodbc", "pyarrow", "pyarrow-hotfix", "numpy", "pandas", "rich"] -mysql = ["pymysql", "pyarrow", "pyarrow-hotfix", "numpy", "pandas", "rich"] +mysql = ["mysqlclient", "pyarrow", "pyarrow-hotfix", "numpy", "pandas", "rich"] oracle = [ "oracledb", "packaging", diff --git a/requirements-dev.txt b/requirements-dev.txt index 28f9348419d3..44fb62df156c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -137,6 +137,7 @@ more-itertools==10.5.0 ; python_version >= "3.10" and python_version < "4.0" msgpack==1.1.0 ; python_version >= "3.10" and python_version < "4.0" multidict==6.1.0 ; python_version >= "3.10" and python_version < "4.0" mypy-extensions==1.0.0 ; python_version >= "3.10" and python_version < "4.0" +mysqlclient==2.2.4 ; python_version >= "3.10" and python_version < "4.0" narwhals==1.8.1 ; python_version >= "3.10" and python_version < "3.13" nbclient==0.10.0 ; python_version >= "3.10" and python_version < "3.13" nbconvert==7.16.4 ; python_version >= "3.10" and python_version < "3.13" @@ -198,7 +199,6 @@ pyexasol[pandas]==0.27.0 ; python_version >= "3.10" and python_version < "4.0" pygments==2.18.0 ; python_version >= "3.10" and python_version < "4.0" pyinstrument==4.7.3 ; python_version >= "3.10" and python_version < "4.0" pyjwt==2.9.0 ; python_version >= "3.10" and python_version < "4.0" -pymysql==1.1.1 ; python_version >= "3.10" and python_version < "4.0" pyodbc==5.1.0 ; python_version >= "3.10" and python_version < "4.0" pyogrio==0.9.0 ; python_version >= "3.10" and python_version < "4.0" pyopenssl==24.2.1 ; python_version >= "3.10" and python_version < "4.0" From 1d965c7861879f783356525ddc718109c10a596e Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Wed, 18 Sep 2024 12:03:54 -0400 Subject: [PATCH 15/16] docs(datafusion): add imdb live demo reference to end of presentation (#10162) --- .../datafusion-meetup-nyc-2024/talk.qmd | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd b/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd index f089c6b594eb..7a766d8b5bc3 100644 --- a/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd +++ b/docs/presentations/datafusion-meetup-nyc-2024/talk.qmd @@ -369,6 +369,24 @@ Nope. You should use Ibis _with_ `X`. ::: {.panel-tabset} +### IMDB Top 10 + +```python +import ibis + +con = ibis.datafusion.connect() +ibis.set_backend(con) + +ratings = ibis.examples.imdb_title_ratings.fetch() +basics = ibis.examples.imdb_title_basics.fetch() + +basics.filter(basics.titleType == "movie", basics.isAdult == 0).join( + ratings, "tconst" +).filter(ratings.numVotes > 100_000).order_by(ratings.averageRating.desc()).select( + "primaryTitle", "averageRating" +).limit(10) +``` + ### Pandas PyPI ```python From b39ec14b96b65c67afc9b483ba0905f8b788763a Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Wed, 18 Sep 2024 12:33:28 -0400 Subject: [PATCH 16/16] docs(table-expr): include inherited methods (all `to_*` methods) (#10164) I just noticed that `to_polars` and `to_pyarrow` weren't showing up in searches, that's because we aren't including methods from the `_FileIOHandler` mixin in the reference docs. Now we do. --- docs/_quarto.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_quarto.yml b/docs/_quarto.yml index 642010c144fa..1817659c9f7e 100644 --- a/docs/_quarto.yml +++ b/docs/_quarto.yml @@ -220,6 +220,7 @@ quartodoc: contents: - name: Table package: ibis.expr.types.relations + include_inherited: true - name: GroupedTable package: ibis.expr.types.groupby - name: read_csv