From 5c8c6384b4a7fdc85495a9b9b80e0570eef8141e Mon Sep 17 00:00:00 2001 From: Juan Leaniz Date: Tue, 27 Feb 2024 14:49:13 -0600 Subject: [PATCH] Remove GCP dependencies (#1440) * Remove gcp dependencies * Update dockerfiles * Update dockerfiles * Update gcp error reporting * Updates to formatting * Add unit test * Update unit test * Clean up * Update unit test * Update error reporting * Update file * Update config template * Catch exception * Updates * fix lint --- docker/api_server/Dockerfile | 4 +- docker/server/Dockerfile | 4 +- docker/tests/Dockerfile | 4 +- docker/worker/Dockerfile | 4 +- poetry.lock | 1856 +++++++++++------------ pyproject.toml | 32 +- turbinia/__init__.py | 5 +- turbinia/client.py | 155 +- turbinia/client_gcp_test.py | 104 -- turbinia/client_test.py | 8 +- turbinia/config/__init__.py | 2 - turbinia/config/turbinia_config_tmpl.py | 21 +- turbinia/evidence.py | 6 +- turbinia/lib/google_cloud.py | 76 +- turbinia/lib/google_cloud_test.py | 33 + turbinia/pubsub.py | 171 --- turbinia/pubsub_test.py | 191 --- turbinia/server_test.py | 6 +- turbinia/state_manager.py | 80 +- turbinia/state_manager_test.py | 93 +- turbinia/task_manager.py | 131 +- turbinia/task_manager_test.py | 1 - turbinia/task_utils.py | 35 +- turbinia/turbiniactl.py | 86 +- turbinia/turbiniactl_test.py | 5 +- turbinia/worker.py | 51 +- turbinia/worker_test.py | 43 +- 27 files changed, 1021 insertions(+), 2186 deletions(-) delete mode 100644 turbinia/client_gcp_test.py create mode 100644 turbinia/lib/google_cloud_test.py delete mode 100644 turbinia/pubsub.py delete mode 100644 turbinia/pubsub_test.py diff --git a/docker/api_server/Dockerfile b/docker/api_server/Dockerfile index b1ec03147..5899dc800 100644 --- a/docker/api_server/Dockerfile +++ b/docker/api_server/Dockerfile @@ -33,7 +33,7 @@ WORKDIR /home/turbinia # Copy requirements and install dependencies to cache them in docker layer COPY --chown=turbinia:turbinia ./pyproject.toml ./poetry.toml ./poetry.lock /home/turbinia/ -RUN poetry install --no-interaction --no-ansi --no-root -E gcp +RUN poetry install --no-interaction --no-ansi --no-root ENV PATH="/home/turbinia/.venv/bin:$PATH" \ VIRTUAL_ENV=/home/turbinia/.venv @@ -44,7 +44,7 @@ COPY --chown=turbinia:turbinia docker/api_server/start.sh /home/turbinia/start.s RUN chmod +rwx /home/turbinia/start.sh # Install Turbinia package -- will skip dependencies if installed -RUN poetry install --no-interaction --no-ansi -E gcp +RUN poetry install --no-interaction --no-ansi CMD ["/home/turbinia/start.sh"] # Expose Prometheus and API endpoints. diff --git a/docker/server/Dockerfile b/docker/server/Dockerfile index fa3fbbfc3..7e21ff1e0 100644 --- a/docker/server/Dockerfile +++ b/docker/server/Dockerfile @@ -32,7 +32,7 @@ WORKDIR /home/turbinia # Copy requirements and install dependencies to cache them in docker layer COPY --chown=turbinia:turbinia ./pyproject.toml ./poetry.toml ./poetry.lock /home/turbinia/ -RUN poetry install --no-interaction --no-ansi --no-root -E gcp +RUN poetry install --no-interaction --no-ansi --no-root ENV PATH="/home/turbinia/.venv/bin:$PATH" \ VIRTUAL_ENV=/home/turbinia/.venv @@ -43,7 +43,7 @@ COPY --chown=turbinia:turbinia docker/server/start.sh /home/turbinia/start.sh RUN chmod +rwx /home/turbinia/start.sh # Install Turbinia package -- will skip dependencies if installed -RUN poetry install --no-interaction --no-ansi -E gcp +RUN poetry install --no-interaction --no-ansi CMD ["/home/turbinia/start.sh"] # Expose Prometheus endpoint. diff --git a/docker/tests/Dockerfile b/docker/tests/Dockerfile index f04090aa7..7568c97bf 100644 --- a/docker/tests/Dockerfile +++ b/docker/tests/Dockerfile @@ -96,7 +96,7 @@ WORKDIR /home/turbinia COPY --chown=turbinia:turbinia ./pyproject.toml ./poetry.toml ./poetry.lock /home/turbinia/ # Install dependencies using Poetry -RUN poetry install --no-interaction --no-ansi -E worker -E gcp --with test --no-root +RUN poetry install --no-interaction --no-ansi -E worker --with test --no-root RUN poetry run python3 -m pip install impacket --no-deps # Activate the virtualenv @@ -106,7 +106,7 @@ ENV PATH="/home/turbinia/.venv/bin:$PATH" \ # Install Turbinia and dependencies in /home/turbinia/.venv using Poetry ADD . /home/turbinia/ # RUN if $(cd /tmp/ && git rev-parse --is-shallow-repository); then cd /tmp/ && git fetch --prune --unshallow && git fetch --depth=1 origin +refs/tags/*:refs/tags/*; fi -RUN poetry install --no-interaction --no-ansi -E worker -E gcp --with test +RUN poetry install --no-interaction --no-ansi -E worker --with test # We need to install the current dev version of turbinia-api-lib for the cli tool test in case the API client changes RUN cd turbinia/api/client && poetry install CMD ["/bin/bash"] diff --git a/docker/worker/Dockerfile b/docker/worker/Dockerfile index b07be92e0..4708a5f26 100644 --- a/docker/worker/Dockerfile +++ b/docker/worker/Dockerfile @@ -105,7 +105,7 @@ WORKDIR /home/turbinia # Copy requirements and install dependencies to cache them in docker layer COPY --chown=turbinia:turbinia ./pyproject.toml ./poetry.toml ./poetry.lock /home/turbinia/ -RUN poetry install --no-interaction --no-ansi -E worker -E gcp --no-root +RUN poetry install --no-interaction --no-ansi -E worker --no-root RUN poetry run pip3 install impacket --no-deps ENV PATH="/home/turbinia/.venv/bin:$PATH" \ VIRTUAL_ENV=/home/turbinia/.venv @@ -116,7 +116,7 @@ COPY --chown=turbinia:turbinia docker/worker/start.sh /home/turbinia/start.sh RUN chmod +rwx /home/turbinia/start.sh # Install Turbinia package -- will skip dependencies if installed -RUN poetry install --no-interaction --no-ansi -E worker -E gcp +RUN poetry install --no-interaction --no-ansi -E worker CMD ["/home/turbinia/start.sh"] # Expose Prometheus endpoint. diff --git a/poetry.lock b/poetry.lock index 8e4a11530..5205b5f4b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,16 +2,15 @@ [[package]] name = "acstore" -version = "20230519" +version = "20240128" description = "Attribute Container Storage (ACStore)." optional = true -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "acstore-20230519.tar.gz", hash = "sha256:b9f6d7b1609b9758fc0944ec25e443de0bd1acb6957388c2de5acc641e13d808"}, + {file = "acstore-20240128.tar.gz", hash = "sha256:f29873feb513fa9a493c11a69d89f85842a98d339cfc4369de190b01900bcfd0"}, ] [package.dependencies] -pip = ">=7.0.0" PyYAML = ">=3.10" [[package]] @@ -31,6 +30,18 @@ PyJWT = ">=1.0.0,<3" python-dateutil = ">=2.1.0,<3" requests = ">=2.0.0,<3" +[[package]] +name = "aenum" +version = "3.1.15" +description = "Advanced Enumerations (compatible with Python's stdlib Enum), NamedTuples, and NamedConstants" +optional = false +python-versions = "*" +files = [ + {file = "aenum-3.1.15-py2-none-any.whl", hash = "sha256:27b1710b9d084de6e2e695dab78fe9f269de924b51ae2850170ee7e1ca6288a5"}, + {file = "aenum-3.1.15-py3-none-any.whl", hash = "sha256:e0dfaeea4c2bd362144b87377e2c61d91958c5ed0b4daf89cb6f45ae23af6288"}, + {file = "aenum-3.1.15.tar.gz", hash = "sha256:8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559"}, +] + [[package]] name = "amqp" version = "5.2.0" @@ -47,13 +58,13 @@ vine = ">=5.0.0,<6.0.0" [[package]] name = "anyio" -version = "4.2.0" +version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, - {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] @@ -105,17 +116,16 @@ files = [ [[package]] name = "azure-core" -version = "1.29.6" +version = "1.30.0" description = "Microsoft Azure Core Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-core-1.29.6.tar.gz", hash = "sha256:13b485252ecd9384ae624894fe51cfa6220966207264c360beada239f88b738a"}, - {file = "azure_core-1.29.6-py3-none-any.whl", hash = "sha256:604a005bce6a49ba661bb7b2be84a9b169047e52fcfcd0a4e4770affab4178f7"}, + {file = "azure-core-1.30.0.tar.gz", hash = "sha256:6f3a7883ef184722f6bd997262eddaf80cfe7e5b3e0caaaf8db1695695893d35"}, + {file = "azure_core-1.30.0-py3-none-any.whl", hash = "sha256:3dae7962aad109610e68c9a7abb31d79720e1d982ddf61363038d175a5025e89"}, ] [package.dependencies] -anyio = ">=3.0,<5.0" requests = ">=2.21.0" six = ">=1.11.0" typing-extensions = ">=4.6.0" @@ -142,19 +152,19 @@ msal-extensions = ">=0.3.0,<2.0.0" [[package]] name = "azure-mgmt-compute" -version = "23.1.0" +version = "30.5.0" description = "Microsoft Azure Compute Management Client Library for Python" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "azure-mgmt-compute-23.1.0.zip", hash = "sha256:49dbb0f51006d557cbd0b22999cb9ecf3eabc2be46d96efcc6d651c6b33754b3"}, - {file = "azure_mgmt_compute-23.1.0-py2.py3-none-any.whl", hash = "sha256:d028afc4fbbd6796b2604195ffdb1021ef77b18cf01356f810820a52a7e2a12d"}, + {file = "azure-mgmt-compute-30.5.0.tar.gz", hash = "sha256:ed3ea34b799db0d52ee55e2f1ab4b0f09fa4a08f35e061ecb9aad9fb5a218844"}, + {file = "azure_mgmt_compute-30.5.0-py3-none-any.whl", hash = "sha256:b65a6c1e22be7334604257d8d9f96a9c6dc4c6d4869f95d0d551c7c8170a2e71"}, ] [package.dependencies] azure-common = ">=1.1,<2.0" -azure-mgmt-core = ">=1.2.0,<2.0.0" -msrest = ">=0.6.21" +azure-mgmt-core = ">=1.3.2,<2.0.0" +isodate = ">=0.6.1,<1.0.0" [[package]] name = "azure-mgmt-core" @@ -188,13 +198,13 @@ isodate = ">=0.6.1,<1.0.0" [[package]] name = "azure-mgmt-network" -version = "25.2.0" +version = "24.0.0" description = "Microsoft Azure Network Management Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-mgmt-network-25.2.0.tar.gz", hash = "sha256:114c4292d223b1d1e247b41af65b8d5a3793567e6adbfa230772055223f4182a"}, - {file = "azure_mgmt_network-25.2.0-py3-none-any.whl", hash = "sha256:c76181e79d689df40b8160c4ffa8dd2bbf6ba064ed4d164fdefd8fb53b781641"}, + {file = "azure-mgmt-network-24.0.0.zip", hash = "sha256:2ed6a14363e7242da3943de91e9f8804b69468d5d36a666a745744fe2278f38d"}, + {file = "azure_mgmt_network-24.0.0-py3-none-any.whl", hash = "sha256:a5ade2fb860f61694feee6118649329b2f7294d599af07922585769293276994"}, ] [package.dependencies] @@ -202,6 +212,22 @@ azure-common = ">=1.1,<2.0" azure-mgmt-core = ">=1.3.2,<2.0.0" isodate = ">=0.6.1,<1.0.0" +[[package]] +name = "azure-mgmt-reservations" +version = "2.3.0" +description = "Microsoft Azure Reservations Client Library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "azure-mgmt-reservations-2.3.0.zip", hash = "sha256:047085105b2de637f2204a34866f3a6de969c56ec4ca0642049f0f4eacea1ca7"}, + {file = "azure_mgmt_reservations-2.3.0-py3-none-any.whl", hash = "sha256:0dbda7da9d054be8c358208c5c046f30ac89012be341a5914d1c6ac1a8dd2e16"}, +] + +[package.dependencies] +azure-common = ">=1.1,<2.0" +azure-mgmt-core = ">=1.3.2,<2.0.0" +msrest = ">=0.7.1" + [[package]] name = "azure-mgmt-resource" version = "23.0.1" @@ -278,17 +304,17 @@ files = [ [[package]] name = "boto3" -version = "1.34.20" +version = "1.34.44" description = "The AWS SDK for Python" optional = false python-versions = ">= 3.8" files = [ - {file = "boto3-1.34.20-py3-none-any.whl", hash = "sha256:a21da54634bd09dcad9e80d106512b6aabe493b1d4260688180156ef27afedc9"}, - {file = "boto3-1.34.20.tar.gz", hash = "sha256:7f662b0c833e7a4d1272b7ec60ded3f14affd54d08620b708ba3abeb0e49d15e"}, + {file = "boto3-1.34.44-py3-none-any.whl", hash = "sha256:40f89fb2acee0a0879effe81badffcd801a348e715483227223241ae311c48fc"}, + {file = "boto3-1.34.44.tar.gz", hash = "sha256:86bcf79a56631609a9f8023fe8f53e2869702bdd4c9047c6d9f091eb39c9b0fa"}, ] [package.dependencies] -botocore = ">=1.34.20,<1.35.0" +botocore = ">=1.34.44,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -297,13 +323,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.20" +version = "1.34.44" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">= 3.8" files = [ - {file = "botocore-1.34.20-py3-none-any.whl", hash = "sha256:f931f13d03e94b3350ad898b21ae2d40240f6571e8a8cdaa487951b51fe3a1fd"}, - {file = "botocore-1.34.20.tar.gz", hash = "sha256:e944bc085222a13359933f4c0a1cce228bdd8aa90e1f2274e94bd55f561db307"}, + {file = "botocore-1.34.44-py3-none-any.whl", hash = "sha256:8d9837fb33256e70b9c8955a32d3e60fa70a0b72849a909737cf105fcc3b5deb"}, + {file = "botocore-1.34.44.tar.gz", hash = "sha256:b0f40c54477e8e0a5c43377a927b8959a86bb8824aaef2d28db7c9c367cdefaa"}, ] [package.dependencies] @@ -393,13 +419,13 @@ zstd = ["zstandard (==0.22.0)"] [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -639,79 +665,65 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "colorlog" -version = "2.10.0" -description = "Log formatting with colors!" -optional = true -python-versions = "*" -files = [ - {file = "colorlog-2.10.0-py2.py3-none-any.whl", hash = "sha256:188a8f47b797fdf001891b5a55263789a2fda0ba7ba4c44f12741d0a8d5e9e03"}, - {file = "colorlog-2.10.0.tar.gz", hash = "sha256:229cd0794a19d8f33b2b4a4b70e1225b6c010af96c2dc8615279abbc1bb3929a"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} - [[package]] name = "coverage" -version = "7.4.0" +version = "7.4.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, - {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, - {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, - {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, - {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, - {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, - {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, - {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, - {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, - {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, - {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, - {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, - {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, - {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, + {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, + {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, + {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, + {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, + {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, + {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, + {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, + {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, + {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, + {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, + {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, + {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, ] [package.extras] @@ -719,56 +731,47 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.4" +version = "41.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449"}, - {file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18"}, - {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2"}, - {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1"}, - {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b"}, - {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1"}, - {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992"}, - {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885"}, - {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824"}, - {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b"}, - {file = "cryptography-42.0.4-cp37-abi3-win32.whl", hash = "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925"}, - {file = "cryptography-42.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923"}, - {file = "cryptography-42.0.4-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7"}, - {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52"}, - {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a"}, - {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9"}, - {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764"}, - {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff"}, - {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257"}, - {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929"}, - {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0"}, - {file = "cryptography-42.0.4-cp39-abi3-win32.whl", hash = "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129"}, - {file = "cryptography-42.0.4-cp39-abi3-win_amd64.whl", hash = "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854"}, - {file = "cryptography-42.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298"}, - {file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88"}, - {file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20"}, - {file = "cryptography-42.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce"}, - {file = "cryptography-42.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74"}, - {file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd"}, - {file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b"}, - {file = "cryptography-42.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660"}, - {file = "cryptography-42.0.4.tar.gz", hash = "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, + {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, + {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, + {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, ] [package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} +cffi = ">=1.12" [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)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -923,22 +926,23 @@ PyYAML = ">=3.10" [[package]] name = "dnspython" -version = "2.4.2" +version = "2.6.1" description = "DNS toolkit" optional = false -python-versions = ">=3.8,<4.0" +python-versions = ">=3.8" files = [ - {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, - {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, ] [package.extras] -dnssec = ["cryptography (>=2.6,<42.0)"] -doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"] -doq = ["aioquic (>=0.9.20)"] -idna = ["idna (>=2.1,<4.0)"] -trio = ["trio (>=0.14,<0.23)"] -wmi = ["wmi (>=1.5.1,<2.0.0)"] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] [[package]] name = "docker" @@ -1107,37 +1111,35 @@ files = [ [[package]] name = "google-api-core" -version = "1.34.0" +version = "2.17.1" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-1.34.0.tar.gz", hash = "sha256:6fb380f49d19ee1d09a9722d0379042b7edb06c0112e4796c7a395078a043e71"}, - {file = "google_api_core-1.34.0-py3-none-any.whl", hash = "sha256:7421474c39d396a74dfa317dddbc69188f2336835f526087c7648f91105e32ff"}, + {file = "google-api-core-2.17.1.tar.gz", hash = "sha256:9df18a1f87ee0df0bc4eea2770ebc4228392d8cc4066655b320e2cfccb15db95"}, + {file = "google_api_core-2.17.1-py3-none-any.whl", hash = "sha256:610c5b90092c360736baccf17bd3efbcb30dd380e7a6dc28a71059edb8bd0d8e"}, ] [package.dependencies] -google-auth = ">=1.25.0,<3.0dev" -googleapis-common-protos = ">=1.56.2,<2.0dev" -grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -grpcio-status = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.0.0dev" -requests = ">=2.18.0,<3.0.0dev" +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" [package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.114.0" +version = "2.118.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.114.0.tar.gz", hash = "sha256:e041bbbf60e682261281e9d64b4660035f04db1cccba19d1d68eebc24d1465ed"}, - {file = "google_api_python_client-2.114.0-py2.py3-none-any.whl", hash = "sha256:690e0bb67d70ff6dea4e8a5d3738639c105a478ac35da153d3b2a384064e9e1a"}, + {file = "google-api-python-client-2.118.0.tar.gz", hash = "sha256:ebf4927a3f5184096647be8f705d090e7f06d48ad82b0fa431a2fe80c2cbe182"}, + {file = "google_api_python_client-2.118.0-py2.py3-none-any.whl", hash = "sha256:9d83b178496b180e058fd206ebfb70ea1afab49f235dd326f557513f56f496d5"}, ] [package.dependencies] @@ -1149,13 +1151,13 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.26.2" +version = "2.28.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.26.2.tar.gz", hash = "sha256:97327dbbf58cccb58fc5a1712bba403ae76668e64814eb30f7316f7e27126b81"}, - {file = "google_auth-2.26.2-py2.py3-none-any.whl", hash = "sha256:3f445c8ce9b61ed6459aad86d8ccdba4a9afed841b2d1451a11ef4db08957424"}, + {file = "google-auth-2.28.0.tar.gz", hash = "sha256:3cfc1b6e4e64797584fb53fc9bd0b7afa9b7c0dba2004fa7dcc9349e58cc3195"}, + {file = "google_auth-2.28.0-py2.py3-none-any.whl", hash = "sha256:7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53"}, ] [package.dependencies] @@ -1203,160 +1205,6 @@ requests-oauthlib = ">=0.7.0" [package.extras] tool = ["click (>=6.0.0)"] -[[package]] -name = "google-cloud-appengine-logging" -version = "1.4.0" -description = "Google Cloud Appengine Logging API client library" -optional = true -python-versions = ">=3.7" -files = [ - {file = "google-cloud-appengine-logging-1.4.0.tar.gz", hash = "sha256:fe74f418d0b01ebebe83ae212abf051ad42692a636677e397de3d459e00d7b64"}, - {file = "google_cloud_appengine_logging-1.4.0-py2.py3-none-any.whl", hash = "sha256:226721903a2d50b6e51c43e59edb548c0bb08cc5f70e1a5f289d3edf2f09a8c9"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-audit-log" -version = "0.2.5" -description = "Google Cloud Audit Protos" -optional = true -python-versions = ">=3.7" -files = [ - {file = "google-cloud-audit-log-0.2.5.tar.gz", hash = "sha256:86e2faba3383adc8fd04a5bd7fd4f960b3e4aedaa7ed950f2f891ce16902eb6b"}, - {file = "google_cloud_audit_log-0.2.5-py2.py3-none-any.whl", hash = "sha256:18b94d4579002a450b7902cd2e8b8fdcb1ea2dd4df3b41f8f82be6d9f7fcd746"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.56.2,<2.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-core" -version = "1.5.0" -description = "Google Cloud API client core library" -optional = true -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" -files = [ - {file = "google-cloud-core-1.5.0.tar.gz", hash = "sha256:1277a015f8eeb014c48f2ec094ed5368358318f1146cf49e8de389962dc19106"}, - {file = "google_cloud_core-1.5.0-py2.py3-none-any.whl", hash = "sha256:99a8a15f406f53f2b11bda1f45f952a9cdfbdbba8abf40c75651019d800879f5"}, -] - -[package.dependencies] -google-api-core = ">=1.21.0,<2.0.0dev" -six = ">=1.12.0" - -[package.extras] -grpc = ["grpcio (>=1.8.2,<2.0dev)"] - -[[package]] -name = "google-cloud-datastore" -version = "2.0.0" -description = "Google Cloud Datastore API client library" -optional = true -python-versions = ">=3.6" -files = [ - {file = "google-cloud-datastore-2.0.0.tar.gz", hash = "sha256:dd83b82650b179cbbf010dd7bbb2fac871e1f5baea019f1bd080669b97c3bd8f"}, - {file = "google_cloud_datastore-2.0.0-py2.py3-none-any.whl", hash = "sha256:6873ff457d565ee373b56dab0fa564b3d89f89f36d0acba54cec809d643605bb"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.22.2,<2.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.4.0,<2.0dev" -libcst = ">=0.2.5" -proto-plus = ">=1.4.0" - -[[package]] -name = "google-cloud-error-reporting" -version = "1.10.0" -description = "Google Cloud Error Reporting API client library" -optional = true -python-versions = ">=3.7" -files = [ - {file = "google-cloud-error-reporting-1.10.0.tar.gz", hash = "sha256:3b27cc6e3c70b6b60bad7ae30954be0c58c67461ac32c7c706b1b383ae9cae45"}, - {file = "google_cloud_error_reporting-1.10.0-py2.py3-none-any.whl", hash = "sha256:1f53737da09998e91f6e6302c7b8c8a3ac03e525fe161368d0a117c3fbe9b8bb"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-cloud-logging = ">=1.14.0,<4.0.0dev" -proto-plus = [ - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, - {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, -] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-logging" -version = "3.1.2" -description = "Stackdriver Logging API client library" -optional = true -python-versions = ">=3.6" -files = [ - {file = "google-cloud-logging-3.1.2.tar.gz", hash = "sha256:3ed00a8bd2076fee7a1dc053880fcb3c973184807e240f8c3c0929dd748eaf7f"}, - {file = "google_cloud_logging-3.1.2-py2.py3-none-any.whl", hash = "sha256:702b69b01c4b98c50a4e4e7cbe12309de8c6685e99ec100c0c902e1765a45e92"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} -google-cloud-appengine-logging = ">=0.1.0,<2.0.0dev" -google-cloud-audit-log = ">=0.1.0,<1.0.0dev" -google-cloud-core = ">=1.4.1,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.15.0,<2.0.0dev" -protobuf = ">=3.19.0,<4.0.0dev" - -[[package]] -name = "google-cloud-pubsub" -version = "1.7.0" -description = "Google Cloud Pub/Sub API client library" -optional = true -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "google-cloud-pubsub-1.7.0.tar.gz", hash = "sha256:c8d098ebd208d00c8f3bb55eefecd8553e7391d59700426a97d35125f0dcb248"}, - {file = "google_cloud_pubsub-1.7.0-py2.py3-none-any.whl", hash = "sha256:b7f577621f991b513034c50f3314ef66838701b3b0dd1fca0d5e9a0e82f9f801"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.14.0,<1.17.dev0 || >=1.20.dev0", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.3,<0.13dev" - -[[package]] -name = "google-cloud-storage" -version = "1.23.0" -description = "Google Cloud Storage API client library" -optional = true -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -files = [ - {file = "google-cloud-storage-1.23.0.tar.gz", hash = "sha256:c66e876ae9547884fa42566a2ebfec51d280f488d7a058af9611ba90c78bed78"}, - {file = "google_cloud_storage-1.23.0-py2.py3-none-any.whl", hash = "sha256:9f59c100d3940e38567c48d54cf1a2e7591a2f38e9693dfc11a242d5e54a1626"}, -] - -[package.dependencies] -google-auth = ">=1.2.0" -google-cloud-core = ">=1.0.3,<2.0dev" -google-resumable-media = ">=0.5.0,<0.6dev" - -[[package]] -name = "google-resumable-media" -version = "0.5.1" -description = "Utilities for Google Media Downloads and Resumable Uploads" -optional = true -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "google-resumable-media-0.5.1.tar.gz", hash = "sha256:97155236971970382b738921f978a6f86a7b5a0b0311703d991e065d3cb55773"}, - {file = "google_resumable_media-0.5.1-py2.py3-none-any.whl", hash = "sha256:cdc64378dc9a7a7bf963a8d0c944c99b549dc0c195a9acbf1fcd465f380b9002"}, -] - -[package.dependencies] -six = "*" - -[package.extras] -requests = ["requests (>=2.18.0,<3.0.0dev)"] - [[package]] name = "googleapis-common-protos" version = "1.62.0" @@ -1369,110 +1217,11 @@ files = [ ] [package.dependencies] -grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] -[[package]] -name = "grpc-google-iam-v1" -version = "0.12.7" -description = "IAM API client library" -optional = true -python-versions = ">=3.7" -files = [ - {file = "grpc-google-iam-v1-0.12.7.tar.gz", hash = "sha256:009197a7f1eaaa22149c96e5e054ac5934ba7241974e92663d8d3528a21203d1"}, - {file = "grpc_google_iam_v1-0.12.7-py2.py3-none-any.whl", hash = "sha256:834da89f4c4a2abbe842a793ed20fc6d9a77011ef2626755b1b89116fb9596d7"}, -] - -[package.dependencies] -googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} -grpcio = ">=1.44.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "grpcio" -version = "1.60.0" -description = "HTTP/2-based RPC framework" -optional = true -python-versions = ">=3.7" -files = [ - {file = "grpcio-1.60.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d020cfa595d1f8f5c6b343530cd3ca16ae5aefdd1e832b777f9f0eb105f5b139"}, - {file = "grpcio-1.60.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b98f43fcdb16172dec5f4b49f2fece4b16a99fd284d81c6bbac1b3b69fcbe0ff"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:20e7a4f7ded59097c84059d28230907cd97130fa74f4a8bfd1d8e5ba18c81491"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452ca5b4afed30e7274445dd9b441a35ece656ec1600b77fff8c216fdf07df43"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43e636dc2ce9ece583b3e2ca41df5c983f4302eabc6d5f9cd04f0562ee8ec1ae"}, - {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e306b97966369b889985a562ede9d99180def39ad42c8014628dd3cc343f508"}, - {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f897c3b127532e6befdcf961c415c97f320d45614daf84deba0a54e64ea2457b"}, - {file = "grpcio-1.60.0-cp310-cp310-win32.whl", hash = "sha256:b87efe4a380887425bb15f220079aa8336276398dc33fce38c64d278164f963d"}, - {file = "grpcio-1.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:a9c7b71211f066908e518a2ef7a5e211670761651039f0d6a80d8d40054047df"}, - {file = "grpcio-1.60.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:fb464479934778d7cc5baf463d959d361954d6533ad34c3a4f1d267e86ee25fd"}, - {file = "grpcio-1.60.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4b44d7e39964e808b071714666a812049765b26b3ea48c4434a3b317bac82f14"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:90bdd76b3f04bdb21de5398b8a7c629676c81dfac290f5f19883857e9371d28c"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91229d7203f1ef0ab420c9b53fe2ca5c1fbeb34f69b3bc1b5089466237a4a134"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b36a2c6d4920ba88fa98075fdd58ff94ebeb8acc1215ae07d01a418af4c0253"}, - {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:297eef542156d6b15174a1231c2493ea9ea54af8d016b8ca7d5d9cc65cfcc444"}, - {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:87c9224acba0ad8bacddf427a1c2772e17ce50b3042a789547af27099c5f751d"}, - {file = "grpcio-1.60.0-cp311-cp311-win32.whl", hash = "sha256:95ae3e8e2c1b9bf671817f86f155c5da7d49a2289c5cf27a319458c3e025c320"}, - {file = "grpcio-1.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:467a7d31554892eed2aa6c2d47ded1079fc40ea0b9601d9f79204afa8902274b"}, - {file = "grpcio-1.60.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:a7152fa6e597c20cb97923407cf0934e14224af42c2b8d915f48bc3ad2d9ac18"}, - {file = "grpcio-1.60.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:7db16dd4ea1b05ada504f08d0dca1cd9b926bed3770f50e715d087c6f00ad748"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b0571a5aef36ba9177e262dc88a9240c866d903a62799e44fd4aae3f9a2ec17e"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fd9584bf1bccdfff1512719316efa77be235469e1e3295dce64538c4773840b"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6a478581b1a1a8fdf3318ecb5f4d0cda41cacdffe2b527c23707c9c1b8fdb55"}, - {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:77c8a317f0fd5a0a2be8ed5cbe5341537d5c00bb79b3bb27ba7c5378ba77dbca"}, - {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1c30bb23a41df95109db130a6cc1b974844300ae2e5d68dd4947aacba5985aa5"}, - {file = "grpcio-1.60.0-cp312-cp312-win32.whl", hash = "sha256:2aef56e85901c2397bd557c5ba514f84de1f0ae5dd132f5d5fed042858115951"}, - {file = "grpcio-1.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:e381fe0c2aa6c03b056ad8f52f8efca7be29fb4d9ae2f8873520843b6039612a"}, - {file = "grpcio-1.60.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:92f88ca1b956eb8427a11bb8b4a0c0b2b03377235fc5102cb05e533b8693a415"}, - {file = "grpcio-1.60.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:e278eafb406f7e1b1b637c2cf51d3ad45883bb5bd1ca56bc05e4fc135dfdaa65"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a48edde788b99214613e440fce495bbe2b1e142a7f214cce9e0832146c41e324"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de2ad69c9a094bf37c1102b5744c9aec6cf74d2b635558b779085d0263166454"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073f959c6f570797272f4ee9464a9997eaf1e98c27cb680225b82b53390d61e6"}, - {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c826f93050c73e7769806f92e601e0efdb83ec8d7c76ddf45d514fee54e8e619"}, - {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9e30be89a75ee66aec7f9e60086fadb37ff8c0ba49a022887c28c134341f7179"}, - {file = "grpcio-1.60.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b0fb2d4801546598ac5cd18e3ec79c1a9af8b8f2a86283c55a5337c5aeca4b1b"}, - {file = "grpcio-1.60.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:9073513ec380434eb8d21970e1ab3161041de121f4018bbed3146839451a6d8e"}, - {file = "grpcio-1.60.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:74d7d9fa97809c5b892449b28a65ec2bfa458a4735ddad46074f9f7d9550ad13"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1434ca77d6fed4ea312901122dc8da6c4389738bf5788f43efb19a838ac03ead"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e61e76020e0c332a98290323ecfec721c9544f5b739fab925b6e8cbe1944cf19"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675997222f2e2f22928fbba640824aebd43791116034f62006e19730715166c0"}, - {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5208a57eae445ae84a219dfd8b56e04313445d146873117b5fa75f3245bc1390"}, - {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:428d699c8553c27e98f4d29fdc0f0edc50e9a8a7590bfd294d2edb0da7be3629"}, - {file = "grpcio-1.60.0-cp38-cp38-win32.whl", hash = "sha256:83f2292ae292ed5a47cdcb9821039ca8e88902923198f2193f13959360c01860"}, - {file = "grpcio-1.60.0-cp38-cp38-win_amd64.whl", hash = "sha256:705a68a973c4c76db5d369ed573fec3367d7d196673fa86614b33d8c8e9ebb08"}, - {file = "grpcio-1.60.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c193109ca4070cdcaa6eff00fdb5a56233dc7610216d58fb81638f89f02e4968"}, - {file = "grpcio-1.60.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:676e4a44e740deaba0f4d95ba1d8c5c89a2fcc43d02c39f69450b1fa19d39590"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5ff21e000ff2f658430bde5288cb1ac440ff15c0d7d18b5fb222f941b46cb0d2"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c86343cf9ff7b2514dd229bdd88ebba760bd8973dac192ae687ff75e39ebfab"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fd3b3968ffe7643144580f260f04d39d869fcc2cddb745deef078b09fd2b328"}, - {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:30943b9530fe3620e3b195c03130396cd0ee3a0d10a66c1bee715d1819001eaf"}, - {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b10241250cb77657ab315270b064a6c7f1add58af94befa20687e7c8d8603ae6"}, - {file = "grpcio-1.60.0-cp39-cp39-win32.whl", hash = "sha256:79a050889eb8d57a93ed21d9585bb63fca881666fc709f5d9f7f9372f5e7fd03"}, - {file = "grpcio-1.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a97a681e82bc11a42d4372fe57898d270a2707f36c45c6676e49ce0d5c41353"}, - {file = "grpcio-1.60.0.tar.gz", hash = "sha256:2199165a1affb666aa24adf0c97436686d0a61bc5fc113c037701fb7c7fceb96"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.60.0)"] - -[[package]] -name = "grpcio-status" -version = "1.48.2" -description = "Status proto mapping for gRPC" -optional = true -python-versions = ">=3.6" -files = [ - {file = "grpcio-status-1.48.2.tar.gz", hash = "sha256:53695f45da07437b7c344ee4ef60d370fd2850179f5a28bb26d8e2aa1102ec11"}, - {file = "grpcio_status-1.48.2-py3-none-any.whl", hash = "sha256:2c33bbdbe20188b2953f46f31af669263b6ee2a9b2d38fa0d36ee091532e21bf"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.48.2" -protobuf = ">=3.12.0" - [[package]] name = "h11" version = "0.14.0" @@ -1486,13 +1235,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.2" +version = "1.0.3" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, - {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, + {file = "httpcore-1.0.3-py3-none-any.whl", hash = "sha256:9a6a501c3099307d9fd76ac244e08503427679b1e81ceb1d922485e2f2462ad2"}, + {file = "httpcore-1.0.3.tar.gz", hash = "sha256:5c0f9546ad17dac4d0772b0808856eb616eb8b48ce94f49ed819fd6982a8a544"}, ] [package.dependencies] @@ -1503,7 +1252,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.23.0)"] +trio = ["trio (>=0.22.0,<0.24.0)"] [[package]] name = "httplib2" @@ -1659,21 +1408,21 @@ files = [ [[package]] name = "jaraco-classes" -version = "3.3.0" +version = "3.3.1" description = "Utility functions for Python class constructs" optional = true python-versions = ">=3.8" files = [ - {file = "jaraco.classes-3.3.0-py3-none-any.whl", hash = "sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb"}, - {file = "jaraco.classes-3.3.0.tar.gz", hash = "sha256:c063dd08e89217cee02c8d5e5ec560f2c8ce6cdc2fcdc2e68f7b2e5547ed3621"}, + {file = "jaraco.classes-3.3.1-py3-none-any.whl", hash = "sha256:86b534de565381f6b3c1c830d13f931d7be1a75f0081c57dff615578676e2206"}, + {file = "jaraco.classes-3.3.1.tar.gz", hash = "sha256:cb28a5ebda8bc47d8c8015307d93163464f9f2b91ab4006e09ff0ce07e8bfb30"}, ] [package.dependencies] more-itertools = "*" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "jeepney" @@ -1775,13 +1524,13 @@ zookeeper = ["kazoo (>=2.8.0)"] [[package]] name = "kubernetes" -version = "29.0.0" +version = "27.2.0" description = "Kubernetes python client" optional = false python-versions = ">=3.6" files = [ - {file = "kubernetes-29.0.0-py2.py3-none-any.whl", hash = "sha256:ab8cb0e0576ccdfb71886366efb102c6a20f268d817be065ce7f9909c631e43e"}, - {file = "kubernetes-29.0.0.tar.gz", hash = "sha256:c4812e227ae74d07d53c88293e564e54b850452715a59a927e7e1bc6b9a60459"}, + {file = "kubernetes-27.2.0-py2.py3-none-any.whl", hash = "sha256:0f9376329c85cf07615ed6886bf9bf21eb1cbfc05e14ec7b0f74ed8153cd2815"}, + {file = "kubernetes-27.2.0.tar.gz", hash = "sha256:d479931c6f37561dbfdf28fc5f46384b1cb8b28f9db344ed4a232ce91990825a"}, ] [package.dependencies] @@ -1831,147 +1580,145 @@ files = [ [[package]] name = "libcloudforensics" -version = "20230601" -description = "libcloudforensics is a set of tools to help acquire forensic evidence from cloud platforms." +version = "20240214" +description = "libcloudforensics is a set of tools to help acquire forensic evidence from Cloud platforms." optional = false -python-versions = "*" +python-versions = ">=3.8,<4.0" files = [ - {file = "libcloudforensics-20230601-py3-none-any.whl", hash = "sha256:2a6dc01767ce52d341f41759b4d3455d8741bca5afa2535e7a10c561a167a23c"}, - {file = "libcloudforensics-20230601.tar.gz", hash = "sha256:66bbac27fed58255f3b593695db2b140769c2e2845c359b1d7c02f8fd82be475"}, + {file = "libcloudforensics-20240214-py3-none-any.whl", hash = "sha256:a56755bb4ffc3763704a756ed9c95235317c6fbb925f1f93f95b44cdee6daf60"}, + {file = "libcloudforensics-20240214.tar.gz", hash = "sha256:e312d1b3b879ee20e80bbd6776c6267f9b36993eb747e759e0b3312195559ed3"}, ] [package.dependencies] -azure-common = "*" -azure-core = "*" -azure-identity = "*" -azure-mgmt-compute = "23.1.0" -azure-mgmt-monitor = "*" -azure-mgmt-network = "*" -azure-mgmt-resource = "23.0.1" -azure-mgmt-storage = "*" -azure-storage-blob = "*" -boto3 = ">=1.26.135" +azure-common = ">=1.1.28,<2.0.0" +azure-core = ">=1.29.4,<2.0.0" +azure-identity = ">=1.13.0,<2.0.0" +azure-mgmt-compute = ">=30.1.0,<31.0.0" +azure-mgmt-monitor = ">=6.0.1,<7.0.0" +azure-mgmt-network = ">=24.0.0,<25.0.0" +azure-mgmt-reservations = ">=2.3.0,<3.0.0" +azure-mgmt-resource = ">=23.0.1,<24.0.0" +azure-mgmt-storage = ">=21.0.0,<22.0.0" +azure-storage-blob = ">=12.18.1,<13.0.0" +boto3 = ">=1.28.20,<2.0.0" botocore = ">=1.29.135" -google-api-core = "*" -google-api-python-client = "*" -httplib2 = "*" -kubernetes = "*" -msrest = "*" -msrestazure = "*" -netaddr = "*" -pycryptodome = "*" -PyJWT = "*" -pyopenssl = "*" -requests = "*" -sshpubkeys = "*" -urllib3 = ">=1.21.1,<1.27" +google-api-core = ">=2.11.1,<3.0.0" +google-api-python-client = ">=2.95.0,<3.0.0" +google-auth = ">=2.22.0,<3.0.0" +httplib2 = ">=0.22.0,<0.23.0" +kubernetes = ">=27.2.0,<28.0.0" +msrest = ">=0.7.1,<0.8.0" +msrestazure = ">=0.6.4,<0.7.0" +netaddr = ">=0.8.0,<0.9.0" +pycryptodome = ">=3.19.1,<4.0.0" +pyjwt = ">=2.8.0,<3.0.0" +pyopenssl = ">=23.2.0,<24.0.0" +requests = ">=2.31.0,<3.0.0" +sshpubkeys = ">=3.3.1,<4.0.0" +urllib3 = {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""} [[package]] name = "libcreg-python" -version = "20231123" +version = "20240201" description = "Python bindings module for libcreg" optional = true python-versions = ">=3.7" files = [ - {file = "libcreg-python-20231123.tar.gz", hash = "sha256:5bf3ba1b8415a335e2ef1c132ac827bf4b84181acb544295822cb67f68167824"}, - {file = "libcreg_python-20231123-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0efdadaaf79223978e2997ad0e7dcea2560c8f3f5179deb0a2c461630c79a604"}, - {file = "libcreg_python-20231123-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:5a0087524262e01f8f395b29730e1df498ec32ca96be152f3c273f592bd25bdd"}, - {file = "libcreg_python-20231123-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:8020898bc80ffbd41296b170144a853be6aebf326b2df0d7e066c1746322cb3a"}, - {file = "libcreg_python-20231123-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:98a84d267b4ba6be7dedd0802763af43aaf3de00eca8e5f7f437ebe356ebab12"}, - {file = "libcreg_python-20231123-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:65d75f6f76081e6fcabb19c4aa22a4c476933990ed1add979cd4d5794fe9895c"}, + {file = "libcreg-python-20240201.tar.gz", hash = "sha256:cfd7e5550a8309a638f5ff616d1c4834b3e1cbfdd7de1829a133b9674c46da93"}, + {file = "libcreg_python-20240201-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:ec9cd6ff3c31b06a31117a9584a7676e2349260f5fbf04e319fe74a111fc8514"}, + {file = "libcreg_python-20240201-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:caaff31a8d1837c66714a151ecfb7c4811fa8143f34815196c27b612d4d1ce14"}, + {file = "libcreg_python-20240201-cp310-cp310-win32.whl", hash = "sha256:01380ebc7ec3abfbaabf6bc695a6a4bd3aa00c060d9260ab4e301024cec72535"}, + {file = "libcreg_python-20240201-cp310-cp310-win_amd64.whl", hash = "sha256:fb331d5c11377df8059658d1d52a3f9658970e63f7abc9bd907e2bfdce58b8e7"}, + {file = "libcreg_python-20240201-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:356dff3e9da2ebe27358970bf203aed66d479a1b101518973d0f8ca0b784254d"}, + {file = "libcreg_python-20240201-cp311-cp311-win32.whl", hash = "sha256:0cbeda205c4945e9cf522b564e325e9479929a93ae6f20e1ffeafa4d2f33cb60"}, + {file = "libcreg_python-20240201-cp311-cp311-win_amd64.whl", hash = "sha256:140c124249e0a0aaa97136ce8516c20a38f363e97845fe5d3e8dd11f9fb4cf82"}, + {file = "libcreg_python-20240201-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:5f36709e28e4346ec19cdd907a58b12745aab3c764fcc3c9d2a4177166c29428"}, + {file = "libcreg_python-20240201-cp312-cp312-win32.whl", hash = "sha256:e470a03e40f62b34d9a6cb5b660a5fc385e11d3d83e1ac3ff37f2dd4efb4b33a"}, + {file = "libcreg_python-20240201-cp312-cp312-win_amd64.whl", hash = "sha256:f1d553c98aee88345d9a22af0ecd5cac9cd18ff42aa01c0d0ae3fe76225250c2"}, + {file = "libcreg_python-20240201-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:42869781c9828c78bd91e4de0845f8edb9f6e713e091c604dc0f1188df1b74b1"}, + {file = "libcreg_python-20240201-cp38-cp38-win32.whl", hash = "sha256:dd0e43ae05370c10bb1ad77a6f1dd56122c788c580ee84f7ea744b7715ce48f3"}, + {file = "libcreg_python-20240201-cp38-cp38-win_amd64.whl", hash = "sha256:d9d7c04793767f2a6759e01453b4ffc7e720c7b1b8a4d7938263dbb53b7e09e0"}, + {file = "libcreg_python-20240201-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:bbad623d39bbdae63d1d61d76c54812c4b8c01bc838340d2aba5abc175cbe5ae"}, + {file = "libcreg_python-20240201-cp39-cp39-win32.whl", hash = "sha256:1d2143ce69976ae903b338a5609abad9d8a57061c44e5a458b043dd17c34d6e1"}, + {file = "libcreg_python-20240201-cp39-cp39-win_amd64.whl", hash = "sha256:2f92d63cc14d811f43464aa8508548660fd0102c35ee1116902ef3ccc18065f7"}, ] -[[package]] -name = "libcst" -version = "1.1.0" -description = "A concrete syntax tree with AST-like properties for Python 3.5, 3.6, 3.7, 3.8, 3.9, and 3.10 programs." -optional = true -python-versions = ">=3.8" -files = [ - {file = "libcst-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:63f75656fd733dc20354c46253fde3cf155613e37643c3eaf6f8818e95b7a3d1"}, - {file = "libcst-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ae11eb1ea55a16dc0cdc61b41b29ac347da70fec14cc4381248e141ee2fbe6c"}, - {file = "libcst-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bc745d0c06420fe2644c28d6ddccea9474fb68a2135904043676deb4fa1e6bc"}, - {file = "libcst-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c1f2da45f1c45634090fd8672c15e0159fdc46853336686959b2d093b6e10fa"}, - {file = "libcst-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:003e5e83a12eed23542c4ea20fdc8de830887cc03662432bb36f84f8c4841b81"}, - {file = "libcst-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:3ebbb9732ae3cc4ae7a0e97890bed0a57c11d6df28790c2b9c869f7da653c7c7"}, - {file = "libcst-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d68c34e3038d3d1d6324eb47744cbf13f2c65e1214cf49db6ff2a6603c1cd838"}, - {file = "libcst-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9dffa1795c2804d183efb01c0f1efd20a7831db6a21a0311edf90b4100d67436"}, - {file = "libcst-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc9b6ac36d7ec9db2f053014ea488086ca2ed9c322be104fbe2c71ca759da4bb"}, - {file = "libcst-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b7a38ec4c1c009ac39027d51558b52851fb9234669ba5ba62283185963a31c"}, - {file = "libcst-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5297a16e575be8173185e936b7765c89a3ca69d4ae217a4af161814a0f9745a7"}, - {file = "libcst-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:7ccaf53925f81118aeaadb068a911fac8abaff608817d7343da280616a5ca9c1"}, - {file = "libcst-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:75816647736f7e09c6120bdbf408456f99b248d6272277eed9a58cf50fb8bc7d"}, - {file = "libcst-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c8f26250f87ca849a7303ed7a4fd6b2c7ac4dec16b7d7e68ca6a476d7c9bfcdb"}, - {file = "libcst-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d37326bd6f379c64190a28947a586b949de3a76be00176b0732c8ee87d67ebe"}, - {file = "libcst-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d8cf974cfa2487b28f23f56c4bff90d550ef16505e58b0dca0493d5293784b"}, - {file = "libcst-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d1271403509b0a4ee6ff7917c2d33b5a015f44d1e208abb1da06ba93b2a378"}, - {file = "libcst-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:bca1841693941fdd18371824bb19a9702d5784cd347cb8231317dbdc7062c5bc"}, - {file = "libcst-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f36f592e035ef84f312a12b75989dde6a5f6767fe99146cdae6a9ee9aff40dd0"}, - {file = "libcst-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f561c9a84eca18be92f4ad90aa9bd873111efbea995449301719a1a7805dbc5c"}, - {file = "libcst-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97fbc73c87e9040e148881041fd5ffa2a6ebf11f64b4ccb5b52e574b95df1a15"}, - {file = "libcst-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99fdc1929703fd9e7408aed2e03f58701c5280b05c8911753a8d8619f7dfdda5"}, - {file = "libcst-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bf69cbbab5016d938aac4d3ae70ba9ccb3f90363c588b3b97be434e6ba95403"}, - {file = "libcst-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:fe41b33aa73635b1651f64633f429f7aa21f86d2db5748659a99d9b7b1ed2a90"}, - {file = "libcst-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73c086705ed34dbad16c62c9adca4249a556c1b022993d511da70ea85feaf669"}, - {file = "libcst-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a07ecfabbbb8b93209f952a365549e65e658831e9231649f4f4e4263cad24b1"}, - {file = "libcst-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c653d9121d6572d8b7f8abf20f88b0a41aab77ff5a6a36e5a0ec0f19af0072e8"}, - {file = "libcst-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f1cd308a4c2f71d5e4eec6ee693819933a03b78edb2e4cc5e3ad1afd5fb3f07"}, - {file = "libcst-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8afb6101b8b3c86c5f9cec6b90ab4da16c3c236fe7396f88e8b93542bb341f7c"}, - {file = "libcst-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:d22d1abfe49aa60fc61fa867e10875a9b3024ba5a801112f4d7ba42d8d53242e"}, - {file = "libcst-1.1.0.tar.gz", hash = "sha256:0acbacb9a170455701845b7e940e2d7b9519db35a86768d86330a0b0deae1086"}, -] - -[package.dependencies] -pyyaml = ">=5.2" -typing-extensions = ">=3.7.4.2" -typing-inspect = ">=0.4.0" - -[package.extras] -dev = ["Sphinx (>=5.1.1)", "black (==23.9.1)", "build (>=0.10.0)", "coverage (>=4.5.4)", "fixit (==2.0.0.post1)", "flake8 (>=3.7.8,<5)", "hypothesis (>=4.36.0)", "hypothesmith (>=0.0.4)", "jinja2 (==3.1.2)", "jupyter (>=1.0.0)", "maturin (>=0.8.3,<0.16)", "nbsphinx (>=0.4.2)", "prompt-toolkit (>=2.0.9)", "pyre-check (==0.9.18)", "setuptools-rust (>=1.5.2)", "setuptools-scm (>=6.0.1)", "slotscheck (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "ufmt (==2.2.0)", "usort (==1.0.7)"] - [[package]] name = "libesedb-python" -version = "20231120" +version = "20240202" description = "Python bindings module for libesedb" optional = true python-versions = ">=3.7" files = [ - {file = "libesedb-python-20231120.tar.gz", hash = "sha256:7c7198831c16d179a3fecc22a7778d79db1ec76a56a33280615b2e47ea9c7bd7"}, - {file = "libesedb_python-20231120-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9a8469fca83ff79454add28667df76bf6772ab4cb5d0ad4325af3c8daca09e17"}, - {file = "libesedb_python-20231120-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:2190b20a5e4a01d742abdd199180e2f25b4b7337da96544eea2722a83373821e"}, - {file = "libesedb_python-20231120-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:caaafb218525353c97c95b6a4d8a55acd997efa861a455b71d67f6a49825d1f4"}, - {file = "libesedb_python-20231120-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:475d9bfb7ff11a4b369a110635f7ac03cbd3030a19e1b82bd83969b5f47be495"}, - {file = "libesedb_python-20231120-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:6824ea16d0dbc6cbc159176176acaf957cc70d2aab38eea7ef1be5b948832189"}, + {file = "libesedb-python-20240202.tar.gz", hash = "sha256:bd47d534dc293c1bf421110a8f6d4c7ca58f157c6fce17f2cd1a6b7bedc18c05"}, + {file = "libesedb_python-20240202-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:241f3eeb833f7089eb26c81b89551d6aae7422bbeee59c27c4536969e1ffa927"}, + {file = "libesedb_python-20240202-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:a8c8aea7f57e37a73d7ea9b9ad449273589b2f9552045cf268a22671101a0546"}, + {file = "libesedb_python-20240202-cp310-cp310-win32.whl", hash = "sha256:f5dc17f12a4d030ad6ab8061f61db4a3c404f1a0c4e0d41b9ca9bd62871024c9"}, + {file = "libesedb_python-20240202-cp310-cp310-win_amd64.whl", hash = "sha256:ade3411dbec951b4d0d93f8c85afee871a14858a7756aee687783a655b6de121"}, + {file = "libesedb_python-20240202-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7e0ce744a9219a47893603b34563d34ac90e8b8f65ee2fc41e89678d6535ad29"}, + {file = "libesedb_python-20240202-cp311-cp311-win32.whl", hash = "sha256:f58d44031b4d659a396dae9c4b438a724ca2849da8f184dc5b93c4260982da87"}, + {file = "libesedb_python-20240202-cp311-cp311-win_amd64.whl", hash = "sha256:77a7e505cc069dca8b97278c7f8a39bab0d83eaa6bb54260752e691d18915569"}, + {file = "libesedb_python-20240202-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:386152d807c9d75aec4555d7b2efe2139bdb4abaf56a66649621e26d2af145fc"}, + {file = "libesedb_python-20240202-cp312-cp312-win32.whl", hash = "sha256:fda7310c0f69ffb278c4176b1e7cf3a5b660241509e611b7ce39dd9fd4bb2c2b"}, + {file = "libesedb_python-20240202-cp312-cp312-win_amd64.whl", hash = "sha256:6d366f504d0480762f1b77d7118633e19cd06ae9b315e12417a93ccbc18520f6"}, + {file = "libesedb_python-20240202-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:db8a55e6d52361389b7145b0380f3d9338e021275c02850eec9bd9c8634f22ec"}, + {file = "libesedb_python-20240202-cp38-cp38-win32.whl", hash = "sha256:700986abcbdd343b999229ce1188420efa572a5294b3d9d1e35e1053aeae45c7"}, + {file = "libesedb_python-20240202-cp38-cp38-win_amd64.whl", hash = "sha256:4b042a3847fc3c00c94f8484c5303539f5f756cdfe1b750f43b28bd55e0914fa"}, + {file = "libesedb_python-20240202-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:8d83e56e8b021150e61cda7b2cdffa020dab60a06b6895878bb84af578836186"}, + {file = "libesedb_python-20240202-cp39-cp39-win32.whl", hash = "sha256:6d2f6c280e278c7732a233188c617243247a17654d0242af85d10e1117f893df"}, + {file = "libesedb_python-20240202-cp39-cp39-win_amd64.whl", hash = "sha256:2922a0bdde398aa6981b6a663d2d81788220015192062dc09a09cc5ca83552f2"}, ] [[package]] name = "libevt-python" -version = "20231121" +version = "20240203" description = "Python bindings module for libevt" optional = true python-versions = ">=3.7" files = [ - {file = "libevt-python-20231121.tar.gz", hash = "sha256:f1354059a3f1f9034783efe6fbb397b99db4d67067ca6ecac5af079e6b4c905d"}, - {file = "libevt_python-20231121-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:011a1846d7955a0593ca9e62fc01e189bedf1e3a2145aecc9037d991efb6b591"}, - {file = "libevt_python-20231121-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:4ad08cc94bb22e982abbae90545f848cbdc791f79e9b739f4e3333230fcc8247"}, - {file = "libevt_python-20231121-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:37817a7364a4e84291aeff418e252fe23f3d460b9742268c7b4323148faa0e89"}, - {file = "libevt_python-20231121-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:7acb260213abe8a2787218d9da3215088f7e8f543facb7c2df18912f4be6aedf"}, - {file = "libevt_python-20231121-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:7f53dd9ab2aa0e4c5a371f42d4e76280cad28a95dc14283361132ac821d48ac7"}, + {file = "libevt-python-20240203.tar.gz", hash = "sha256:5d3df4e410c0b01ccab9af39cdeed0b8081d8e4716e806479fcf0f1706f27a21"}, + {file = "libevt_python-20240203-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:87b98801f6109a5bc48905ca63f077fdc2f2d7af78b451d8c32506d4ad136860"}, + {file = "libevt_python-20240203-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:d38577bf71d29a084d78d5959683dd42a36c32ce653e6e9577b32c5bc9236aaa"}, + {file = "libevt_python-20240203-cp310-cp310-win32.whl", hash = "sha256:a69b566ed43be4a015d42a51c5c79954395e9a99673ecc755525d6a9fe8ee328"}, + {file = "libevt_python-20240203-cp310-cp310-win_amd64.whl", hash = "sha256:3803cfe40abc12a4ea3c57be59642b6848ffcf7f49664b66d9158ac81c401898"}, + {file = "libevt_python-20240203-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:97398072af78b2d2b9ee1706537b2a76e269974bb465ef73abeb7ee52967d56e"}, + {file = "libevt_python-20240203-cp311-cp311-win32.whl", hash = "sha256:c611bee50a1ef74bdb4546684475e94e059e4266b2cf8a2b90df9d8db7afb78c"}, + {file = "libevt_python-20240203-cp311-cp311-win_amd64.whl", hash = "sha256:0def9eb78417cc961ef499a8f00013f8c08be099f430bf3222330d31ace9c995"}, + {file = "libevt_python-20240203-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:bd21dc587f144ec9183e20d74a654641d130914e18358a75f966b49ce77ad3f2"}, + {file = "libevt_python-20240203-cp312-cp312-win32.whl", hash = "sha256:7e25cc9d540c318fe7305f24aedb1240bb2094b491abcdcfa9abfebd0c429028"}, + {file = "libevt_python-20240203-cp312-cp312-win_amd64.whl", hash = "sha256:28f9b88a24cec64f375e68ff8acd04b5d4d7992f4769aa6b023e3e60f51a80ef"}, + {file = "libevt_python-20240203-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:be8794d009664bc2713b9989503bea27118ba3898708811212d9457d59a4fafb"}, + {file = "libevt_python-20240203-cp38-cp38-win32.whl", hash = "sha256:1558e2a0e6b4a1ca138ae04121abb64686838798ee633220ce776fd4fb15239b"}, + {file = "libevt_python-20240203-cp38-cp38-win_amd64.whl", hash = "sha256:e82538d733b8be33adfd949699504414c9f6ed2ea1aac12df2aedff49db0431a"}, + {file = "libevt_python-20240203-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:dd7e0270f5581ab9d0cf4ee57ef39ee44d18f393c44ad6be5428cd019b28cae7"}, + {file = "libevt_python-20240203-cp39-cp39-win32.whl", hash = "sha256:5b58cace163085644ac93bfc50d4d5ba1347def61d5ea94145ac5c2767e73e38"}, + {file = "libevt_python-20240203-cp39-cp39-win_amd64.whl", hash = "sha256:961f3ab04f992c5427f27351ea70414896b7677b513debd934aa4b10e01338bd"}, ] [[package]] name = "libevtx-python" -version = "20231121" +version = "20240204" description = "Python bindings module for libevtx" optional = true python-versions = ">=3.7" files = [ - {file = "libevtx-python-20231121.tar.gz", hash = "sha256:e5717447573cc556b32682d0ee36ca6ff8474865ac3766d757d04e1ba70e23d8"}, - {file = "libevtx_python-20231121-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:3c9c28188646a2f88c22ab046a74e0c035f320e3f0fa13a6a93def8a807aac92"}, - {file = "libevtx_python-20231121-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:83e0c8fbb41f3d6f0c158c6c975ac32a230d3f92a24382fc9fff2eb0219343e3"}, - {file = "libevtx_python-20231121-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:633379b9c90ee59c627d2c2f5d201f70932600d5c35effabe7eb8b9fa0814af3"}, - {file = "libevtx_python-20231121-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:8f091277b33e71b1af3bfc84dd148dc02ba0493cfc8c2e02c1263d5724f79678"}, - {file = "libevtx_python-20231121-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:77546386457292db1bafe4946f1b7069a41d73216222df48fa2fe4c7bd45b980"}, + {file = "libevtx-python-20240204.tar.gz", hash = "sha256:9dd1320a7a7c1fc0fdcbc6f0e62de7a04792328f91f4599abda33f15e41b0b22"}, + {file = "libevtx_python-20240204-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:96d8a08bd41c74c989956d022640dafccbd0c021558ac8d4fd82ac85997b7303"}, + {file = "libevtx_python-20240204-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:c84a42f80aee7849050f44c672376ed8dd8440e0bf2eb1aa9d9bdc6dc6ae0eb5"}, + {file = "libevtx_python-20240204-cp310-cp310-win32.whl", hash = "sha256:8802eb98432f92f35d84ae9794ffb8d0f8fc86cb3a47734a7bb457addb9293b8"}, + {file = "libevtx_python-20240204-cp310-cp310-win_amd64.whl", hash = "sha256:b51822dc4201b83da0bbf2043c8acd623de840d40d96c5ac3eea7ead5260e01f"}, + {file = "libevtx_python-20240204-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b561f06ff647d8ba5d0f0b26945cfbaec88327b461d9a15b82f5f9145e68f134"}, + {file = "libevtx_python-20240204-cp311-cp311-win32.whl", hash = "sha256:cb7a9d428b85a6487df6bc13e0ba709301a8fd012bb411c54fe33cd81fd3ea0d"}, + {file = "libevtx_python-20240204-cp311-cp311-win_amd64.whl", hash = "sha256:16c27f66e40dfb5bbdf19eec1274a65f2f0b31afbf1dde814e967ba3156ea783"}, + {file = "libevtx_python-20240204-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:9cb94d796bd6c2651b687b047a9f36087907032d55ef4bc591378286ca4b68cf"}, + {file = "libevtx_python-20240204-cp312-cp312-win32.whl", hash = "sha256:e37e5b14f720039ef7d4705c55886a1497bded779dc5d825792aa4ca2a9a20d8"}, + {file = "libevtx_python-20240204-cp312-cp312-win_amd64.whl", hash = "sha256:629d5aa66ee8bff8845e4451feda64a657c00a9b375daa72f53ddf62d9f2111f"}, + {file = "libevtx_python-20240204-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:a86ecb3bf4cb5167014e1845a0ee077eb0a4302f294ae91935286265620803bf"}, + {file = "libevtx_python-20240204-cp38-cp38-win32.whl", hash = "sha256:8089c6ed584d32f8161b5916b60b1f27d0824dba05238c3a9cccc09a0fefd556"}, + {file = "libevtx_python-20240204-cp38-cp38-win_amd64.whl", hash = "sha256:de96028666a36dbe6345a6a53d710dd93f76047fe5d24cabf9b5be81fcbb5957"}, + {file = "libevtx_python-20240204-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:df64161a20149545a1af9faf540d5c51285c80731e950a0f364d29f463ba1b5c"}, + {file = "libevtx_python-20240204-cp39-cp39-win32.whl", hash = "sha256:39ac40b37fcfd99e348d3e4a1a00557286421b9e3ecb7e9a95cae1c3a47dfd17"}, + {file = "libevtx_python-20240204-cp39-cp39-win_amd64.whl", hash = "sha256:f487836cdfaea801c30bfb676ae5b72aa4601668a545df0d96d97fb0188fbbca"}, ] [[package]] @@ -2006,32 +1753,54 @@ files = [ [[package]] name = "libfsapfs-python" -version = "20231122" +version = "20240218" description = "Python bindings module for libfsapfs" optional = true python-versions = ">=3.7" files = [ - {file = "libfsapfs-python-20231122.tar.gz", hash = "sha256:090fbfc55b8dbd6e4fe8aa9cfbd4d69e3c3dce74ea2becbff632f5e027f067bd"}, - {file = "libfsapfs_python-20231122-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:033aebc8ed4ffba01a8a14c14667512a787e4f9d493cb3e7f451289061804060"}, - {file = "libfsapfs_python-20231122-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:4ba9674c9c50947211465c28445abe24a189415baa22ca57c3a5f4e631192fab"}, - {file = "libfsapfs_python-20231122-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:0dd513a137616d772aa786fbbef9459d579d6675730638a2fdb9f3c91e3b2dd1"}, - {file = "libfsapfs_python-20231122-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:715bfa504e08d67bbbaa6f990191e36b27bfbf9d1e56eda8a6796ef3b6775eea"}, - {file = "libfsapfs_python-20231122-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:d85d5383b5a2fdc3b55f7ac47e7f17ea4bbb50d356904fee8b400b1826407f6e"}, + {file = "libfsapfs-python-20240218.tar.gz", hash = "sha256:f3c17646b570f7e262b4dca0de69e490c6961ca04366863176f7de0d17beb25c"}, + {file = "libfsapfs_python-20240218-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:cd97828327d78d3b6053186305b7508860571667bcd6f0b12f19425873c81fb0"}, + {file = "libfsapfs_python-20240218-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:1d75614d26ec7982d2053871aeadad981be863e6cfea0f4e5d5565503a52c20e"}, + {file = "libfsapfs_python-20240218-cp310-cp310-win32.whl", hash = "sha256:f68d59555060cba3f2275aaa201a2a2942a8872289740aa1fbce912dbca29cd3"}, + {file = "libfsapfs_python-20240218-cp310-cp310-win_amd64.whl", hash = "sha256:de7af969f1b70242f63dc8537cd1abc30cade0085e20cd151862aab2e30f789e"}, + {file = "libfsapfs_python-20240218-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:4aa735d5aec51a36afc8b1ff493288bfe940970b5b6a3a586f28108df7d6af36"}, + {file = "libfsapfs_python-20240218-cp311-cp311-win32.whl", hash = "sha256:883961fff88e24ee713e8c2c06ad1e084cbe4277cba697a84ee708d2bf6786b6"}, + {file = "libfsapfs_python-20240218-cp311-cp311-win_amd64.whl", hash = "sha256:2e2f077f039567b1d05a10787c7d56cf2334c5108445f38b0a52d59a4acc77e1"}, + {file = "libfsapfs_python-20240218-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:0f9f8ede5d215966f320c705af9760889fbdc2e141add6cdc60dcc384437b34b"}, + {file = "libfsapfs_python-20240218-cp312-cp312-win32.whl", hash = "sha256:228efd23d89ba0c6a4ae31800a16e50e898fd8307891a70cde0e0ba7d917b1ab"}, + {file = "libfsapfs_python-20240218-cp312-cp312-win_amd64.whl", hash = "sha256:d5bd388cea5164b247e677fb392a3bfc670feecb7786b979ffeca1e6d5843d84"}, + {file = "libfsapfs_python-20240218-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:85f6212257e6d200fdae87f76a756c0f49f99e4f3ffcdd0a848021c3d9c854d8"}, + {file = "libfsapfs_python-20240218-cp38-cp38-win32.whl", hash = "sha256:1f2a027f41643db29e6bdf9e70c37388dd9ad1a5ae4878057830bd874d0db3ab"}, + {file = "libfsapfs_python-20240218-cp38-cp38-win_amd64.whl", hash = "sha256:aea6f632b33bb3ed6afc1a914829878caa8f9cf1dbaf2a35568c5ed8c478aea0"}, + {file = "libfsapfs_python-20240218-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:474e1a288c21f8aa97371ce849476f29900a2d805294505469225b53b926a9ef"}, + {file = "libfsapfs_python-20240218-cp39-cp39-win32.whl", hash = "sha256:a6ec6f7133fc62bb1365262dc4100e17f2987e78c726b77277becd8aabd485bc"}, + {file = "libfsapfs_python-20240218-cp39-cp39-win_amd64.whl", hash = "sha256:18ac09445de30982489d62f09fbad16404a2bd43f707472116812d6c89d7156d"}, ] [[package]] name = "libfsext-python" -version = "20231129" +version = "20240219" description = "Python bindings module for libfsext" optional = true python-versions = ">=3.7" files = [ - {file = "libfsext-python-20231129.tar.gz", hash = "sha256:22386eff4433455ceb2504d4e54b0f31f45abb369e2ba99a47755da3693cd142"}, - {file = "libfsext_python-20231129-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9ee2af1db6de65fcda497fa8a52141a2b02801c584fa4c3c1c0f58905e05ed57"}, - {file = "libfsext_python-20231129-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:6640e71286f12466cf34b08010ff785117f95b75bbf9895b75e3c34e669c33e4"}, - {file = "libfsext_python-20231129-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:c061def1abb1fa6a30b42fe38ba6d27513d66ff93fac9429c54e5aa34559b778"}, - {file = "libfsext_python-20231129-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:9fccc22f436c2701fc7c2b02f1fe6b9d6c883e4b72f4b6e943afedf8e142394d"}, - {file = "libfsext_python-20231129-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:47c1eedb4d4a8c687c745fbd61d069e57c6aa4c383092873d85e83a9e9db5974"}, + {file = "libfsext-python-20240219.tar.gz", hash = "sha256:a308a153d0bd954c9ffaaf45665d22ffc0d02f4e258f2d36e706a959058f8fdb"}, + {file = "libfsext_python-20240219-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:35853b95b3e172639e25e377854dafe0460989dfd96e2f276b53bc2842c271f5"}, + {file = "libfsext_python-20240219-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:4a3bbaced9b9ba2d0b6a908f5f6c58b84eb2717aaed816db88b3123a417216ad"}, + {file = "libfsext_python-20240219-cp310-cp310-win32.whl", hash = "sha256:21330efa9209ad7ec6a778f70f602de9d3690da5f41aaad72a2fd95cf267e403"}, + {file = "libfsext_python-20240219-cp310-cp310-win_amd64.whl", hash = "sha256:485a35b5e79c9801bc5c4dbb3552810cd6079d53d5e5d20c8e910ff841394755"}, + {file = "libfsext_python-20240219-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ebeaf03b737d696a998b1a1e8877131aea21d6f9b868f68ec582cfae2a6a42c5"}, + {file = "libfsext_python-20240219-cp311-cp311-win32.whl", hash = "sha256:9473d0f9bc4ec4dfb32cf039d2796ea5af910f500a0144e81e6b27b9613ddd53"}, + {file = "libfsext_python-20240219-cp311-cp311-win_amd64.whl", hash = "sha256:9b49f4cc6002662fb6f088b2aea0c9708f8eafb329f1b7a61093b0fcdc036c3a"}, + {file = "libfsext_python-20240219-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:4fae78c537e73cf420f7d56c658af6c4618b41fe882ea38a772c2030b6b60b33"}, + {file = "libfsext_python-20240219-cp312-cp312-win32.whl", hash = "sha256:442bb8346dbe8cf3e8b332845648136501c9fb663b39579c375e358688cb85e4"}, + {file = "libfsext_python-20240219-cp312-cp312-win_amd64.whl", hash = "sha256:b70622bbd33b58b46f50f52450c944a432097a69c02da8c3ef245aa7e43e65aa"}, + {file = "libfsext_python-20240219-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:721a2fa7dd4c09cdabae9a70772626672bd5bc651ddc694e5b17910e192993e9"}, + {file = "libfsext_python-20240219-cp38-cp38-win32.whl", hash = "sha256:bca38d86bee78dcdbf9c797ef9368d3c045a5680120de453417ca7e43d6a5704"}, + {file = "libfsext_python-20240219-cp38-cp38-win_amd64.whl", hash = "sha256:9c0951b66f52fdc5a85250e6e79198acc36ea610157c783c779a3c5db4c32d57"}, + {file = "libfsext_python-20240219-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:982456660657e5092a5fb44ad6120a5ea22b6ce90176624690c41e7257ca0a87"}, + {file = "libfsext_python-20240219-cp39-cp39-win32.whl", hash = "sha256:2826f2455e6b23b83e33fe50740eb7d5e577f9981139996737e46d1ac0eddbac"}, + {file = "libfsext_python-20240219-cp39-cp39-win_amd64.whl", hash = "sha256:4445c612f30e515c009be9b18e7b6886095d7956298c1534ca42dda0933a4b93"}, ] [[package]] @@ -2066,17 +1835,27 @@ files = [ [[package]] name = "libfsntfs-python" -version = "20231125" +version = "20240119" description = "Python bindings module for libfsntfs" optional = true python-versions = ">=3.7" files = [ - {file = "libfsntfs-python-20231125.tar.gz", hash = "sha256:e23c5e9938a8cc0ba778dbebb1be29a2e3b84a1e16d9d4cefa3cb37608b320ad"}, - {file = "libfsntfs_python-20231125-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:343e8c30805ff0a0bb25af26d5b0e0b8ec93db8ad75e41b1b39a986b87ed831f"}, - {file = "libfsntfs_python-20231125-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:0f76144ae5735d66dcb5070ddb27e416cf277d1cdd8ece161e5f27f6fbdc09eb"}, - {file = "libfsntfs_python-20231125-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:6e2de8c5b1ead95dec2f0fb66d112564641151637027f6952da71662bb296346"}, - {file = "libfsntfs_python-20231125-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:f4a0dd165c8be348b5c7c97080d1cd4cd4ce0f2189ddf29a6a682c87443c4e38"}, - {file = "libfsntfs_python-20231125-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:91e695eab8585f6e4d62f60323e48cb10dd8cb0091209620d13ac34b1ec527cc"}, + {file = "libfsntfs-python-20240119.tar.gz", hash = "sha256:4ece34d1bf154290cb1e5189bc7a2452c1e24bf3a1193b41dbb4a7d9fa2a0146"}, + {file = "libfsntfs_python-20240119-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fe40efa1e5dda29531c27e5ebb65412da8137a4780a91b6a9a899b2ee1229d62"}, + {file = "libfsntfs_python-20240119-cp310-cp310-win32.whl", hash = "sha256:79a825469cdeb23a101dba07dfdbcc9168b3574a65a238a337876a54124835eb"}, + {file = "libfsntfs_python-20240119-cp310-cp310-win_amd64.whl", hash = "sha256:db0fa1d1b7fe095398d3c37b19a47cde98d8e516d022a43d346e00dd27668f7a"}, + {file = "libfsntfs_python-20240119-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b196da254823f6e05f3185875d4e5e471de45eb2af1377a622629a4b9f3afb24"}, + {file = "libfsntfs_python-20240119-cp311-cp311-win32.whl", hash = "sha256:f4adcc92a3f04d374a54b4c52cc6723d712915657553d3a6a6a9b8fe40d75691"}, + {file = "libfsntfs_python-20240119-cp311-cp311-win_amd64.whl", hash = "sha256:73cbc72dd7bb643ea23c7c61cc2d3b795d2266053ccadcdd9320cf66935d1dc9"}, + {file = "libfsntfs_python-20240119-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:c316fa381e7c693bc28fd937ea34a0142c10aee8b8dfad23cef831d986ada423"}, + {file = "libfsntfs_python-20240119-cp312-cp312-win32.whl", hash = "sha256:88672859fd987132523188f57cce2cda3d138f50a1bf0db8cab8fafb3bd5d496"}, + {file = "libfsntfs_python-20240119-cp312-cp312-win_amd64.whl", hash = "sha256:f0fc44125bff1dcaecda9d18e075cef4bb695220ee394388d9f905b489a9f548"}, + {file = "libfsntfs_python-20240119-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:a1484055221b3507f0dac1e6864b3e4054dbaa3179f4f73f0028ec8bc1f20974"}, + {file = "libfsntfs_python-20240119-cp38-cp38-win32.whl", hash = "sha256:478b1e818551e74975a9d701c58629b67caca38fb2faecfecc2d06ebfae782ef"}, + {file = "libfsntfs_python-20240119-cp38-cp38-win_amd64.whl", hash = "sha256:f3280d6787415c4d3e7aa411b155748254faef83a0a8b1e9fe1a1512ec39dbb5"}, + {file = "libfsntfs_python-20240119-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:f2f0c70477ea4761f5969a2a2ee1f72b7ee3663d3270c3d04297fb8281f38306"}, + {file = "libfsntfs_python-20240119-cp39-cp39-win32.whl", hash = "sha256:3aba0586616823d3c0a06ff9fd39808df75c9493dd8becd9e1aadc6141eedfb1"}, + {file = "libfsntfs_python-20240119-cp39-cp39-win_amd64.whl", hash = "sha256:46bb7df5e5aad753a6adc66e4f6c2bd157c7df583ad714296a3a3d526cd69cb6"}, ] [[package]] @@ -2111,47 +1890,77 @@ files = [ [[package]] name = "libfwnt-python" -version = "20231124" +version = "20240126" description = "Python bindings module for libfwnt" optional = true python-versions = ">=3.7" files = [ - {file = "libfwnt-python-20231124.tar.gz", hash = "sha256:f74f675dbc39af105d54e27b861bd3c657ecf9c58a3ec4a150b19eb7c4119db4"}, - {file = "libfwnt_python-20231124-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:998ba1f4e3522f79f7dbb61d98bce1b86909ac1000d68ce7102de3f33537b44c"}, - {file = "libfwnt_python-20231124-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b6c1ca99162c65296b058de673be6953073f8869a07a3c30a85d3496cc50a6b5"}, - {file = "libfwnt_python-20231124-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:d9e46ef7c7a879ad83c067006d9ea95bfda8f1b77bfc1ee7ef184d52816406b2"}, - {file = "libfwnt_python-20231124-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:52bfedca4c6adcd44da23261d075dc1c7c510201a4ea40542dfb1387facc530d"}, - {file = "libfwnt_python-20231124-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:20891d2cb0db11b9fb991f99e165fc1b503b68c85160e7a299e8f8c27590446f"}, + {file = "libfwnt-python-20240126.tar.gz", hash = "sha256:52bfab1e86d20120a361929094d0476fedf8feb52c83dfddc3458a1572be6efc"}, + {file = "libfwnt_python-20240126-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:6db546a1e6ea2883e0c28a962b465d26b821bdb33ef66ca421ed1bac8fb993fe"}, + {file = "libfwnt_python-20240126-cp310-cp310-win32.whl", hash = "sha256:a01da952ee5612ae8c2d9aa54f205d8a9fa15eaa009c028cfa26b100266bbe5c"}, + {file = "libfwnt_python-20240126-cp310-cp310-win_amd64.whl", hash = "sha256:7b67aad7922309c9a50ead7c31fe2b758bfa10a21d4e899b8bd3620b6cda8ccd"}, + {file = "libfwnt_python-20240126-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:78a103d9dd03f2241346941fc7b1074618189678a1dc960348bb58a575f0a5a8"}, + {file = "libfwnt_python-20240126-cp311-cp311-win32.whl", hash = "sha256:4198659a38ce88b946827c2a2e05a9f55fd1b114d24c768426818ae36337ee2b"}, + {file = "libfwnt_python-20240126-cp311-cp311-win_amd64.whl", hash = "sha256:a258bf1d562d4db37aefe67aef922ae6c937a997c9cfdd6451e128587069da90"}, + {file = "libfwnt_python-20240126-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:52a599981d5941fe45690b4d1e9384864ab8edd838a924cacf308ba517552e0d"}, + {file = "libfwnt_python-20240126-cp312-cp312-win32.whl", hash = "sha256:aee740ad7ad982e9621460f588f2f1e8ad15661801e5c258d9378f78fa97655f"}, + {file = "libfwnt_python-20240126-cp312-cp312-win_amd64.whl", hash = "sha256:0fa37b383b35182be5303657cfb8a26f3e180e8329002d94590fd155c461d81e"}, + {file = "libfwnt_python-20240126-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:9bedf1e1bccfc79e3fe9f7a28997f8b557e4035591a344208e9ffce95ec955db"}, + {file = "libfwnt_python-20240126-cp38-cp38-win32.whl", hash = "sha256:6e85b4ead3c97fb513be32b41ff31123e4928baa33903989f2cf63289cd89ccc"}, + {file = "libfwnt_python-20240126-cp38-cp38-win_amd64.whl", hash = "sha256:8d62753337816942854d8b896fb131638ca67c10ec4cd1219a2c9b59a2de2e2c"}, + {file = "libfwnt_python-20240126-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:1b51bf3052edd8701edbffb27f1d4267279b1dc3621c03e5cef5ed1dff5b9747"}, + {file = "libfwnt_python-20240126-cp39-cp39-win32.whl", hash = "sha256:22645a75785d011143a50856959c1140e34db9465db9f6f4bc1fe557291b02c9"}, + {file = "libfwnt_python-20240126-cp39-cp39-win_amd64.whl", hash = "sha256:8f2597da8c51cd0e604ecc5ec9d2f8197c37caac55ad7438af431c8ed77f5c68"}, ] [[package]] name = "libfwsi-python" -version = "20231130" +version = "20240120" description = "Python bindings module for libfwsi" optional = true python-versions = ">=3.7" files = [ - {file = "libfwsi-python-20231130.tar.gz", hash = "sha256:470245d6e7cf0d03594f702f0142e07ed59f0c2f16c763a629ec7b0a92795225"}, - {file = "libfwsi_python-20231130-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:bda7da0f741ecf8dc4f1dcd28b66ed3bf6443611905e84cc022bb9b15de8e3d2"}, - {file = "libfwsi_python-20231130-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b84ba19260197d145b368d8d9f45455d89450cc8384d37c76f978be7e1147a43"}, - {file = "libfwsi_python-20231130-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:aa7f7df62fe3853faa6de3c38961a36f41aaa56a7f3fad0080547f5da4000bf0"}, - {file = "libfwsi_python-20231130-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:b00a2e740fe81a74975a1eee4e9a6213ea05fadfdf05fe8be12a293d19ac0e2c"}, - {file = "libfwsi_python-20231130-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:1b69f6533cc12fac645698a76c2beae67554e0b56f0028f2ee3675891f827f26"}, + {file = "libfwsi-python-20240120.tar.gz", hash = "sha256:276d6e59d9041fe740d00cdbcc9a3ddcda5dfd509d6bf07de45f9a7efe90e6bb"}, + {file = "libfwsi_python-20240120-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:1f6e874b000433a1ba43715d2e0e8329e020ea4b9b8f5a2b7d24fe2363f16270"}, + {file = "libfwsi_python-20240120-cp310-cp310-win32.whl", hash = "sha256:7246372bd4c80c88beebe73a83111012fddb40e6298d9426fe1310138ed1a539"}, + {file = "libfwsi_python-20240120-cp310-cp310-win_amd64.whl", hash = "sha256:1aeb582240c3ca08342e9171900d7aba84dfd8c8dff2e6daf651458ce3ff99d5"}, + {file = "libfwsi_python-20240120-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:def0323b737d41fc90152538315f550fe9f45e900637528d5b351566adcc457a"}, + {file = "libfwsi_python-20240120-cp311-cp311-win32.whl", hash = "sha256:d1020f36ae4a14123885f42023280601dedc77194ec0368c5f6082a7e833e178"}, + {file = "libfwsi_python-20240120-cp311-cp311-win_amd64.whl", hash = "sha256:9c83fb03bab1d94667661da2d249221f25dca217cf38a9a23f18496589b76543"}, + {file = "libfwsi_python-20240120-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:55ce695e0eaa35b1526e7bd7ceaf17819eae253020054ddafe36283ba58a54cf"}, + {file = "libfwsi_python-20240120-cp312-cp312-win32.whl", hash = "sha256:d83cc53c7f0cbd401a963d35f11fc60c363b0e2ebcaad0234adc52190b9573dc"}, + {file = "libfwsi_python-20240120-cp312-cp312-win_amd64.whl", hash = "sha256:948de2113093ca9294a4fc5eca250764e1e977b74161e41d555c9d196a2f7dc9"}, + {file = "libfwsi_python-20240120-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:ac590e4cbea728259a4c661b0c754e596e714eee2127ddd45100614c98e0eba6"}, + {file = "libfwsi_python-20240120-cp38-cp38-win32.whl", hash = "sha256:597ea584b1db990612d84905d378ebce3c9a9fe33a93cf94a48d9a4185eef6c4"}, + {file = "libfwsi_python-20240120-cp38-cp38-win_amd64.whl", hash = "sha256:77fa71a2b5383cc16b985aa984479768fdefe89bca080dd316d318cb35c31663"}, + {file = "libfwsi_python-20240120-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:837b672d5a096fb50317f6bb89df21c25f84df0011ef130056f80a8646a06f1d"}, + {file = "libfwsi_python-20240120-cp39-cp39-win32.whl", hash = "sha256:cd1bd6d4ce1fe3450344a57767118f1c03858a2cd948f607c08e97c9173f6d27"}, + {file = "libfwsi_python-20240120-cp39-cp39-win_amd64.whl", hash = "sha256:ec52afd2fa09be682bdab2595c437cfe0f00859a8e18a4a7ce5bab5398ce2594"}, ] [[package]] name = "liblnk-python" -version = "20231120" +version = "20240120" description = "Python bindings module for liblnk" optional = true python-versions = ">=3.7" files = [ - {file = "liblnk-python-20231120.tar.gz", hash = "sha256:b916744f2116ae0c4ea4dc03b9903988622f874406fa73b8b06a8ae4ae787bec"}, - {file = "liblnk_python-20231120-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:2b5a9e493a20183d407c47f86b876c3985bc0afb476b0eb2f1ed81d4b396b93d"}, - {file = "liblnk_python-20231120-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:68f3fef79f167338489c3e2c7cd9ebe9af2de52dc8bfbe6ab0b058be5145030a"}, - {file = "liblnk_python-20231120-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7f07484fbee7cb6a8b190c0aae1ff846068454adbbe265dec4822792b33d4a00"}, - {file = "liblnk_python-20231120-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:46a0484fef15bfde53e50096793522fafb5942039dc0174a775330c53a8f4d45"}, - {file = "liblnk_python-20231120-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:4284643e3decba3b0af7a772abade5cca75ce6b4480cb63d0411fb1200a5368a"}, + {file = "liblnk-python-20240120.tar.gz", hash = "sha256:04a40f49aae2c91ad82ee8862de83d188af403f17ec6047a2d9034c2b22c1b73"}, + {file = "liblnk_python-20240120-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7eff05774a16c5fa7fef23757265fe4c27e89fc88ed2468dea9a08934919dc08"}, + {file = "liblnk_python-20240120-cp310-cp310-win32.whl", hash = "sha256:9b0310a7e086d7a45afb216ac1ed5a8db917aa4fc3adc0e89474195019850aa7"}, + {file = "liblnk_python-20240120-cp310-cp310-win_amd64.whl", hash = "sha256:2f6066577a696c3c4ee23672cc4ee1371de4e794406efbca13012c419ee3e68e"}, + {file = "liblnk_python-20240120-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ee8c8c1f66eeb0a22117c5004d5c24342b96cc88b1a0efd5c3dd1f798b9d7283"}, + {file = "liblnk_python-20240120-cp311-cp311-win32.whl", hash = "sha256:80b1c0717850bc52e92ded63ba4428cd594b40f5e4dc57d191ff9df41123fcfa"}, + {file = "liblnk_python-20240120-cp311-cp311-win_amd64.whl", hash = "sha256:9b9e1831a9973fd536e03a24ded009146110556ec330a27af79acb96dea5b0e4"}, + {file = "liblnk_python-20240120-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:5dd99f3b6c88e09058b055d661028314a5cd6d366949d3a109d056179c2f2287"}, + {file = "liblnk_python-20240120-cp312-cp312-win32.whl", hash = "sha256:305e7b407d091f82de0ff427cc8636a21c001c049ab380bfcda73278da799535"}, + {file = "liblnk_python-20240120-cp312-cp312-win_amd64.whl", hash = "sha256:082d10d433f7dba7e923e0ed618d5dd1a5591ba88aa926eb3ebec26e790cac91"}, + {file = "liblnk_python-20240120-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:9f88950f875be72a7690cee98d989318bb77cf750bb17233ef924b3b5eaeadca"}, + {file = "liblnk_python-20240120-cp38-cp38-win32.whl", hash = "sha256:0be8ecc130e8f5b1bacfbd6d57dc84b3f132e24b2eac73b88bb363fb24455dd0"}, + {file = "liblnk_python-20240120-cp38-cp38-win_amd64.whl", hash = "sha256:fca2378a8a56b74d91962692f817adc49c2902a85d19986331109c50313e8858"}, + {file = "liblnk_python-20240120-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:e74c1c6fdfe469eeac0f940517c1b9bad44b04531cf482616906f604aa89edbd"}, + {file = "liblnk_python-20240120-cp39-cp39-win32.whl", hash = "sha256:3da145bc216385e7e8fc6ad0aacc551f74a8c3d7cca1856589e3a1e34c653220"}, + {file = "liblnk_python-20240120-cp39-cp39-win_amd64.whl", hash = "sha256:9d3815c6fd2c110e8aa388d1b4b6da1ca0d6ffc6293531029a8cf2d72d697d88"}, ] [[package]] @@ -2186,32 +1995,54 @@ files = [ [[package]] name = "libmsiecf-python" -version = "20231203" +version = "20240209" description = "Python bindings module for libmsiecf" optional = true python-versions = ">=3.7" files = [ - {file = "libmsiecf-python-20231203.tar.gz", hash = "sha256:47a2aa26d85923c2f42d51254150515456f46d12cf95b7fee24d5e8e3e22348a"}, - {file = "libmsiecf_python-20231203-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9847d78e211556de8db4b9e97d4912cb9c971c4418b2ec43feb2ef92c053ea70"}, - {file = "libmsiecf_python-20231203-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:9310500ee57265e33f6d9cafc5e441f94e36631dee541018eaeecebd6bf13dc7"}, - {file = "libmsiecf_python-20231203-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b4969f75155eba4dc9f742365e8f2b8ecf8d4127628aa73fa8b80b2ef7ff96ac"}, - {file = "libmsiecf_python-20231203-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:5a9989b7c688f49efcd3a7ec3863bf9a05e7610f2d733b7f42a40b2f5e900178"}, - {file = "libmsiecf_python-20231203-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:35d134601a90bf639dc8cc47ab353336712eb140d3963a76a0c0d1ff22c6556b"}, + {file = "libmsiecf-python-20240209.tar.gz", hash = "sha256:0b7f29088988ed2dcd1e5478e3720fb9a47779e8a3d764e26ec63325c5c100d0"}, + {file = "libmsiecf_python-20240209-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:1bfe2469273cf3d567392e8c884bcba60a4c97c8edf78a0179beb7ab8aa61283"}, + {file = "libmsiecf_python-20240209-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:f1e0cdd4ba9d28f5d643d2785e54d8e0c26fb9dc0e45e7bb444277deb2d638e0"}, + {file = "libmsiecf_python-20240209-cp310-cp310-win32.whl", hash = "sha256:da86e652c79102673245e72f7b5b7033a1a4bab56733e70c6793044fc152736c"}, + {file = "libmsiecf_python-20240209-cp310-cp310-win_amd64.whl", hash = "sha256:951dc2af8c5e2723438e3437749b76cd3032b88f825336e284b955654830c38b"}, + {file = "libmsiecf_python-20240209-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:fffddb0ef7e9cc1afff9ee7415d46a90f204e36fd2958296a379a4c10c032b69"}, + {file = "libmsiecf_python-20240209-cp311-cp311-win32.whl", hash = "sha256:18fb36cb4bccfd79045383772db2d5b0468a9eb064d45cbe2f41a08aba53bf8b"}, + {file = "libmsiecf_python-20240209-cp311-cp311-win_amd64.whl", hash = "sha256:253c24011cf7bbf761cbeab5098badbf79feaca119e6755001a6d83e15cc8704"}, + {file = "libmsiecf_python-20240209-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:9807be8343b1568cc24a4f75da97600ec7f2b8ed005c34a8b9cbae899a891f3a"}, + {file = "libmsiecf_python-20240209-cp312-cp312-win32.whl", hash = "sha256:fe680d01415af0324e4ee3dc6f670e990cb10c40a3bdff862639cffae531e7ad"}, + {file = "libmsiecf_python-20240209-cp312-cp312-win_amd64.whl", hash = "sha256:babb06103d6e573110daae0d505ed0a94dc874717b1921d619d9ef7b13119e2b"}, + {file = "libmsiecf_python-20240209-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:15bb706f0308bee46ce560db4eb2eb654b2775abba37accd6b1ec165ae6c1f19"}, + {file = "libmsiecf_python-20240209-cp38-cp38-win32.whl", hash = "sha256:eb1a77a69b6461778acc143a79c2c20fb26506aacee175d858069997f29ec55a"}, + {file = "libmsiecf_python-20240209-cp38-cp38-win_amd64.whl", hash = "sha256:cc5fb123137f605aae46e431c4863b2663e68bb6cacba534335348d7ca045a56"}, + {file = "libmsiecf_python-20240209-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:d45f223e8deab5b707ca55610e73e35f0e13deee35c3465719c35f468f641043"}, + {file = "libmsiecf_python-20240209-cp39-cp39-win32.whl", hash = "sha256:d258097dfbc93c75218f804c6785c7e667463c8b6896f08c0779b1c83cec6bc1"}, + {file = "libmsiecf_python-20240209-cp39-cp39-win_amd64.whl", hash = "sha256:3f38642590b9171114950b7bed9cf5baad62468986b961a27c2d9c7c6b868aa1"}, ] [[package]] name = "libolecf-python" -version = "20231203" +version = "20240212" description = "Python bindings module for libolecf" optional = true python-versions = ">=3.7" files = [ - {file = "libolecf-python-20231203.tar.gz", hash = "sha256:8503655090cb96418faf3805255b7e485f1b96ec912de9a41472720aeb6f30c0"}, - {file = "libolecf_python-20231203-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:410ae7aad8836bfc93db78979b01e0322e811eeec1089a71f31dcd1617bcd06a"}, - {file = "libolecf_python-20231203-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:f459eb44d8e9d6de2b4dd51938b383cc033c193d69d4597895fca0a716b12389"}, - {file = "libolecf_python-20231203-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:c0fb724b2e297773aaf6d47c2c5e39cfece80898404e7e9ee386e042cdfcf03b"}, - {file = "libolecf_python-20231203-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:8c1bd0a123a35f816bf66a2b08212ede8dc7cb2731272c068b042ef2f2c1c6a1"}, - {file = "libolecf_python-20231203-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:ce926fdde19d21d316193f6b42a6a713ab8f9065008ddf0860bd7e31d37e4fc5"}, + {file = "libolecf-python-20240212.tar.gz", hash = "sha256:8ca9b87a8e54567943c91a86cfba0e233448b09da3788b29cde0d58b5c4738f6"}, + {file = "libolecf_python-20240212-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:2ce45603001fcee17f7f60d3a0cbcca1b2d7af51f5466fa45e6c63ad95c9e28a"}, + {file = "libolecf_python-20240212-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:fceff9a463bff8396eb0c954fe264f58970c5b9dd3280b650118181f1595a930"}, + {file = "libolecf_python-20240212-cp310-cp310-win32.whl", hash = "sha256:1f05afa7d356dc465984cbfd5b90df48651a41d4aa996a37d4ac1edd0be3b38e"}, + {file = "libolecf_python-20240212-cp310-cp310-win_amd64.whl", hash = "sha256:bb1de7119fed05fd10d6be2f2cd3f7520de9efc4a7ec851c6ba9e846329ecbd1"}, + {file = "libolecf_python-20240212-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:cd99bebf81346184fb8e3322100a0fb0a7537429a80c85a9031fe6621390a7d6"}, + {file = "libolecf_python-20240212-cp311-cp311-win32.whl", hash = "sha256:2a13b06d5b8616dbd1d10355b98ce078034e057891485cc966d3a19fa89ac005"}, + {file = "libolecf_python-20240212-cp311-cp311-win_amd64.whl", hash = "sha256:4c32714ba447e86005738fc68ce5836e69cb4be753e39396803c5412216c9b25"}, + {file = "libolecf_python-20240212-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7720496f8ccaf4528d4f7201a432946f5fa2e544f04854fe806524ce82776769"}, + {file = "libolecf_python-20240212-cp312-cp312-win32.whl", hash = "sha256:27459139516da198d4bdbb63a8de10296c3731690089707388758583e5137477"}, + {file = "libolecf_python-20240212-cp312-cp312-win_amd64.whl", hash = "sha256:a1810d684461eb0d14ec39abf32d6ab3f85125496ece64abb6788b311537fff5"}, + {file = "libolecf_python-20240212-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:645dcf58a24a5164b40a0af36d7c809908ae43dd356c810817fa6f1c22291b05"}, + {file = "libolecf_python-20240212-cp38-cp38-win32.whl", hash = "sha256:a649bf99d6da54d4a92a72219a21b88c88dd4e4b4886accff03312fb6b064284"}, + {file = "libolecf_python-20240212-cp38-cp38-win_amd64.whl", hash = "sha256:1a513602c823be8edc041d79b507a8885ea9fdc6e026a4b6ba21218bc8e41aaa"}, + {file = "libolecf_python-20240212-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:47f3378fb795394984b5362d088545ea0e14e4eb28757b13c643fcb89f6bb0f9"}, + {file = "libolecf_python-20240212-cp39-cp39-win32.whl", hash = "sha256:36d2f858e5b0bf53da2e7aace739a9ba6d9a4ce3f44f40f28efee0a5ced8772d"}, + {file = "libolecf_python-20240212-cp39-cp39-win_amd64.whl", hash = "sha256:b758e20f1d8efbe100f7e47d3514a7861ad483ceec26e1b9d839be503e7e89aa"}, ] [[package]] @@ -2246,32 +2077,54 @@ files = [ [[package]] name = "libregf-python" -version = "20231203" +version = "20240214" description = "Python bindings module for libregf" optional = true python-versions = ">=3.7" files = [ - {file = "libregf-python-20231203.tar.gz", hash = "sha256:1c6117ea0ac07f0de9e1dd9e7b5e23aa0270ec54ae7958e8cdaca5ad69299730"}, - {file = "libregf_python-20231203-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:066b1233cb7858177dff7260a8ce94cb2e6a5d6932e585215a0ebebbcd4ff09b"}, - {file = "libregf_python-20231203-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:eda359b44bd80c5b4092a610d2c32b3dba7aee2271638355c6b065e246cbe1c0"}, - {file = "libregf_python-20231203-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:50c39ecc72570f2dc9319e1364693dc8f0953236186bec4cab65312f055dfb6d"}, - {file = "libregf_python-20231203-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:83693a5f4991795b70a04d7cad98579b7f4a5497a64d19bcac095f73f29e0cba"}, - {file = "libregf_python-20231203-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:9b9204fbba891a3882ea7231b85651d1ebd592174ab19bbaba708ff7c3e99392"}, + {file = "libregf-python-20240214.tar.gz", hash = "sha256:195ff0437359fa4666bd9befa55fa3c49a1f6dcd1b87a4a1c0a010638361fd87"}, + {file = "libregf_python-20240214-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:28f37e509cb78b18f835e458af07faa3b8a4273f84629d514b840db501436120"}, + {file = "libregf_python-20240214-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:1af335292f0a69a9a5381c6e6c09753a2d516a524bc1cc5b3f9f7dbd51e5634d"}, + {file = "libregf_python-20240214-cp310-cp310-win32.whl", hash = "sha256:3f19ed62a502ebe96b158f8d4a5aa5365ac4537ad41ed079220aea4050b17655"}, + {file = "libregf_python-20240214-cp310-cp310-win_amd64.whl", hash = "sha256:1150154e8d4eb3e7a54243e9b9befba1a4c307e76117ae915aa833df8e1b3247"}, + {file = "libregf_python-20240214-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:896bb73bd0aaa97642f991861f0e081793d396a63b3f2c0efedde694878a9226"}, + {file = "libregf_python-20240214-cp311-cp311-win32.whl", hash = "sha256:8689d29ae488818363b9e9910d30f1a081a3074b3bd3dc8054d9b85282fb0b02"}, + {file = "libregf_python-20240214-cp311-cp311-win_amd64.whl", hash = "sha256:06069c52f1027fefca5424b5bded15881ee794462802e011c0b4c4bee709b4d6"}, + {file = "libregf_python-20240214-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:039a81463a647ed5a77c93c5f30e5746619022fa97ba27817e9258f963510309"}, + {file = "libregf_python-20240214-cp312-cp312-win32.whl", hash = "sha256:6d0c84fe673f4a67db7bbbb85b452ff148dc5dae66ba01d523be3a9e3cf39c68"}, + {file = "libregf_python-20240214-cp312-cp312-win_amd64.whl", hash = "sha256:dd58b968ba518c948b3e7d634b0811968e6e54b850ba0861e3f5fb2651c7829a"}, + {file = "libregf_python-20240214-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:e555a529752003c6071533100be4a2038aa1aac591ff2e12b225c4f410d541a8"}, + {file = "libregf_python-20240214-cp38-cp38-win32.whl", hash = "sha256:9f00ca4b8317367e5a4d3b99def57d683f9b3fa97722948b9e686c6a4de60480"}, + {file = "libregf_python-20240214-cp38-cp38-win_amd64.whl", hash = "sha256:04872bfe01e83b03343597ebfb96ef731cfc85ecc480b4603ad16c39cb7b479d"}, + {file = "libregf_python-20240214-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:7e01b01dfeb80058bb8ec328ddef52bb175484b5efadb4c6c77b169ceb57bc11"}, + {file = "libregf_python-20240214-cp39-cp39-win32.whl", hash = "sha256:954f2411b5856d73feb2cd2a2d66301a80b01dfcd8e39e15dd07ad7c052aa694"}, + {file = "libregf_python-20240214-cp39-cp39-win_amd64.whl", hash = "sha256:7e421f152b1c98e1296bb55777b32ecbbdd08e24478e750bcde945d93d9b4382"}, ] [[package]] name = "libscca-python" -version = "20231203" +version = "20240215" description = "Python bindings module for libscca" optional = true python-versions = ">=3.7" files = [ - {file = "libscca-python-20231203.tar.gz", hash = "sha256:217aac0c18f06306bddfe3afab9994960e5d0acb77ab667f404f9a33ae96d621"}, - {file = "libscca_python-20231203-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:c8cf5e15ba124cfdd6c9f9f20e4f27d0809968313caeea13d8ff1d4e35df2b1c"}, - {file = "libscca_python-20231203-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:d5e2d1e31680f17b52df401407c2d2791a5b3920b1043d15c839d01fd1bc1866"}, - {file = "libscca_python-20231203-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:71b6a48f8b596c0dd7293a040fe2f03bd6e8e9f02f8b378a8831214386b5c229"}, - {file = "libscca_python-20231203-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3989ce24bac135305b73b01937d99f16f8f15816e2b04b1b8386c01a3985a191"}, - {file = "libscca_python-20231203-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:5af5da1e914e61a1ba77e847502ff4aef51b8e8cd519529fc7f9a07a4900b1cc"}, + {file = "libscca-python-20240215.tar.gz", hash = "sha256:85eb3a47cc4ed19944b5a951cf4347685b96eefd09e4fe8028015236aa188d6c"}, + {file = "libscca_python-20240215-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:d841a9fe0de2e53d3880b0c2458423d72b1324a7f561612d5ba81d5c14e0fa08"}, + {file = "libscca_python-20240215-cp310-cp310-manylinux_2_34_x86_64.manylinux_2_35_x86_64.whl", hash = "sha256:718e56ead7337900438693eee3edf0731917eb747bdba7b898a7dfd89fd1f779"}, + {file = "libscca_python-20240215-cp310-cp310-win32.whl", hash = "sha256:b8b0aa55da6592bc575cdd10d81450472f5c2cec9895a9d44e74b7203d9c00eb"}, + {file = "libscca_python-20240215-cp310-cp310-win_amd64.whl", hash = "sha256:b782c4ad2a39c1fef44908d1609dc99e6d383573b743d521da3e27c1f4936d05"}, + {file = "libscca_python-20240215-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:145a39fc551faa37ed4afcd952e3e0a59d83d0685dc851a56fc9a6b08e87192a"}, + {file = "libscca_python-20240215-cp311-cp311-win32.whl", hash = "sha256:86cf4db3f024a368cd1686c3bc0b94d3275b5b0aad5a6c9f27200f1c9940d63b"}, + {file = "libscca_python-20240215-cp311-cp311-win_amd64.whl", hash = "sha256:53a753ff9eb6ea77d664faed079225b292a07eceb6589834f1f5f86f0404202e"}, + {file = "libscca_python-20240215-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:0224b0fb86062525b263c020ce4f614ff1b734cad9c78461cd7557655cb253dc"}, + {file = "libscca_python-20240215-cp312-cp312-win32.whl", hash = "sha256:9b3c7308241ae2835850450d8be0ea82e3f5084ff7b6c68ef1e77bba4ecd0509"}, + {file = "libscca_python-20240215-cp312-cp312-win_amd64.whl", hash = "sha256:8187146231981e7d4f5063e1f0fb574b5886e1d9c8a532533ce1c3732155ffc8"}, + {file = "libscca_python-20240215-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:152c4030e5194ebe6e5a37361058572aa3188ea0206f96624291b9a2aaa524d4"}, + {file = "libscca_python-20240215-cp38-cp38-win32.whl", hash = "sha256:6d897462c005bb2c0798d6b892a2bc09fb7d3c2f6ce11aeeab3da406fdce04d8"}, + {file = "libscca_python-20240215-cp38-cp38-win_amd64.whl", hash = "sha256:3ef553bce6559c5ab5ec9a5dc14a23ff59fd8aa3fa75cf66fb75746c6b48adb1"}, + {file = "libscca_python-20240215-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:c587db04044c699e97020628d3a35cb9a8bdb5dc5d1e0b0c3bdd15068667d337"}, + {file = "libscca_python-20240215-cp39-cp39-win32.whl", hash = "sha256:a16fc45ea4f123caedc16a478423878c85f1cebdb3cff6a6374cda2cc2fe8172"}, + {file = "libscca_python-20240215-cp39-cp39-win_amd64.whl", hash = "sha256:6a5e3e63efc3ae7fb16a69271af6a48fd36769988119ae93f40f879189238dca"}, ] [[package]] @@ -2461,71 +2314,71 @@ tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] @@ -2630,71 +2483,60 @@ adal = ">=0.6.0,<2.0.0" msrest = ">=0.6.0,<2.0.0" six = "*" -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = true -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - [[package]] name = "netaddr" -version = "0.10.1" +version = "0.8.0" description = "A network address manipulation library for Python" optional = false python-versions = "*" files = [ - {file = "netaddr-0.10.1-py2.py3-none-any.whl", hash = "sha256:9822305b42ea1020d54fee322d43cee5622b044c07a1f0130b459bb467efcf88"}, - {file = "netaddr-0.10.1.tar.gz", hash = "sha256:f4da4222ca8c3f43c8e18a8263e5426c750a3a837fdfeccf74c68d0408eaa3bf"}, + {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, + {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, ] [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] @@ -2809,36 +2651,40 @@ files = [ [[package]] name = "pandas" -version = "2.1.4" +version = "2.2.0" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9"}, - {file = "pandas-2.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034"}, - {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d"}, - {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9"}, - {file = "pandas-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139"}, - {file = "pandas-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46"}, - {file = "pandas-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092"}, - {file = "pandas-2.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821"}, - {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d"}, - {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171"}, - {file = "pandas-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623"}, - {file = "pandas-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e"}, - {file = "pandas-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6"}, - {file = "pandas-2.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b"}, - {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540"}, - {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead"}, - {file = "pandas-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1"}, - {file = "pandas-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf"}, - {file = "pandas-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34"}, - {file = "pandas-2.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a"}, - {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732"}, - {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8"}, - {file = "pandas-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860"}, - {file = "pandas-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984"}, - {file = "pandas-2.1.4.tar.gz", hash = "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"}, + {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, + {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, + {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, + {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, + {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, + {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, + {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, ] [package.dependencies] @@ -2849,31 +2695,31 @@ numpy = [ ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" -tzdata = ">=2022.1" +tzdata = ">=2022.7" [package.extras] -all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] -aws = ["s3fs (>=2022.05.0)"] -clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] -compression = ["zstandard (>=0.17.0)"] -computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2022.05.0)"] -gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] -hdf5 = ["tables (>=3.7.0)"] -html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] -mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] -spss = ["pyreadstat (>=1.1.5)"] -sql-other = ["SQLAlchemy (>=1.4.36)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.8.0)"] +xml = ["lxml (>=4.9.2)"] [[package]] name = "pefile" @@ -2888,13 +2734,13 @@ files = [ [[package]] name = "pip" -version = "23.3.2" +version = "24.0" description = "The PyPA recommended tool for installing Python packages." optional = true python-versions = ">=3.7" files = [ - {file = "pip-23.3.2-py3-none-any.whl", hash = "sha256:5052d7889c1f9d05224cd41741acb7c5d6fa735ab34e339624a614eaaa7e7d76"}, - {file = "pip-23.3.2.tar.gz", hash = "sha256:7fd9972f96db22c8077a1ee2691b172c8089b17a5652a44494a9ecb0d78f9149"}, + {file = "pip-24.0-py3-none-any.whl", hash = "sha256:ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc"}, + {file = "pip-24.0.tar.gz", hash = "sha256:ea9bd1a847e8c5774a5777bb398c19e80bcd4e2aa16a4b301b718fe6f593aba2"}, ] [[package]] @@ -2975,28 +2821,28 @@ zstd = ">=1.3.0.2" [[package]] name = "platformdirs" -version = "4.1.0" +version = "4.2.0" 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.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -3050,23 +2896,6 @@ files = [ [package.dependencies] wcwidth = "*" -[[package]] -name = "proto-plus" -version = "1.23.0" -description = "Beautiful, Pythonic protocol buffers." -optional = true -python-versions = ">=3.6" -files = [ - {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, - {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, -] - -[package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" - -[package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] - [[package]] name = "protobuf" version = "3.20.3" @@ -3098,47 +2927,29 @@ files = [ {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, ] -[[package]] -name = "psq" -version = "0.8.0" -description = "A simple task queue using Google Cloud Pub/Sub" -optional = true -python-versions = "*" -files = [ - {file = "psq-0.8.0-py2.py3-none-any.whl", hash = "sha256:69608f691ecc5b8f0bfa633cf61d96db209342264d8f7d0833eda297a9cfe03c"}, - {file = "psq-0.8.0.tar.gz", hash = "sha256:c79de0aa7853799cb3dd06fa1b4076511aa9ec4e5db873a95001fc67abe8c381"}, -] - -[package.dependencies] -click = ">=4.0" -colorlog = ">=2.6.0,<3.0.0" -google-cloud-datastore = ">=1.0.0,<=2.0.0" -google-cloud-pubsub = ">=0.35.2" -werkzeug = ">=0.10.0,<1.0.0" - [[package]] name = "psutil" -version = "5.9.7" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, - {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, - {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, - {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, - {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, - {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, - {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, - {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, - {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, - {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -3227,13 +3038,13 @@ files = [ [[package]] name = "puremagic" -version = "1.15" +version = "1.20" description = "Pure python implementation of magic file detection" optional = true python-versions = "*" files = [ - {file = "puremagic-1.15-py3-none-any.whl", hash = "sha256:349e179f04bcc14eb0e2c3941cd9ee4ea74881ab6ccac63ea0c37c98f7a80b22"}, - {file = "puremagic-1.15.tar.gz", hash = "sha256:6e46aa78113a466abc9f69e6e8a4ce90eb57d908dafb809597012621061462bd"}, + {file = "puremagic-1.20-py3-none-any.whl", hash = "sha256:14817470dc1e3339356088b58576820efd12544a676c20d7d5e738ea1e06f852"}, + {file = "puremagic-1.20.tar.gz", hash = "sha256:c55c57369bd957bfe3af4765a66784eaaae77d697a6f12477174280e0abcbd07"}, ] [[package]] @@ -3356,47 +3167,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.13" +version = "1.10.14" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:efff03cc7a4f29d9009d1c96ceb1e7a70a65cfe86e89d34e4a5f2ab1e5693737"}, - {file = "pydantic-1.10.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ecea2b9d80e5333303eeb77e180b90e95eea8f765d08c3d278cd56b00345d01"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1740068fd8e2ef6eb27a20e5651df000978edce6da6803c2bef0bc74540f9548"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84bafe2e60b5e78bc64a2941b4c071a4b7404c5c907f5f5a99b0139781e69ed8"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc0898c12f8e9c97f6cd44c0ed70d55749eaf783716896960b4ecce2edfd2d69"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:654db58ae399fe6434e55325a2c3e959836bd17a6f6a0b6ca8107ea0571d2e17"}, - {file = "pydantic-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:75ac15385a3534d887a99c713aa3da88a30fbd6204a5cd0dc4dab3d770b9bd2f"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c553f6a156deb868ba38a23cf0df886c63492e9257f60a79c0fd8e7173537653"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e08865bc6464df8c7d61439ef4439829e3ab62ab1669cddea8dd00cd74b9ffe"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31647d85a2013d926ce60b84f9dd5300d44535a9941fe825dc349ae1f760df9"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:210ce042e8f6f7c01168b2d84d4c9eb2b009fe7bf572c2266e235edf14bacd80"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8ae5dd6b721459bfa30805f4c25880e0dd78fc5b5879f9f7a692196ddcb5a580"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8e81fc5fb17dae698f52bdd1c4f18b6ca674d7068242b2aff075f588301bbb0"}, - {file = "pydantic-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:61d9dce220447fb74f45e73d7ff3b530e25db30192ad8d425166d43c5deb6df0"}, - {file = "pydantic-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b03e42ec20286f052490423682016fd80fda830d8e4119f8ab13ec7464c0132"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f59ef915cac80275245824e9d771ee939133be38215555e9dc90c6cb148aaeb5"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a1f9f747851338933942db7af7b6ee8268568ef2ed86c4185c6ef4402e80ba8"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:97cce3ae7341f7620a0ba5ef6cf043975cd9d2b81f3aa5f4ea37928269bc1b87"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854223752ba81e3abf663d685f105c64150873cc6f5d0c01d3e3220bcff7d36f"}, - {file = "pydantic-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:b97c1fac8c49be29486df85968682b0afa77e1b809aff74b83081cc115e52f33"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c958d053453a1c4b1c2062b05cd42d9d5c8eb67537b8d5a7e3c3032943ecd261"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c5370a7edaac06daee3af1c8b1192e305bc102abcbf2a92374b5bc793818599"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6f6e7305244bddb4414ba7094ce910560c907bdfa3501e9db1a7fd7eaea127"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a3c792a58e1622667a2837512099eac62490cdfd63bd407993aaf200a4cf1f"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c636925f38b8db208e09d344c7aa4f29a86bb9947495dd6b6d376ad10334fb78"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:678bcf5591b63cc917100dc50ab6caebe597ac67e8c9ccb75e698f66038ea953"}, - {file = "pydantic-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:6cf25c1a65c27923a17b3da28a0bdb99f62ee04230c931d83e888012851f4e7f"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ef467901d7a41fa0ca6db9ae3ec0021e3f657ce2c208e98cd511f3161c762c6"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968ac42970f57b8344ee08837b62f6ee6f53c33f603547a55571c954a4225691"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9849f031cf8a2f0a928fe885e5a04b08006d6d41876b8bbd2fc68a18f9f2e3fd"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e3ff861c3b9c6857579de282ce8baabf443f42ffba355bf070770ed63e11e1"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f00790179497767aae6bcdc36355792c79e7bbb20b145ff449700eb076c5f96"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:75b297827b59bc229cac1a23a2f7a4ac0031068e5be0ce385be1462e7e17a35d"}, - {file = "pydantic-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:e70ca129d2053fb8b728ee7d1af8e553a928d7e301a311094b8a0501adc8763d"}, - {file = "pydantic-1.10.13-py3-none-any.whl", hash = "sha256:b87326822e71bd5f313e7d3bfdc77ac3247035ac10b0c0618bd99dcf95b1e687"}, - {file = "pydantic-1.10.13.tar.gz", hash = "sha256:32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, + {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, + {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, + {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, + {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, + {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, + {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, + {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, + {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, ] [package.dependencies] @@ -3447,17 +3258,17 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pyopenssl" -version = "24.0.0" +version = "23.3.0" description = "Python wrapper module around the OpenSSL library" optional = false python-versions = ">=3.7" files = [ - {file = "pyOpenSSL-24.0.0-py3-none-any.whl", hash = "sha256:ba07553fb6fd6a7a2259adb9b84e12302a9a8a75c44046e8bb5d3e5ee887e3c3"}, - {file = "pyOpenSSL-24.0.0.tar.gz", hash = "sha256:6aa33039a93fffa4563e655b61d11364d01264be8ccb49906101e02a334530bf"}, + {file = "pyOpenSSL-23.3.0-py3-none-any.whl", hash = "sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2"}, + {file = "pyOpenSSL-23.3.0.tar.gz", hash = "sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12"}, ] [package.dependencies] -cryptography = ">=41.0.5,<43" +cryptography = ">=41.0.5,<42" [package.extras] docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] @@ -3479,13 +3290,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.4.4" +version = "8.0.1" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-8.0.1-py3-none-any.whl", hash = "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca"}, + {file = "pytest-8.0.1.tar.gz", hash = "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae"}, ] [package.dependencies] @@ -3493,7 +3304,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" +pluggy = ">=1.3.0,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] @@ -3515,13 +3326,13 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.0.0" +version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" files = [ - {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, - {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] [package.extras] @@ -3529,17 +3340,17 @@ cli = ["click (>=5.0)"] [[package]] name = "python-multipart" -version = "0.0.7" +version = "0.0.9" description = "A streaming multipart parser for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "python_multipart-0.0.7-py3-none-any.whl", hash = "sha256:b1fef9a53b74c795e2347daac8c54b252d9e0df9c619712691c1cc8021bd3c49"}, - {file = "python_multipart-0.0.7.tar.gz", hash = "sha256:288a6c39b06596c1b988bb6794c6fbc80e6c369e35e5062637df256bee0c9af9"}, + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, ] [package.extras] -dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==2.2.0)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] +dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] [[package]] name = "pytsk3" @@ -3553,13 +3364,13 @@ files = [ [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -3967,6 +3778,23 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "turbinia-api-lib" +version = "1.0.2" +description = "Turbinia API Server" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "turbinia_api_lib-1.0.2-py3-none-any.whl", hash = "sha256:04b3f471fb01046d81031cc0f95e5368f855647251eb7823dad00d0c07f8f80b"}, + {file = "turbinia_api_lib-1.0.2.tar.gz", hash = "sha256:b1885c43987591294c0beacd03732fb07decb5608f0c69a3158ead178f3c6b9e"}, +] + +[package.dependencies] +aenum = ">=3.1.11" +pydantic = ">=1.10.5,<2.0.0" +python-dateutil = ">=2.8.2" +urllib3 = ">=1.25.3,<2" + [[package]] name = "typing-extensions" version = "4.9.0" @@ -3978,30 +3806,15 @@ files = [ {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] -[[package]] -name = "typing-inspect" -version = "0.9.0" -description = "Runtime inspection utilities for typing module." -optional = true -python-versions = "*" -files = [ - {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, - {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, -] - -[package.dependencies] -mypy-extensions = ">=0.3.0" -typing-extensions = ">=3.7.4" - [[package]] name = "tzdata" -version = "2023.4" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] @@ -4107,13 +3920,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "uvicorn" -version = "0.26.0" +version = "0.27.1" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.26.0-py3-none-any.whl", hash = "sha256:cdb58ef6b8188c6c174994b2b1ba2150a9a8ae7ea5fb2f1b856b94a815d6071d"}, - {file = "uvicorn-0.26.0.tar.gz", hash = "sha256:48bfd350fce3c5c57af5fb4995fded8fb50da3b4feb543eb18ad7e0d54589602"}, + {file = "uvicorn-0.27.1-py3-none-any.whl", hash = "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4"}, + {file = "uvicorn-0.27.1.tar.gz", hash = "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a"}, ] [package.dependencies] @@ -4381,87 +4194,71 @@ files = [ {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, ] -[[package]] -name = "werkzeug" -version = "0.16.1" -description = "The comprehensive WSGI web application library." -optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Werkzeug-0.16.1-py2.py3-none-any.whl", hash = "sha256:1e0dedc2acb1f46827daa2e399c1485c8fa17c0d8e70b6b875b4e7f54bf408d2"}, - {file = "Werkzeug-0.16.1.tar.gz", hash = "sha256:b353856d37dec59d6511359f97f6a4b2468442e454bd1c98298ddce53cac1f04"}, -] - -[package.extras] -dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "tox"] -termcolor = ["termcolor"] -watchdog = ["watchdog"] - [[package]] name = "xattr" -version = "1.0.0" +version = "1.1.0" description = "Python wrapper for extended filesystem attributes" optional = true python-versions = ">=3.8" files = [ - {file = "xattr-1.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:322f5bb858e59556d67de41b4e42d40b5794bc3944eaf3a3a3e97d1b7352e6ea"}, - {file = "xattr-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ad65a3402e00bbacde61011c8a1ee9ae3bf5c0511b7be195e6c5eabc758ce0e9"}, - {file = "xattr-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:693a91a671ba7aee0dc34d0598334449ce66bdfae476a3674de04d2176bce9a0"}, - {file = "xattr-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f216c756a927836c3417946ecd0083230e44e243b30053e8dfa770bda5c3ffaf"}, - {file = "xattr-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fe97714d5069108c16a097c91bb9ac6f20759732de69f1e3983c99d7ff8909c"}, - {file = "xattr-1.0.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6ccca250cbaa0bb8909ed988960252e219798315f6ff3b232c725900afe258c"}, - {file = "xattr-1.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba1f628ac5ca3f82bc527cebb7db5969eb0d0555183f27d6f1c6ddcfa11abcb1"}, - {file = "xattr-1.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4ea16d69910eeec3691fdcc5b0795c28af5fdddb2a77fd5d87caab4f5f0dad83"}, - {file = "xattr-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7b7d2658824ae6fc29a85e6260010d6e4766216173cddd0d421bd07249d93"}, - {file = "xattr-1.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1a308f0d0ae672ad6c8a1d30a7a97f2297fcc13392b6e5418aa38c64bbb96036"}, - {file = "xattr-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d8116b4c2d139b39337089749ca08403f90b09a20c41dc5b0f24074ff5e9230"}, - {file = "xattr-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2d99576566d47683a8c6cca2e1803e754d25a7f552b9ee0dc5a1c99408cd9a"}, - {file = "xattr-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69aa6bfcf413e6f3b7bf6565fd6d05c9a0f4a800c78a459aa84dba697a273aa6"}, - {file = "xattr-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81f97e6816dd6132c4952c25be236b87e0cb9dcf83b36dac117dea25c29359c"}, - {file = "xattr-1.0.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4a93053beffd077a955f29ff6c5f01e159a9406ace2264ad0c3fb40e94df5b3"}, - {file = "xattr-1.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:919ab1ceecb3b90d3278d278d405806bdbc58325771348148c7129a72defd594"}, - {file = "xattr-1.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6d870ec5114a4f182782169092e102d38b1f96171f9399ef9f18662f09919d04"}, - {file = "xattr-1.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3434a97a8225e71558ff55d9699a55be80dd606b773873484a90089d2faccf2"}, - {file = "xattr-1.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d5d0550f1cf4bec2ea91d1d1cec222c2171785bf7f9ca29348c1277c4471b24e"}, - {file = "xattr-1.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fef7a10ee0fa9965cfcf10a03ec40d0eda4123ffef7f5448276c15d05e90556b"}, - {file = "xattr-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ae05cb39800b58d502a32a57ae6a69f9f9009898c0c4cb2c470c4e2aba6e4ba0"}, - {file = "xattr-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02eb0ce4669d841d3d95ddcbc4c00042fad7b865420c06158d8ae153cbfd14f0"}, - {file = "xattr-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a00b7a737826ecf7248a2defc923c0bd7ead7f3e1ff3646a6139fcaf55dd08"}, - {file = "xattr-1.0.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7baee7be877c8ef7a9ec8c84cd983850a0ffb3640e26bdf2efa321eaa72b2693"}, - {file = "xattr-1.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3adfb72183551b3828766794171d6b7d1799e5806490a9fbaa3bf92bf5f2ef"}, - {file = "xattr-1.0.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3c42f2857ff30c4f7888e87b2de08c205fdc0fa6f5c75587ec2d35e7d570a487"}, - {file = "xattr-1.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:933b416104d5fad1618b0a36cb86df52955cac3f9ee1939ba8baeb8a6bb0f10f"}, - {file = "xattr-1.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3536eb90cfe0707597db09fb0fba34e1eab0ac821718940087087db1438334a5"}, - {file = "xattr-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e20a57094063c1df93bd26971ec1dc60fcac302c41fc4cf6f1ab7f7304e734ad"}, - {file = "xattr-1.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae3ee8e4308d7d1219f04db85919fe5c15be94de531f7ce84a44634da56f6dee"}, - {file = "xattr-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:320635b6a939646e314ea0de461b8d9b290ff514c7f663397af02568cc3423c0"}, - {file = "xattr-1.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ccdf9e90fc404fd429e71eed29045b548e4841dfc249b4f781334a79270d78c"}, - {file = "xattr-1.0.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b5e036ef198a9ff012ec0a5091ca9665692fa641e566128d53f08d363c9b407"}, - {file = "xattr-1.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dc720284ae9e6ec8d6630003104e5c61b5104442f6269e32fe2adab87f929085"}, - {file = "xattr-1.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:62fa9b76b4297303248d858af3d5b2097fd4a24d4ee03dc8c5921d168944828d"}, - {file = "xattr-1.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:357d79f07d629c84e293931fb2f877abb9f4e0bf54614434b39d3caf7abb3b78"}, - {file = "xattr-1.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:004e5c6af5fe3cf38a519c830c6c0c0a74bb0d5f0fc72d3f82b76418647860bc"}, - {file = "xattr-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f584c9ab5e6ba536898701ca38a168572bebabfe0fca038188ca884005068f69"}, - {file = "xattr-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0cef02f9b33682f74eccc15496d4a6deedb69f87f5833398d897cfd2f92d1770"}, - {file = "xattr-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d5ac274b6b68551b590ef2e42e09b85be61779052893117655f7fc9d76f24fe"}, - {file = "xattr-1.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a68d3edad97b3843fd5c4cc9e0b3f9716719f8688229cbb45c8075eed4d807e"}, - {file = "xattr-1.0.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6057f1e53174df8691d4fef2d170125e60aad0c8cfc527500f1898972b1bec8"}, - {file = "xattr-1.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:658e5405d389a5461b17de4c9b8888425884f57e8ebd794d23ff3a60e8342cfd"}, - {file = "xattr-1.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:852ca3204cd5d1d1ee91fa454e820ff5195584f81f0784b3db12d553ad3ac97c"}, - {file = "xattr-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0ecda996369532b3dd6118329d6040463254bb655ed6d400fc56dd513d22ab5b"}, - {file = "xattr-1.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:17ece9a745ac2fc3f0278475be095170bc102af416227026d84399794bb47664"}, - {file = "xattr-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7a802631d9ce950f1ac7bb5b571a49cb3ee1f4e78c0039a7e4affb933d8287c"}, - {file = "xattr-1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b10d39425d9c6a2d54d1f6c1ed10363cf5b94deecca73d1530e58f90df39f025"}, - {file = "xattr-1.0.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e20243875302722812e091bcd5649c52a2fe03f78c2f7b969ac1333ab48c4a3c"}, - {file = "xattr-1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:06f487e8e73b26f96ccc5f3c2819c39d8ea75d5fadc2e7445d960ee72860ddd6"}, - {file = "xattr-1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:924d05b70ba8947a1df063b4f30f5068f468645c89d3bc98588e6065c766eb7f"}, - {file = "xattr-1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7df1cfa8ac4044cb206c3fbd061303fe34a22617ed3288b0486018ecb1edf111"}, - {file = "xattr-1.0.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9de013198d014c11f8eaddb3e79a3257403781aa54bbc1743149227df908b3e"}, - {file = "xattr-1.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0f1b3584733a27eb1671000fd917e21b1eba2d563c593cbbc7436873c4822224"}, - {file = "xattr-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c5481ed9fa04ebac81710d8a02d91cd67f35da16fa0250d1643f55e4d2c0d1"}, - {file = "xattr-1.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0d7de4a1db1d4a8a3382c12a914443114c31f8ebe07ab1fcc89b4d2ffe67ee"}, - {file = "xattr-1.0.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c8f3e5ef665f093987ec19304cb36b7e8aaa2e0011705f18a75956ec45ee774"}, - {file = "xattr-1.0.0.tar.gz", hash = "sha256:a2c7cb2ef441bf679e240b65e205f08a3ee315e190fea5673e60fd6812e634a5"}, + {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef2fa0f85458736178fd3dcfeb09c3cf423f0843313e25391db2cfd1acec8888"}, + {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ccab735d0632fe71f7d72e72adf886f45c18b7787430467ce0070207882cfe25"}, + {file = "xattr-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9013f290387f1ac90bccbb1926555ca9aef75651271098d99217284d9e010f7c"}, + {file = "xattr-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcd5dfbcee73c7be057676ecb900cabb46c691aff4397bf48c579ffb30bb963"}, + {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6480589c1dac7785d1f851347a32c4a97305937bf7b488b857fe8b28a25de9e9"}, + {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08f61cbed52dc6f7c181455826a9ff1e375ad86f67dd9d5eb7663574abb32451"}, + {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:918e1f83f2e8a072da2671eac710871ee5af337e9bf8554b5ce7f20cdb113186"}, + {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0f06e0c1e4d06b4e0e49aaa1184b6f0e81c3758c2e8365597918054890763b53"}, + {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a641ac038a9f53d2f696716147ca4dbd6a01998dc9cd4bc628801bc0df7f4d"}, + {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7e4ca0956fd11679bb2e0c0d6b9cdc0f25470cc00d8da173bb7656cc9a9cf104"}, + {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6881b120f9a4b36ccd8a28d933bc0f6e1de67218b6ce6e66874e0280fc006844"}, + {file = "xattr-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dab29d9288aa28e68a6f355ddfc3f0a7342b40c9012798829f3e7bd765e85c2c"}, + {file = "xattr-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c80bbf55339c93770fc294b4b6586b5bf8e85ec00a4c2d585c33dbd84b5006"}, + {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1418705f253b6b6a7224b69773842cac83fcbcd12870354b6e11dd1cd54630f"}, + {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687e7d18611ef8d84a6ecd8f4d1ab6757500c1302f4c2046ce0aa3585e13da3f"}, + {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6ceb9efe0657a982ccb8b8a2efe96b690891779584c901d2f920784e5d20ae3"}, + {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b489b7916f239100956ea0b39c504f3c3a00258ba65677e4c8ba1bd0b5513446"}, + {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0a9c431b0e66516a078125e9a273251d4b8e5ba84fe644b619f2725050d688a0"}, + {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1a5921ea3313cc1c57f2f53b63ea8ca9a91e48f4cc7ebec057d2447ec82c7efe"}, + {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6ad2a7bd5e6cf71d4a862413234a067cf158ca0ae94a40d4b87b98b62808498"}, + {file = "xattr-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0683dae7609f7280b0c89774d00b5957e6ffcb181c6019c46632b389706b77e6"}, + {file = "xattr-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54cb15cd94e5ef8a0ef02309f1bf973ba0e13c11e87686e983f371948cfee6af"}, + {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff6223a854229055e803c2ad0c0ea9a6da50c6be30d92c198cf5f9f28819a921"}, + {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d44e8f955218638c9ab222eed21e9bd9ab430d296caf2176fb37abe69a714e5c"}, + {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:caab2c2986c30f92301f12e9c50415d324412e8e6a739a52a603c3e6a54b3610"}, + {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d6eb7d5f281014cd44e2d847a9107491af1bf3087f5afeded75ed3e37ec87239"}, + {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:47a3bdfe034b4fdb70e5941d97037405e3904accc28e10dbef6d1c9061fb6fd7"}, + {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00d2b415cf9d6a24112d019e721aa2a85652f7bbc9f3b9574b2d1cd8668eb491"}, + {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:78b377832dd0ee408f9f121a354082c6346960f7b6b1480483ed0618b1912120"}, + {file = "xattr-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6461a43b585e5f2e049b39bcbfcb6391bfef3c5118231f1b15d10bdb89ef17fe"}, + {file = "xattr-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24d97f0d28f63695e3344ffdabca9fcc30c33e5c8ccc198c7524361a98d526f2"}, + {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ad47d89968c9097900607457a0c89160b4771601d813e769f68263755516065"}, + {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc53cab265f6e8449bd683d5ee3bc5a191e6dd940736f3de1a188e6da66b0653"}, + {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cd11e917f5b89f2a0ad639d9875943806c6c9309a3dd02da5a3e8ef92db7bed9"}, + {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9c5a78c7558989492c4cb7242e490ffb03482437bf782967dfff114e44242343"}, + {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cebcf8a303a44fbc439b68321408af7267507c0d8643229dbb107f6c132d389c"}, + {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b0d73150f2f9655b4da01c2369eb33a294b7f9d56eccb089819eafdbeb99f896"}, + {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:793c01deaadac50926c0e1481702133260c7cb5e62116762f6fe1543d07b826f"}, + {file = "xattr-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e189e440bcd04ccaad0474720abee6ee64890823ec0db361fb0a4fb5e843a1bf"}, + {file = "xattr-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afacebbc1fa519f41728f8746a92da891c7755e6745164bd0d5739face318e86"}, + {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b1664edf003153ac8d1911e83a0fc60db1b1b374ee8ac943f215f93754a1102"}, + {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda2684228798e937a7c29b0e1c7ef3d70e2b85390a69b42a1c61b2039ba81de"}, + {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b735ac2625a4fc2c9343b19f806793db6494336338537d2911c8ee4c390dda46"}, + {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fa6a7af7a4ada43f15ccc58b6f9adcdbff4c36ba040013d2681e589e07ae280a"}, + {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1059b2f726e2702c8bbf9bbf369acfc042202a4cc576c2dec6791234ad5e948"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e2255f36ebf2cb2dbf772a7437ad870836b7396e60517211834cf66ce678b595"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba4f80b9855cc98513ddf22b7ad8551bc448c70d3147799ea4f6c0b758fb466"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb70c16e7c3ae6ba0ab6c6835c8448c61d8caf43ea63b813af1f4dbe83dd156"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83652910ef6a368b77b00825ad67815e5c92bfab551a848ca66e9981d14a7519"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7a92aff66c43fa3e44cbeab7cbeee66266c91178a0f595e044bf3ce51485743b"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d4f71b673339aeaae1f6ea9ef8ea6c9643c8cd0df5003b9a0eaa75403e2e06c"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a20de1c47b5cd7b47da61799a3b34e11e5815d716299351f82a88627a43f9a96"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23705c7079b05761ff2fa778ad17396e7599c8759401abc05b312dfb3bc99f69"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:27272afeba8422f2a9d27e1080a9a7b807394e88cce73db9ed8d2dde3afcfb87"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd43978966de3baf4aea367c99ffa102b289d6c2ea5f3d9ce34a203dc2f2ab73"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded771eaf27bb4eb3c64c0d09866460ee8801d81dc21097269cf495b3cac8657"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca300c0acca4f0cddd2332bb860ef58e1465d376364f0e72a1823fdd58e90d"}, + {file = "xattr-1.1.0.tar.gz", hash = "sha256:fecbf3b05043ed3487a28190dec3e4c4d879b2fcec0e30bafd8ec5d4b6043630"}, ] [package.dependencies] @@ -4472,13 +4269,13 @@ test = ["pytest"] [[package]] name = "xlsxwriter" -version = "3.1.9" +version = "3.2.0" description = "A Python module for creating Excel XLSX files." optional = true python-versions = ">=3.6" files = [ - {file = "XlsxWriter-3.1.9-py3-none-any.whl", hash = "sha256:b61c1a0c786f82644936c0936ec96ee96cd3afb9440094232f7faef9b38689f0"}, - {file = "XlsxWriter-3.1.9.tar.gz", hash = "sha256:de810bf328c6a4550f4ffd6b0b34972aeb7ffcf40f3d285a0413734f9b63a929"}, + {file = "XlsxWriter-3.2.0-py3-none-any.whl", hash = "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e"}, + {file = "XlsxWriter-3.2.0.tar.gz", hash = "sha256:9977d0c661a72866a61f9f7a809e25ebbb0fb7036baa3b9fe74afcfca6b3cb8c"}, ] [[package]] @@ -4499,22 +4296,90 @@ tomli = ">=2.0.1" [[package]] name = "yara-python" -version = "4.3.1" +version = "4.5.0" description = "Python interface for YARA" optional = true python-versions = "*" files = [ - {file = "yara-python-4.3.1.tar.gz", hash = "sha256:7af4354ee0f1561f51fd01771a121d8d385b93bbc6138a25a38ce68aa6801c2c"}, - {file = "yara_python-4.3.1-cp310-cp310-win32.whl", hash = "sha256:834d8fe2cdb5cf61d5e505d32c504b62891df5ce5af9f04dbd8c7575c1dbef30"}, - {file = "yara_python-4.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:ec05d0b7cc46728119d450875382d5386305510b8cfb14bad3627060c9e6f199"}, - {file = "yara_python-4.3.1-cp311-cp311-win32.whl", hash = "sha256:c8663f75f0c5f82e0f6053c9ddbddd97f956787bffb7f64cac1e40e0a21db89c"}, - {file = "yara_python-4.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:51f1bdbcdbcfa29a7a2cf7e7e5d6a7d8dbd00568e4ab6103adceda5a499895a6"}, - {file = "yara_python-4.3.1-cp37-cp37m-win32.whl", hash = "sha256:8847bb5e74d2b33cf48f372bed02805876ab2e414aa7fd50c16a7c6150316601"}, - {file = "yara_python-4.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:fbf8281a6eb538b5c219a9c54c65a910806e7adf28a7d878f2cff551cbbd43ea"}, - {file = "yara_python-4.3.1-cp38-cp38-win32.whl", hash = "sha256:fd70fe0ba522d4ecd73cbf45e528872844e61e2febe8f66e8a94c2674751b831"}, - {file = "yara_python-4.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:950377dd53d17870f66406f0db9ed9f6b04ac7e61c7f6fd5429459e2a00fd874"}, - {file = "yara_python-4.3.1-cp39-cp39-win32.whl", hash = "sha256:c032ad4ec6698a4f485b3d9721e6223028953bb61362482bdd7eabb147271e80"}, - {file = "yara_python-4.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:f0b7b2ea840638415a075a25860dbcb6466d83000a8367196188a6367b01af71"}, + {file = "yara_python-4.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3feb72c2146c50e583d7e3cacbb49f280fb5cac0494cae1b48e5980ecbdc1571"}, + {file = "yara_python-4.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1a036c41eaebdf6c0a674e0bd9d37c9d06d1d7427455866ace09d3a159c442b0"}, + {file = "yara_python-4.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acbc950b051a576dd4c6825bf4ebb1c0f0c5eea35b3e01bde921b744e2cc92e1"}, + {file = "yara_python-4.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11bb478dee0450af1f6643a138b9eaec085ab79aa4a4aef786390c5dfc70f0d0"}, + {file = "yara_python-4.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1633d5653d37b6ef6517113ed446159d8de67d02893c00c43daecd9bbcb9700b"}, + {file = "yara_python-4.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:82109dd8c932c3326a9747ac3ac62857868fcc9d9fe55d6f46ff0b4dcf14eb57"}, + {file = "yara_python-4.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:85af2755732081e5fb99fc4295659690f97b61b7a1428e857dbfe91f12f9cf7d"}, + {file = "yara_python-4.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a776f86060aebd4e31c74927ddd13e6b3c21a59e4586da8667e69849e5008872"}, + {file = "yara_python-4.5.0-cp310-cp310-win32.whl", hash = "sha256:535f274738d6ad5501b4450b0bf3cd3c0d1547e9773a7ca1cf9e855d8a1cf741"}, + {file = "yara_python-4.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:5de0bf8ea0d530e8af2b59c56c5506219f060b4b25b196ba88fd19753529246d"}, + {file = "yara_python-4.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aeadaa62aa523e71abcb438f6f07761b9d62177021bb0e919a180d5b1e8cc05f"}, + {file = "yara_python-4.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b4cc4eb937c1fd3747682cae639179a6bc03a24c86dde861ca2ba1abafe8404"}, + {file = "yara_python-4.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c77dfe89038a1e0a134d44aacb05d48b268312ca3a58df1fc0cf212aaaa79ff"}, + {file = "yara_python-4.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:570d1f0f9893ec114a25ed9704e992ce58fb28c3399f6a3d81ea42d4e90c6a9d"}, + {file = "yara_python-4.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4650def8807d5b6736a1144ca2d880198deafec2313816a4fcc365c00f9b61b"}, + {file = "yara_python-4.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f557ce581e35ae23f19da6e80be1f84a1ac98b17b67b04cf46a9877d8d4fa870"}, + {file = "yara_python-4.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2d400917ebaf35663975ff001a6c13e432af68e641879194152212b8e87dd974"}, + {file = "yara_python-4.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c5de6ed584bf59005186628f88df718475ccb6818912b0b12a151a2e61f0c29c"}, + {file = "yara_python-4.5.0-cp311-cp311-win32.whl", hash = "sha256:17bee3e24258ef9d31cbc11342d22d513e005b7a551083adbb01d3ffc748c945"}, + {file = "yara_python-4.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:36acc235bf7aa61145daf364c97d3723e9c0e350cca6ae00bf717088a2c72f3b"}, + {file = "yara_python-4.5.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6918ddc68d89f4da1eb851d6a841ebc615cec31532f74698e4f51e58b44213e0"}, + {file = "yara_python-4.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9a9d666acc4d6d1ec59da4864ac4e25552169bd92520b050e5fcf92212d3ab1e"}, + {file = "yara_python-4.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a96d7b4a7e060c40b290d2264c17623f063a5604e6502b06cd145f2f0e6e82ed"}, + {file = "yara_python-4.5.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91f782bdea16441c87f0231f038cf6d151e36718154871f5c5fb274364d144e7"}, + {file = "yara_python-4.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:006f4af0cf30725425b6777016e6d6d7b2854955f0402b227f70d6fbdc594272"}, + {file = "yara_python-4.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7645a4d23d7749c390da92de105831762499eba22e39e956d0fddfda05d949eb"}, + {file = "yara_python-4.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:244fd95d0e4f4f1fbe85032f7e9b779e2cb4c6678787725482d2b43925ff2ed3"}, + {file = "yara_python-4.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c17980d60ff3f7cfabab2df28965efb8e0b38508a5c47a0ad6917016edc0328c"}, + {file = "yara_python-4.5.0-cp312-cp312-win32.whl", hash = "sha256:86549302cae8f9c5fb1394e2e9fd9dc802e3c488723935e50fdcb0d6b639ab51"}, + {file = "yara_python-4.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:36423ffd5e2e1f39562df6bd569be997c2fd06e0f30019dfadf339ff88278a4f"}, + {file = "yara_python-4.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:49f8e215c9ebd0b43a782d3cfbeee6f82e2a647482cff6c676e96da57014d878"}, + {file = "yara_python-4.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:262be4841add4d7e978db317e63f657291b4c9a64469bcdf43cdee8b3f28e0c0"}, + {file = "yara_python-4.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ee9e222daa982d31dc4be5fabf838726a3fb6a6425253c73f53aa0f0e2f457"}, + {file = "yara_python-4.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6d7d16fffc0fe92cd8d4ead9fbd58f1da7fcd9d39ff5c32924691db66257927"}, + {file = "yara_python-4.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ebbe0c112da598828d8fad15356a20b739dd2ef0dd0d90f6ec0f00ce9aa7ae1"}, + {file = "yara_python-4.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a08162e9b4bdbae1e2e34ab83b6f145d334d650399aab9afb5341ce67a866a5c"}, + {file = "yara_python-4.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:65b0e4c168f0210d9b6be7b95bb7e2a97a545d52e9d3403370c3c5506b9d31f1"}, + {file = "yara_python-4.5.0-cp37-cp37m-win32.whl", hash = "sha256:3393eced9af44507193f7724b8f37ed5f0c5620fb402b886d6f07f578aab43af"}, + {file = "yara_python-4.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de539783415e5b73e81d0a26fbe21cf2ade1b32fbd653be8a0f7430907337883"}, + {file = "yara_python-4.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:067610dfedfe361b748bbf9148183df11141748f2a83b4bdb873fde96a62e204"}, + {file = "yara_python-4.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8342783942dd8bdc46f1047cdb45ff68dcfe7aef0499b644deabd3d685a2d7e6"}, + {file = "yara_python-4.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f14db61a8e54c61cced58d070630033b68e276036053f402e76a1b7ebc5ad0f0"}, + {file = "yara_python-4.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:468743b991341440fa4fd6c1414b2f5948970d26330ac1ae811f10d559c57771"}, + {file = "yara_python-4.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cde3be15f16c3b24a3e7a08327deeec9225cecf060c930fef58d38ae4554b17e"}, + {file = "yara_python-4.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1b07363c9b44796fe991e29a5756a48ae195f3cbe4d72bb70b1932f5ccadd153"}, + {file = "yara_python-4.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8072d6f89d7352d09d1eeda6a8fa15582ff141495f24ceb448c7b7f7592d1820"}, + {file = "yara_python-4.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29735530650093e251abe11f76d78382fb8e87f24e7bc154e4fe28c624e7d4f7"}, + {file = "yara_python-4.5.0-cp38-cp38-win32.whl", hash = "sha256:016a7ce7ec60b1dcecec6a23557abd3b78b442a8ac7dd14c4e8047ac07227ea6"}, + {file = "yara_python-4.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:47fe5195687fff0f7ec435ce75b46a35b05b257c7550de5cb417bad9750bebde"}, + {file = "yara_python-4.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:aea5ba7084b48fb3d5edd6b01c7e45763a1f0a4dd83bc0c3c1975e61aeae86cf"}, + {file = "yara_python-4.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:16894888f599b4acdf57a4fc157108fb804823149f60e81a0afba0b7d2ebbf5f"}, + {file = "yara_python-4.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e80d2d8e5f7e9c25c8150f7281183abb2e53d81c0d33cecdf1459faeb042572"}, + {file = "yara_python-4.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898fbdc6c5f5913935ce2586242dd94673d27f3a031dc0704598237c25ed4431"}, + {file = "yara_python-4.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e94d576dd98f7b957d34b8b03cabdf0372d11e9f65cd45bb823cbc3a086ec25"}, + {file = "yara_python-4.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d95e525074624c2618cb8146b4cc22455e786fbbe575b99bf191824a23f460db"}, + {file = "yara_python-4.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:185d542aefc154c28d59b7385f3d8d7baacbb74451f2f153a51c1216ae063d70"}, + {file = "yara_python-4.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e7571f164a2da121fbc3a0d4df68fec82d2ae39bb8ea48b5a77467a467741573"}, + {file = "yara_python-4.5.0-cp39-cp39-win32.whl", hash = "sha256:692ae9d9647026908d5202a9ec68da6c8b4e4fb161828a425bc847ad03e66341"}, + {file = "yara_python-4.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:b08ebeab39aab6fd80da875aa9fe0ec21ab8432f4656a0f4011a5069a9c3aab4"}, + {file = "yara_python-4.5.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:cf9758f5b22cd0d9e14cec363d5eda3af637d93728bf5287ee0887a2fce036b1"}, + {file = "yara_python-4.5.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b68c7367df3d10d55fbeda985c02425ef9b549805fa9893505e25d68ef039e8"}, + {file = "yara_python-4.5.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe47ea00cd442eeb0bfea9ffea3cec97074e0e88843358a0552063b978655736"}, + {file = "yara_python-4.5.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344b679576d51fc6397eac3282e4ad27b1ab093cf9571a47e47b50debcd03dbf"}, + {file = "yara_python-4.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5c02545da623e58f5df8292a7d214b97667989904271d30b5e389b9ab1a81395"}, + {file = "yara_python-4.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e344f6953be0f60dc4fa94f629568e12ed9d2b981997e22bf32bd83083774c2f"}, + {file = "yara_python-4.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da34bac1807d270df4840d28c01a7d879e0ce0a0c692a0b0bd8f2adf4f6d1c"}, + {file = "yara_python-4.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d262ddf7032f1a9efe9c7533315c37db86ad58c10b5888d704f50f0f82bdfb8"}, + {file = "yara_python-4.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d04c17b27e33f9541a47f12972fc1a5836d2dfa947f48ed3242c5c9c32fc47b"}, + {file = "yara_python-4.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:847c249bbf6847f6d056921315eeef2d9c2ac79fcf063384d9b752b51e087afd"}, + {file = "yara_python-4.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0361820a3a8ec522cbb259d6af664d5f7dd19b29e4bcce9c36e480832b4172fc"}, + {file = "yara_python-4.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00a7c3d593ef0d065d84c06ed365ce24735f553669de1e066851e8f6cdfc2051"}, + {file = "yara_python-4.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a45b201d634be0f37bcb5fcf898fc91c66032c3f87b3e7656953f111e475f409"}, + {file = "yara_python-4.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c1cbcfc262840ea1fb19bc961eaff51d764896bd411643f5695a46046cae99b"}, + {file = "yara_python-4.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:445d80c3a327345cae346cb12c86b01265127319a9cf3a1d93e301ee080fb2c7"}, + {file = "yara_python-4.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c966f098254d6883ea9b1bba9743a298658cc58f43904ea6564e31e3e0d699d8"}, + {file = "yara_python-4.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c901ce071141261a857ea779bcdf0c1e63e238d1b597a411dc2f816796a25c63"}, + {file = "yara_python-4.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26085645d894bdfa75e2e88ba57d8297ed89c415ae3c2224ef27095c13c0c050"}, + {file = "yara_python-4.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0778e2d41bde173dd5e4758bb2f6d58832f149ff10d333e8751ae3cc4b195b2"}, + {file = "yara_python-4.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:648072ba075b930d976b5f6ae8c4563e4e32a057a2a8bd5be0e82ac98b682c60"}, ] [[package]] @@ -4629,10 +4494,9 @@ files = [ ] [extras] -gcp = ["google-api-core", "google-api-python-client", "google-auth", "google-cloud-datastore", "google-cloud-error-reporting", "google-cloud-pubsub", "google-cloud-storage", "grpcio-status", "proto-plus", "protobuf", "psq"] worker = ["dfDewey", "dfimagetools", "plaso", "pyhindsight"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "28f50af3123a22b2a860d2a187b8b60391cf96c30be0db8cc22dd183965e60ca" +content-hash = "d3c12669d7dd462c36a56c9fdfa273624771cb5fe4171143971d652087d82d98" diff --git a/pyproject.toml b/pyproject.toml index 96727bd1c..43d049252 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "turbinia" -version = "20231116.2" +version = "20240219" description = "Automation and Scaling of Digital Forensics Tools" authors = ["Turbinia Developers "] maintainers = ["Turbinia Developers "] @@ -20,23 +20,11 @@ dfimagetools = { version = "^20230806", optional = true } docker = { version = "^6.1.3" } fastapi = {extras = ["all"], version = ">=0.75.0,<0.99.0"} filelock = { version = "*" } -# TODO: Cleanup GCP libs and their dependencies when psq/pubsub is deprecated -google-api-core = { version = "<2.0.0dev", optional = true } -google-api-python-client = { version = "*", optional = true } -google-auth = { version = ">=2.15.0", optional = true } -google-cloud-core = { version = "<2.0dev", optional = true } -google-cloud-datastore = { version = "<=2.0.0", optional = true } -google-cloud-error-reporting = { version = "*", optional = true } -google-cloud-pubsub = { version = "1.7.0", optional = true } -google-cloud-storage = { version = "<=2.2.1", optional = true } -grpcio-status = { version = "<1.49.0,>=1.33.2", optional = true } -libcloudforensics = { version = "20230601" } +libcloudforensics = { version = "20240214" } pandas = { version = "^2.1.0" } plaso = { version = "20231224", optional = true } prometheus_client = { version = "^0.17.1" } protobuf = { version = ">=3.19.0,<4.0.0dev", optional = true } -proto-plus = { version = "<2.0.0dev,>=1.22.0", optional = true } -psq = { version = "*", optional = true } pydantic = { version = "^1.10.5,<2"} pyhindsight = { version = "^20230327.0", optional = true } redis = { version = "^4.4.4" } @@ -51,6 +39,7 @@ fakeredis = "^1.8.1" google-auth-oauthlib = "^1.1.0" mock = "*" pytest = "*" +turbinia-api-lib = "^1.0.2" yapf = "*" [tool.poetry.extras] @@ -61,21 +50,6 @@ worker = [ "pyhindsight", ] -gcp = [ - "google-api-core", - "google-api-python-client", - "google-auth", - "google-cloud-coverage", - "google-cloud-datastore", - "google-cloud-error-reporting", - "google-cloud-pubsub", - "google-cloud-storage", - "grpcio-status", - "protobuf", - "proto-plus", - "psq", -] - [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/turbinia/__init__.py b/turbinia/__init__.py index 951941d8b..2f1892a34 100644 --- a/turbinia/__init__.py +++ b/turbinia/__init__.py @@ -43,8 +43,9 @@ def log_and_report(message, trace): if config.CLOUD_PROVIDER.lower() == 'gcp' and config.STACKDRIVER_TRACEBACK: # Only load google_cloud if needed from turbinia.lib import google_cloud - client = google_cloud.setup_stackdriver_traceback(config.TURBINIA_PROJECT) - client.report_exception() + error_client = google_cloud.GCPErrorReporting() + message = f'{message}:{trace}' + error_client.report(message) class TurbiniaException(Exception): diff --git a/turbinia/client.py b/turbinia/client.py index 648f6cae1..285e40a41 100644 --- a/turbinia/client.py +++ b/turbinia/client.py @@ -20,15 +20,12 @@ from datetime import datetime from datetime import timedelta -import httplib2 -import json import logging from operator import itemgetter from operator import attrgetter import os import time -from google import auth from turbinia import config from turbinia.config import logger from turbinia.config import DATETIME_FORMAT @@ -67,9 +64,7 @@ def get_turbinia_client(): """ # pylint: disable=no-else-return setup(is_client=True) - if config.TASK_MANAGER.lower() == 'psq': - return BaseTurbiniaClient() - elif config.TASK_MANAGER.lower() == 'celery': + if config.TASK_MANAGER.lower() == 'celery': return TurbiniaCeleryClient() else: msg = f'Task Manager type "{config.TASK_MANAGER:s}" not implemented' @@ -340,123 +335,6 @@ def wait_for_request( log.info(f'All {len(task_results):d} Tasks completed') - def get_task_data( - self, instance, project, region, days=0, task_id=None, request_id=None, - group_id=None, user=None, function_name='gettasks', output_json=False): - """Gets task data from Google Cloud Functions. - - Args: - instance (string): The Turbinia instance name (by default the same as the - INSTANCE_ID in the config). - project (string): The name of the project. - region (string): The name of the region to execute in. - days (int): The number of days we want history for. - task_id (string): The Id of the task. - group_id (string): The group Id of the requests. - request_id (string): The Id of the request we want tasks for. - user (string): The user of the request we want tasks for. - function_name (string): The GCF function we want to call. - output_json (bool): Whether to return JSON output. - - Returns: - (List|JSON string) of Task dict objects - """ - cloud_function = gcp_function.GoogleCloudFunction(project) - func_args = {'instance': instance, 'kind': 'TurbiniaTask'} - - if days: - start_time = datetime.now() - timedelta(days=days) - # Format this like '1990-01-01T00:00:00z' so we can cast it directly to a - # javascript Date() object in the cloud function. - start_string = start_time.strftime(DATETIME_FORMAT) - func_args.update({'start_time': start_string}) - elif task_id: - func_args.update({'task_id': task_id}) - elif group_id: - func_args.update({'group_id': group_id}) - elif request_id: - func_args.update({'request_id': request_id}) - - if user: - func_args.update({'user': user}) - - response = {} - retry_count = 0 - credential_error_count = 0 - while not response and retry_count < MAX_RETRIES: - try: - response = cloud_function.ExecuteFunction( - function_name, region, func_args) - except auth.exceptions.RefreshError as exception: - if credential_error_count == 0: - log.info( - 'GCP Credentials need to be refreshed by running gcloud auth ' - 'application-default login, please refresh in another terminal ' - 'and run turbiniactl -w status -r {0!s} and this process will ' - 'resume. Error: {1!s}'.format(request_id, exception)) - else: - log.debug( - 'GCP Credentials need to be refreshed by running gcloud auth ' - 'application-default login, please refresh in another terminal ' - 'and run turbiniactl -w status -r {0!s} and this process will ' - 'resume. Attempt {1:d}. Error: ' - '{2!s}'.format(request_id, credential_error_count + 1, exception)) - # Note, we are intentionally not incrementing the retry_count here because - # we will retry indefinitely while we wait for the user to reauth. - credential_error_count += 1 - except httplib2.ServerNotFoundError as exception: - log.info( - 'Error connecting to server, will retry [{0:d} of {1:d} retries]: ' - '{2!s}'.format(retry_count, MAX_RETRIES, exception)) - retry_count += 1 - - if not response: - retry_count += 1 - time.sleep(RETRY_SLEEP) - elif response.get('error', {}).get('code') == 503: - log.warning( - 'Retriable error response from cloud functions: [{0!s}]'.format( - response.get('error'))) - retry_count += 1 - response = {} - time.sleep(RETRY_SLEEP) - - if not response or 'result' not in response: - log.error('No results found') - if response.get('error'): - msg = f"Error executing Cloud Function: [{response.get('error')!s}]." - log.error(msg) - log.debug(f'Invalid or empty GCF response: {response!s}') - raise TurbiniaException( - f'Cloud Function {function_name:s} returned no results.') - - try: - results = json.loads(response.get('result')) - except (TypeError, ValueError) as exception: - raise TurbiniaException( - 'Could not deserialize result [{0!s}] from GCF: [{1!s}]'.format( - response.get('result'), exception)) - - task_data = results[0] - if output_json: - try: - json_data = json.dumps(task_data) - except (TypeError, ValueError) as exception: - raise TurbiniaException( - 'Could not re-serialize result [{0!s}] from GCF: [{1!s}]'.format( - str(task_data), exception)) - return json_data - - # Convert run_time/last_update back into datetime objects - for task in task_data: - if task.get('run_time'): - task['run_time'] = timedelta(seconds=task['run_time']) - if task.get('last_update'): - task['last_update'] = datetime.strptime( - task['last_update'], DATETIME_FORMAT) - - return task_data - def format_task_detail(self, task, show_files=False): """Formats a single task in detail. @@ -1019,36 +897,7 @@ def send_request(self, request): Args: request: A TurbiniaRequest object. """ - self.task_manager.server_pubsub.send_request(request) - - def close_tasks( - self, instance, project, region, request_id=None, task_id=None, user=None, - requester=None): - """Close Turbinia Tasks based on Request ID. - - Args: - instance (string): The Turbinia instance name (by default the same as the - INSTANCE_ID in the config). - project (string): The name of the project. - region (string): The name of the zone to execute in. - request_id (string): The Id of the request we want tasks for. - task_id (string): The Id of the request we want task for. - user (string): The user of the request we want tasks for. - requester (string): The user making the request to close tasks. - - Returns: String of closed Task IDs. - """ - cloud_function = gcp_function.GoogleCloudFunction(project) - func_args = { - 'instance': instance, - 'kind': 'TurbiniaTask', - 'request_id': request_id, - 'task_id': task_id, - 'user': user, - 'requester': requester - } - response = cloud_function.ExecuteFunction('closetasks', region, func_args) - return f"Closed Task IDs: {response.get('result')}" + pass class TurbiniaCeleryClient(BaseTurbiniaClient): diff --git a/turbinia/client_gcp_test.py b/turbinia/client_gcp_test.py deleted file mode 100644 index 0dd037d85..000000000 --- a/turbinia/client_gcp_test.py +++ /dev/null @@ -1,104 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2018 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tests for Turbinia client module.""" - -from __future__ import unicode_literals - -from datetime import timedelta -import json -import unittest -import importlib -import mock - -from turbinia import config -from turbinia import client as TurbiniaClientProvider -from turbinia import TurbiniaException - -DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S.%fZ' - - -class TestTurbiniaClient(unittest.TestCase): - """Test Turbinia client class.""" - - @mock.patch('turbinia.client.task_manager.PSQTaskManager._backend_setup') - @mock.patch('google.cloud.datastore.Client') - def setUp(self, _, __): #pylint: disable=arguments-differ - """Initialize tests for Turbinia client.""" - config.LoadConfig() - config.TASK_MANAGER = 'PSQ' - config.STATE_MANAGER = 'Datastore' - config.CLOUD_PROVIDER = 'GCP' - - # Reload module using the config settings above. - # This is needed due to the conditional imports in client.py - importlib.reload(TurbiniaClientProvider) - self.client = TurbiniaClientProvider.get_turbinia_client() - TurbiniaClientProvider.RETRY_SLEEP = 0.001 - - def testTurbiniaClientInit(self): - """Basic test for client.""" - client = self.client - self.assertTrue(hasattr(client, 'task_manager')) - - @mock.patch('libcloudforensics.providers.gcp.internal.function.GoogleCloudFunction.ExecuteFunction') # yapf: disable - def testTurbiniaClientGetTaskData(self, mock_cloud_function): - """Basic test for client.get_task_data""" - # ExecuteFunction returns a dict with a 'result' key that has a json-encoded - # list. This contains our task data, which is a list of dicts. - run_time = timedelta(seconds=3) - test_task_data = [{'bar': 'bar2', 'run_time': run_time.total_seconds()}] - gcf_result = [test_task_data, 'Unused GCF data'] - gcf_result = json.dumps(gcf_result) - function_return = {'result': gcf_result} - mock_cloud_function.return_value = function_return - client = self.client - task_data = client.get_task_data('inst', 'proj', 'reg') - # get_task_data() converts this back into a timedelta(). We returned it - # seconds from the GCF function call because that is what it is stored in - # Datastore as. - test_task_data[0]['run_time'] = run_time - self.assertEqual(task_data, test_task_data) - - # Also test that JSON output works - task_data = client.get_task_data('inst', 'proj', 'reg', output_json=True) - self.assertEqual(task_data, '[{"bar": "bar2", "run_time": 3.0}]') - - @mock.patch('libcloudforensics.providers.gcp.internal.function.GoogleCloudFunction.ExecuteFunction') # yapf: disable - @mock.patch('libcloudforensics.providers.gcp.internal.function.GoogleCloudFunction') # yapf: disable - def testTurbiniaClientGetTaskDataNoResults(self, _, mock_cloud_function): - """Test for exception after empty results from cloud functions.""" - mock_cloud_function.return_value = {} - client = self.client - self.assertRaises( - TurbiniaException, client.get_task_data, "inst", "proj", "reg") - - @mock.patch('libcloudforensics.providers.gcp.internal.function.GoogleCloudFunction.ExecuteFunction') # yapf: disable - def testTurbiniaClientGetTaskDataRetriableErrors(self, mock_cloud_function): - """Test for retries after retriable errors returned from cloud functions.""" - mock_cloud_function.return_value = {'error': {'code': 503}} - client = self.client - self.assertRaises( - TurbiniaException, client.get_task_data, "inst", "proj", "reg") - self.assertEqual( - mock_cloud_function.call_count, TurbiniaClientProvider.MAX_RETRIES) - - @mock.patch('libcloudforensics.providers.gcp.internal.function.GoogleCloudFunction.ExecuteFunction') # yapf: disable - @mock.patch('libcloudforensics.providers.gcp.internal.function.GoogleCloudFunction') # yapf: disable - def testTurbiniaClientGetTaskDataInvalidJson(self, _, mock_cloud_function): - """Test for exception after bad json results from cloud functions.""" - mock_cloud_function.return_value = {'result': None} - client = self.client - self.assertRaises( - TurbiniaException, client.get_task_data, "inst", "proj", "reg") diff --git a/turbinia/client_test.py b/turbinia/client_test.py index 28c606b2b..18ffd37b9 100644 --- a/turbinia/client_test.py +++ b/turbinia/client_test.py @@ -268,17 +268,15 @@ def load_test_data(self): } ] # yapf: disable - @mock.patch('turbinia.client.task_manager.PSQTaskManager._backend_setup') - @mock.patch('google.cloud.datastore.Client') + @mock.patch('turbinia.client.task_manager.CeleryTaskManager._backend_setup') def setUp( self, _, - __, ): #pylint: disable=arguments-differ """Initialize tests for Turbinia client.""" config.LoadConfig() - config.TASK_MANAGER = 'PSQ' - config.STATE_MANAGER = 'Datastore' + config.TASK_MANAGER = 'Celery' + config.STATE_MANAGER = 'Redis' importlib.reload(state_manager) importlib.reload(TurbiniaClientProvider) self.client = TurbiniaClientProvider.get_turbinia_client() diff --git a/turbinia/config/__init__.py b/turbinia/config/__init__.py index e6692cc71..e2fbf1cf3 100644 --- a/turbinia/config/__init__.py +++ b/turbinia/config/__init__.py @@ -84,8 +84,6 @@ 'TURBINIA_ZONE', 'TURBINIA_REGION', 'BUCKET_NAME', - 'PSQ_TOPIC', - 'PUBSUB_TOPIC', 'GCS_OUTPUT_PATH', 'RECIPE_FILE_DIR', 'STACKDRIVER_TRACEBACK', diff --git a/turbinia/config/turbinia_config_tmpl.py b/turbinia/config/turbinia_config_tmpl.py index ac80fb789..e5dc2384c 100644 --- a/turbinia/config/turbinia_config_tmpl.py +++ b/turbinia/config/turbinia_config_tmpl.py @@ -28,15 +28,11 @@ # for GCP or hybrid installations, and 'Local' for local installations. CLOUD_PROVIDER = 'Local' -# Which state manager to use. Valid options are 'Datastore' or 'Redis'. Use -# 'Datastore' for Cloud (GCP) or hybrid installations, and 'Redis' for local -# installations. -STATE_MANAGER = 'Datastore' +# Task manager only supports 'Celery'. +TASK_MANAGER = 'Celery' -# Which Task manager to use. Valid options are 'PSQ' and 'Celery'. Use 'PSQ' -# for Cloud (GCP) or hybrid installations, and 'Celery' for local -# installations. -TASK_MANAGER = 'PSQ' +# Which state manager to use. The only valid option is 'Redis'. +STATE_MANAGER = 'Redis' # Default base output directory for worker results and evidence. OUTPUT_DIR = '/var/tmp' @@ -287,15 +283,6 @@ # This must be globally unique within GCP. BUCKET_NAME = None -# This is the internal PubSub topic that PSQ will use. This should be different -# than the PUBSUB_TOPIC variable. The actual PubSub topic created will be this -# variable prefixed with 'psq-'. -PSQ_TOPIC = 'turbinia-psq' - -# The PubSub topic Turbinia will listen on for new requests. This should be -# different than the PSQ_TOPIC variable. -PUBSUB_TOPIC = INSTANCE_ID - # GCS Path to copy worker results and Evidence output to. # Otherwise, set this as 'None' if output will be stored in shared storage. # GCS_OUTPUT_PATH = 'gs://%s/output' % BUCKET_NAME diff --git a/turbinia/evidence.py b/turbinia/evidence.py index fbe605c9f..7b55fb4bd 100644 --- a/turbinia/evidence.py +++ b/turbinia/evidence.py @@ -1070,7 +1070,7 @@ def _validate(self): log.info(f'Running pinfo.py to validate PlasoFile {self.local_path}') command = subprocess.run(cmd, capture_output=True, check=True) storage_counters_json = command.stdout.decode('utf-8').strip() - # pinfo.py might print warnings (non-json) so we only need to last line of output + # pinfo.py might print warnings so we only need to last line of output storage_counters_json = storage_counters_json.splitlines()[-1] storage_counters = json.loads(storage_counters_json) total_file_events = storage_counters.get('storage_counters', {}).get( @@ -1082,6 +1082,10 @@ def _validate(self): except subprocess.CalledProcessError as exception: raise TurbiniaException( f'Error validating plaso file: {exception!s}') from exception + except json.decoder.JSONDecodeError as exception: + log.warning( + f'Skipping validation, pinfo failed to read the Plaso ' + f'file: {exception!s}') class PlasoCsvFile(Evidence): diff --git a/turbinia/lib/google_cloud.py b/turbinia/lib/google_cloud.py index b10cd82d7..22492d620 100644 --- a/turbinia/lib/google_cloud.py +++ b/turbinia/lib/google_cloud.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# Copyright 2017 Google Inc. +# Copyright 2024 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,31 +13,68 @@ # limitations under the License. """Google Cloud resources library.""" -from __future__ import unicode_literals import logging +import traceback -from google.cloud import error_reporting -from google.cloud import exceptions +import google.auth +import googleapiclient.discovery +from googleapiclient.errors import HttpError + +from turbinia import __version__ from turbinia import TurbiniaException logger = logging.getLogger('turbinia') -def setup_stackdriver_traceback(project_id): - """Set up Google Cloud Error Reporting +class GCPErrorReporting: + """This class is used to report errors to Google Cloud.""" + + def __init__(self): + self._credentials, self._project = self._create_credentials() + try: + self.logging_client = googleapiclient.discovery.build( + 'clouderrorreporting', + 'v1beta1', + credentials=self._credentials, + ) + except google.auth.exceptions.MutualTLSChannelError as exception: + raise TurbiniaException( + 'Error creating Google API client: {exception}') from exception + + @staticmethod + def _create_credentials() -> google.auth.credentials.Credentials: + return google.auth.default() + + def report(self, message, caller=None) -> None: + if not caller: + stack = traceback.extract_stack() + caller = stack[-2] + file_path = caller[0] + line_number = caller[1] + function_name = caller[2] + report_location = { + 'filePath': file_path, + 'lineNumber': line_number, + 'functionName': function_name + } + + try: + self._send_error_report(message, report_location=report_location) + except HttpError as exception: + logger.exception('Unable to report error: %s', exception) - This method will enable Google Cloud Error Reporting. - All exceptions that occur within a Turbinia Task will be logged. + def _send_error_report(self, message, report_location) -> None: + payload = { + 'serviceContext': { + 'service': 'Turbinia', + 'version': __version__ + }, + 'message': f'{message}', + 'context': { + 'reportLocation': report_location + } + } - Attributes: - project_id: The name of the Google Cloud project. - Raises: - TurbiniaException: When an error occurs enabling GCP Error Reporting. - """ - try: - client = error_reporting.Client(project=project_id) - except exceptions.GoogleCloudError as exception: - msg = f'Error enabling GCP Error Reporting: {str(exception):s}' - raise TurbiniaException(msg) - return client + self.logging_client.projects().events().report( + projectName=f'projects/{self._project}', body=payload).execute() diff --git a/turbinia/lib/google_cloud_test.py b/turbinia/lib/google_cloud_test.py new file mode 100644 index 000000000..c4ed60ce8 --- /dev/null +++ b/turbinia/lib/google_cloud_test.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Google Cloud resources library.""" + +import mock +import unittest + +from turbinia.lib import google_cloud + + +class GoogleCLoudErrorReportingTest(unittest.TestCase): + """Tests for GCP Error reporting functions.""" + + @mock.patch('google.auth.default') + @mock.patch('googleapiclient.discovery.build') + @mock.patch('turbinia.lib.google_cloud.GCPErrorReporting._send_error_report') + def testStackDriverSetup(self, mock_send, mock_build, mock_credentials): + """Test object instantiation.""" + mock_credentials.return_value = ('fake-project-id', 'fake-credentials') + client_test = google_cloud.GCPErrorReporting() + self.assertIsInstance(client_test, google_cloud.GCPErrorReporting) diff --git a/turbinia/pubsub.py b/turbinia/pubsub.py deleted file mode 100644 index a2d17413c..000000000 --- a/turbinia/pubsub.py +++ /dev/null @@ -1,171 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2016 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Google PubSub Listener for requests to Turbinia to process evidence.""" - -from __future__ import unicode_literals - -import base64 -import codecs -import logging - -from six.moves import queue -from six.moves import xrange - -from google.cloud import exceptions -from google.cloud import pubsub -from googleapiclient.errors import HttpError -import libcloudforensics.providers.gcp.internal.common as gcp_common - -from turbinia import config -from turbinia import TurbiniaException -from turbinia.message import TurbiniaMessageBase - -log = logging.getLogger('turbinia') - - -class TurbiniaPubSub(TurbiniaMessageBase): - """PubSub client object for Google Cloud. - - Attributes: - _queue: A Queue object for storing pubsub messages - pubsub_api_client: The pubsub API client object - subscriber: The pubsub subscriber client object - subscription: The pubsub subscription object - topic_name (str): The pubsub topic name - topic_path (str): The full path of the pubsub topic - """ - - def __init__(self, topic_name): - """Initialization for PubSubClient.""" - self._queue = queue.Queue() - self.pubsub_api_client = None - self.subscriber = None - self.subscription = None - self.topic_name = topic_name - self.topic_path = None - - def setup(self): - """Set up the pubsub clients.""" - self.setup_publisher() - self.setup_subscriber() - - def setup_publisher(self): - """Set up the pubsub publisher.""" - config.LoadConfig() - # Configure the pubsub client in googleapiclient.discovery - # for more information on using the API, see - # https://cloud.google.com/pubsub/docs/reference/rest - self.pubsub_api_client = gcp_common.CreateService('pubsub', 'v1') - self.topic_path = f'projects/{config.TURBINIA_PROJECT:s}/topics/{self.topic_name:s}' - try: - log.debug(f'Trying to create pubsub topic {self.topic_path:s}') - topics_client = self.pubsub_api_client.projects().topics() - # the ExecuteRequest takes API URI, method name as string and parameters - # as a dict, it executes the API call, handles paging and return response. - gcp_common.ExecuteRequest( - topics_client, 'create', {'name': self.topic_path}) - except HttpError as exception: - if exception.resp.status == 409: - log.debug(f'PubSub topic {self.topic_path:s} already exists.') - else: - raise TurbiniaException( - 'Unknown error occurred when creating Topic:' - ' {0!s}'.format(exception), __name__) from exception - log.debug(f'Setup PubSub publisher at {self.topic_path:s}') - - def setup_subscriber(self): - """Set up the pubsub subscriber.""" - config.LoadConfig() - self.subscriber = pubsub.SubscriberClient() - subscription_path = self.subscriber.subscription_path( - config.TURBINIA_PROJECT, self.topic_name) - if not self.topic_path: - self.topic_path = self.subscriber.topic_path( - config.TURBINIA_PROJECT, self.topic_name) - try: - log.debug( - 'Trying to create subscription {0:s} on topic {1:s}'.format( - subscription_path, self.topic_path)) - self.subscriber.create_subscription(subscription_path, self.topic_path) - except exceptions.Conflict: - log.debug(f'Subscription {subscription_path:s} already exists.') - - log.debug(f'Setup PubSub Subscription {subscription_path:s}') - self.subscription = self.subscriber.subscribe( - subscription_path, self._callback) - - def _callback(self, message): - """Callback function that places messages in the queue. - - Args: - message: A pubsub message object - """ - data = codecs.decode(message.data, 'utf-8') - log.debug(f'Received pubsub message: {data:s}') - message.ack() - self._queue.put(message) - - def check_messages(self): - """Checks for pubsub messages. - - Returns: - A list of any TurbiniaRequest objects received, else an empty list - """ - requests = [] - for _ in xrange(self._queue.qsize()): - message = self._queue.get() - data = message.data - log.info(f'Processing PubSub message {message.message_id:s}') - - request = self._validate_message(data) - if request: - requests.append(request) - else: - log.error(f'Error processing PubSub message: {data:s}') - - return requests - - def send_message(self, message): - """Send a pubsub message. - - message: The message to send. - """ - base64_data = base64.b64encode(message.encode('utf-8')) - request_body = { - "messages": [{ - "data": - base64_data.decode('utf-8') # base64 encoded string - }] - } - publish_client = self.pubsub_api_client.projects().topics() - response = gcp_common.ExecuteRequest( - publish_client, 'publish', { - 'topic': self.topic_path, - 'body': request_body - }) - # Safe to unpack since response is unpaged. - if not response[0]['messageIds']: - raise TurbiniaException( - f'Message {message:s} was not published to topic {self.topic_path:s}') - msg_id = response[0]['messageIds'][0] - log.info(f'Published message {msg_id!s} to topic {self.topic_name!s}') - - def send_request(self, request): - """Sends a TurbiniaRequest message. - - Args: - request: A TurbiniaRequest object. - """ - self.send_message(request.to_json()) diff --git a/turbinia/pubsub_test.py b/turbinia/pubsub_test.py deleted file mode 100644 index 360b0ad35..000000000 --- a/turbinia/pubsub_test.py +++ /dev/null @@ -1,191 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2016 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tests for Turbinia pubsub module.""" - -from __future__ import unicode_literals - -import unittest - -import base64 -import mock - -from six.moves import queue - -from turbinia import evidence -from turbinia import pubsub -from turbinia import message -from turbinia import tcelery as celery -from turbinia import TurbiniaException - - -def getTurbiniaRequest(): - """Get a Turbinia Request object with valid evidence attached. - - Returns: - TurbiniaRequest object. - """ - request = message.TurbiniaRequest( - request_id='deadbeef', context={'kw': [1, 2]}) - rawdisk = evidence.RawDisk(name='My Evidence', source_path='/tmp/foo') - request.evidence.append(rawdisk) - return request - - -class MockPubSubMessage: - """This is a mock of a PubSub message.""" - - def __init__(self, data='fake data', message_id='12345'): - self.data = data if data else '' - self.message_id = message_id - - -class MockPubSubProject: - """This is a mock of a PubSub project API object.""" - - def topics(cls): - "Mock class method topics." - return 'fake-topic-api-object' - - -class MockPubSubClient: - """This is a mock of PubSub API client.""" - - def projects(cls): - "Mock class method projects." - return MockPubSubProject() - - -class TestTurbiniaRequest(unittest.TestCase): - """Test TurbiniaRequest class.""" - - def testTurbiniaRequestSerialization(self): - """Test that TurbiniaRequests serializes/unserializes.""" - request = getTurbiniaRequest() - request_json = request.to_json() - self.assertTrue(isinstance(request_json, str)) - - # Create a new Turbinia Request object to load our results into - request_new = message.TurbiniaRequest() - request_new.from_json(request_json) - - self.assertTrue(isinstance(request_new, message.TurbiniaRequest)) - self.assertTrue(request_new.context['kw'][1], 2) - self.assertTrue(request_new.request_id, 'deadbeef') - self.assertTrue(isinstance(request_new.evidence[0], evidence.RawDisk)) - self.assertEqual(request_new.evidence[0].name, 'My Evidence') - - def testTurbiniaRequestSerializationBadData(self): - """Tests that TurbiniaRequest will raise error on non-json data.""" - request_new = message.TurbiniaRequest() - self.assertRaises(TurbiniaException, request_new.from_json, 'non-json-data') - - def testTurbiniaRequestSerializationBadJSON(self): - """Tests that TurbiniaRequest will raise error on wrong JSON object.""" - rawdisk = evidence.RawDisk(name='My Evidence', source_path='/tmp/foo') - rawdisk_json = rawdisk.to_json() - self.assertTrue(isinstance(rawdisk_json, str)) - - request_new = message.TurbiniaRequest() - # Try to load serialization RawDisk() into a TurbiniaRequest, which should - # error because this is not the correct type. - self.assertRaises(TurbiniaException, request_new.from_json, rawdisk_json) - - -class TestTurbiniaPubSub(unittest.TestCase): - """Test turbinia.pubsub module.""" - - def setUp(self): - request = getTurbiniaRequest() - self.pubsub = pubsub.TurbiniaPubSub('fake_topic') - pub_sub_message = MockPubSubMessage(request.to_json(), 'msg id') - # pylint: disable=protected-access - self.pubsub._queue.put(pub_sub_message) - self.pubsub.topic_path = 'faketopicpath' - - def testCheckMessages(self): - """Test check_messages to make sure it returns the expected results.""" - results = self.pubsub.check_messages() - self.assertTrue(len(results) == 1) - request_new = results[0] - - # Make sure that the TurbiniaRequest object is as expected - self.assertTrue(isinstance(request_new, message.TurbiniaRequest)) - self.assertTrue(request_new.context['kw'][1], 2) - self.assertTrue(request_new.request_id, 'deadbeef') - self.assertTrue(isinstance(request_new.evidence[0], evidence.RawDisk)) - self.assertEqual(request_new.evidence[0].name, 'My Evidence') - - def testBadCheckMessages(self): - """Test check_messages returns empty list for an invalid message.""" - pub_sub_message = MockPubSubMessage('non-json-data', 'msg id2') - # Clear the queue so we can add an invalid message - # pylint: disable=protected-access - self.pubsub._queue.get() - self.pubsub._queue.put(pub_sub_message) - - self.assertListEqual(self.pubsub.check_messages(), []) - - @mock.patch('libcloudforensics.providers.gcp.internal.common.ExecuteRequest') - def testSendMessage(self, gcp_execute): - """Test sending a message.""" - gcp_execute.return_value = [{'messageIds': ['fake-id']}] - gcp_execute.side_effect = None - self.pubsub.pubsub_api_client = MockPubSubClient() - self.pubsub.send_message('test message text') - base64_data = base64.b64encode('test message text'.encode('utf-8')) - gcp_execute.assert_called_with( - 'fake-topic-api-object', 'publish', { - 'topic': 'faketopicpath', - 'body': { - 'messages': [{ - 'data': base64_data.decode('utf-8') - }] - } - }) - - -class TestTurbiniaKombu(unittest.TestCase): - """Test turbinia.pubsub Kombu module.""" - - def setUp(self): - """Sets up test class.""" - request = getTurbiniaRequest() - self.kombu = celery.TurbiniaKombu('fake_topic') - result = mock.MagicMock() - result.payload = request.to_json() - self.kombu.queue = mock.MagicMock() - self.kombu.queue.__len__.return_value = 1 - self.kombu.queue.get.side_effect = [result, queue.Empty('Empty Queue')] - - def testCheckMessages(self): - """Test check_messages method.""" - results = self.kombu.check_messages() - self.assertTrue(len(results) == 1) - request_new = results[0] - - # Make sure that the TurbiniaRequest object is as expected - self.assertTrue(isinstance(request_new, message.TurbiniaRequest)) - self.assertTrue(request_new.context['kw'][1], 2) - self.assertTrue(request_new.request_id, 'deadbeef') - self.assertTrue(isinstance(request_new.evidence[0], evidence.RawDisk)) - self.assertEqual(request_new.evidence[0].name, 'My Evidence') - - def testBadCheckMessages(self): - """Test check_messages method with non-json data.""" - result = mock.MagicMock() - result.payload = 'non-json-data' - self.kombu.queue.get.side_effect = [result, queue.Empty('Empty Queue')] - - self.assertListEqual(self.kombu.check_messages(), []) diff --git a/turbinia/server_test.py b/turbinia/server_test.py index 252bff4c1..7086946f8 100644 --- a/turbinia/server_test.py +++ b/turbinia/server_test.py @@ -29,10 +29,10 @@ class TestTurbiniaServerPSQ(unittest.TestCase): def setUp(self): #pylint: disable=arguments-differ """Initialize tests for Turbinia Server.""" config.LoadConfig() - config.STATE_MANAGER = 'Datastore' - config.TASK_MANAGER = 'PSQ' + config.STATE_MANAGER = 'Redis' + config.TASK_MANAGER = 'Celery' - @mock.patch('turbinia.client.task_manager.PSQTaskManager._backend_setup') + @mock.patch('turbinia.client.task_manager.CeleryTaskManager._backend_setup') @mock.patch('turbinia.state_manager.get_state_manager') def testTurbiniaServerInit(self, _, __): """Basic test for Turbinia Server init.""" diff --git a/turbinia/state_manager.py b/turbinia/state_manager.py index 814da3573..603862a4f 100644 --- a/turbinia/state_manager.py +++ b/turbinia/state_manager.py @@ -36,16 +36,10 @@ config.LoadConfig() if 'unittest' in sys.modules.keys(): - from google.cloud import datastore - from google.cloud import exceptions from google.auth import exceptions as auth_exceptions import redis -if config.STATE_MANAGER.lower() == 'datastore': - from google.cloud import datastore - from google.cloud import exceptions - from google.auth import exceptions as auth_exceptions -elif config.STATE_MANAGER.lower() == 'redis': +if config.STATE_MANAGER.lower() == 'redis': import redis else: msg = f'State Manager type "{config.STATE_MANAGER:s}" not implemented' @@ -67,9 +61,7 @@ def get_state_manager(): """ config.LoadConfig() # pylint: disable=no-else-return - if config.STATE_MANAGER.lower() == 'datastore': - return DatastoreStateManager() - elif config.STATE_MANAGER.lower() == 'redis': + if config.STATE_MANAGER.lower() == 'redis': return RedisStateManager() else: msg = f'State Manager type "{config.STATE_MANAGER:s}" not implemented' @@ -127,9 +119,6 @@ def get_task_dict(self, task): task_dict.update({k: None for k in all_attrs if k not in task_dict}) task_dict = self._validate_data(task_dict) - # Using the pubsub topic as an instance attribute in order to have a unique - # namespace per Turbinia installation. - # TODO(aarontp): Migrate this to actual Datastore namespaces config.LoadConfig() task_dict.update({'instance': config.INSTANCE_ID}) if isinstance(task_dict['instance'], six.binary_type): @@ -167,71 +156,6 @@ def write_new_task(self, task): raise NotImplementedError -class DatastoreStateManager(BaseStateManager): - """Datastore State Manager. - - Attributes: - client: A Datastore client object. - """ - - def __init__(self): - config.LoadConfig() - try: - self.client = datastore.Client(project=config.TURBINIA_PROJECT) - except (EnvironmentError, - auth_exceptions.DefaultCredentialsError) as exception: - message = ( - 'Could not create Datastore client: {0!s}\n' - 'Have you run $ gcloud auth application-default login?'.format( - exception)) - raise TurbiniaException(message) - - def _validate_data(self, data): - for key, value in iter(data.items()): - if (isinstance(value, six.string_types) and - len(value) >= MAX_DATASTORE_STRLEN): - log.warning( - 'Warning: key {0:s} with value {1:s} is longer than {2:d} bytes. ' - 'Truncating in order to fit in Datastore.'.format( - key, value, MAX_DATASTORE_STRLEN)) - suffix = '[...]' - data[key] = value[:MAX_DATASTORE_STRLEN - len(suffix)] + suffix - - return data - - def update_task(self, task): - task.touch() - try: - with self.client.transaction(): - if not task.state_key: - self.write_new_task(task) - return - entity = self.client.get(task.state_key) - entity.update(self.get_task_dict(task)) - log.debug(f'Updating Task {task.name:s} in Datastore') - self.client.put(entity) - except exceptions.GoogleCloudError as exception: - log.error( - f'Failed to update task {task.name:s} in datastore: {exception!s}') - - def write_new_task(self, task): - key = self.client.key('TurbiniaTask', task.id) - try: - entity = datastore.Entity(key) - task_data = self.get_task_dict(task) - if not task_data.get('status'): - task_data['status'] = 'Task scheduled at {0:s}'.format( - datetime.now().strftime(DATETIME_FORMAT)) - entity.update(task_data) - log.info(f'Writing new task {task.name:s} into Datastore') - self.client.put(entity) - task.state_key = key - except exceptions.GoogleCloudError as exception: - log.error( - f'Failed to update task {task.name:s} in datastore: {exception!s}') - return key - - class RedisStateManager(BaseStateManager): """Use redis for task state storage. diff --git a/turbinia/state_manager_test.py b/turbinia/state_manager_test.py index b6b99acac..9b7ec5555 100644 --- a/turbinia/state_manager_test.py +++ b/turbinia/state_manager_test.py @@ -16,108 +16,17 @@ from __future__ import unicode_literals -import copy import fakeredis import importlib import json import os -import tempfile import unittest from unittest import mock from turbinia import config -from turbinia.workers import TurbiniaTask -from turbinia.workers import TurbiniaTaskResult - from turbinia import state_manager -class TestPSQStateManager(unittest.TestCase): - """Test PSQStateManager class.""" - - def _get_state_manager(self): - """Gets a Datastore State Manager object for test.""" - config.STATE_MANAGER = 'Datastore' - return state_manager.get_state_manager() - - @mock.patch('turbinia.state_manager.datastore.Client') - def setUp(self, _): - self.remove_files = [] - self.remove_dirs = [] - self.state_manager = None - - config.LoadConfig() - self.state_manager_save = config.STATE_MANAGER - - self.test_data = { - 'name': 'TestTask', - 'request_id': 'TestRequestId', - 'group_id': 'TestGroupId', - 'status': 'TestStatus', - 'saved_paths': ['testpath1', 'testpath2'] - } - - # Set up TurbiniaTask - self.base_output_dir = tempfile.mkdtemp() - self.task = TurbiniaTask( - base_output_dir=self.base_output_dir, name=self.test_data['name'], - request_id=self.test_data['request_id'], - group_id=self.test_data['group_id']) - self.task.output_manager = mock.MagicMock() - self.task.output_manager.get_local_output_dirs.return_value = ( - '/fake/tmp/dir', self.base_output_dir) - - # Set up TurbiniaTaskResult - self.result = TurbiniaTaskResult(base_output_dir=self.base_output_dir) - self.result.setup(self.task) - self.result.status = self.test_data['status'] - self.result.saved_paths = self.test_data['saved_paths'] - self.task.result = self.result - - def tearDown(self): - config.STATE_MANAGER = self.state_manager_save - [os.remove(f) for f in self.remove_files if os.path.exists(f)] - [os.rmdir(d) for d in self.remove_dirs if os.path.exists(d)] - os.rmdir(self.base_output_dir) - - @mock.patch('turbinia.state_manager.datastore.Client') - def testStateManagerGetTaskDict(self, _): - """Test State Manager get_task_dict().""" - self.state_manager = self._get_state_manager() - - task_dict = self.state_manager.get_task_dict(self.task) - - # Make the returned task_dict contains all of our test data - self.assertEqual(task_dict['name'], self.test_data['name']) - self.assertEqual(task_dict['request_id'], self.test_data['request_id']) - self.assertEqual(task_dict['status'], self.test_data['status']) - self.assertEqual(len(task_dict['saved_paths']), 2) - self.assertEqual(task_dict['group_id'], self.test_data['group_id']) - self.assertTrue('instance' in task_dict) - self.assertIn(self.test_data['saved_paths'][0], task_dict['saved_paths']) - - @mock.patch('turbinia.state_manager.datastore.Client') - def testStateManagerValidateDataValidDict(self, _): - """Test State Manager _validate_data() base case.""" - self.state_manager = self._get_state_manager() - # pylint: disable=protected-access - test_data = self.state_manager._validate_data(self.test_data) - self.assertDictEqual(test_data, self.test_data) - - @mock.patch('turbinia.state_manager.datastore.Client') - def testStateManagerValidateDataInvalidDict(self, _): - """Test State Manager _validate_data() with invalid large input.""" - self.state_manager = self._get_state_manager() - invalid_dict = copy.deepcopy(self.test_data) - invalid_dict['status'] = 'A' * state_manager.MAX_DATASTORE_STRLEN + 'BORKEN' - # pylint: disable=protected-access - test_data = self.state_manager._validate_data(invalid_dict) - self.assertListEqual(list(test_data.keys()), list(self.test_data.keys())) - self.assertNotEqual(test_data['status'], self.test_data['status']) - self.assertLessEqual( - len(test_data['status']), state_manager.MAX_DATASTORE_STRLEN) - - class TestRedisEvidenceStateManager(unittest.TestCase): """Test RedisStateManager class.""" @@ -162,7 +71,7 @@ def get_data_from_fake_redis(self): evidence_key, attribute_name, json.dumps(attribute_value)) @mock.patch('redis.StrictRedis') - @mock.patch('turbinia.state_manager.datastore.Client') + @mock.patch('turbinia.state_manager.get_state_manager') def setUp(self, _, mock_redis): self.state_manager = None config.LoadConfig() diff --git a/turbinia/task_manager.py b/turbinia/task_manager.py index 862590df3..7aa251b91 100644 --- a/turbinia/task_manager.py +++ b/turbinia/task_manager.py @@ -20,7 +20,6 @@ from copy import deepcopy from datetime import datetime import time -import uuid from prometheus_client import Counter @@ -37,23 +36,13 @@ from turbinia.workers.abort import AbortTask config.LoadConfig() -if config.TASK_MANAGER.lower() == 'psq': - import psq - from google.cloud import exceptions - from google.cloud import datastore - from google.cloud import pubsub - - from turbinia import pubsub as turbinia_pubsub -elif config.TASK_MANAGER.lower() == 'celery': +if config.TASK_MANAGER.lower() == 'celery': from celery import states as celery_states - from turbinia import tcelery as turbinia_celery log = logging.getLogger('turbinia') -PSQ_TASK_TIMEOUT_SECONDS = 604800 -PSQ_QUEUE_WAIT_SECONDS = 2 # The amount of time in seconds that the Server will wait in addition to the # Job/Task timeout value before it times out a given Task. This is to make sure # that the Server doesn't time out the Task before the Worker has a chance to @@ -92,9 +81,7 @@ def get_task_manager(): """ config.LoadConfig() # pylint: disable=no-else-return - if config.TASK_MANAGER.lower() == 'psq': - return PSQTaskManager() - elif config.TASK_MANAGER.lower() == 'celery': + if config.TASK_MANAGER.lower() == 'celery': return CeleryTaskManager() else: msg = f'Task Manager type "{config.TASK_MANAGER:s}" not implemented' @@ -479,7 +466,7 @@ def process_result(self, task_result): """Runs final task results recording. self.process_tasks handles things that have failed at the task queue layer - (i.e. PSQ), and this method handles tasks that have potentially failed + (i.e. Celery), and this method handles tasks that have potentially failed below that layer (i.e. somewhere in our Task code). This also adds the Evidence to the running jobs and running requests so we @@ -755,115 +742,3 @@ def enqueue_task(self, task, evidence_): ) task.stub = self.celery_runner.delay( task.serialize(), evidence_.serialize()) - - -class PSQTaskManager(BaseTaskManager): - """PSQ implementation of BaseTaskManager. - - Attributes: - psq: PSQ Queue object. - server_pubsub: A PubSubClient object for receiving new evidence messages. - """ - - def __init__(self): - self.psq = None - self.server_pubsub = None - config.LoadConfig() - super(PSQTaskManager, self).__init__() - - # pylint: disable=keyword-arg-before-vararg - def _backend_setup(self, server=True, *args, **kwargs): - """ - Args: - server (bool): Whether this is the client or a server - - Raises: - TurbiniaException: When there are errors creating PSQ Queue - """ - - log.debug( - 'Setting up PSQ Task Manager requirements on project {0:s}'.format( - config.TURBINIA_PROJECT)) - self.server_pubsub = turbinia_pubsub.TurbiniaPubSub(config.PUBSUB_TOPIC) - if server: - self.server_pubsub.setup_subscriber() - psq_publisher = pubsub.PublisherClient() - psq_subscriber = pubsub.SubscriberClient() - datastore_client = datastore.Client(project=config.TURBINIA_PROJECT) - try: - self.psq = psq.Queue( - psq_publisher, psq_subscriber, config.TURBINIA_PROJECT, - name=config.PSQ_TOPIC, - storage=psq.DatastoreStorage(datastore_client)) - except exceptions.GoogleCloudError as exception: - msg = f'Error creating PSQ Queue: {str(exception):s}' - log.error(msg) - raise turbinia.TurbiniaException(msg) - else: - self.server_pubsub.setup_publisher() - - def process_tasks(self): - completed_tasks = [] - for task in self.tasks: - check_timeout = False - psq_task = task.stub.get_task() - # This handles tasks that have failed at the PSQ layer. - if not psq_task: - check_timeout = True - log.debug(f'Task {task.stub.task_id:s} not yet created') - elif psq_task.status not in (psq.task.FINISHED, psq.task.FAILED): - check_timeout = True - log.debug(f'Task {psq_task.id:s} not finished') - elif psq_task.status == psq.task.FAILED: - log.warning(f'Task {psq_task.id:s} failed.') - completed_tasks.append(task) - else: - task.result = workers.TurbiniaTaskResult.deserialize( - task.stub.result(timeout=PSQ_TASK_TIMEOUT_SECONDS)) - completed_tasks.append(task) - - # For certain Task states we want to check whether the Task has timed out - # or not. - if check_timeout: - timeout = self.check_task_timeout(task) - if timeout: - log.warning( - 'Task {0:s} timed on server out after {1:d} seconds. Auto-closing Task.' - .format(task.id, timeout)) - task = self.timeout_task(task, timeout) - completed_tasks.append(task) - - outstanding_task_count = len(self.tasks) - len(completed_tasks) - if outstanding_task_count > 0: - log.info(f'{outstanding_task_count:d} Tasks still outstanding.') - return completed_tasks - - def get_evidence(self): - requests = self.server_pubsub.check_messages() - evidence_list = [] - for request in requests: - for evidence_ in request.evidence: - if not evidence_.request_id: - evidence_.request_id = request.request_id - - log.info(f'Received evidence [{str(evidence_):s}] from PubSub message.') - - success, message = recipe_helpers.validate_recipe(request.recipe) - if not success: - self.abort_request( - evidence_.request_id, request.requester, evidence_.name, message) - else: - evidence_.config = request.recipe - evidence_.config['globals']['requester'] = request.requester - evidence_list.append(evidence_) - turbinia_server_request_total.inc() - - return evidence_list - - def enqueue_task(self, task, evidence_): - log.info( - f'Adding PSQ task {task.name:s} with evidence {evidence_.name:s} to queue' - ) - task.stub = self.psq.enqueue( - task_utils.task_runner, task.serialize(), evidence_.serialize()) - time.sleep(PSQ_QUEUE_WAIT_SECONDS) diff --git a/turbinia/task_manager_test.py b/turbinia/task_manager_test.py index 4470af749..a0f8a24de 100644 --- a/turbinia/task_manager_test.py +++ b/turbinia/task_manager_test.py @@ -18,7 +18,6 @@ import mock -from turbinia import config from turbinia import TurbiniaException from turbinia import task_manager from turbinia.jobs import manager as jobs_manager diff --git a/turbinia/task_utils.py b/turbinia/task_utils.py index eac56b7d3..b67c35395 100644 --- a/turbinia/task_utils.py +++ b/turbinia/task_utils.py @@ -17,7 +17,6 @@ from datetime import datetime import logging -import os import filelock from turbinia import config @@ -197,32 +196,14 @@ def task_runner(obj, *args, **kwargs): Output from TurbiniaTask (should be TurbiniaTaskResult). """ obj = task_deserialize(obj) - if config.TASK_MANAGER.lower() == 'psq': - # Late import because this is only needed for PSQ - import psq - # GKE PSQ Specific - do not queue more work if pod places this file - if os.path.exists(config.SCALEDOWN_WORKER_FILE): - raise psq.Retry() - # Try to acquire lock, timeout and requeue task if the worker - # is already processing a task. - try: - lock = filelock.FileLock(config.LOCK_FILE) - with lock.acquire(timeout=0.001): - run = obj.run_wrapper(*args, **kwargs) - except filelock.Timeout: - raise psq.Retry() - # *Always* make sure we release the lock - finally: - lock.release() # Celery is configured to receive only one Task per worker # so no need to create a FileLock. - elif config.TASK_MANAGER.lower() == 'celery': - try: - lock = filelock.FileLock(config.LOCK_FILE) - with lock.acquire(timeout=10): - run = obj.run_wrapper(*args, **kwargs) - except filelock.Timeout: - raise TurbiniaException(f'Could not acquire lock on {config.LOCK_FILE}') - finally: - lock.release() + try: + lock = filelock.FileLock(config.LOCK_FILE) + with lock.acquire(timeout=10): + run = obj.run_wrapper(*args, **kwargs) + except filelock.Timeout: + raise TurbiniaException(f'Could not acquire lock on {config.LOCK_FILE}') + finally: + lock.release() return run diff --git a/turbinia/turbiniactl.py b/turbinia/turbiniactl.py index cde5ac6e6..2c8121f4b 100644 --- a/turbinia/turbiniactl.py +++ b/turbinia/turbiniactl.py @@ -32,7 +32,6 @@ from turbinia import __version__ from turbinia.processors import archive from turbinia.output_manager import OutputManager -from turbinia.output_manager import GCSOutputWriter log = logging.getLogger('turbinia') # We set up the logger first without the file handler, and we will set up the @@ -348,12 +347,6 @@ def process_args(args): help='List all available Jobs. These Job names can be used by ' '--jobs_allowlist and --jobs_denylist') - # PSQ Worker - parser_psqworker = subparsers.add_parser('psqworker', help='Run PSQ worker') - parser_psqworker.add_argument( - '-S', '--single_threaded', action='store_true', - help='Run PSQ Worker in a single thread', required=False) - # Celery Worker subparsers.add_parser('celeryworker', help='Run Celery worker') @@ -483,8 +476,7 @@ def process_args(args): config.OUTPUT_DIR = args.output_dir config.TURBINIA_COMMAND = args.command - flags_set = args.command in ( - 'api_server', 'server', 'psqworker', 'celeryworker') + flags_set = args.command in ('api_server', 'server', 'celeryworker') # Run logger setup again if we're running as a server or worker (or have a log # file explicitly set on the command line) to set a file-handler now that we # have the logfile path from the config. @@ -517,7 +509,6 @@ def process_args(args): from turbinia import notify from turbinia import client as TurbiniaClientProvider from turbinia.worker import TurbiniaCeleryWorker - from turbinia.worker import TurbiniaPsqWorker from turbinia.server import TurbiniaServer # Print out config if requested @@ -572,7 +563,7 @@ def process_args(args): # Create Client object client = None - if args.command not in ('psqworker', 'server'): + if args.command not in ('server'): client = TurbiniaClientProvider.get_turbinia_client() # Set group id @@ -651,14 +642,13 @@ def process_args(args): f'--copy_only specified, so not processing {disk_name:s} with Turbinia' ) continue - process_evidence( args=args, disk_name=disk_name, name=name, source=source, project=project, zone=zone, embedded_path=embedded_path, mount_partition=mount_partition, group_id=group_id, filter_patterns=filter_patterns, client=client, yara_rules=yara_rules, group_name=group_name, reason=reason, all_args=all_args) - elif args.command == 'rawmemory': + if args.command == 'rawmemory': # Checks if length of args match args.name, args.profile = check_args( args.source_path, [args.name, args.profile]) @@ -682,13 +672,6 @@ def process_args(args): group_id=group_id, client=client, filter_patterns=filter_patterns, yara_rules=yara_rules, browser_type=browser_type, group_name=group_name, reason=reason, all_args=all_args) - elif args.command == 'psqworker': - # Set up root logger level which is normally set by the psqworker command - # which we are bypassing. - logger.setup() - worker = TurbiniaPsqWorker( - jobs_denylist=args.jobs_denylist, jobs_allowlist=args.jobs_allowlist) - worker.start() elif args.command == 'celeryworker': logger.setup() worker = TurbiniaCeleryWorker( @@ -709,22 +692,6 @@ def process_args(args): 'Cannot run status command with request ID and group ID. Please ' 'only specify one.') raise TurbiniaException(msg) - if args.close_tasks: - if args.group_id: - msg = 'The --close_task flag is not compatible with --group_id.' - raise TurbiniaException(msg) - if args.user or args.request_id or args.task_id: - print( - client.close_tasks( - instance=config.INSTANCE_ID, project=config.TURBINIA_PROJECT, - region=region, request_id=args.request_id, task_id=args.task_id, - user=args.user, requester=getpass.getuser())) - sys.exit(0) - else: - log.info( - '--close_tasks (-c) requires --user, --request_id, or/and --task_id' - ) - sys.exit(1) if args.dump_json and (args.statistics or args.requests or args.workers): log.info( @@ -749,7 +716,6 @@ def process_args(args): log.info( '--wait requires --request_id, which is not specified. ' 'turbiniactl will exit without waiting.') - if args.requests: print( client.format_request_status( @@ -757,7 +723,6 @@ def process_args(args): region=region, days=args.days_history, all_fields=args.all_fields)) sys.exit(0) - if args.workers: print( client.format_worker_status( @@ -781,51 +746,6 @@ def process_args(args): elif args.command == 'listjobs': log.info('Available Jobs:') client.list_jobs() - elif args.command == 'dumpgcs': - if not config.GCS_OUTPUT_PATH and not args.bucket: - msg = 'GCS storage must be enabled in order to use this.' - raise TurbiniaException(msg) - if not args.task_id and not args.request_id: - msg = 'You must specify one of task_id or request_id.' - raise TurbiniaException(msg) - if not os.path.isdir(args.output_dir): - msg = 'Please provide a valid directory path.' - raise TurbiniaException(msg) - - gcs_bucket = args.bucket if args.bucket else config.GCS_OUTPUT_PATH - instance_id = args.instance_id if args.instance_id else config.INSTANCE_ID - - try: - task_data = client.get_task_data( - instance=instance_id, days=args.days_history, - project=config.TURBINIA_PROJECT, region=config.TURBINIA_REGION, - task_id=args.task_id, request_id=args.request_id, - function_name='gettasks') - output_writer = GCSOutputWriter( - gcs_bucket, local_output_dir=args.output_dir) - if not task_data: - msg = 'No Tasks found for task/request ID' - raise TurbiniaException(msg) - if args.task_id: - log.info( - 'Downloading GCS files for task_id {0:s} to {1:s}.'.format( - args.task_id, args.output_dir)) - for task in task_data: - if task['id'] == args.task_id: - if task['saved_paths']: - output_writer.copy_from_gcs(task['saved_paths']) - if args.request_id: - log.info( - 'Downloading GCS files for request_id {0:s} to {1:s}.'.format( - args.request_id, args.output_dir)) - paths = [] - for task in task_data: - if task['saved_paths']: - paths.extend(task['saved_paths']) - output_writer.copy_from_gcs(paths) - - except TurbiniaException as exception: - log.error(f'Failed to pull the data {exception!s}') else: log.warning(f'Command {args.command!s} not implemented.') diff --git a/turbinia/turbiniactl_test.py b/turbinia/turbiniactl_test.py index 399e5fa0f..608d0fe5b 100644 --- a/turbinia/turbiniactl_test.py +++ b/turbinia/turbiniactl_test.py @@ -316,7 +316,6 @@ def testUnequalCompresseddirectoryArgs(self, _): def testUnequalCloudDiskArgs(self, mockParser, mock_copyDisk, _): """Test unequal number of args for cloud disk evidence type.""" config.SHARED_FILESYSTEM = False - config.TASK_MANAGER = 'PSQ' config.CLOUD_PROVIDER = 'GCP' mockArgs = argparse.Namespace( all_fields=False, command='googleclouddisk', config_file=None, @@ -387,7 +386,7 @@ def testUnequalCloudDiskEmbeddedArgs(self, mock_copyDisk, _): """Test unequal number of args for cloud embedded disk evidence type.""" # Fail when zones don't match config.SHARED_FILESYSTEM = False - config.TASK_MANAGER = 'PSQ' + config.TASK_MANAGER = 'Celery' config.CLOUD_PROVIDER = 'GCP' self.assertRaises( TurbiniaException, turbiniactl.process_args, [ @@ -505,4 +504,4 @@ def testTurbiniaClientRequest(self, mockClient): test_request = mockClient.create_request() self.assertIsNotNone(test_request) test_default_recipe = recipe_helpers.DEFAULT_RECIPE - self.assertEqual(test_request.recipe, test_default_recipe) \ No newline at end of file + self.assertEqual(test_request.recipe, test_default_recipe) diff --git a/turbinia/worker.py b/turbinia/worker.py index 5b56a1356..f63e2835b 100644 --- a/turbinia/worker.py +++ b/turbinia/worker.py @@ -33,18 +33,12 @@ config.LoadConfig() task_manager_type = config.TASK_MANAGER.lower() -if task_manager_type == 'psq': - import psq - - from google.cloud import exceptions - from google.cloud import datastore - from google.cloud import pubsub -elif task_manager_type == 'celery': +if task_manager_type == 'celery': from turbinia import tcelery as turbinia_celery else: raise TurbiniaException( - 'Unknown task manager {0:s} found, please update config to use "psq" or ' - '"celery"'.format(task_manager_type)) + 'Unknown task manager {0:s} found, please update config to use "Celery"' + .format(task_manager_type)) log = logging.getLogger('turbinia') @@ -261,42 +255,3 @@ def start(self): '--without-mingle' ] self.worker.start(argv) - - -class TurbiniaPsqWorker(TurbiniaWorkerBase): - """Turbinia PSQ Worker class. - - Attributes: - worker (psq.Worker): PSQ Worker object - psq (psq.Queue): A Task queue object - - Raises: - TurbiniaException: When errors occur - """ - - def __init__(self, *args, **kwargs): - super(TurbiniaPsqWorker, self).__init__(*args, **kwargs) - self.worker = None - self.psq = None - - def _backend_setup(self): - psq_publisher = pubsub.PublisherClient() - psq_subscriber = pubsub.SubscriberClient() - datastore_client = datastore.Client(project=config.TURBINIA_PROJECT) - try: - self.psq = psq.Queue( - psq_publisher, psq_subscriber, config.TURBINIA_PROJECT, - name=config.PSQ_TOPIC, storage=psq.DatastoreStorage(datastore_client)) - except exceptions.GoogleCloudError as exception: - msg = f'Error creating PSQ Queue: {str(exception):s}' - log.error(msg) - raise TurbiniaException(msg) - log.info(f'Starting PSQ listener on queue {self.psq.name:s}') - self.worker = psq.Worker(queue=self.psq) - - def start(self): - """Start Turbinia PSQ Worker.""" - log.info('Running Turbinia PSQ Worker.') - self._monitoring_setup() - self._backend_setup() - self.worker.listen() diff --git a/turbinia/worker_test.py b/turbinia/worker_test.py index 32e7d1f74..b88b75036 100644 --- a/turbinia/worker_test.py +++ b/turbinia/worker_test.py @@ -24,7 +24,7 @@ import mock from turbinia import config -from turbinia.worker import TurbiniaPsqWorker +from turbinia.worker import TurbiniaCeleryWorker from turbinia.worker import check_system_dependencies from turbinia.worker import check_docker_dependencies from turbinia.jobs import manager @@ -32,8 +32,8 @@ from turbinia import TurbiniaException -class TestTurbiniaPsqWorker(unittest.TestCase): - """Test Turbinia PSQ Worker class.""" +class TestTurbiniaCeleryWorker(unittest.TestCase): + """Test Turbinia Celery Worker class.""" def setUp(self): self.tmp_dir = tempfile.mkdtemp(prefix='turbinia-test') @@ -50,47 +50,42 @@ def tearDown(self): if 'turbinia-test' in self.tmp_dir: shutil.rmtree(self.tmp_dir) - @mock.patch('google.cloud.datastore.Client') - @mock.patch('psq.Worker') + @mock.patch('turbinia.client.task_manager.CeleryTaskManager._backend_setup') @mock.patch('turbinia.lib.docker_manager.DockerManager') - def testTurbiniaPsqWorkerInit(self, _, __, ___): - """Basic test for PSQ worker.""" - worker = TurbiniaPsqWorker([], []) + def testTurbiniaCeleryWorkerInit(self, _, __): + """Basic test for Celery worker.""" + worker = TurbiniaCeleryWorker([], []) self.assertTrue(hasattr(worker, 'worker')) - @mock.patch('google.cloud.datastore.Client') - @mock.patch('psq.Worker') + @mock.patch('turbinia.client.task_manager.CeleryTaskManager._backend_setup') @mock.patch('turbinia.lib.docker_manager.DockerManager') - def testTurbiniaWorkerNoDir(self, _, __, ___): + def testTurbiniaWorkerNoDir(self, _, __): """Test that OUTPUT_DIR path is created.""" config.OUTPUT_DIR = os.path.join(self.tmp_dir, 'no_such_dir') - TurbiniaPsqWorker([], []) + TurbiniaCeleryWorker([], []) self.assertTrue(os.path.exists(config.OUTPUT_DIR)) - @mock.patch('google.cloud.datastore.Client') - @mock.patch('psq.Worker') + @mock.patch('turbinia.client.task_manager.CeleryTaskManager._backend_setup') @mock.patch('turbinia.lib.docker_manager.DockerManager') - def testTurbiniaWorkerIsNonDir(self, _, __, ___): + def testTurbiniaWorkerIsNonDir(self, _, __): """Test that OUTPUT_DIR does not point to an existing non-directory.""" config.OUTPUT_DIR = os.path.join(self.tmp_dir, 'empty_file') open(config.OUTPUT_DIR, 'a').close() - self.assertRaises(TurbiniaException, TurbiniaPsqWorker) + self.assertRaises(TurbiniaException, TurbiniaCeleryWorker) @mock.patch('turbinia.worker.config') @mock.patch('turbinia.worker.check_directory') - @mock.patch('google.cloud.datastore.Client') - @mock.patch('psq.Worker') + @mock.patch('turbinia.client.task_manager.CeleryTaskManager._backend_setup') @mock.patch('turbinia.lib.docker_manager.DockerManager') - def testTurbiniaWorkerJobsLists(self, _, __, ___, ____, mock_config): + def testTurbiniaWorkerJobsLists(self, _, __, ___, mock_config): """Test that worker job allowlist and denylists are setup correctly.""" - mock_config.PSQ_TOPIC = 'foo' manager.JobsManager._job_classes = {} manager.JobsManager.RegisterJob(manager_test.TestJob1) manager.JobsManager.RegisterJob(manager_test.TestJob2) manager.JobsManager.RegisterJob(manager_test.TestJob3) # Check denylist - TurbiniaPsqWorker(['testjob1'], []) + TurbiniaCeleryWorker(['testjob1'], []) self.assertListEqual( sorted(list(manager.JobsManager.GetJobNames())), ['testjob2', 'testjob3']) @@ -98,21 +93,21 @@ def testTurbiniaWorkerJobsLists(self, _, __, ___, ____, mock_config): # Check denylist with DISABLED_JOBS config mock_config.DISABLED_JOBS = ['testjob1'] - TurbiniaPsqWorker(['testjob2'], []) + TurbiniaCeleryWorker(['testjob2'], []) self.assertListEqual(list(manager.JobsManager.GetJobNames()), ['testjob3']) manager.JobsManager.RegisterJob(manager_test.TestJob1) manager.JobsManager.RegisterJob(manager_test.TestJob2) mock_config.DISABLED_JOBS = [''] # Check allowlist - TurbiniaPsqWorker([], ['testjob1']) + TurbiniaCeleryWorker([], ['testjob1']) self.assertListEqual(list(manager.JobsManager.GetJobNames()), ['testjob1']) manager.JobsManager.RegisterJob(manager_test.TestJob2) manager.JobsManager.RegisterJob(manager_test.TestJob3) # Check allowlist of item in DISABLED_JOBS config mock_config.DISABLED_JOBS = ['testjob1', 'testjob2'] - TurbiniaPsqWorker([], ['testjob1']) + TurbiniaCeleryWorker([], ['testjob1']) self.assertListEqual(list(manager.JobsManager.GetJobNames()), ['testjob1']) manager.JobsManager.RegisterJob(manager_test.TestJob2) manager.JobsManager.RegisterJob(manager_test.TestJob3)