From ea07e843411c7ade50d31688f49c893202b9dbe2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 19:18:15 +0000 Subject: [PATCH 01/16] Bump cryptography from 43.0.3 to 44.0.1 Bumps [cryptography](https://github.com/pyca/cryptography) from 43.0.3 to 44.0.1. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/43.0.3...44.0.1) --- updated-dependencies: - dependency-name: cryptography dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- poetry.lock | 76 ++++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/poetry.lock b/poetry.lock index c44460c58..713cc9b6f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -990,51 +990,55 @@ files = [ [[package]] name = "cryptography" -version = "43.0.3" +version = "44.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = ">=3.7" +python-versions = "!=3.9.0,!=3.9.1,>=3.7" files = [ - {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, - {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, - {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, - {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, - {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, - {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, - {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, + {file = "cryptography-44.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf688f615c29bfe9dfc44312ca470989279f0e94bb9f631f85e3459af8efc009"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7c7e2d71d908dc0f8d2027e1604102140d84b155e658c20e8ad1304317691f"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887143b9ff6bad2b7570da75a7fe8bbf5f65276365ac259a5d2d5147a73775f2"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:322eb03ecc62784536bc173f1483e76747aafeb69c8728df48537eb431cd1911"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:21377472ca4ada2906bc313168c9dc7b1d7ca417b63c1c3011d0c74b7de9ae69"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df978682c1504fc93b3209de21aeabf2375cb1571d4e61907b3e7a2540e83026"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:eb3889330f2a4a148abead555399ec9a32b13b7c8ba969b72d8e500eb7ef84cd"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6a85a93d0642bd774460a86513c5d9d80b5c002ca9693e63f6e540f1815ed0"}, + {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6f76fdd6fd048576a04c5210d53aa04ca34d2ed63336d4abd306d0cbe298fddf"}, + {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6c8acf6f3d1f47acb2248ec3ea261171a671f3d9428e34ad0357148d492c7864"}, + {file = "cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a"}, + {file = "cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00"}, + {file = "cryptography-44.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a2d8a7045e1ab9b9f803f0d9531ead85f90c5f2859e653b61497228b18452008"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8272f257cf1cbd3f2e120f14c68bff2b6bdfcc157fafdee84a1b795efd72862"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8d181e90a777b63f3f0caa836844a1182f1f265687fac2115fcf245f5fbec3"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:436df4f203482f41aad60ed1813811ac4ab102765ecae7a2bbb1dbb66dcff5a7"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4f422e8c6a28cf8b7f883eb790695d6d45b0c385a2583073f3cec434cc705e1a"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:72198e2b5925155497a5a3e8c216c7fb3e64c16ccee11f0e7da272fa93b35c4c"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a46a89ad3e6176223b632056f321bc7de36b9f9b93b2cc1cccf935a3849dc62"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:53f23339864b617a3dfc2b0ac8d5c432625c80014c25caac9082314e9de56f41"}, + {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:888fcc3fce0c888785a4876ca55f9f43787f4c5c1cc1e2e0da71ad481ff82c5b"}, + {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:00918d859aa4e57db8299607086f793fa7813ae2ff5a4637e318a25ef82730f7"}, + {file = "cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9"}, + {file = "cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1f9a92144fa0c877117e9748c74501bea842f93d21ee00b0cf922846d9d0b183"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:610a83540765a8d8ce0f351ce42e26e53e1f774a6efb71eb1b41eb01d01c3d12"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fed5cd6102bb4eb843e3315d2bf25fede494509bddadb81e03a859c1bc17b83"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f4daefc971c2d1f82f03097dc6f216744a6cd2ac0f04c68fb935ea2ba2a0d420"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94f99f2b943b354a5b6307d7e8d19f5c423a794462bde2bf310c770ba052b1c4"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d9c5b9f698a83c8bd71e0f4d3f9f839ef244798e5ffe96febfa9714717db7af7"}, + {file = "cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14"}, ] [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.1)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -4955,4 +4959,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "8904d8f81805e9c7fa124868f5d9f356a8be6b42e56df2ee09fa2a5f8d936e45" +content-hash = "6812b5497e3c203f9b7216e2e94adccd8e673f1ddfa0b901b83a5c1f58b769f4" diff --git a/pyproject.toml b/pyproject.toml index a1658db39..fc0d728de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,7 @@ shapely = "^2.0.5" smartypants = "^2.0.1" mistune = "0.8.4" blinker = "^1.9.0" -cryptography = "^43.0.1" +cryptography = "^44.0.1" idna = "^3.7" jmespath = "^1.0.1" markupsafe = "^2.1.5" From 7a509fe87327ea80ae226275a36ad1e567cdc922 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 15:41:47 +0000 Subject: [PATCH 02/16] Bump geojson from 3.1.0 to 3.2.0 Bumps [geojson](https://github.com/jazzband/geojson) from 3.1.0 to 3.2.0. - [Changelog](https://github.com/jazzband/geojson/blob/main/CHANGELOG.rst) - [Commits](https://github.com/jazzband/geojson/compare/3.1.0...3.2.0) --- updated-dependencies: - dependency-name: geojson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 713cc9b6f..d8e1d4054 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1623,13 +1623,13 @@ files = [ [[package]] name = "geojson" -version = "3.1.0" +version = "3.2.0" description = "Python bindings and utilities for GeoJSON" optional = false python-versions = ">=3.7" files = [ - {file = "geojson-3.1.0-py3-none-any.whl", hash = "sha256:68a9771827237adb8c0c71f8527509c8f5bef61733aa434cefc9c9d4f0ebe8f3"}, - {file = "geojson-3.1.0.tar.gz", hash = "sha256:58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac"}, + {file = "geojson-3.2.0-py3-none-any.whl", hash = "sha256:69d14156469e13c79479672eafae7b37e2dcd19bdfd77b53f74fa8fe29910b52"}, + {file = "geojson-3.2.0.tar.gz", hash = "sha256:b860baba1e8c6f71f8f5f6e3949a694daccf40820fa8f138b3f712bd85804903"}, ] [[package]] @@ -4959,4 +4959,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "6812b5497e3c203f9b7216e2e94adccd8e673f1ddfa0b901b83a5c1f58b769f4" +content-hash = "45f17ef7e2ea00493798fcbd7a266ec987f8d57cd3639923ffdceae8e1fc9ef8" diff --git a/pyproject.toml b/pyproject.toml index fc0d728de..fa4d3a840 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ werkzeug = "^3.0.6" faker = "^26.0.0" async-timeout = "^4.0.3" bleach = "^6.1.0" -geojson = "^3.1.0" +geojson = "^3.2.0" numpy = "^1.26.4" ordered-set = "^4.1.0" phonenumbers = "^8.13.42" From 6e5585027c9e552dbe2e3985edf40b7d83317498 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 21:07:52 +0000 Subject: [PATCH 03/16] Bump cffi from 1.16.0 to 1.17.1 Bumps [cffi](https://github.com/python-cffi/cffi) from 1.16.0 to 1.17.1. - [Release notes](https://github.com/python-cffi/cffi/releases) - [Commits](https://github.com/python-cffi/cffi/compare/v1.16.0...v1.17.1) --- updated-dependencies: - dependency-name: cffi dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- poetry.lock | 123 +++++++++++++++++++++++++++---------------------- pyproject.toml | 2 +- 2 files changed, 70 insertions(+), 55 deletions(-) diff --git a/poetry.lock b/poetry.lock index d8e1d4054..152ea9e49 100644 --- a/poetry.lock +++ b/poetry.lock @@ -590,63 +590,78 @@ files = [ [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -4959,4 +4974,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "45f17ef7e2ea00493798fcbd7a266ec987f8d57cd3639923ffdceae8e1fc9ef8" +content-hash = "fcf4590ca3abb7ea5661c1f60c6eb9e246755ca5bb984f885e2756e453d7e638" diff --git a/pyproject.toml b/pyproject.toml index fa4d3a840..7c6b90730 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ botocore = "^1.34.159" cachetools = "==5.4.0" celery = {version = "==5.4.0", extras = ["redis"]} certifi = ">=2022.12.7" -cffi = "==1.16.0" +cffi = "==1.17.1" charset-normalizer = "^3.1.0" click = "==8.1.7" click-datetime = "==0.2" From 87c4429055e732f3a970c5581b7c7b47bb5b767f Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Wed, 19 Feb 2025 16:42:34 -0500 Subject: [PATCH 04/16] Update GitHub Action References This changeset updates many of our GitHub Action references to point to the latest versions to ensure they are kept up-to-date. This helps address any improvements and security patches that have been made to them. Signed-off-by: Carlo Costino --- .github/workflows/adr-accepted.yml | 2 +- .github/workflows/daily_checks.yml | 4 ++-- .github/workflows/deploy-demo.yml | 6 +++--- .github/workflows/deploy-prod.yml | 6 +++--- .github/workflows/deploy.yml | 6 +++--- .github/workflows/terraform-demo.yml | 2 +- .github/workflows/terraform-production.yml | 2 +- .github/workflows/terraform-staging.yml | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/adr-accepted.yml b/.github/workflows/adr-accepted.yml index c1f781e3f..7faedc902 100644 --- a/.github/workflows/adr-accepted.yml +++ b/.github/workflows/adr-accepted.yml @@ -53,7 +53,7 @@ jobs: echo "filename=$FILENAME" >> "$GITHUB_OUTPUT" - name: write the ADR - uses: DamianReeves/write-file-action@v1.2 + uses: DamianReeves/write-file-action@v1.3 with: path: ${{ steps.filename.outputs.filename }} write-mode: overwrite diff --git a/.github/workflows/daily_checks.yml b/.github/workflows/daily_checks.yml index edd1f7369..60a169ca7 100644 --- a/.github/workflows/daily_checks.yml +++ b/.github/workflows/daily_checks.yml @@ -27,11 +27,11 @@ jobs: - uses: ./.github/actions/setup-project - name: Create requirements.txt run: poetry export --without-hashes --format=requirements.txt > requirements.txt - - uses: pypa/gh-action-pip-audit@v1.0.6 + - uses: pypa/gh-action-pip-audit@v1.1.0 with: inputs: requirements.txt - name: Upload pip-audit artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: pip-audit-report path: /tmp/pip-audit-output.txt diff --git a/.github/workflows/deploy-demo.yml b/.github/workflows/deploy-demo.yml index d3855d2ef..48a47ceb3 100644 --- a/.github/workflows/deploy-demo.yml +++ b/.github/workflows/deploy-demo.yml @@ -18,7 +18,7 @@ jobs: - name: Check for changes to Terraform id: changed-terraform-files - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | terraform/demo/** @@ -78,7 +78,7 @@ jobs: - name: Check for changes to templates.json id: changed-templates - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | app/config_files/templates.json @@ -88,7 +88,7 @@ jobs: - name: Check for changes to egress config id: changed-egress-config - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | deploy-config/egress_proxy/notify-api-demo.*.acl diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml index bc4eaae74..6e0a2d583 100644 --- a/.github/workflows/deploy-prod.yml +++ b/.github/workflows/deploy-prod.yml @@ -22,7 +22,7 @@ jobs: - name: Check for changes to Terraform id: changed-terraform-files - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | terraform/production/** @@ -82,7 +82,7 @@ jobs: - name: Check for changes to templates.json id: changed-templates - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | app/config_files/templates.json @@ -92,7 +92,7 @@ jobs: - name: Check for changes to egress config id: changed-egress-config - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | deploy-config/egress_proxy/notify-api-production.*.acl diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d8d0da952..897e359e2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,7 +24,7 @@ jobs: - name: Check for changes to Terraform id: changed-terraform-files - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | terraform/staging/** @@ -84,7 +84,7 @@ jobs: - name: Check for changes to templates.json id: changed-templates - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | app/config_files/templates.json @@ -94,7 +94,7 @@ jobs: - name: Check for changes to egress config id: changed-egress-config - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | deploy-config/egress_proxy/notify-api-staging.*.acl diff --git a/.github/workflows/terraform-demo.yml b/.github/workflows/terraform-demo.yml index 765f9e53b..a3dced5fc 100644 --- a/.github/workflows/terraform-demo.yml +++ b/.github/workflows/terraform-demo.yml @@ -51,7 +51,7 @@ jobs: # inspiration: https://learn.hashicorp.com/tutorials/terraform/github-actions#review-actions-workflow - name: Update PR - uses: actions/github-script@v6 + uses: actions/github-script@v7 # we would like to update the PR even when a prior step failed if: ${{ always() }} with: diff --git a/.github/workflows/terraform-production.yml b/.github/workflows/terraform-production.yml index 1988c5d95..2f9a5960f 100644 --- a/.github/workflows/terraform-production.yml +++ b/.github/workflows/terraform-production.yml @@ -51,7 +51,7 @@ jobs: # inspiration: https://learn.hashicorp.com/tutorials/terraform/github-actions#review-actions-workflow - name: Update PR - uses: actions/github-script@v6 + uses: actions/github-script@v7 # we would like to update the PR even when a prior step failed if: ${{ always() }} with: diff --git a/.github/workflows/terraform-staging.yml b/.github/workflows/terraform-staging.yml index 1f86ee033..f70efdff6 100644 --- a/.github/workflows/terraform-staging.yml +++ b/.github/workflows/terraform-staging.yml @@ -51,7 +51,7 @@ jobs: # inspiration: https://learn.hashicorp.com/tutorials/terraform/github-actions#review-actions-workflow - name: Update PR - uses: actions/github-script@v6 + uses: actions/github-script@v7 # we would like to update the PR even when a prior step failed if: ${{ always() }} with: From 1de2c8081b59c93de7e68499b8fbb989bc4409b3 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Wed, 19 Feb 2025 18:21:57 -0500 Subject: [PATCH 05/16] Update Terraform config and revert staging deploy change This changeset updates the Terraform user configuration in several environments to factor in team member changes, and reverts the previous change to the staging deploy to see if there was an issue with the last update which is preventing the workflow from running now. Signed-off-by: Carlo Costino --- .github/workflows/deploy.yml | 4 ++-- terraform/demo/main.tf | 3 +-- terraform/sandbox/main.tf | 4 +--- terraform/staging/main.tf | 4 +--- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 897e359e2..cc70434b9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,7 +24,7 @@ jobs: - name: Check for changes to Terraform id: changed-terraform-files - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v44 with: files: | terraform/staging/** @@ -84,7 +84,7 @@ jobs: - name: Check for changes to templates.json id: changed-templates - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v44 with: files: | app/config_files/templates.json diff --git a/terraform/demo/main.tf b/terraform/demo/main.tf index 1a9e091db..47bcf411d 100644 --- a/terraform/demo/main.tf +++ b/terraform/demo/main.tf @@ -49,8 +49,7 @@ module "egress-space" { cf_org_name = local.cf_org_name cf_restricted_space_name = local.cf_space_name deployers = [ - var.cf_user, - "steven.reilly@gsa.gov" + var.cf_user ] } diff --git a/terraform/sandbox/main.tf b/terraform/sandbox/main.tf index 380131370..48b4063e8 100644 --- a/terraform/sandbox/main.tf +++ b/terraform/sandbox/main.tf @@ -49,9 +49,7 @@ module "egress-space" { cf_org_name = local.cf_org_name cf_restricted_space_name = local.cf_space_name deployers = [ - var.cf_user, - "steven.reilly@gsa.gov", - "carlo.costino@gsa.gov" + var.cf_user ] } diff --git a/terraform/staging/main.tf b/terraform/staging/main.tf index d59b063ea..d2e7e674a 100644 --- a/terraform/staging/main.tf +++ b/terraform/staging/main.tf @@ -49,9 +49,7 @@ module "egress-space" { cf_org_name = local.cf_org_name cf_restricted_space_name = local.cf_space_name deployers = [ - var.cf_user, - "steven.reilly@gsa.gov", - "carlo.costino@gsa.gov" + var.cf_user ] } From a4645e9ba10ac8fceead03c1189739afb77a8ed3 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Wed, 19 Feb 2025 21:15:01 -0500 Subject: [PATCH 06/16] Adding users back in Signed-off-by: Carlo Costino --- terraform/demo/main.tf | 3 ++- terraform/sandbox/main.tf | 3 ++- terraform/staging/main.tf | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/terraform/demo/main.tf b/terraform/demo/main.tf index 47bcf411d..5011f0901 100644 --- a/terraform/demo/main.tf +++ b/terraform/demo/main.tf @@ -49,7 +49,8 @@ module "egress-space" { cf_org_name = local.cf_org_name cf_restricted_space_name = local.cf_space_name deployers = [ - var.cf_user + var.cf_user, + "carlo.costino@gsa.gov" ] } diff --git a/terraform/sandbox/main.tf b/terraform/sandbox/main.tf index 48b4063e8..a5b2d6592 100644 --- a/terraform/sandbox/main.tf +++ b/terraform/sandbox/main.tf @@ -49,7 +49,8 @@ module "egress-space" { cf_org_name = local.cf_org_name cf_restricted_space_name = local.cf_space_name deployers = [ - var.cf_user + var.cf_user, + "carlo.costino@gsa.gov" ] } diff --git a/terraform/staging/main.tf b/terraform/staging/main.tf index d2e7e674a..bc6def6d5 100644 --- a/terraform/staging/main.tf +++ b/terraform/staging/main.tf @@ -49,7 +49,8 @@ module "egress-space" { cf_org_name = local.cf_org_name cf_restricted_space_name = local.cf_space_name deployers = [ - var.cf_user + var.cf_user, + "carlo.costino@gsa.gov" ] } From 76ff8c11e9130dfb279c10029c27409086d0aab3 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Wed, 19 Feb 2025 21:26:45 -0500 Subject: [PATCH 07/16] Try installing Terraform directly per GitHub Action issue Signed-off-by: Carlo Costino --- .github/workflows/terraform-staging.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/terraform-staging.yml b/.github/workflows/terraform-staging.yml index f70efdff6..9fe174ee8 100644 --- a/.github/workflows/terraform-staging.yml +++ b/.github/workflows/terraform-staging.yml @@ -18,6 +18,14 @@ jobs: - name: Checkout uses: actions/checkout@v4 + # Looks like we need to install Terraform ourselves now! + # https://github.com/actions/runner-images/issues/10796#issuecomment-2417064348 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: "^1.7.5" + terraform_wrapper: false + - name: Terraform format id: format run: terraform fmt -check From 00e6e560fa4e1e593323e0f2407a77d12c553479 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Wed, 19 Feb 2025 21:36:51 -0500 Subject: [PATCH 08/16] Fix up Terraform installation and get back to latest changed file check Signed-off-by: Carlo Costino --- .github/workflows/deploy-demo.yml | 8 ++++++++ .github/workflows/deploy-prod.yml | 8 ++++++++ .github/workflows/deploy.yml | 12 +++++++++-- .github/workflows/drift.yml | 24 ++++++++++++++++++++++ .github/workflows/terraform-demo.yml | 8 ++++++++ .github/workflows/terraform-production.yml | 8 ++++++++ 6 files changed, 66 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-demo.yml b/.github/workflows/deploy-demo.yml index 48a47ceb3..3c07156bd 100644 --- a/.github/workflows/deploy-demo.yml +++ b/.github/workflows/deploy-demo.yml @@ -16,6 +16,14 @@ jobs: with: fetch-depth: 2 + # Looks like we need to install Terraform ourselves now! + # https://github.com/actions/runner-images/issues/10796#issuecomment-2417064348 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: "^1.7.5" + terraform_wrapper: false + - name: Check for changes to Terraform id: changed-terraform-files uses: tj-actions/changed-files@v45 diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml index 6e0a2d583..703fc35b2 100644 --- a/.github/workflows/deploy-prod.yml +++ b/.github/workflows/deploy-prod.yml @@ -20,6 +20,14 @@ jobs: with: fetch-depth: 2 + # Looks like we need to install Terraform ourselves now! + # https://github.com/actions/runner-images/issues/10796#issuecomment-2417064348 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: "^1.7.5" + terraform_wrapper: false + - name: Check for changes to Terraform id: changed-terraform-files uses: tj-actions/changed-files@v45 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index cc70434b9..eb32dd1eb 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -22,9 +22,17 @@ jobs: with: fetch-depth: 2 + # Looks like we need to install Terraform ourselves now! + # https://github.com/actions/runner-images/issues/10796#issuecomment-2417064348 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: "^1.7.5" + terraform_wrapper: false + - name: Check for changes to Terraform id: changed-terraform-files - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | terraform/staging/** @@ -84,7 +92,7 @@ jobs: - name: Check for changes to templates.json id: changed-templates - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@v45 with: files: | app/config_files/templates.json diff --git a/.github/workflows/drift.yml b/.github/workflows/drift.yml index 5f495ceba..62fa1b3c7 100644 --- a/.github/workflows/drift.yml +++ b/.github/workflows/drift.yml @@ -15,6 +15,14 @@ jobs: - name: Checkout uses: actions/checkout@v4 + # Looks like we need to install Terraform ourselves now! + # https://github.com/actions/runner-images/issues/10796#issuecomment-2417064348 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: "^1.7.5" + terraform_wrapper: false + - name: Check for drift uses: dflook/terraform-check@v1 env: @@ -35,6 +43,14 @@ jobs: with: ref: 'production' + # Looks like we need to install Terraform ourselves now! + # https://github.com/actions/runner-images/issues/10796#issuecomment-2417064348 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: "^1.7.5" + terraform_wrapper: false + - name: Check for drift uses: dflook/terraform-check@v1 env: @@ -55,6 +71,14 @@ jobs: with: ref: 'production' + # Looks like we need to install Terraform ourselves now! + # https://github.com/actions/runner-images/issues/10796#issuecomment-2417064348 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: "^1.7.5" + terraform_wrapper: false + - name: Check for drift uses: dflook/terraform-check@v1 env: diff --git a/.github/workflows/terraform-demo.yml b/.github/workflows/terraform-demo.yml index a3dced5fc..1910de574 100644 --- a/.github/workflows/terraform-demo.yml +++ b/.github/workflows/terraform-demo.yml @@ -18,6 +18,14 @@ jobs: - name: Checkout uses: actions/checkout@v4 + # Looks like we need to install Terraform ourselves now! + # https://github.com/actions/runner-images/issues/10796#issuecomment-2417064348 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: "^1.7.5" + terraform_wrapper: false + - name: Terraform format id: format run: terraform fmt -check diff --git a/.github/workflows/terraform-production.yml b/.github/workflows/terraform-production.yml index 2f9a5960f..91b3a48b9 100644 --- a/.github/workflows/terraform-production.yml +++ b/.github/workflows/terraform-production.yml @@ -18,6 +18,14 @@ jobs: - name: Checkout uses: actions/checkout@v4 + # Looks like we need to install Terraform ourselves now! + # https://github.com/actions/runner-images/issues/10796#issuecomment-2417064348 + - name: Setup Terraform + uses: hashicorp/setup-terraform@v3 + with: + terraform_version: "^1.7.5" + terraform_wrapper: false + - name: Terraform format id: format run: terraform fmt -check From eb8d18bf6b8e9bb9ed27ba121106a7f8f5f2c17f Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Thu, 20 Feb 2025 08:00:39 -0800 Subject: [PATCH 09/16] improve error handling around corrupt csv files --- app/aws/s3.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/aws/s3.py b/app/aws/s3.py index c33366a2c..e8841b20c 100644 --- a/app/aws/s3.py +++ b/app/aws/s3.py @@ -396,7 +396,7 @@ def get_job_from_s3(service_id, job_id): return None -def extract_phones(job): +def extract_phones(job, service_id, job_id): job_csv_data = StringIO(job) csv_reader = csv.reader(job_csv_data) first_row = next(csv_reader) @@ -415,9 +415,11 @@ def extract_phones(job): phones[job_row] = "Unavailable" current_app.logger.error( f"Corrupt csv file, missing columns or\ - possibly a byte order mark in the file, row looks like {row}", + possibly a byte order mark in the file, \ + row: {row} service_id {service_id} job_id {job_id}", ) - + # If the file is corrupt, stop trying to process it. + return phones else: my_phone = row[phone_index] my_phone = re.sub(r"[\+\s\(\)\-\.]*", "", my_phone) @@ -460,7 +462,7 @@ def get_phone_number_from_s3(service_id, job_id, job_row_number): ) return "Unavailable" - phones = extract_phones(job) + phones = extract_phones(job, service_id, job_id) set_job_cache(f"{job_id}_phones", phones) # If we can find the quick dictionary, use it From b1712964a8f10a6f275611487bff88518ae89276 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 24 Feb 2025 10:18:33 -0800 Subject: [PATCH 10/16] remove pytz remnants --- app/job/rest.py | 5 +++-- notifications_utils/timezones.py | 6 +++--- poetry.lock | 13 +------------ pyproject.toml | 1 - tests/app/conftest.py | 4 ++-- tests/app/job/test_rest.py | 4 ++-- 6 files changed, 11 insertions(+), 22 deletions(-) diff --git a/app/job/rest.py b/app/job/rest.py index 8b3965061..2c863f95c 100644 --- a/app/job/rest.py +++ b/app/job/rest.py @@ -1,5 +1,6 @@ +from zoneinfo import ZoneInfo + import dateutil -import pytz from flask import Blueprint, current_app, jsonify, request from app.aws.s3 import ( @@ -225,7 +226,7 @@ def get_scheduled_job_stats(service_id): jsonify( count=count, soonest_scheduled_for=( - soonest_scheduled_for.replace(tzinfo=pytz.UTC).isoformat() + soonest_scheduled_for.replace(tzinfo=ZoneInfo.UTC).isoformat() if soonest_scheduled_for else None ), diff --git a/notifications_utils/timezones.py b/notifications_utils/timezones.py index 277a139f0..1dc59d0e2 100644 --- a/notifications_utils/timezones.py +++ b/notifications_utils/timezones.py @@ -1,9 +1,9 @@ import os +from zoneinfo import ZoneInfo -import pytz from dateutil import parser -local_timezone = pytz.timezone(os.getenv("TIMEZONE", "America/New_York")) +local_timezone = os.getenv("TIMEZONE", ZoneInfo("America/New_York")) def utc_string_to_aware_gmt_datetime(date): @@ -12,5 +12,5 @@ def utc_string_to_aware_gmt_datetime(date): Returns an aware local datetime, essentially the time you'd see on your clock """ date = parser.parse(date) - forced_utc = date.replace(tzinfo=pytz.utc) + forced_utc = date.replace(tzinfo=ZoneInfo.UTC) return forced_utc.astimezone(local_timezone) diff --git a/poetry.lock b/poetry.lock index 152ea9e49..cbdc6dca6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3635,17 +3635,6 @@ files = [ {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, ] -[[package]] -name = "pytz" -version = "2024.2" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, - {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, -] - [[package]] name = "pywin32-ctypes" version = "0.2.3" @@ -4974,4 +4963,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "fcf4590ca3abb7ea5661c1f60c6eb9e246755ca5bb984f885e2756e453d7e638" +content-hash = "51f7e2007fa0114d2f3437dd2bc5eb5cb2e45453b2cbbc2def2c11318aa4f196" diff --git a/pyproject.toml b/pyproject.toml index 7c6b90730..8c7c32695 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,6 @@ numpy = "^1.26.4" ordered-set = "^4.1.0" phonenumbers = "^8.13.42" python-json-logger = "^2.0.7" -pytz = "^2024.1" regex = "^2024.7.24" shapely = "^2.0.5" smartypants = "^2.0.1" diff --git a/tests/app/conftest.py b/tests/app/conftest.py index d402aa8cb..3a43446c4 100644 --- a/tests/app/conftest.py +++ b/tests/app/conftest.py @@ -1,9 +1,9 @@ import json import uuid from datetime import datetime, timedelta +from zoneinfo import ZoneInfo import pytest -import pytz import requests_mock from flask import current_app, url_for from sqlalchemy import delete, select @@ -988,4 +988,4 @@ def admin_request(client): def datetime_in_past(days=0, seconds=0): - return datetime.now(tz=pytz.utc) - timedelta(days=days, seconds=seconds) + return datetime.now(tz=ZoneInfo.UTC) - timedelta(days=days, seconds=seconds) diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index 8d40a045a..e8d48a846 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -2,9 +2,9 @@ import json import uuid from datetime import date, datetime, timedelta from unittest.mock import ANY +from zoneinfo import ZoneInfo import pytest -import pytz from freezegun import freeze_time import app.celery.tasks @@ -183,7 +183,7 @@ def test_create_scheduled_job(client, sample_template, mocker, fake_uuid): assert resp_json["data"]["id"] == fake_uuid assert ( resp_json["data"]["scheduled_for"] - == datetime(2016, 1, 5, 11, 59, 0, tzinfo=pytz.UTC).isoformat() + == datetime(2016, 1, 5, 11, 59, 0, tzinfo=ZoneInfo.UTC).isoformat() ) assert resp_json["data"]["job_status"] == JobStatus.SCHEDULED assert resp_json["data"]["template"] == str(sample_template.id) From cd8564204f99635b88845e584ea9914ee1bf1a50 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 24 Feb 2025 10:32:39 -0800 Subject: [PATCH 11/16] remove pytz remnants --- app/job/rest.py | 2 +- notifications_utils/timezones.py | 2 +- tests/app/conftest.py | 2 +- tests/app/job/test_rest.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/job/rest.py b/app/job/rest.py index 2c863f95c..afc563514 100644 --- a/app/job/rest.py +++ b/app/job/rest.py @@ -226,7 +226,7 @@ def get_scheduled_job_stats(service_id): jsonify( count=count, soonest_scheduled_for=( - soonest_scheduled_for.replace(tzinfo=ZoneInfo.UTC).isoformat() + soonest_scheduled_for.replace(tzinfo=ZoneInfo("UTC")).isoformat() if soonest_scheduled_for else None ), diff --git a/notifications_utils/timezones.py b/notifications_utils/timezones.py index 1dc59d0e2..78976010b 100644 --- a/notifications_utils/timezones.py +++ b/notifications_utils/timezones.py @@ -12,5 +12,5 @@ def utc_string_to_aware_gmt_datetime(date): Returns an aware local datetime, essentially the time you'd see on your clock """ date = parser.parse(date) - forced_utc = date.replace(tzinfo=ZoneInfo.UTC) + forced_utc = date.replace(tzinfo=ZoneInfo("UTC")) return forced_utc.astimezone(local_timezone) diff --git a/tests/app/conftest.py b/tests/app/conftest.py index 3a43446c4..135c54931 100644 --- a/tests/app/conftest.py +++ b/tests/app/conftest.py @@ -988,4 +988,4 @@ def admin_request(client): def datetime_in_past(days=0, seconds=0): - return datetime.now(tz=ZoneInfo.UTC) - timedelta(days=days, seconds=seconds) + return datetime.now(tz=ZoneInfo("UTC")) - timedelta(days=days, seconds=seconds) diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index e8d48a846..b6d7a15e9 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -183,7 +183,7 @@ def test_create_scheduled_job(client, sample_template, mocker, fake_uuid): assert resp_json["data"]["id"] == fake_uuid assert ( resp_json["data"]["scheduled_for"] - == datetime(2016, 1, 5, 11, 59, 0, tzinfo=ZoneInfo.UTC).isoformat() + == datetime(2016, 1, 5, 11, 59, 0, tzinfo=ZoneInfo("UTC")).isoformat() ) assert resp_json["data"]["job_status"] == JobStatus.SCHEDULED assert resp_json["data"]["template"] == str(sample_template.id) From 3bd2e1d1581ad16bfef1d8dc6243152e72737368 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 24 Feb 2025 12:29:31 -0800 Subject: [PATCH 12/16] fix message ratio endpoint --- app/dao/notifications_dao.py | 38 ++++++++++++++++++++++++++++++++++++ app/service/rest.py | 23 ++++++++++------------ 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index 806f5e957..ab70f9673 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -279,6 +279,44 @@ def dao_get_notification_count_for_service(*, service_id): return db.session.execute(stmt).scalar() +def dao_get_notification_count_for_service_message_ratio(service_id, current_year): + start_date = datetime(current_year, 1, 1) + end_date = datetime(current_year + 1, 1, 1) + stmt1 = ( + select(func.count()) + .select_from(Notification) + .where( + Notification.service_id == service_id, + Notification.status + not in [ + NotificationStatus.CANCELLED, + NotificationStatus.CREATED, + NotificationStatus.SENDING, + ], + Notification.created_at >= start_date, + Notification.created_at < end_date, + ) + ) + stmt2 = ( + select(func.count()) + .select_from(NotificationHistory) + .where( + NotificationHistory.service_id == service_id, + NotificationHistory.status + not in [ + NotificationStatus.CANCELLED, + NotificationStatus.CREATED, + NotificationStatus.SENDING, + ], + NotificationHistory.created_at >= start_date, + NotificationHistory.created_at < end_date, + ) + ) + recent_count = db.session.execute(stmt1).scalar_one() + old_count = db.session.execute(stmt2).scalar_one() + return recent_count + old_count + + def dao_get_failed_notification_count(): stmt = select(func.count(Notification.id)).where( Notification.status == NotificationStatus.FAILED diff --git a/app/service/rest.py b/app/service/rest.py index 98cb0e963..b58a3d565 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -1,5 +1,6 @@ import itertools from datetime import datetime, timedelta +from zoneinfo import ZoneInfo from flask import Blueprint, current_app, jsonify, request from sqlalchemy import select @@ -7,7 +8,7 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import NoResultFound from werkzeug.datastructures import MultiDict -from app import db, redis_store +from app import db from app.aws.s3 import get_personalisation_from_s3, get_phone_number_from_s3 from app.config import QueueNames from app.dao import fact_notification_status_dao, notifications_dao @@ -28,7 +29,10 @@ from app.dao.fact_notification_status_dao import ( fetch_stats_for_all_services_by_date_range, ) from app.dao.inbound_numbers_dao import dao_allocate_number_for_service -from app.dao.notifications_dao import dao_get_notification_count_for_service +from app.dao.notifications_dao import ( + dao_get_notification_count_for_service, + dao_get_notification_count_for_service_message_ratio, +) from app.dao.organization_dao import dao_get_organization_by_service_id from app.dao.service_data_retention_dao import ( fetch_service_data_retention, @@ -109,7 +113,6 @@ from app.service.service_senders_schema import ( from app.service.utils import get_guest_list_objects from app.user.users_schema import post_set_permissions_schema from app.utils import get_prev_next_pagination_links, utc_now -from notifications_utils.clients.redis import total_limit_cache_key service_blueprint = Blueprint("service", __name__) @@ -1145,17 +1148,11 @@ def modify_service_data_retention(service_id, data_retention_id): def get_service_message_ratio(): service_id = request.args.get("service_id") + current_year = datetime.datetime.now(tzinfo=ZoneInfo("UTC")).year my_service = dao_fetch_service_by_id(service_id) - - cache_key = total_limit_cache_key(service_id) - messages_sent = redis_store.get(cache_key) - if messages_sent is None: - messages_sent = 0 - current_app.logger.warning( - f"Messages sent was not being tracked for service {service_id}" - ) - else: - messages_sent = int(messages_sent) + messages_sent = dao_get_notification_count_for_service_message_ratio( + service_id, current_year + ) return { "messages_sent": messages_sent, From b22b711fd5e6b268d907e665ce35386529595a5f Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 24 Feb 2025 12:45:05 -0800 Subject: [PATCH 13/16] fix test --- tests/app/service/test_rest.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index cd2ef8005..5668890bf 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -1668,7 +1668,9 @@ def test_remove_user_from_service(client, sample_user_service_permission): def test_get_service_message_ratio(mocker, client, sample_user_service_permission): service = sample_user_service_permission.service - mock_redis = mocker.patch("app.service.rest.redis_store.get") + mock_redis = mocker.patch( + "app.service.rest.dao_get_notification_count_for_service_message_ratio" + ) mock_redis.return_value = 1 endpoint = url_for( From f854cac5efed8b7b5356c05efb182909d7d701f5 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 24 Feb 2025 12:56:37 -0800 Subject: [PATCH 14/16] fix test --- app/service/rest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/service/rest.py b/app/service/rest.py index b58a3d565..ee9dc7896 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -1148,7 +1148,7 @@ def modify_service_data_retention(service_id, data_retention_id): def get_service_message_ratio(): service_id = request.args.get("service_id") - current_year = datetime.datetime.now(tzinfo=ZoneInfo("UTC")).year + current_year = datetime.now(tzinfo=ZoneInfo("UTC")).year my_service = dao_fetch_service_by_id(service_id) messages_sent = dao_get_notification_count_for_service_message_ratio( service_id, current_year From 2678719494bda80a38841dca83153ce46f3cb16e Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 24 Feb 2025 13:06:40 -0800 Subject: [PATCH 15/16] fix test --- app/service/rest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/service/rest.py b/app/service/rest.py index ee9dc7896..275f60e95 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -1148,7 +1148,7 @@ def modify_service_data_retention(service_id, data_retention_id): def get_service_message_ratio(): service_id = request.args.get("service_id") - current_year = datetime.now(tzinfo=ZoneInfo("UTC")).year + current_year = datetime.now(tz=ZoneInfo("UTC")).year my_service = dao_fetch_service_by_id(service_id) messages_sent = dao_get_notification_count_for_service_message_ratio( service_id, current_year From a834da4c198e73ac0c6585327eafcac6603461fb Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 24 Feb 2025 14:30:58 -0800 Subject: [PATCH 16/16] fix test --- app/service/rest.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/service/rest.py b/app/service/rest.py index 275f60e95..fb18d4a6d 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -1153,9 +1153,19 @@ def get_service_message_ratio(): messages_sent = dao_get_notification_count_for_service_message_ratio( service_id, current_year ) + messages_remaining = my_service.total_message_limit - messages_sent + + if my_service.total_message_limit - messages_sent < 0: + raise Exception( + f"Math error get_service_message_ratio(), \ + total {my_service.total_message_limit} \ + messages_sent {messages_sent} remaining {messages_remaining} \ + service_id {service_id} current_year {current_year}" + ) return { "messages_sent": messages_sent, + "messages_remaining": messages_remaining, "total_message_limit": my_service.total_message_limit, }, 200