diff --git a/conftest.py b/conftest.py
index 38d1c181..786f970e 100644
--- a/conftest.py
+++ b/conftest.py
@@ -1 +1,17 @@
-# empty file so that pyetst adds top-level directory
+from typing import Generator
+
+import numpy as np
+import pytest
+
+
+@pytest.fixture(scope="module")
+def rng() -> Generator[np.random.Generator, None, None]:
+ """
+ Create a new Random Number Generator for tests which require randomized data.
+
+ Yields:
+ Generator[np.random.Generator, None, None]: The generator used for creating randomized
+ numbers.
+ """
+ rng: np.random.Generator = np.random.default_rng(12345)
+ yield rng
diff --git a/poetry.lock b/poetry.lock
index 8c8d6807..8829ecc0 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,10 +1,9 @@
-# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
[[package]]
name = "aiofiles"
version = "22.1.0"
description = "File support for asyncio."
-category = "dev"
optional = false
python-versions = ">=3.7,<4.0"
files = [
@@ -16,7 +15,6 @@ files = [
name = "aiosqlite"
version = "0.19.0"
description = "asyncio bridge to the standard sqlite3 module"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -30,53 +28,51 @@ docs = ["sphinx (==6.1.3)", "sphinx-mdinclude (==0.5.3)"]
[[package]]
name = "alpineer"
-version = "0.1.7"
+version = "0.1.9"
description = "Toolbox for Multiplexed Imaging. Contains scripts and little tools which are used throughout ark-analysis, mibi-bin-tools, and toffy."
-category = "main"
optional = false
python-versions = ">=3.9,<4.0"
files = [
- {file = "alpineer-0.1.7-py3-none-any.whl", hash = "sha256:e266e28505501117a470442f5cd9ece0d68e1b05cdab1a4ff642e98664afc69b"},
- {file = "alpineer-0.1.7.tar.gz", hash = "sha256:8daec081c956d929f4e0d05874cf65b49e57d748070a214a063a0e901c079ed1"},
+ {file = "alpineer-0.1.9-py3-none-any.whl", hash = "sha256:915447d097a332dfb30fa3c6a9eb08ebcaeb75094934e856750ca0f7869d1555"},
+ {file = "alpineer-0.1.9.tar.gz", hash = "sha256:d1613f7ae2d993d13f8b46261c86e4904033ea2fadcb9a7051110a4157da7f8e"},
]
[package.dependencies]
charset-normalizer = ">=2.1.1,<3.0.0"
matplotlib = ">=3,<4"
natsort = ">=8,<9"
-numpy = ">=1.0.0,<2.0.0"
+numpy = "==1.*"
pillow = ">=9,<10"
-scikit-image = "<1.0.0"
+scikit-image = "==0.*"
tifffile = "*"
xarray = "*"
xmltodict = ">=0.13.0,<0.14.0"
[[package]]
name = "anyio"
-version = "3.6.2"
+version = "3.7.1"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
-category = "dev"
optional = false
-python-versions = ">=3.6.2"
+python-versions = ">=3.7"
files = [
- {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"},
- {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"},
+ {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"},
+ {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"},
]
[package.dependencies]
+exceptiongroup = {version = "*", markers = "python_version < \"3.11\""}
idna = ">=2.8"
sniffio = ">=1.1"
[package.extras]
-doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
-test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"]
-trio = ["trio (>=0.16,<0.22)"]
+doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"]
+test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
+trio = ["trio (<0.22)"]
[[package]]
name = "appnope"
version = "0.1.3"
description = "Disable App Nap on macOS >= 10.9"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -88,7 +84,6 @@ files = [
name = "argon2-cffi"
version = "21.3.0"
description = "The secure Argon2 password hashing algorithm."
-category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -108,7 +103,6 @@ tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"]
name = "argon2-cffi-bindings"
version = "21.2.0"
description = "Low-level CFFI bindings for Argon2"
-category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -146,7 +140,6 @@ tests = ["pytest"]
name = "arrow"
version = "1.2.3"
description = "Better dates & times for Python"
-category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -161,7 +154,6 @@ python-dateutil = ">=2.7.0"
name = "asttokens"
version = "2.2.1"
description = "Annotate AST trees with source code positions"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -179,7 +171,6 @@ test = ["astroid", "pytest"]
name = "attrs"
version = "23.1.0"
description = "Classes Without Boilerplate"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -198,7 +189,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte
name = "babel"
version = "2.12.1"
description = "Internationalization utilities"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -210,7 +200,6 @@ files = [
name = "backcall"
version = "0.2.0"
description = "Specifications for callback functions passed in to an API"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -222,7 +211,6 @@ files = [
name = "beautifulsoup4"
version = "4.12.2"
description = "Screen-scraping library"
-category = "dev"
optional = false
python-versions = ">=3.6.0"
files = [
@@ -241,7 +229,6 @@ lxml = ["lxml"]
name = "black"
version = "22.12.0"
description = "The uncompromising code formatter."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -277,7 +264,6 @@ uvloop = ["uvloop (>=0.15.2)"]
name = "bleach"
version = "6.0.0"
description = "An easy safelist-based HTML-sanitizing tool."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -296,7 +282,6 @@ css = ["tinycss2 (>=1.1.0,<1.2)"]
name = "certifi"
version = "2023.5.7"
description = "Python package for providing Mozilla's CA Bundle."
-category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -308,7 +293,6 @@ files = [
name = "cffi"
version = "1.15.1"
description = "Foreign Function Interface for Python calling C code."
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -385,7 +369,6 @@ pycparser = "*"
name = "charset-normalizer"
version = "2.1.1"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-category = "main"
optional = false
python-versions = ">=3.6.0"
files = [
@@ -400,7 +383,6 @@ unicode-backport = ["unicodedata2"]
name = "click"
version = "8.1.3"
description = "Composable command line interface toolkit"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -415,7 +397,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
name = "colorama"
version = "0.4.6"
description = "Cross-platform colored terminal text."
-category = "main"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
files = [
@@ -427,7 +408,6 @@ files = [
name = "comm"
version = "0.1.3"
description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc."
-category = "main"
optional = false
python-versions = ">=3.6"
files = [
@@ -445,84 +425,66 @@ typing = ["mypy (>=0.990)"]
[[package]]
name = "contourpy"
-version = "1.0.7"
+version = "1.1.0"
description = "Python library for calculating contours of 2D quadrilateral grids"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
- {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"},
- {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"},
- {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"},
- {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"},
- {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"},
- {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"},
- {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"},
- {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"},
- {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"},
- {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"},
- {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"},
- {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"},
- {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"},
- {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"},
- {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"},
- {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"},
- {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"},
- {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"},
- {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"},
- {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"},
- {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"},
- {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"},
- {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"},
- {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"},
- {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"},
- {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"},
- {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"},
- {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"},
- {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"},
- {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"},
- {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"},
- {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"},
- {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"},
- {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"},
- {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"},
- {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"},
- {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"},
- {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"},
- {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"},
- {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"},
- {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"},
- {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"},
- {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"},
- {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"},
- {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"},
- {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"},
- {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"},
+ {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"},
+ {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"},
+ {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"},
+ {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"},
+ {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"},
+ {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"},
+ {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"},
+ {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"},
+ {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"},
+ {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"},
+ {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"},
+ {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"},
+ {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"},
+ {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"},
+ {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"},
+ {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"},
+ {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"},
+ {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"},
+ {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"},
+ {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"},
+ {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"},
+ {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"},
+ {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"},
+ {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"},
+ {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"},
+ {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"},
+ {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"},
+ {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"},
+ {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"},
+ {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"},
+ {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"},
+ {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"},
+ {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"},
+ {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"},
+ {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"},
+ {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"},
+ {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"},
+ {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"},
+ {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"},
]
[package.dependencies]
numpy = ">=1.16"
[package.extras]
-bokeh = ["bokeh", "chromedriver", "selenium"]
+bokeh = ["bokeh", "selenium"]
docs = ["furo", "sphinx-copybutton"]
-mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"]
-test = ["Pillow", "matplotlib", "pytest"]
-test-no-images = ["pytest"]
+mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"]
+test = ["Pillow", "contourpy[test-no-images]", "matplotlib"]
+test-no-images = ["pytest", "pytest-cov", "wurlitzer"]
[[package]]
name = "coverage"
version = "6.5.0"
description = "Code coverage measurement for Python"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -588,7 +550,6 @@ toml = ["tomli"]
name = "coveralls"
version = "3.3.1"
description = "Show coverage stats online via coveralls.io"
-category = "dev"
optional = false
python-versions = ">= 3.5"
files = [
@@ -597,7 +558,7 @@ files = [
]
[package.dependencies]
-coverage = ">=4.1,<6.0.0 || >6.1,<6.1.1 || >6.1.1,<7.0"
+coverage = ">=4.1,<6.0.dev0 || >6.1,<6.1.1 || >6.1.1,<7.0"
docopt = ">=0.6.1"
requests = ">=1.0.0"
@@ -608,7 +569,6 @@ yaml = ["PyYAML (>=3.10)"]
name = "cycler"
version = "0.11.0"
description = "Composable style cycles"
-category = "main"
optional = false
python-versions = ">=3.6"
files = [
@@ -618,59 +578,19 @@ files = [
[[package]]
name = "cython"
-version = "0.29.34"
+version = "0.29.36"
description = "The Cython compiler for writing C extensions for the Python language."
-category = "main"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
files = [
- {file = "Cython-0.29.34-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:742544024ddb74314e2d597accdb747ed76bd126e61fcf49940a5b5be0a8f381"},
- {file = "Cython-0.29.34-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03daae07f8cbf797506446adae512c3dd86e7f27a62a541fa1ee254baf43e32c"},
- {file = "Cython-0.29.34-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5a8de3e793a576e40ca9b4f5518610cd416273c7dc5e254115656b6e4ec70663"},
- {file = "Cython-0.29.34-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:60969d38e6a456a67e7ef8ae20668eff54e32ba439d4068ccf2854a44275a30f"},
- {file = "Cython-0.29.34-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:21b88200620d80cfe193d199b259cdad2b9af56f916f0f7f474b5a3631ca0caa"},
- {file = "Cython-0.29.34-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:308c8f1e58bf5e6e8a1c4dcf8abbd2d13d0f9b1e582f4d9ae8b89857342d8bb5"},
- {file = "Cython-0.29.34-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:d8f822fb6ecd5d88c42136561f82960612421154fc5bf23c57103a367bb91356"},
- {file = "Cython-0.29.34-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56866323f1660cecb4d5ff3a1fba92a56b91b7cfae0a8253777aa4bdb3bdf9a8"},
- {file = "Cython-0.29.34-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e971db8aeb12e7c0697cefafe65eefcc33ff1224ae3d8c7f83346cbc42c6c270"},
- {file = "Cython-0.29.34-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4401270b0dc464c23671e2e9d52a60985f988318febaf51b047190e855bbe7d"},
- {file = "Cython-0.29.34-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:dce0a36d163c05ae8b21200059511217d79b47baf2b7b0f926e8367bd7a3cc24"},
- {file = "Cython-0.29.34-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dbd79221869ee9a6ccc4953b2c8838bb6ae08ab4d50ea4b60d7894f03739417b"},
- {file = "Cython-0.29.34-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0f4229df10bc4545ebbeaaf96ebb706011d8b333e54ed202beb03f2bee0a50e"},
- {file = "Cython-0.29.34-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fd1ea21f1cebf33ae288caa0f3e9b5563a709f4df8925d53bad99be693fc0d9b"},
- {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d7ef5f68f4c5baa93349ea54a352f8716d18bee9a37f3e93eff38a5d4e9b7262"},
- {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:459994d1de0f99bb18fad9f2325f760c4b392b1324aef37bcc1cd94922dfce41"},
- {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:1d6c809e2f9ce5950bbc52a1d2352ef3d4fc56186b64cb0d50c8c5a3c1d17661"},
- {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f674ceb5f722d364395f180fbac273072fc1a266aab924acc9cfd5afc645aae1"},
- {file = "Cython-0.29.34-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9489de5b2044dcdfd9d6ca8242a02d560137b3c41b1f5ae1c4f6707d66d6e44d"},
- {file = "Cython-0.29.34-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5c121dc185040f4333bfded68963b4529698e1b6d994da56be32c97a90c896b6"},
- {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:b6149f7cc5b31bccb158c5b968e5a8d374fdc629792e7b928a9b66e08b03fca5"},
- {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0ab3cbf3d62b0354631a45dc93cfcdf79098663b1c65a6033af4a452b52217a7"},
- {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:4a2723447d1334484681d5aede34184f2da66317891f94b80e693a2f96a8f1a7"},
- {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e40cf86aadc29ecd1cb6de67b0d9488705865deea4fc185c7ad56d7a6fc78703"},
- {file = "Cython-0.29.34-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8c3cd8bb8e880a3346f5685601004d96e0a2221e73edcaeea57ea848618b4ac6"},
- {file = "Cython-0.29.34-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0e9032cd650b0cb1d2c2ef2623f5714c14d14c28d7647d589c3eeed0baf7428e"},
- {file = "Cython-0.29.34-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bdb3285660e3068438791ace7dd7b1efd6b442a10b5c8d7a4f0c9d184d08c8ed"},
- {file = "Cython-0.29.34-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a8ad755f9364e720f10a36734a1c7a5ced5c679446718b589259261438a517c9"},
- {file = "Cython-0.29.34-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:7595d29eaee95633dd8060f50f0e54b27472d01587659557ebcfe39da3ea946b"},
- {file = "Cython-0.29.34-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e6ef7879668214d80ea3914c17e7d4e1ebf4242e0dd4dabe95ca5ccbe75589a5"},
- {file = "Cython-0.29.34-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ccb223b5f0fd95d8d27561efc0c14502c0945f1a32274835831efa5d5baddfc1"},
- {file = "Cython-0.29.34-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11b1b278b8edef215caaa5250ad65a10023bfa0b5a93c776552248fc6f60098d"},
- {file = "Cython-0.29.34-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:5718319a01489688fdd22ddebb8e2fcbbd60be5f30de4336ea7063c3ae29fbe5"},
- {file = "Cython-0.29.34-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:cfb2302ef617d647ee590a4c0a00ba3c2da05f301dcefe7721125565d2e51351"},
- {file = "Cython-0.29.34-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:67b850cf46b861bc27226d31e1d87c0e69869a02f8d3cc5d5bef549764029879"},
- {file = "Cython-0.29.34-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0963266dad685812c1dbb758fcd4de78290e3adc7db271c8664dcde27380b13e"},
- {file = "Cython-0.29.34-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7879992487d9060a61393eeefe00d299210256928dce44d887b6be313d342bac"},
- {file = "Cython-0.29.34-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:44733366f1604b0c327613b6918469284878d2f5084297d10d26072fc6948d51"},
- {file = "Cython-0.29.34-py2.py3-none-any.whl", hash = "sha256:be4f6b7be75a201c290c8611c0978549c60353890204573078e865423dbe3c83"},
- {file = "Cython-0.29.34.tar.gz", hash = "sha256:1909688f5d7b521a60c396d20bba9e47a1b2d2784bfb085401e1e1e7d29a29a8"},
+ {file = "Cython-0.29.36-py2.py3-none-any.whl", hash = "sha256:95bb13d8be507425d03ebe051f90d4b2a9fdccc64e4f30b35645fdb7542742eb"},
+ {file = "Cython-0.29.36.tar.gz", hash = "sha256:41c0cfd2d754e383c9eeb95effc9aa4ab847d0c9747077ddd7c0dcb68c3bc01f"},
]
[[package]]
name = "debugpy"
version = "1.6.7"
description = "An implementation of the Debug Adapter Protocol for Python"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -698,7 +618,6 @@ files = [
name = "decopatch"
version = "1.4.10"
description = "Create decorators easily in python."
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -713,7 +632,6 @@ makefun = ">=1.5.0"
name = "decorator"
version = "5.1.1"
description = "Decorators for Humans"
-category = "main"
optional = false
python-versions = ">=3.5"
files = [
@@ -725,7 +643,6 @@ files = [
name = "defusedxml"
version = "0.7.1"
description = "XML bomb protection for Python stdlib modules"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
@@ -737,7 +654,6 @@ files = [
name = "docopt"
version = "0.6.2"
description = "Pythonic argument parser, that will make you smile"
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -746,14 +662,13 @@ files = [
[[package]]
name = "exceptiongroup"
-version = "1.1.1"
+version = "1.1.2"
description = "Backport of PEP 654 (exception groups)"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"},
- {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"},
+ {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"},
+ {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"},
]
[package.extras]
@@ -763,7 +678,6 @@ test = ["pytest (>=6)"]
name = "executing"
version = "1.2.0"
description = "Get the currently executing AST node of a frame, and other information"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -776,14 +690,13 @@ tests = ["asttokens", "littleutils", "pytest", "rich"]
[[package]]
name = "fastjsonschema"
-version = "2.16.3"
+version = "2.17.1"
description = "Fastest Python implementation of JSON schema"
-category = "dev"
optional = false
python-versions = "*"
files = [
- {file = "fastjsonschema-2.16.3-py3-none-any.whl", hash = "sha256:04fbecc94300436f628517b05741b7ea009506ce8f946d40996567c669318490"},
- {file = "fastjsonschema-2.16.3.tar.gz", hash = "sha256:4a30d6315a68c253cfa8f963b9697246315aa3db89f98b97235e345dedfb0b8e"},
+ {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"},
+ {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"},
]
[package.extras]
@@ -791,14 +704,45 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc
[[package]]
name = "fonttools"
-version = "4.39.3"
+version = "4.40.0"
description = "Tools to manipulate font files"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
- {file = "fonttools-4.39.3-py3-none-any.whl", hash = "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb"},
- {file = "fonttools-4.39.3.zip", hash = "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7"},
+ {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b802dcbf9bcff74672f292b2466f6589ab8736ce4dcf36f48eb994c2847c4b30"},
+ {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f6e3fa3da923063c286320e728ba2270e49c73386e3a711aa680f4b0747d692"},
+ {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdf60f8a5c6bcce7d024a33f7e4bc7921f5b74e8ea13bccd204f2c8b86f3470"},
+ {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91784e21a1a085fac07c6a407564f4a77feb471b5954c9ee55a4f9165151f6c1"},
+ {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05171f3c546f64d78569f10adc0de72561882352cac39ec7439af12304d8d8c0"},
+ {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7449e5e306f3a930a8944c85d0cbc8429cba13503372a1a40f23124d6fb09b58"},
+ {file = "fonttools-4.40.0-cp310-cp310-win32.whl", hash = "sha256:bae8c13abbc2511e9a855d2142c0ab01178dd66b1a665798f357da0d06253e0d"},
+ {file = "fonttools-4.40.0-cp310-cp310-win_amd64.whl", hash = "sha256:425b74a608427499b0e45e433c34ddc350820b6f25b7c8761963a08145157a66"},
+ {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:00ab569b2a3e591e00425023ade87e8fef90380c1dde61be7691cb524ca5f743"},
+ {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:18ea64ac43e94c9e0c23d7a9475f1026be0e25b10dda8f236fc956188761df97"},
+ {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:022c4a16b412293e7f1ce21b8bab7a6f9d12c4ffdf171fdc67122baddb973069"},
+ {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530c5d35109f3e0cea2535742d6a3bc99c0786cf0cbd7bb2dc9212387f0d908c"},
+ {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5e00334c66f4e83535384cb5339526d01d02d77f142c23b2f97bd6a4f585497a"},
+ {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb52c10fda31159c22c7ed85074e05f8b97da8773ea461706c273e31bcbea836"},
+ {file = "fonttools-4.40.0-cp311-cp311-win32.whl", hash = "sha256:6a8d71b9a5c884c72741868e845c0e563c5d83dcaf10bb0ceeec3b4b2eb14c67"},
+ {file = "fonttools-4.40.0-cp311-cp311-win_amd64.whl", hash = "sha256:15abb3d055c1b2dff9ce376b6c3db10777cb74b37b52b78f61657634fd348a0d"},
+ {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14037c31138fbd21847ad5e5441dfdde003e0a8f3feb5812a1a21fd1c255ffbd"},
+ {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:94c915f6716589f78bc00fbc14c5b8de65cfd11ee335d32504f1ef234524cb24"},
+ {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37467cee0f32cada2ec08bc16c9c31f9b53ea54b2f5604bf25a1246b5f50593a"},
+ {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56d4d85f5374b45b08d2f928517d1e313ea71b4847240398decd0ab3ebbca885"},
+ {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8c4305b171b61040b1ee75d18f9baafe58bd3b798d1670078efe2c92436bfb63"},
+ {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a954b90d1473c85a22ecf305761d9fd89da93bbd31dae86e7dea436ad2cb5dc9"},
+ {file = "fonttools-4.40.0-cp38-cp38-win32.whl", hash = "sha256:1bc4c5b147be8dbc5df9cc8ac5e93ee914ad030fe2a201cc8f02f499db71011d"},
+ {file = "fonttools-4.40.0-cp38-cp38-win_amd64.whl", hash = "sha256:8a917828dbfdb1cbe50cf40eeae6fbf9c41aef9e535649ed8f4982b2ef65c091"},
+ {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:882983279bf39afe4e945109772c2ffad2be2c90983d6559af8b75c19845a80a"},
+ {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c55f1b4109dbc3aeb496677b3e636d55ef46dc078c2a5e3f3db4e90f1c6d2907"},
+ {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec468c022d09f1817c691cf884feb1030ef6f1e93e3ea6831b0d8144c06480d1"},
+ {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5adf4ba114f028fc3f5317a221fd8b0f4ef7a2e5524a2b1e0fd891b093791a"},
+ {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa83b3f151bc63970f39b2b42a06097c5a22fd7ed9f7ba008e618de4503d3895"},
+ {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97d95b8301b62bdece1af943b88bcb3680fd385f88346a4a899ee145913b414a"},
+ {file = "fonttools-4.40.0-cp39-cp39-win32.whl", hash = "sha256:1a003608400dd1cca3e089e8c94973c6b51a4fb1ef00ff6d7641617b9242e637"},
+ {file = "fonttools-4.40.0-cp39-cp39-win_amd64.whl", hash = "sha256:7961575221e3da0841c75da53833272c520000d76f7f71274dbf43370f8a1065"},
+ {file = "fonttools-4.40.0-py3-none-any.whl", hash = "sha256:200729d12461e2038700d31f0d49ad5a7b55855dec7525074979a06b46f88505"},
+ {file = "fonttools-4.40.0.tar.gz", hash = "sha256:337b6e83d7ee73c40ea62407f2ce03b07c3459e213b6f332b94a69923b9e1cb9"},
]
[package.extras]
@@ -819,7 +763,6 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
name = "fqdn"
version = "1.5.1"
description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4"
files = [
@@ -831,7 +774,6 @@ files = [
name = "idna"
version = "3.4"
description = "Internationalized Domain Names in Applications (IDNA)"
-category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -841,14 +783,13 @@ files = [
[[package]]
name = "imageio"
-version = "2.28.1"
+version = "2.31.1"
description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats."
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "imageio-2.28.1-py3-none-any.whl", hash = "sha256:b9b456146aab459e648cde633b81bf487eb45248948f79c033e55af3bf1e6d70"},
- {file = "imageio-2.28.1.tar.gz", hash = "sha256:5db5087be5c814ecf7e2c7d30a1a15c97eca97d8c26f31ddc54d767d4a43bce8"},
+ {file = "imageio-2.31.1-py3-none-any.whl", hash = "sha256:4106fb395ef7f8dc0262d6aa1bb03daba818445c381ca8b7d5dfc7a2089b04df"},
+ {file = "imageio-2.31.1.tar.gz", hash = "sha256:f8436a02af02fd63f272dab50f7d623547a38f0e04a4a73e2b02ae1b8b180f27"},
]
[package.dependencies]
@@ -873,14 +814,13 @@ tifffile = ["tifffile"]
[[package]]
name = "importlib-metadata"
-version = "6.6.0"
+version = "6.7.0"
description = "Read metadata from Python packages"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"},
- {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"},
+ {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"},
+ {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"},
]
[package.dependencies]
@@ -889,13 +829,12 @@ zipp = ">=0.5"
[package.extras]
docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
perf = ["ipython"]
-testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"]
+testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"]
[[package]]
name = "importlib-resources"
version = "5.12.0"
description = "Read resources from Python packages"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -914,7 +853,6 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec
name = "iniconfig"
version = "2.0.0"
description = "brain-dead simple config-ini parsing"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -924,14 +862,13 @@ files = [
[[package]]
name = "ipykernel"
-version = "6.23.0"
+version = "6.24.0"
description = "IPython Kernel for Jupyter"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
- {file = "ipykernel-6.23.0-py3-none-any.whl", hash = "sha256:fc886f1dcdc0ec17f277e4d21fd071c857d381adcb04f3f3735d25325ca323c6"},
- {file = "ipykernel-6.23.0.tar.gz", hash = "sha256:bd6f487d9e2744c84f6e667d46462d7647a4c862e70e08282f05a52b9d4b705f"},
+ {file = "ipykernel-6.24.0-py3-none-any.whl", hash = "sha256:2f5fffc7ad8f1fd5aadb4e171ba9129d9668dbafa374732cf9511ada52d6547f"},
+ {file = "ipykernel-6.24.0.tar.gz", hash = "sha256:29cea0a716b1176d002a61d0b0c851f34536495bc4ef7dd0222c88b41b816123"},
]
[package.dependencies]
@@ -940,7 +877,7 @@ comm = ">=0.1.1"
debugpy = ">=1.6.5"
ipython = ">=7.23.1"
jupyter-client = ">=6.1.12"
-jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
matplotlib-inline = ">=0.1"
nest-asyncio = "*"
packaging = "*"
@@ -958,14 +895,13 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio"
[[package]]
name = "ipython"
-version = "8.13.2"
+version = "8.14.0"
description = "IPython: Productive Interactive Computing"
-category = "main"
optional = false
python-versions = ">=3.9"
files = [
- {file = "ipython-8.13.2-py3-none-any.whl", hash = "sha256:ffca270240fbd21b06b2974e14a86494d6d29290184e788275f55e0b55914926"},
- {file = "ipython-8.13.2.tar.gz", hash = "sha256:7dff3fad32b97f6488e02f87b970f309d082f758d7b7fc252e3b19ee0e432dbb"},
+ {file = "ipython-8.14.0-py3-none-any.whl", hash = "sha256:248aca623f5c99a6635bc3857677b7320b9b8039f99f070ee0d20a5ca5a8e6bf"},
+ {file = "ipython-8.14.0.tar.gz", hash = "sha256:1d197b907b6ba441b692c48cf2a3a2de280dc0ac91a3405b39349a50272ca0a1"},
]
[package.dependencies]
@@ -1000,7 +936,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa
name = "ipython-genutils"
version = "0.2.0"
description = "Vestigial utilities from IPython"
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1010,14 +945,13 @@ files = [
[[package]]
name = "ipywidgets"
-version = "8.0.6"
+version = "8.0.7"
description = "Jupyter interactive widgets"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "ipywidgets-8.0.6-py3-none-any.whl", hash = "sha256:a60bf8d2528997e05ac83fd19ea2fbe65f2e79fbe1b2b35779bdfc46c2941dcc"},
- {file = "ipywidgets-8.0.6.tar.gz", hash = "sha256:de7d779f2045d60de9f6c25f653fdae2dba57898e6a1284494b3ba20b6893bb8"},
+ {file = "ipywidgets-8.0.7-py3-none-any.whl", hash = "sha256:e0aed0c95a1e55b6a123f64305245578bdc09e52965a34941c2b6a578b8c64a0"},
+ {file = "ipywidgets-8.0.7.tar.gz", hash = "sha256:50ace0a8886e9a0d68b980db82f94c25d55d21ff2340ed36f802dd9365e94acf"},
]
[package.dependencies]
@@ -1034,7 +968,6 @@ test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"]
name = "isoduration"
version = "20.11.0"
description = "Operations with ISO 8601 durations"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1049,7 +982,6 @@ arrow = ">=0.15.0"
name = "isort"
version = "5.12.0"
description = "A Python utility / library to sort Python imports."
-category = "dev"
optional = false
python-versions = ">=3.8.0"
files = [
@@ -1067,7 +999,6 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"]
name = "jedi"
version = "0.18.2"
description = "An autocompletion tool for Python that can be used for text editors."
-category = "main"
optional = false
python-versions = ">=3.6"
files = [
@@ -1087,7 +1018,6 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
name = "jinja2"
version = "3.1.2"
description = "A very fast and expressive template engine."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1103,26 +1033,24 @@ i18n = ["Babel (>=2.7)"]
[[package]]
name = "joblib"
-version = "1.2.0"
+version = "1.3.1"
description = "Lightweight pipelining with Python functions"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"},
- {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"},
+ {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"},
+ {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"},
]
[[package]]
name = "json5"
-version = "0.9.11"
+version = "0.9.14"
description = "A Python implementation of the JSON5 data format."
-category = "dev"
optional = false
python-versions = "*"
files = [
- {file = "json5-0.9.11-py2.py3-none-any.whl", hash = "sha256:1aa54b80b5e507dfe31d12b7743a642e2ffa6f70bf73b8e3d7d1d5fba83d99bd"},
- {file = "json5-0.9.11.tar.gz", hash = "sha256:4f1e196acc55b83985a51318489f345963c7ba84aa37607e49073066c562e99b"},
+ {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"},
+ {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"},
]
[package.extras]
@@ -1130,21 +1058,19 @@ dev = ["hypothesis"]
[[package]]
name = "jsonpointer"
-version = "2.3"
+version = "2.4"
description = "Identify specific nodes in a JSON document (RFC 6901)"
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*"
files = [
- {file = "jsonpointer-2.3-py2.py3-none-any.whl", hash = "sha256:51801e558539b4e9cd268638c078c6c5746c9ac96bc38152d443400e4f3793e9"},
- {file = "jsonpointer-2.3.tar.gz", hash = "sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a"},
+ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"},
+ {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"},
]
[[package]]
name = "jsonschema"
version = "4.17.3"
description = "An implementation of JSON Schema validation for Python"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1170,19 +1096,18 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-
[[package]]
name = "jupyter-client"
-version = "8.2.0"
+version = "8.3.0"
description = "Jupyter protocol implementation and client libraries"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
- {file = "jupyter_client-8.2.0-py3-none-any.whl", hash = "sha256:b18219aa695d39e2ad570533e0d71fb7881d35a873051054a84ee2a17c4b7389"},
- {file = "jupyter_client-8.2.0.tar.gz", hash = "sha256:9fe233834edd0e6c0aa5f05ca2ab4bdea1842bfd2d8a932878212fc5301ddaf0"},
+ {file = "jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"},
+ {file = "jupyter_client-8.3.0.tar.gz", hash = "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f"},
]
[package.dependencies]
importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""}
-jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
python-dateutil = ">=2.8.2"
pyzmq = ">=23.0"
tornado = ">=6.2"
@@ -1196,7 +1121,6 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt
name = "jupyter-contrib-core"
version = "0.4.2"
description = "Common utilities for jupyter-contrib projects."
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1217,7 +1141,6 @@ testing-utils = ["mock", "nose"]
name = "jupyter-contrib-nbextensions"
version = "0.7.0"
description = "A collection of Jupyter nbextensions."
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1241,14 +1164,13 @@ test = ["mock", "nbformat", "nose", "pip", "requests"]
[[package]]
name = "jupyter-core"
-version = "5.3.0"
+version = "5.3.1"
description = "Jupyter core package. A base package on which Jupyter projects rely."
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
- {file = "jupyter_core-5.3.0-py3-none-any.whl", hash = "sha256:d4201af84559bc8c70cead287e1ab94aeef3c512848dde077b7684b54d67730d"},
- {file = "jupyter_core-5.3.0.tar.gz", hash = "sha256:6db75be0c83edbf1b7c9f91ec266a9a24ef945da630f3120e1a0046dc13713fc"},
+ {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"},
+ {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"},
]
[package.dependencies]
@@ -1264,7 +1186,6 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"]
name = "jupyter-events"
version = "0.6.3"
description = "Jupyter Event System library"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1289,7 +1210,6 @@ test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=
name = "jupyter-highlight-selected-word"
version = "0.2.0"
description = "Jupyter notebook extension that enables highlighting every instance of the current word in the notebook."
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1301,7 +1221,6 @@ files = [
name = "jupyter-nbextensions-configurator"
version = "0.6.3"
description = "jupyter serverextension providing configuration interfaces for nbextensions."
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1321,14 +1240,13 @@ test = ["jupyter-contrib-core[testing-utils]", "mock", "nose", "requests", "sele
[[package]]
name = "jupyter-server"
-version = "2.5.0"
+version = "2.7.0"
description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications."
-category = "dev"
optional = false
python-versions = ">=3.8"
files = [
- {file = "jupyter_server-2.5.0-py3-none-any.whl", hash = "sha256:e6bc1e9e96d7c55b9ce9699ff6cb9a910581fe7349e27c40389acb67632e24c0"},
- {file = "jupyter_server-2.5.0.tar.gz", hash = "sha256:9fde612791f716fd34d610cd939704a9639643744751ba66e7ee8fdc9cead07e"},
+ {file = "jupyter_server-2.7.0-py3-none-any.whl", hash = "sha256:6a77912aff643e53fa14bdb2634884b52b784a4be77ce8e93f7283faed0f0849"},
+ {file = "jupyter_server-2.7.0.tar.gz", hash = "sha256:36da0a266d31a41ac335a366c88933c17dfa5bb817a48f5c02c16d303bc9477f"},
]
[package.dependencies]
@@ -1336,11 +1254,12 @@ anyio = ">=3.1.0"
argon2-cffi = "*"
jinja2 = "*"
jupyter-client = ">=7.4.4"
-jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
-jupyter-events = ">=0.4.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+jupyter-events = ">=0.6.0"
jupyter-server-terminals = "*"
nbconvert = ">=6.4.4"
nbformat = ">=5.3.0"
+overrides = "*"
packaging = "*"
prometheus-client = "*"
pywinpty = {version = "*", markers = "os_name == \"nt\""}
@@ -1352,14 +1271,13 @@ traitlets = ">=5.6.0"
websocket-client = "*"
[package.extras]
-docs = ["docutils (<0.20)", "ipykernel", "jinja2", "jupyter-client", "jupyter-server", "mistune (<1.0.0)", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"]
-test = ["ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"]
+docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"]
+test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"]
[[package]]
name = "jupyter-server-fileid"
version = "0.9.0"
description = ""
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1379,7 +1297,6 @@ test = ["jupyter-server[test] (>=1.15,<3)", "pytest", "pytest-cov"]
name = "jupyter-server-terminals"
version = "0.4.4"
description = "A Jupyter Server Extension Providing Terminals."
-category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1399,7 +1316,6 @@ test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov",
name = "jupyter-server-ydoc"
version = "0.8.0"
description = "A Jupyter Server Extension Providing Y Documents."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1419,7 +1335,6 @@ test = ["coverage", "jupyter-server[test] (>=2.0.0a0)", "pytest (>=7.0)", "pytes
name = "jupyter-ydoc"
version = "0.2.4"
description = "Document structures for collaborative editing using Ypy"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1437,14 +1352,13 @@ test = ["pre-commit", "pytest", "pytest-asyncio", "websockets (>=10.0)", "ypy-we
[[package]]
name = "jupyterlab"
-version = "3.6.3"
+version = "3.6.5"
description = "JupyterLab computational environment"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "jupyterlab-3.6.3-py3-none-any.whl", hash = "sha256:6aba0caa771697d02fbf409f9767b2fdb4ee32ce935940e3b9a0d5d48d994d0f"},
- {file = "jupyterlab-3.6.3.tar.gz", hash = "sha256:373e9cfb8a72edd294be14f16662563a220cecf0fb26de7aab1af9a29b689b82"},
+ {file = "jupyterlab-3.6.5-py3-none-any.whl", hash = "sha256:4d13665c2c2f42c753140d88b52ff8722cd5b38629b934f5612bfa5490bcdc65"},
+ {file = "jupyterlab-3.6.5.tar.gz", hash = "sha256:ac0cb19756be1d1e14b2be1f23c603de46e0f0113960fce9888889ca55ae8923"},
]
[package.dependencies]
@@ -1453,7 +1367,7 @@ jinja2 = ">=2.1"
jupyter-core = "*"
jupyter-server = ">=1.16.0,<3"
jupyter-server-ydoc = ">=0.8.0,<0.9.0"
-jupyter-ydoc = ">=0.2.3,<0.3.0"
+jupyter-ydoc = ">=0.2.4,<0.3.0"
jupyterlab-server = ">=2.19,<3.0"
nbclassic = "*"
notebook = "<7"
@@ -1468,7 +1382,6 @@ test = ["check-manifest", "coverage", "jupyterlab-server[test]", "pre-commit", "
name = "jupyterlab-pygments"
version = "0.2.2"
description = "Pygments theme using JupyterLab CSS variables"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1478,14 +1391,13 @@ files = [
[[package]]
name = "jupyterlab-server"
-version = "2.22.1"
+version = "2.23.0"
description = "A set of server components for JupyterLab and JupyterLab like applications."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "jupyterlab_server-2.22.1-py3-none-any.whl", hash = "sha256:1c8eb55c7cd70a50a51fef42a7b4e26ef2f7fc48728f0290604bd89b1dd156e6"},
- {file = "jupyterlab_server-2.22.1.tar.gz", hash = "sha256:dfaaf898af84b9d01ae9583b813f378b96ee90c3a66f24c5186ea5d1bbdb2089"},
+ {file = "jupyterlab_server-2.23.0-py3-none-any.whl", hash = "sha256:a5ea2c839336a8ba7c38c8e7b2f24cedf919f0d439f4d2e606d9322013a95788"},
+ {file = "jupyterlab_server-2.23.0.tar.gz", hash = "sha256:83c01aa4ad9451cd61b383e634d939ff713850f4640c0056b2cdb2b6211a74c7"},
]
[package.dependencies]
@@ -1499,27 +1411,25 @@ packaging = ">=21.3"
requests = ">=2.28"
[package.extras]
-docs = ["autodoc-traits", "docutils (<0.20)", "jinja2 (<3.2.0)", "mistune (<3)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi"]
+docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"]
openapi = ["openapi-core (>=0.16.1,<0.17.0)", "ruamel-yaml"]
test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.6.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"]
[[package]]
name = "jupyterlab-widgets"
-version = "3.0.7"
+version = "3.0.8"
description = "Jupyter interactive widgets for JupyterLab"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "jupyterlab_widgets-3.0.7-py3-none-any.whl", hash = "sha256:c73f8370338ec19f1bec47254752d6505b03601cbd5a67e6a0b184532f73a459"},
- {file = "jupyterlab_widgets-3.0.7.tar.gz", hash = "sha256:c3a50ed5bf528a0c7a869096503af54702f86dda1db469aee1c92dc0c01b43ca"},
+ {file = "jupyterlab_widgets-3.0.8-py3-none-any.whl", hash = "sha256:4715912d6ceab839c9db35953c764b3214ebbc9161c809f6e0510168845dfdf5"},
+ {file = "jupyterlab_widgets-3.0.8.tar.gz", hash = "sha256:d428ab97b8d87cc7c54cbf37644d6e0f0e662f23876e05fa460a73ec3257252a"},
]
[[package]]
name = "kiwisolver"
version = "1.4.4"
description = "A fast implementation of the Cassowary constraint solver"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -1595,118 +1505,137 @@ files = [
[[package]]
name = "lazy-loader"
-version = "0.2"
+version = "0.3"
description = "lazy_loader"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "lazy_loader-0.2-py3-none-any.whl", hash = "sha256:c35875f815c340f823ce3271ed645045397213f961b40ad0c0d395c3f5218eeb"},
- {file = "lazy_loader-0.2.tar.gz", hash = "sha256:0edc7a5175c400acb108f283749951fefdadedeb00adcec6e88b974a9254f18a"},
+ {file = "lazy_loader-0.3-py3-none-any.whl", hash = "sha256:1e9e76ee8631e264c62ce10006718e80b2cfc74340d17d1031e0f84af7478554"},
+ {file = "lazy_loader-0.3.tar.gz", hash = "sha256:3b68898e34f5b2a29daaaac172c6555512d0f32074f147e2254e4a6d9d838f37"},
]
[package.extras]
-lint = ["pre-commit (>=3.1)"]
-test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
+lint = ["pre-commit (>=3.3)"]
+test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"]
+
+[[package]]
+name = "loguru"
+version = "0.7.0"
+description = "Python logging made (stupidly) simple"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"},
+ {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"},
+]
+
+[package.dependencies]
+colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""}
+win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""}
+
+[package.extras]
+dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"]
[[package]]
name = "lxml"
-version = "4.9.2"
+version = "4.9.3"
description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*"
files = [
- {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"},
- {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"},
- {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"},
- {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"},
- {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"},
- {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"},
- {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"},
- {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"},
- {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"},
- {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"},
- {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"},
- {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"},
- {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"},
- {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"},
- {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"},
- {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"},
- {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"},
- {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"},
- {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"},
- {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"},
- {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"},
- {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"},
- {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"},
- {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"},
- {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"},
- {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"},
- {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"},
- {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"},
- {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"},
- {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"},
- {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"},
- {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"},
- {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"},
- {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"},
- {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"},
- {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"},
- {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"},
- {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"},
- {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"},
- {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"},
- {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"},
- {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"},
- {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"},
- {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"},
- {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"},
- {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"},
- {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"},
- {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"},
- {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"},
- {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"},
- {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"},
- {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"},
- {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"},
- {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"},
- {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"},
- {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"},
- {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"},
- {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"},
- {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"},
- {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"},
- {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"},
+ {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"},
+ {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"},
+ {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"},
+ {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"},
+ {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"},
+ {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"},
+ {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"},
+ {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"},
+ {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"},
+ {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"},
+ {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"},
+ {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"},
+ {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"},
+ {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"},
+ {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"},
+ {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"},
+ {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"},
+ {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"},
+ {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"},
+ {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"},
+ {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"},
+ {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"},
+ {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"},
+ {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"},
+ {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"},
+ {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"},
+ {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"},
+ {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"},
+ {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"},
+ {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"},
+ {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"},
+ {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"},
+ {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"},
+ {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"},
+ {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"},
+ {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"},
+ {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"},
+ {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"},
+ {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"},
+ {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"},
+ {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"},
+ {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"},
+ {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"},
+ {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"},
+ {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"},
+ {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"},
+ {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"},
+ {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"},
+ {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"},
+ {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"},
+ {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"},
+ {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"},
+ {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"},
+ {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"},
+ {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"},
+ {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"},
+ {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"},
+ {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"},
+ {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"},
+ {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"},
+ {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"},
+ {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"},
+ {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"},
+ {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"},
+ {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"},
+ {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"},
+ {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"},
+ {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"},
+ {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"},
+ {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"},
+ {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"},
+ {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"},
+ {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"},
+ {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"},
+ {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"},
+ {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"},
+ {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"},
+ {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"},
+ {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"},
+ {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"},
+ {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"},
]
[package.extras]
cssselect = ["cssselect (>=0.7)"]
html5 = ["html5lib"]
htmlsoup = ["BeautifulSoup4"]
-source = ["Cython (>=0.29.7)"]
+source = ["Cython (>=0.29.35)"]
[[package]]
name = "makefun"
version = "1.15.1"
description = "Small library to dynamically create python functions."
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1716,69 +1645,67 @@ files = [
[[package]]
name = "markupsafe"
-version = "2.1.2"
+version = "2.1.3"
description = "Safely add untrusted strings to HTML/XML markup."
-category = "dev"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"},
- {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"},
- {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"},
- {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"},
- {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"},
- {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"},
- {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"},
- {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"},
- {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"},
- {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"},
- {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"},
- {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"},
- {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"},
- {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"},
- {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"},
- {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"},
- {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"},
- {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"},
- {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"},
- {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"},
- {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"},
- {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"},
- {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"},
+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-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"},
]
[[package]]
name = "matplotlib"
version = "3.7.1"
description = "Python plotting package"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
@@ -1841,7 +1768,6 @@ python-dateutil = ">=2.7"
name = "matplotlib-inline"
version = "0.1.6"
description = "Inline Matplotlib backend for Jupyter"
-category = "main"
optional = false
python-versions = ">=3.5"
files = [
@@ -1856,7 +1782,6 @@ traitlets = "*"
name = "mibi-bin-tools"
version = "0.2.9"
description = "Source for extracting .bin files from the commercial MIBI."
-category = "main"
optional = false
python-versions = ">=3.9"
files = [
@@ -1897,21 +1822,19 @@ test = ["coveralls[toml]", "pytest", "pytest-cases", "pytest-cov", "pytest-mock"
[[package]]
name = "mistune"
-version = "2.0.5"
-description = "A sane Markdown parser with useful plugins and renderers"
-category = "dev"
+version = "3.0.1"
+description = "A sane and fast Markdown parser with useful plugins and renderers"
optional = false
-python-versions = "*"
+python-versions = ">=3.7"
files = [
- {file = "mistune-2.0.5-py2.py3-none-any.whl", hash = "sha256:bad7f5d431886fcbaf5f758118ecff70d31f75231b34024a1341120340a65ce8"},
- {file = "mistune-2.0.5.tar.gz", hash = "sha256:0246113cb2492db875c6be56974a7c893333bf26cd92891c85f63151cee09d34"},
+ {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"},
+ {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"},
]
[[package]]
name = "mock"
version = "5.0.2"
description = "Rolling backport of unittest.mock for all Pythons"
-category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -1928,7 +1851,6 @@ test = ["pytest", "pytest-cov"]
name = "mypy-extensions"
version = "1.0.0"
description = "Type system extensions for programs checked with the mypy type checker."
-category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -1938,14 +1860,13 @@ files = [
[[package]]
name = "natsort"
-version = "8.3.1"
+version = "8.4.0"
description = "Simple yet flexible natural sorting in Python."
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "natsort-8.3.1-py3-none-any.whl", hash = "sha256:d583bc9050dd10538de36297c960b93f873f0cd01671a3c50df5bd86dd391dcb"},
- {file = "natsort-8.3.1.tar.gz", hash = "sha256:517595492dde570a4fd6b6a76f644440c1ba51e2338c8a671d7f0475fda8f9fd"},
+ {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"},
+ {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"},
]
[package.extras]
@@ -1956,7 +1877,6 @@ icu = ["PyICU (>=1.0.0)"]
name = "nbclassic"
version = "1.0.0"
description = "Jupyter Notebook as a Jupyter Server extension."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1990,56 +1910,54 @@ test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-jupyter", "pytest-p
[[package]]
name = "nbclient"
-version = "0.7.4"
+version = "0.8.0"
description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor."
-category = "dev"
optional = false
-python-versions = ">=3.7.0"
+python-versions = ">=3.8.0"
files = [
- {file = "nbclient-0.7.4-py3-none-any.whl", hash = "sha256:c817c0768c5ff0d60e468e017613e6eae27b6fa31e43f905addd2d24df60c125"},
- {file = "nbclient-0.7.4.tar.gz", hash = "sha256:d447f0e5a4cfe79d462459aec1b3dc5c2e9152597262be8ee27f7d4c02566a0d"},
+ {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"},
+ {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"},
]
[package.dependencies]
jupyter-client = ">=6.1.12"
-jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
nbformat = ">=5.1"
-traitlets = ">=5.3"
+traitlets = ">=5.4"
[package.extras]
dev = ["pre-commit"]
docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"]
-test = ["flaky", "ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"]
+test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"]
[[package]]
name = "nbconvert"
-version = "7.4.0"
+version = "7.6.0"
description = "Converting Jupyter Notebooks"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "nbconvert-7.4.0-py3-none-any.whl", hash = "sha256:af5064a9db524f9f12f4e8be7f0799524bd5b14c1adea37e34e83c95127cc818"},
- {file = "nbconvert-7.4.0.tar.gz", hash = "sha256:51b6c77b507b177b73f6729dba15676e42c4e92bcb00edc8cc982ee72e7d89d7"},
+ {file = "nbconvert-7.6.0-py3-none-any.whl", hash = "sha256:5a445c6794b0791984bc5436608fe2c066cb43c83920c7bc91bde3b765e9a264"},
+ {file = "nbconvert-7.6.0.tar.gz", hash = "sha256:24fcf27efdef2b51d7f090cc5ce5a9b178766a55be513c4ebab08c91899ab550"},
]
[package.dependencies]
beautifulsoup4 = "*"
-bleach = "*"
+bleach = "!=5.0.0"
defusedxml = "*"
importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""}
jinja2 = ">=3.0"
jupyter-core = ">=4.7"
jupyterlab-pygments = "*"
markupsafe = ">=2.0"
-mistune = ">=2.0.3,<3"
+mistune = ">=2.0.3,<4"
nbclient = ">=0.5.0"
-nbformat = ">=5.1"
+nbformat = ">=5.7"
packaging = "*"
pandocfilters = ">=1.4.1"
pygments = ">=2.4.1"
tinycss2 = "*"
-traitlets = ">=5.0"
+traitlets = ">=5.1"
[package.extras]
all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"]
@@ -2052,14 +1970,13 @@ webpdf = ["pyppeteer (>=1,<1.1)"]
[[package]]
name = "nbformat"
-version = "5.8.0"
+version = "5.9.0"
description = "The Jupyter Notebook format"
-category = "dev"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "nbformat-5.8.0-py3-none-any.whl", hash = "sha256:d910082bd3e0bffcf07eabf3683ed7dda0727a326c446eeb2922abe102e65162"},
- {file = "nbformat-5.8.0.tar.gz", hash = "sha256:46dac64c781f1c34dfd8acba16547024110348f9fc7eab0f31981c2a3dc48d1f"},
+ {file = "nbformat-5.9.0-py3-none-any.whl", hash = "sha256:8c8fa16d6d05062c26177754bfbfac22de644888e2ef69d27ad2a334cf2576e5"},
+ {file = "nbformat-5.9.0.tar.gz", hash = "sha256:e98ebb6120c3efbafdee2a40af2a140cadee90bb06dd69a2a63d9551fcc7f976"},
]
[package.dependencies]
@@ -2076,7 +1993,6 @@ test = ["pep440", "pre-commit", "pytest", "testpath"]
name = "nest-asyncio"
version = "1.5.6"
description = "Patch asyncio to allow nested event loops"
-category = "main"
optional = false
python-versions = ">=3.5"
files = [
@@ -2088,7 +2004,6 @@ files = [
name = "networkx"
version = "3.1"
description = "Python package for creating and manipulating graphs and networks"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
@@ -2107,7 +2022,6 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"]
name = "notebook"
version = "6.5.4"
description = "A web-based notebook environment for interactive computing"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2142,7 +2056,6 @@ test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixs
name = "notebook-shim"
version = "0.2.3"
description = "A shim layer for notebook traits and config"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2158,47 +2071,53 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"
[[package]]
name = "numpy"
-version = "1.24.3"
+version = "1.25.0"
description = "Fundamental package for array computing in Python"
-category = "main"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"},
- {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"},
- {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"},
- {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"},
- {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"},
- {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"},
- {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"},
- {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"},
- {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"},
- {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"},
- {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"},
- {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"},
- {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"},
- {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"},
- {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"},
- {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"},
- {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"},
- {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"},
- {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"},
- {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"},
- {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"},
- {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"},
- {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"},
- {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"},
- {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"},
- {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"},
- {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"},
- {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"},
+ {file = "numpy-1.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8aa130c3042052d656751df5e81f6d61edff3e289b5994edcf77f54118a8d9f4"},
+ {file = "numpy-1.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e3f2b96e3b63c978bc29daaa3700c028fe3f049ea3031b58aa33fe2a5809d24"},
+ {file = "numpy-1.25.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6b267f349a99d3908b56645eebf340cb58f01bd1e773b4eea1a905b3f0e4208"},
+ {file = "numpy-1.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4aedd08f15d3045a4e9c648f1e04daca2ab1044256959f1f95aafeeb3d794c16"},
+ {file = "numpy-1.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d183b5c58513f74225c376643234c369468e02947b47942eacbb23c1671f25d"},
+ {file = "numpy-1.25.0-cp310-cp310-win32.whl", hash = "sha256:d76a84998c51b8b68b40448ddd02bd1081bb33abcdc28beee6cd284fe11036c6"},
+ {file = "numpy-1.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0dc071017bc00abb7d7201bac06fa80333c6314477b3d10b52b58fa6a6e38f6"},
+ {file = "numpy-1.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c69fe5f05eea336b7a740e114dec995e2f927003c30702d896892403df6dbf0"},
+ {file = "numpy-1.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c7211d7920b97aeca7b3773a6783492b5b93baba39e7c36054f6e749fc7490c"},
+ {file = "numpy-1.25.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc68f11404930e9c7ecfc937aa423e1e50158317bf67ca91736a9864eae0232"},
+ {file = "numpy-1.25.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e559c6afbca484072a98a51b6fa466aae785cfe89b69e8b856c3191bc8872a82"},
+ {file = "numpy-1.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6c284907e37f5e04d2412950960894b143a648dea3f79290757eb878b91acbd1"},
+ {file = "numpy-1.25.0-cp311-cp311-win32.whl", hash = "sha256:95367ccd88c07af21b379be1725b5322362bb83679d36691f124a16357390153"},
+ {file = "numpy-1.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:b76aa836a952059d70a2788a2d98cb2a533ccd46222558b6970348939e55fc24"},
+ {file = "numpy-1.25.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b792164e539d99d93e4e5e09ae10f8cbe5466de7d759fc155e075237e0c274e4"},
+ {file = "numpy-1.25.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7cd981ccc0afe49b9883f14761bb57c964df71124dcd155b0cba2b591f0d64b9"},
+ {file = "numpy-1.25.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa48bebfb41f93043a796128854b84407d4df730d3fb6e5dc36402f5cd594c0"},
+ {file = "numpy-1.25.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5177310ac2e63d6603f659fadc1e7bab33dd5a8db4e0596df34214eeab0fee3b"},
+ {file = "numpy-1.25.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0ac6edfb35d2a99aaf102b509c8e9319c499ebd4978df4971b94419a116d0790"},
+ {file = "numpy-1.25.0-cp39-cp39-win32.whl", hash = "sha256:7412125b4f18aeddca2ecd7219ea2d2708f697943e6f624be41aa5f8a9852cc4"},
+ {file = "numpy-1.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:26815c6c8498dc49d81faa76d61078c4f9f0859ce7817919021b9eba72b425e3"},
+ {file = "numpy-1.25.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b1b90860bf7d8a8c313b372d4f27343a54f415b20fb69dd601b7efe1029c91e"},
+ {file = "numpy-1.25.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cdae87d8c136fd4da4dad1e48064d700f63e923d5af6c8c782ac0df8044542"},
+ {file = "numpy-1.25.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cc3fda2b36482891db1060f00f881c77f9423eead4c3579629940a3e12095fe8"},
+ {file = "numpy-1.25.0.tar.gz", hash = "sha256:f1accae9a28dc3cda46a91de86acf69de0d1b5f4edd44a9b0c3ceb8036dfff19"},
+]
+
+[[package]]
+name = "overrides"
+version = "7.3.1"
+description = "A decorator to automatically detect mismatch when overriding a method."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "overrides-7.3.1-py3-none-any.whl", hash = "sha256:6187d8710a935d09b0bcef8238301d6ee2569d2ac1ae0ec39a8c7924e27f58ca"},
+ {file = "overrides-7.3.1.tar.gz", hash = "sha256:8b97c6c1e1681b78cbc9424b138d880f0803c2254c5ebaabdde57bb6c62093f2"},
]
[[package]]
name = "packaging"
version = "23.1"
description = "Core utilities for Python packages"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -2208,39 +2127,36 @@ files = [
[[package]]
name = "pandas"
-version = "1.5.3"
+version = "2.0.3"
description = "Powerful data structures for data analysis, time series, and statistics"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
- {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"},
- {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"},
- {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"},
- {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"},
- {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"},
- {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"},
- {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"},
- {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"},
- {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"},
- {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"},
- {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"},
- {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"},
- {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"},
- {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"},
- {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"},
- {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"},
- {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"},
- {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"},
- {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"},
- {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"},
- {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"},
- {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"},
- {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"},
- {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"},
- {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"},
- {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"},
- {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"},
+ {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"},
+ {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"},
+ {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"},
+ {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"},
+ {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"},
+ {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"},
+ {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"},
+ {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"},
+ {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"},
+ {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"},
+ {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"},
+ {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"},
+ {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"},
+ {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"},
+ {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"},
+ {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"},
+ {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"},
+ {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"},
+ {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"},
+ {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"},
+ {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"},
+ {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"},
+ {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"},
+ {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"},
+ {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"},
]
[package.dependencies]
@@ -2249,17 +2165,37 @@ numpy = [
{version = ">=1.21.0", markers = "python_version >= \"3.10\""},
{version = ">=1.23.2", markers = "python_version >= \"3.11\""},
]
-python-dateutil = ">=2.8.1"
+python-dateutil = ">=2.8.2"
pytz = ">=2020.1"
-
-[package.extras]
-test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"]
+tzdata = ">=2022.1"
+
+[package.extras]
+all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"]
+aws = ["s3fs (>=2021.08.0)"]
+clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"]
+compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"]
+computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"]
+excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"]
+feather = ["pyarrow (>=7.0.0)"]
+fss = ["fsspec (>=2021.07.0)"]
+gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"]
+hdf5 = ["tables (>=3.6.1)"]
+html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"]
+mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"]
+output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"]
+parquet = ["pyarrow (>=7.0.0)"]
+performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"]
+plot = ["matplotlib (>=3.6.1)"]
+postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"]
+spss = ["pyreadstat (>=1.1.2)"]
+sql-other = ["SQLAlchemy (>=1.4.16)"]
+test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"]
+xml = ["lxml (>=4.6.3)"]
[[package]]
name = "pandocfilters"
version = "1.5.0"
description = "Utilities for writing pandoc filters in python"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
files = [
@@ -2271,7 +2207,6 @@ files = [
name = "parso"
version = "0.8.3"
description = "A Python Parser"
-category = "main"
optional = false
python-versions = ">=3.6"
files = [
@@ -2287,7 +2222,6 @@ testing = ["docopt", "pytest (<6.0.0)"]
name = "pathspec"
version = "0.11.1"
description = "Utility library for gitignore style pattern matching of file paths."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2299,7 +2233,6 @@ files = [
name = "pexpect"
version = "4.8.0"
description = "Pexpect allows easy control of interactive console applications."
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -2314,7 +2247,6 @@ ptyprocess = ">=0.5"
name = "pickleshare"
version = "0.7.5"
description = "Tiny 'shelve'-like database with concurrency support"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -2326,7 +2258,6 @@ files = [
name = "pillow"
version = "9.5.0"
description = "Python Imaging Library (Fork)"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -2404,30 +2335,28 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
[[package]]
name = "platformdirs"
-version = "3.5.0"
+version = "3.8.0"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "platformdirs-3.5.0-py3-none-any.whl", hash = "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4"},
- {file = "platformdirs-3.5.0.tar.gz", hash = "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335"},
+ {file = "platformdirs-3.8.0-py3-none-any.whl", hash = "sha256:ca9ed98ce73076ba72e092b23d3c93ea6c4e186b3f1c3dad6edd98ff6ffcca2e"},
+ {file = "platformdirs-3.8.0.tar.gz", hash = "sha256:b0cabcb11063d21a0b261d557acb0a9d2126350e63b70cdf7db6347baea456dc"},
]
[package.extras]
-docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"]
+docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"]
+test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"]
[[package]]
name = "pluggy"
-version = "1.0.0"
+version = "1.2.0"
description = "plugin and hook calling mechanisms for python"
-category = "dev"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
files = [
- {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
- {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
+ {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"},
+ {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"},
]
[package.extras]
@@ -2436,14 +2365,13 @@ testing = ["pytest", "pytest-benchmark"]
[[package]]
name = "prometheus-client"
-version = "0.16.0"
+version = "0.17.0"
description = "Python client for the Prometheus monitoring system."
-category = "dev"
optional = false
python-versions = ">=3.6"
files = [
- {file = "prometheus_client-0.16.0-py3-none-any.whl", hash = "sha256:0836af6eb2c8f4fed712b2f279f6c0a8bbab29f9f4aa15276b91c7cb0d1616ab"},
- {file = "prometheus_client-0.16.0.tar.gz", hash = "sha256:a03e35b359f14dd1630898543e2120addfdeacd1a6069c1367ae90fd93ad3f48"},
+ {file = "prometheus_client-0.17.0-py3-none-any.whl", hash = "sha256:a77b708cf083f4d1a3fb3ce5c95b4afa32b9c521ae363354a4a910204ea095ce"},
+ {file = "prometheus_client-0.17.0.tar.gz", hash = "sha256:9c3b26f1535945e85b8934fb374678d263137b78ef85f305b1156c7c881cd11b"},
]
[package.extras]
@@ -2451,14 +2379,13 @@ twisted = ["twisted"]
[[package]]
name = "prompt-toolkit"
-version = "3.0.38"
+version = "3.0.39"
description = "Library for building powerful interactive command lines in Python"
-category = "main"
optional = false
python-versions = ">=3.7.0"
files = [
- {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"},
- {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"},
+ {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"},
+ {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"},
]
[package.dependencies]
@@ -2468,7 +2395,6 @@ wcwidth = "*"
name = "psutil"
version = "5.9.5"
description = "Cross-platform lib for process and system monitoring in Python."
-category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
files = [
@@ -2495,7 +2421,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"]
name = "ptyprocess"
version = "0.7.0"
description = "Run a subprocess in a pseudo terminal"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -2507,7 +2432,6 @@ files = [
name = "pure-eval"
version = "0.2.2"
description = "Safely evaluate AST nodes without side effects"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -2522,7 +2446,6 @@ tests = ["pytest"]
name = "py"
version = "1.11.0"
description = "library with cross-python path, ini-parsing, io, code, log facilities"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
@@ -2534,7 +2457,6 @@ files = [
name = "pycodestyle"
version = "2.10.0"
description = "Python style guide checker"
-category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2546,7 +2468,6 @@ files = [
name = "pycparser"
version = "2.21"
description = "C parser in Python"
-category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
files = [
@@ -2558,7 +2479,6 @@ files = [
name = "pygments"
version = "2.15.1"
description = "Pygments is a syntax highlighting package written in Python."
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -2571,14 +2491,13 @@ plugins = ["importlib-metadata"]
[[package]]
name = "pyparsing"
-version = "3.0.9"
+version = "3.1.0"
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
-category = "main"
optional = false
python-versions = ">=3.6.8"
files = [
- {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
- {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
+ {file = "pyparsing-3.1.0-py3-none-any.whl", hash = "sha256:d554a96d1a7d3ddaf7183104485bc19fd80543ad6ac5bdb6426719d766fb06c1"},
+ {file = "pyparsing-3.1.0.tar.gz", hash = "sha256:edb662d6fe322d6e990b1594b5feaeadf806803359e3d4d42f11e295e588f0ea"},
]
[package.extras]
@@ -2588,7 +2507,6 @@ diagrams = ["jinja2", "railroad-diagrams"]
name = "pyrsistent"
version = "0.19.3"
description = "Persistent/Functional/Immutable data structures"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2623,14 +2541,13 @@ files = [
[[package]]
name = "pytest"
-version = "7.3.1"
+version = "7.4.0"
description = "pytest: simple powerful testing with Python"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"},
- {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"},
+ {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"},
+ {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"},
]
[package.dependencies]
@@ -2642,13 +2559,12 @@ pluggy = ">=0.12,<2.0"
tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
[package.extras]
-testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"]
+testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytest-cases"
version = "3.6.14"
description = "Separate test code from test cases in pytest."
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -2662,14 +2578,13 @@ makefun = ">=1.9.5"
[[package]]
name = "pytest-cov"
-version = "4.0.0"
+version = "4.1.0"
description = "Pytest plugin for measuring coverage."
-category = "dev"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
files = [
- {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"},
- {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"},
+ {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"},
+ {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"},
]
[package.dependencies]
@@ -2681,14 +2596,13 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale
[[package]]
name = "pytest-mock"
-version = "3.10.0"
+version = "3.11.1"
description = "Thin-wrapper around the mock package for easier use with pytest"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"},
- {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"},
+ {file = "pytest-mock-3.11.1.tar.gz", hash = "sha256:7f6b125602ac6d743e523ae0bfa71e1a697a2f5534064528c6ff84c2f7c2fc7f"},
+ {file = "pytest_mock-3.11.1-py3-none-any.whl", hash = "sha256:21c279fff83d70763b05f8874cc9cfb3fcacd6d354247a976f9529d19f9acf39"},
]
[package.dependencies]
@@ -2701,7 +2615,6 @@ dev = ["pre-commit", "pytest-asyncio", "tox"]
name = "pytest-pycodestyle"
version = "2.3.1"
description = "pytest plugin to run pycodestyle"
-category = "dev"
optional = false
python-versions = "~=3.7"
files = [
@@ -2720,7 +2633,6 @@ tests = ["pytest-isort"]
name = "pytest-randomly"
version = "3.12.0"
description = "Pytest plugin to randomly order tests and control random.seed."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2736,7 +2648,6 @@ pytest = "*"
name = "python-dateutil"
version = "2.8.2"
description = "Extensions to the standard Python datetime module"
-category = "main"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
files = [
@@ -2751,7 +2662,6 @@ six = ">=1.5"
name = "python-json-logger"
version = "2.0.7"
description = "A python library adding a json log formatter"
-category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2763,7 +2673,6 @@ files = [
name = "pytz"
version = "2023.3"
description = "World timezone definitions, modern and historical"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -2775,7 +2684,6 @@ files = [
name = "pywavelets"
version = "1.4.1"
description = "PyWavelets, wavelet transform module"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
@@ -2813,7 +2721,6 @@ numpy = ">=1.17.3"
name = "pywin32"
version = "306"
description = "Python for Window Extensions"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -2837,7 +2744,6 @@ files = [
name = "pywinpty"
version = "2.0.10"
description = "Pseudo terminal support for Windows from Python."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2853,7 +2759,6 @@ files = [
name = "pyyaml"
version = "6.0"
description = "YAML parser and emitter for Python"
-category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2901,89 +2806,88 @@ files = [
[[package]]
name = "pyzmq"
-version = "25.0.2"
+version = "25.1.0"
description = "Python bindings for 0MQ"
-category = "main"
optional = false
python-versions = ">=3.6"
files = [
- {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ac178e666c097c8d3deb5097b58cd1316092fc43e8ef5b5fdb259b51da7e7315"},
- {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:659e62e1cbb063151c52f5b01a38e1df6b54feccfa3e2509d44c35ca6d7962ee"},
- {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8280ada89010735a12b968ec3ea9a468ac2e04fddcc1cede59cb7f5178783b9c"},
- {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b5eeb5278a8a636bb0abdd9ff5076bcbb836cd2302565df53ff1fa7d106d54"},
- {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a2e5fe42dfe6b73ca120b97ac9f34bfa8414feb15e00e37415dbd51cf227ef6"},
- {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:827bf60e749e78acb408a6c5af6688efbc9993e44ecc792b036ec2f4b4acf485"},
- {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b504ae43d37e282301da586529e2ded8b36d4ee2cd5e6db4386724ddeaa6bbc"},
- {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb1f69a0a2a2b1aae8412979dd6293cc6bcddd4439bf07e4758d864ddb112354"},
- {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b9c9cc965cdf28381e36da525dcb89fc1571d9c54800fdcd73e3f73a2fc29bd"},
- {file = "pyzmq-25.0.2-cp310-cp310-win32.whl", hash = "sha256:24abbfdbb75ac5039205e72d6c75f10fc39d925f2df8ff21ebc74179488ebfca"},
- {file = "pyzmq-25.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6a821a506822fac55d2df2085a52530f68ab15ceed12d63539adc32bd4410f6e"},
- {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9af0bb0277e92f41af35e991c242c9c71920169d6aa53ade7e444f338f4c8128"},
- {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54a96cf77684a3a537b76acfa7237b1e79a8f8d14e7f00e0171a94b346c5293e"},
- {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88649b19ede1cab03b96b66c364cbbf17c953615cdbc844f7f6e5f14c5e5261c"},
- {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:715cff7644a80a7795953c11b067a75f16eb9fc695a5a53316891ebee7f3c9d5"},
- {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b3f0f066b4f1d17383aae509bacf833ccaf591184a1f3c7a1661c085063ae"},
- {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d488c5c8630f7e782e800869f82744c3aca4aca62c63232e5d8c490d3d66956a"},
- {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:38d9f78d69bcdeec0c11e0feb3bc70f36f9b8c44fc06e5d06d91dc0a21b453c7"},
- {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3059a6a534c910e1d5d068df42f60d434f79e6cc6285aa469b384fa921f78cf8"},
- {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6526d097b75192f228c09d48420854d53dfbc7abbb41b0e26f363ccb26fbc177"},
- {file = "pyzmq-25.0.2-cp311-cp311-win32.whl", hash = "sha256:5c5fbb229e40a89a2fe73d0c1181916f31e30f253cb2d6d91bea7927c2e18413"},
- {file = "pyzmq-25.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed15e3a2c3c2398e6ae5ce86d6a31b452dfd6ad4cd5d312596b30929c4b6e182"},
- {file = "pyzmq-25.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:032f5c8483c85bf9c9ca0593a11c7c749d734ce68d435e38c3f72e759b98b3c9"},
- {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:374b55516393bfd4d7a7daa6c3b36d6dd6a31ff9d2adad0838cd6a203125e714"},
- {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08bfcc21b5997a9be4fefa405341320d8e7f19b4d684fb9c0580255c5bd6d695"},
- {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1a843d26a8da1b752c74bc019c7b20e6791ee813cd6877449e6a1415589d22ff"},
- {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b48616a09d7df9dbae2f45a0256eee7b794b903ddc6d8657a9948669b345f220"},
- {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d4427b4a136e3b7f85516c76dd2e0756c22eec4026afb76ca1397152b0ca8145"},
- {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:26b0358e8933990502f4513c991c9935b6c06af01787a36d133b7c39b1df37fa"},
- {file = "pyzmq-25.0.2-cp36-cp36m-win32.whl", hash = "sha256:c8fedc3ccd62c6b77dfe6f43802057a803a411ee96f14e946f4a76ec4ed0e117"},
- {file = "pyzmq-25.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2da6813b7995b6b1d1307329c73d3e3be2fd2d78e19acfc4eff2e27262732388"},
- {file = "pyzmq-25.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a35960c8b2f63e4ef67fd6731851030df68e4b617a6715dd11b4b10312d19fef"},
- {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2a0b880ab40aca5a878933376cb6c1ec483fba72f7f34e015c0f675c90b20"},
- {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85762712b74c7bd18e340c3639d1bf2f23735a998d63f46bb6584d904b5e401d"},
- {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:64812f29d6eee565e129ca14b0c785744bfff679a4727137484101b34602d1a7"},
- {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:510d8e55b3a7cd13f8d3e9121edf0a8730b87d925d25298bace29a7e7bc82810"},
- {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b164cc3c8acb3d102e311f2eb6f3c305865ecb377e56adc015cb51f721f1dda6"},
- {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:28fdb9224a258134784a9cf009b59265a9dde79582fb750d4e88a6bcbc6fa3dc"},
- {file = "pyzmq-25.0.2-cp37-cp37m-win32.whl", hash = "sha256:dd771a440effa1c36d3523bc6ba4e54ff5d2e54b4adcc1e060d8f3ca3721d228"},
- {file = "pyzmq-25.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:9bdc40efb679b9dcc39c06d25629e55581e4c4f7870a5e88db4f1c51ce25e20d"},
- {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:1f82906a2d8e4ee310f30487b165e7cc8ed09c009e4502da67178b03083c4ce0"},
- {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:21ec0bf4831988af43c8d66ba3ccd81af2c5e793e1bf6790eb2d50e27b3c570a"},
- {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbce982a17c88d2312ec2cf7673985d444f1beaac6e8189424e0a0e0448dbb3"},
- {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e1d2f2d86fc75ed7f8845a992c5f6f1ab5db99747fb0d78b5e4046d041164d2"},
- {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e92ff20ad5d13266bc999a29ed29a3b5b101c21fdf4b2cf420c09db9fb690e"},
- {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edbbf06cc2719889470a8d2bf5072bb00f423e12de0eb9ffec946c2c9748e149"},
- {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77942243ff4d14d90c11b2afd8ee6c039b45a0be4e53fb6fa7f5e4fd0b59da39"},
- {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ab046e9cb902d1f62c9cc0eca055b1d11108bdc271caf7c2171487298f229b56"},
- {file = "pyzmq-25.0.2-cp38-cp38-win32.whl", hash = "sha256:ad761cfbe477236802a7ab2c080d268c95e784fe30cafa7e055aacd1ca877eb0"},
- {file = "pyzmq-25.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8560756318ec7c4c49d2c341012167e704b5a46d9034905853c3d1ade4f55bee"},
- {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:ab2c056ac503f25a63f6c8c6771373e2a711b98b304614151dfb552d3d6c81f6"},
- {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cca8524b61c0eaaa3505382dc9b9a3bc8165f1d6c010fdd1452c224225a26689"},
- {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb9f7eae02d3ac42fbedad30006b7407c984a0eb4189a1322241a20944d61e5"},
- {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5eaeae038c68748082137d6896d5c4db7927e9349237ded08ee1bbd94f7361c9"},
- {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a31992a8f8d51663ebf79df0df6a04ffb905063083d682d4380ab8d2c67257c"},
- {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6a979e59d2184a0c8f2ede4b0810cbdd86b64d99d9cc8a023929e40dce7c86cc"},
- {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1f124cb73f1aa6654d31b183810febc8505fd0c597afa127c4f40076be4574e0"},
- {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:65c19a63b4a83ae45d62178b70223adeee5f12f3032726b897431b6553aa25af"},
- {file = "pyzmq-25.0.2-cp39-cp39-win32.whl", hash = "sha256:83d822e8687621bed87404afc1c03d83fa2ce39733d54c2fd52d8829edb8a7ff"},
- {file = "pyzmq-25.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:24683285cc6b7bf18ad37d75b9db0e0fefe58404e7001f1d82bf9e721806daa7"},
- {file = "pyzmq-25.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a4b4261eb8f9ed71f63b9eb0198dd7c934aa3b3972dac586d0ef502ba9ab08b"},
- {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:62ec8d979f56c0053a92b2b6a10ff54b9ec8a4f187db2b6ec31ee3dd6d3ca6e2"},
- {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:affec1470351178e892121b3414c8ef7803269f207bf9bef85f9a6dd11cde264"},
- {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffc71111433bd6ec8607a37b9211f4ef42e3d3b271c6d76c813669834764b248"},
- {file = "pyzmq-25.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6fadc60970714d86eff27821f8fb01f8328dd36bebd496b0564a500fe4a9e354"},
- {file = "pyzmq-25.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:269968f2a76c0513490aeb3ba0dc3c77b7c7a11daa894f9d1da88d4a0db09835"},
- {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f7c8b8368e84381ae7c57f1f5283b029c888504aaf4949c32e6e6fb256ec9bf0"},
- {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25e6873a70ad5aa31e4a7c41e5e8c709296edef4a92313e1cd5fc87bbd1874e2"},
- {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b733076ff46e7db5504c5e7284f04a9852c63214c74688bdb6135808531755a3"},
- {file = "pyzmq-25.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a6f6ae12478fdc26a6d5fdb21f806b08fa5403cd02fd312e4cb5f72df078f96f"},
- {file = "pyzmq-25.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:67da1c213fbd208906ab3470cfff1ee0048838365135a9bddc7b40b11e6d6c89"},
- {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531e36d9fcd66f18de27434a25b51d137eb546931033f392e85674c7a7cea853"},
- {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34a6fddd159ff38aa9497b2e342a559f142ab365576284bc8f77cb3ead1f79c5"},
- {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b491998ef886662c1f3d49ea2198055a9a536ddf7430b051b21054f2a5831800"},
- {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5d496815074e3e3d183fe2c7fcea2109ad67b74084c254481f87b64e04e9a471"},
- {file = "pyzmq-25.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:56a94ab1d12af982b55ca96c6853db6ac85505e820d9458ac76364c1998972f4"},
- {file = "pyzmq-25.0.2.tar.gz", hash = "sha256:6b8c1bbb70e868dc88801aa532cae6bd4e3b5233784692b786f17ad2962e5149"},
+ {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"},
+ {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"},
+ {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"},
+ {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d984b1b2f574bc1bb58296d3c0b64b10e95e7026f8716ed6c0b86d4679843f"},
+ {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154bddda2a351161474b36dba03bf1463377ec226a13458725183e508840df89"},
+ {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cb6d161ae94fb35bb518b74bb06b7293299c15ba3bc099dccd6a5b7ae589aee3"},
+ {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:90146ab578931e0e2826ee39d0c948d0ea72734378f1898939d18bc9c823fcf9"},
+ {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:831ba20b660b39e39e5ac8603e8193f8fce1ee03a42c84ade89c36a251449d80"},
+ {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a522510e3434e12aff80187144c6df556bb06fe6b9d01b2ecfbd2b5bfa5c60c"},
+ {file = "pyzmq-25.1.0-cp310-cp310-win32.whl", hash = "sha256:be24a5867b8e3b9dd5c241de359a9a5217698ff616ac2daa47713ba2ebe30ad1"},
+ {file = "pyzmq-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:5693dcc4f163481cf79e98cf2d7995c60e43809e325b77a7748d8024b1b7bcba"},
+ {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:13bbe36da3f8aaf2b7ec12696253c0bf6ffe05f4507985a8844a1081db6ec22d"},
+ {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:69511d604368f3dc58d4be1b0bad99b61ee92b44afe1cd9b7bd8c5e34ea8248a"},
+ {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a983c8694667fd76d793ada77fd36c8317e76aa66eec75be2653cef2ea72883"},
+ {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:332616f95eb400492103ab9d542b69d5f0ff628b23129a4bc0a2fd48da6e4e0b"},
+ {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58416db767787aedbfd57116714aad6c9ce57215ffa1c3758a52403f7c68cff5"},
+ {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cad9545f5801a125f162d09ec9b724b7ad9b6440151b89645241d0120e119dcc"},
+ {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d6128d431b8dfa888bf51c22a04d48bcb3d64431caf02b3cb943269f17fd2994"},
+ {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"},
+ {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:442d3efc77ca4d35bee3547a8e08e8d4bb88dadb54a8377014938ba98d2e074a"},
+ {file = "pyzmq-25.1.0-cp311-cp311-win32.whl", hash = "sha256:65346f507a815a731092421d0d7d60ed551a80d9b75e8b684307d435a5597425"},
+ {file = "pyzmq-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b45d722046fea5a5694cba5d86f21f78f0052b40a4bbbbf60128ac55bfcc7b6"},
+ {file = "pyzmq-25.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f45808eda8b1d71308c5416ef3abe958f033fdbb356984fabbfc7887bed76b3f"},
+ {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b697774ea8273e3c0460cf0bba16cd85ca6c46dfe8b303211816d68c492e132"},
+ {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b324fa769577fc2c8f5efcd429cef5acbc17d63fe15ed16d6dcbac2c5eb00849"},
+ {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5873d6a60b778848ce23b6c0ac26c39e48969823882f607516b91fb323ce80e5"},
+ {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0d9e7ba6a815a12c8575ba7887da4b72483e4cfc57179af10c9b937f3f9308f"},
+ {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:414b8beec76521358b49170db7b9967d6974bdfc3297f47f7d23edec37329b00"},
+ {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:01f06f33e12497dca86353c354461f75275a5ad9eaea181ac0dc1662da8074fa"},
+ {file = "pyzmq-25.1.0-cp36-cp36m-win32.whl", hash = "sha256:b5a07c4f29bf7cb0164664ef87e4aa25435dcc1f818d29842118b0ac1eb8e2b5"},
+ {file = "pyzmq-25.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:968b0c737797c1809ec602e082cb63e9824ff2329275336bb88bd71591e94a90"},
+ {file = "pyzmq-25.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47b915ba666c51391836d7ed9a745926b22c434efa76c119f77bcffa64d2c50c"},
+ {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5af31493663cf76dd36b00dafbc839e83bbca8a0662931e11816d75f36155897"},
+ {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5489738a692bc7ee9a0a7765979c8a572520d616d12d949eaffc6e061b82b4d1"},
+ {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1fc56a0221bdf67cfa94ef2d6ce5513a3d209c3dfd21fed4d4e87eca1822e3a3"},
+ {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:75217e83faea9edbc29516fc90c817bc40c6b21a5771ecb53e868e45594826b0"},
+ {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3830be8826639d801de9053cf86350ed6742c4321ba4236e4b5568528d7bfed7"},
+ {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3575699d7fd7c9b2108bc1c6128641a9a825a58577775ada26c02eb29e09c517"},
+ {file = "pyzmq-25.1.0-cp37-cp37m-win32.whl", hash = "sha256:95bd3a998d8c68b76679f6b18f520904af5204f089beebb7b0301d97704634dd"},
+ {file = "pyzmq-25.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dbc466744a2db4b7ca05589f21ae1a35066afada2f803f92369f5877c100ef62"},
+ {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:3bed53f7218490c68f0e82a29c92335daa9606216e51c64f37b48eb78f1281f4"},
+ {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb52e826d16c09ef87132c6e360e1879c984f19a4f62d8a935345deac43f3c12"},
+ {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ddbef8b53cd16467fdbfa92a712eae46dd066aa19780681a2ce266e88fbc7165"},
+ {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9301cf1d7fc1ddf668d0abbe3e227fc9ab15bc036a31c247276012abb921b5ff"},
+ {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e23a8c3b6c06de40bdb9e06288180d630b562db8ac199e8cc535af81f90e64b"},
+ {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a82faae00d1eed4809c2f18b37f15ce39a10a1c58fe48b60ad02875d6e13d80"},
+ {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8398a1b1951aaa330269c35335ae69744be166e67e0ebd9869bdc09426f3871"},
+ {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d40682ac60b2a613d36d8d3a0cd14fbdf8e7e0618fbb40aa9fa7b796c9081584"},
+ {file = "pyzmq-25.1.0-cp38-cp38-win32.whl", hash = "sha256:33d5c8391a34d56224bccf74f458d82fc6e24b3213fc68165c98b708c7a69325"},
+ {file = "pyzmq-25.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c66b7ff2527e18554030319b1376d81560ca0742c6e0b17ff1ee96624a5f1afd"},
+ {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:af56229ea6527a849ac9fb154a059d7e32e77a8cba27e3e62a1e38d8808cb1a5"},
+ {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdca18b94c404af6ae5533cd1bc310c4931f7ac97c148bbfd2cd4bdd62b96253"},
+ {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"},
+ {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c2fc7aad520a97d64ffc98190fce6b64152bde57a10c704b337082679e74f67"},
+ {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86a26415a8b6af02cd8d782e3a9ae3872140a057f1cadf0133de685185c02b"},
+ {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851fb2fe14036cfc1960d806628b80276af5424db09fe5c91c726890c8e6d943"},
+ {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a21fec5c3cea45421a19ccbe6250c82f97af4175bc09de4d6dd78fb0cb4c200"},
+ {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bad172aba822444b32eae54c2d5ab18cd7dee9814fd5c7ed026603b8cae2d05f"},
+ {file = "pyzmq-25.1.0-cp39-cp39-win32.whl", hash = "sha256:4d67609b37204acad3d566bb7391e0ecc25ef8bae22ff72ebe2ad7ffb7847158"},
+ {file = "pyzmq-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:71c7b5896e40720d30cd77a81e62b433b981005bbff0cb2f739e0f8d059b5d99"},
+ {file = "pyzmq-25.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb27ef9d3bdc0c195b2dc54fcb8720e18b741624686a81942e14c8b67cc61a6"},
+ {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c4fc2741e0513b5d5a12fe200d6785bbcc621f6f2278893a9ca7bed7f2efb7d"},
+ {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc34fdd458ff77a2a00e3c86f899911f6f269d393ca5675842a6e92eea565bae"},
+ {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8751f9c1442624da391bbd92bd4b072def6d7702a9390e4479f45c182392ff78"},
+ {file = "pyzmq-25.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6581e886aec3135964a302a0f5eb68f964869b9efd1dbafdebceaaf2934f8a68"},
+ {file = "pyzmq-25.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5482f08d2c3c42b920e8771ae8932fbaa0a67dff925fc476996ddd8155a170f3"},
+ {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7fbcafa3ea16d1de1f213c226005fea21ee16ed56134b75b2dede5a2129e62"},
+ {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adecf6d02b1beab8d7c04bc36f22bb0e4c65a35eb0b4750b91693631d4081c70"},
+ {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d39e42a0aa888122d1beb8ec0d4ddfb6c6b45aecb5ba4013c27e2f28657765"},
+ {file = "pyzmq-25.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7018289b402ebf2b2c06992813523de61d4ce17bd514c4339d8f27a6f6809492"},
+ {file = "pyzmq-25.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9e68ae9864d260b18f311b68d29134d8776d82e7f5d75ce898b40a88df9db30f"},
+ {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e21cc00e4debe8f54c3ed7b9fcca540f46eee12762a9fa56feb8512fd9057161"},
+ {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f666ae327a6899ff560d741681fdcdf4506f990595201ed39b44278c471ad98"},
+ {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5efcc29056dfe95e9c9db0dfbb12b62db9c4ad302f812931b6d21dd04a9119"},
+ {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:48e5e59e77c1a83162ab3c163fc01cd2eebc5b34560341a67421b09be0891287"},
+ {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"},
+ {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"},
]
[package.dependencies]
@@ -2991,14 +2895,13 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""}
[[package]]
name = "requests"
-version = "2.30.0"
+version = "2.31.0"
description = "Python HTTP for Humans."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"},
- {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"},
+ {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
+ {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"},
]
[package.dependencies]
@@ -3015,7 +2918,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
name = "rfc3339-validator"
version = "0.1.4"
description = "A pure python RFC3339 validator"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
@@ -3030,7 +2932,6 @@ six = "*"
name = "rfc3986-validator"
version = "0.1.1"
description = "Pure python rfc3986 validator"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
@@ -3040,181 +2941,135 @@ files = [
[[package]]
name = "scikit-image"
-version = "0.20.0"
+version = "0.21.0"
description = "Image processing in Python"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
- {file = "scikit_image-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3cec8c5e8412ee19642a916648144186eb6b60c39fb6608ab478b4d1a4575e25"},
- {file = "scikit_image-0.20.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0ab378822fadc93db7e917a266d489ea33df3b42edfef197caaebbabbc2e4ecc"},
- {file = "scikit_image-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6797e3ef5fc53897bde131cfc3ceba6ce247d89cfe194fc8d3aba7f5c12aaf6"},
- {file = "scikit_image-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f667dcf01737248bc5bd0a99fad58475abeb6b6a8229aecee9fdb96cf988ae85"},
- {file = "scikit_image-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:79a400ffe35fc7f64d1d043f3d043e062015689ad5637c35cd5569edae87ae13"},
- {file = "scikit_image-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:049d955869620453b9e0568c2da62c8fec47bf3714be48b5d46bbaebb91bdc1f"},
- {file = "scikit_image-0.20.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:a503ee85b444234ee88f34bf8674872dc37c6124ff60b7eb9242813de012ff4e"},
- {file = "scikit_image-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3943d7355d02b40c066fd87cd5fe1b4f6637a16448e62333c4191a65ebf40a1c"},
- {file = "scikit_image-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d719242ea7e7250d49e38d1e33c44c2dd59c3414ae085881d168b98cbb6059a"},
- {file = "scikit_image-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:fdd1fd258e78c86e382fd687177431088a40880bd785e0ab40ee5f3794366710"},
- {file = "scikit_image-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cd0486cb769d906307a3ec3884630be822d8ec2f41069e197336f904f584a33"},
- {file = "scikit_image-0.20.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2e9026161d0a698f532352dda6455a0bc13b1c9d831ea9279726b59d064df574"},
- {file = "scikit_image-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c123e6b0677dc1697c04b5bf2efb7110bcca511b4bc6967a38fa395ae5edf44"},
- {file = "scikit_image-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76f2fd12b537daea806a078df9ea76f5cc5a529d5bd7c41d7d0a101e9c5f91c4"},
- {file = "scikit_image-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:2118d610096754bca44b5d37328e1382e5fa7c6493803685100c9238e257d848"},
- {file = "scikit_image-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13a5c1c81ee5bcb64ee8ca8f1a2cf371b0c4345ea6fb67c3052e1c6d5edbd936"},
- {file = "scikit_image-0.20.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:1794889d2dbb385c7ad5656363371ba0057b7a3335cda093a11415af84bb96e2"},
- {file = "scikit_image-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df14f8a55dae511749b081d9402ea215ea7c641bd6f74f06aa7b623e132817df"},
- {file = "scikit_image-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b856efc75e3051bea6d40a8ffcdaabd5682783ece1aa91c3f6777c3372a98ca1"},
- {file = "scikit_image-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:a600374394b76b7fc260cef54e1be21047c4de0ecffb0b7f2f7392cd8ba16ffa"},
- {file = "scikit_image-0.20.0.tar.gz", hash = "sha256:2cd784fce18bd31d71ade62c6221440199ead03acf7544086261ee032264cf61"},
-]
-
-[package.dependencies]
-imageio = ">=2.4.1"
-lazy_loader = ">=0.1"
+ {file = "scikit_image-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:978ac3302252155a8556cdfe067bad2d18d5ccef4e91c2f727bc564ed75566bc"},
+ {file = "scikit_image-0.21.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:82c22e008527e5ee26ab08e3ce919998ef164d538ff30b9e5764b223cfda06b1"},
+ {file = "scikit_image-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd29d2631d3e975c377066acfc1f4cb2cc95e2257cf70e7fedfcb96441096e88"},
+ {file = "scikit_image-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6c12925ceb9f3aede555921e26642d601b2d37d1617002a2636f2cb5178ae2f"},
+ {file = "scikit_image-0.21.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f538d4de77e4f3225d068d9ea2965bed3f7dda7f457a8f89634fa22ffb9ad8c"},
+ {file = "scikit_image-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ec9bab6920ac43037d7434058b67b5778d42c60f67b8679239f48a471e7ed6f8"},
+ {file = "scikit_image-0.21.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:a54720430dba833ffbb6dedd93d9f0938c5dd47d20ab9ba3e4e61c19d95f6f19"},
+ {file = "scikit_image-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e40dd102da14cdadc09210f930b4556c90ff8f99cd9d8bcccf9f73a86c44245"},
+ {file = "scikit_image-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff5719c7eb99596a39c3e1d9b564025bae78ecf1da3ee6842d34f6965b5f1474"},
+ {file = "scikit_image-0.21.0-cp311-cp311-win_amd64.whl", hash = "sha256:146c3824253eee9ff346c4ad10cb58376f91aefaf4a4bb2fe11aa21691f7de76"},
+ {file = "scikit_image-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4e1b09f81a99c9c390215929194847b3cd358550b4b65bb6e42c5393d69cb74a"},
+ {file = "scikit_image-0.21.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9f7b5fb4a22f0d5ae0fa13beeb887c925280590145cd6d8b2630794d120ff7c7"},
+ {file = "scikit_image-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4814033717f0b6491fee252facb9df92058d6a72ab78dd6408a50f3915a88b8"},
+ {file = "scikit_image-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b0d6ed6502cca0c9719c444caafa0b8cda0f9e29e01ca42f621a240073284be"},
+ {file = "scikit_image-0.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:9194cb7bc21215fde6c1b1e9685d312d2aa8f65ea9736bc6311126a91c860032"},
+ {file = "scikit_image-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54df1ddc854f37a912d42bc724e456e86858107e94048a81a27720bc588f9937"},
+ {file = "scikit_image-0.21.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c01e3ab0a1fabfd8ce30686d4401b7ed36e6126c9d4d05cb94abf6bdc46f7ac9"},
+ {file = "scikit_image-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ef5d8d1099317b7b315b530348cbfa68ab8ce32459de3c074d204166951025c"},
+ {file = "scikit_image-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b1e96c59cab640ca5c5b22c501524cfaf34cbe0cb51ba73bd9a9ede3fb6e1d"},
+ {file = "scikit_image-0.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:9cffcddd2a5594c0a06de2ae3e1e25d662745a26f94fda31520593669677c010"},
+]
+
+[package.dependencies]
+imageio = ">=2.27"
+lazy_loader = ">=0.2"
networkx = ">=2.8"
numpy = ">=1.21.1"
-packaging = ">=20.0"
+packaging = ">=21"
pillow = ">=9.0.1"
PyWavelets = ">=1.1.1"
-scipy = [
- {version = ">=1.8,<1.9.2", markers = "python_version <= \"3.9\""},
- {version = ">=1.8", markers = "python_version > \"3.9\""},
-]
-tifffile = ">=2019.7.26"
+scipy = ">=1.8"
+tifffile = ">=2022.8.12"
[package.extras]
-build = ["Cython (>=0.29.24)", "build", "meson-python (>=0.13.0rc0)", "ninja", "numpy (>=1.21.1)", "packaging (>=20)", "pythran", "setuptools (>=67)", "wheel"]
-data = ["pooch (>=1.3.0)"]
-default = ["PyWavelets (>=1.1.1)", "imageio (>=2.4.1)", "lazy_loader (>=0.1)", "networkx (>=2.8)", "numpy (>=1.21.1)", "packaging (>=20.0)", "pillow (>=9.0.1)", "scipy (>=1.8)", "scipy (>=1.8,<1.9.2)", "tifffile (>=2019.7.26)"]
+build = ["Cython (>=0.29.32)", "build", "meson-python (>=0.13)", "ninja", "numpy (>=1.21.1)", "packaging (>=21)", "pythran", "setuptools (>=67)", "spin (==0.3)", "wheel"]
+data = ["pooch (>=1.6.0)"]
+default = ["PyWavelets (>=1.1.1)", "imageio (>=2.27)", "lazy_loader (>=0.2)", "networkx (>=2.8)", "numpy (>=1.21.1)", "packaging (>=21)", "pillow (>=9.0.1)", "scipy (>=1.8)", "tifffile (>=2022.8.12)"]
developer = ["pre-commit", "rtoml"]
-docs = ["dask[array] (>=2022.9.2)", "ipywidgets", "kaleido", "matplotlib (>=3.6)", "myst-parser", "numpydoc (>=1.5)", "pandas (>=1.5)", "plotly (>=5.10)", "pooch (>=1.6)", "pytest-runner", "scikit-learn", "seaborn (>=0.11)", "sphinx (>=5.2)", "sphinx-copybutton", "sphinx-gallery (>=0.11)", "tifffile (>=2022.8.12)"]
-optional = ["SimpleITK", "astropy (>=3.1.2)", "cloudpickle (>=0.2.1)", "dask[array] (>=1.0.0,!=2.17.0)", "matplotlib (>=3.3)", "pooch (>=1.3.0)", "pyamg"]
-test = ["asv", "codecov", "matplotlib (>=3.3)", "pooch (>=1.3.0)", "pytest (>=5.2.0)", "pytest-cov (>=2.7.0)", "pytest-faulthandler", "pytest-localserver"]
+docs = ["dask[array] (>=2022.9.2)", "ipykernel", "ipywidgets", "kaleido", "matplotlib (>=3.5)", "myst-parser", "numpydoc (>=1.5)", "pandas (>=1.5)", "plotly (>=5.10)", "pooch (>=1.6)", "pydata-sphinx-theme (>=0.13)", "pytest-runner", "scikit-learn (>=0.24.0)", "seaborn (>=0.11)", "sphinx (>=5.0)", "sphinx-copybutton", "sphinx-gallery (>=0.11)", "sphinx_design (>=0.3)", "tifffile (>=2022.8.12)"]
+optional = ["SimpleITK", "astropy (>=5.0)", "cloudpickle (>=0.2.1)", "dask[array] (>=2021.1.0)", "matplotlib (>=3.5)", "pooch (>=1.6.0)", "pyamg", "scikit-learn (>=0.24.0)"]
+test = ["asv", "matplotlib (>=3.5)", "pooch (>=1.6.0)", "pytest (>=7.0)", "pytest-cov (>=2.11.0)", "pytest-faulthandler", "pytest-localserver"]
[[package]]
name = "scikit-learn"
-version = "1.2.2"
+version = "1.3.0"
description = "A set of python modules for machine learning and data mining"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
- {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"},
- {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"},
- {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"},
- {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"},
- {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"},
- {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"},
- {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"},
- {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"},
- {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"},
- {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"},
- {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"},
- {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"},
- {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"},
- {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"},
- {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"},
- {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"},
- {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"},
- {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"},
- {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"},
- {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"},
- {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"},
+ {file = "scikit-learn-1.3.0.tar.gz", hash = "sha256:8be549886f5eda46436b6e555b0e4873b4f10aa21c07df45c4bc1735afbccd7a"},
+ {file = "scikit_learn-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981287869e576d42c682cf7ca96af0c6ac544ed9316328fd0d9292795c742cf5"},
+ {file = "scikit_learn-1.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:436aaaae2c916ad16631142488e4c82f4296af2404f480e031d866863425d2a2"},
+ {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e28d8fa47a0b30ae1bd7a079519dd852764e31708a7804da6cb6f8b36e3630"},
+ {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80c08834a473d08a204d966982a62e11c976228d306a2648c575e3ead12111"},
+ {file = "scikit_learn-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:552fd1b6ee22900cf1780d7386a554bb96949e9a359999177cf30211e6b20df6"},
+ {file = "scikit_learn-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79970a6d759eb00a62266a31e2637d07d2d28446fca8079cf9afa7c07b0427f8"},
+ {file = "scikit_learn-1.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:850a00b559e636b23901aabbe79b73dc604b4e4248ba9e2d6e72f95063765603"},
+ {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee04835fb016e8062ee9fe9074aef9b82e430504e420bff51e3e5fffe72750ca"},
+ {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d953531f5d9f00c90c34fa3b7d7cfb43ecff4c605dac9e4255a20b114a27369"},
+ {file = "scikit_learn-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:151ac2bf65ccf363664a689b8beafc9e6aae36263db114b4ca06fbbbf827444a"},
+ {file = "scikit_learn-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a885a9edc9c0a341cab27ec4f8a6c58b35f3d449c9d2503a6fd23e06bbd4f6a"},
+ {file = "scikit_learn-1.3.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9877af9c6d1b15486e18a94101b742e9d0d2f343d35a634e337411ddb57783f3"},
+ {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c470f53cea065ff3d588050955c492793bb50c19a92923490d18fcb637f6383a"},
+ {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6e2d7389542eae01077a1ee0318c4fec20c66c957f45c7aac0c6eb0fe3c612"},
+ {file = "scikit_learn-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:3a11936adbc379a6061ea32fa03338d4ca7248d86dd507c81e13af428a5bc1db"},
+ {file = "scikit_learn-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:998d38fcec96584deee1e79cd127469b3ad6fefd1ea6c2dfc54e8db367eb396b"},
+ {file = "scikit_learn-1.3.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ded35e810438a527e17623ac6deae3b360134345b7c598175ab7741720d7ffa7"},
+ {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8102d5036e28d08ab47166b48c8d5e5810704daecf3a476a4282d562be9a28"},
+ {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7617164951c422747e7c32be4afa15d75ad8044f42e7d70d3e2e0429a50e6718"},
+ {file = "scikit_learn-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d54fb9e6038284548072df22fd34777e434153f7ffac72c8596f2d6987110dd"},
]
[package.dependencies]
joblib = ">=1.1.1"
numpy = ">=1.17.3"
-scipy = ">=1.3.2"
+scipy = ">=1.5.0"
threadpoolctl = ">=2.0.0"
[package.extras]
benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"]
-docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"]
-examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"]
-tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"]
+docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"]
+examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"]
+tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"]
[[package]]
name = "scipy"
-version = "1.9.1"
-description = "SciPy: Scientific Library for Python"
-category = "main"
-optional = false
-python-versions = ">=3.8,<3.12"
-files = [
- {file = "scipy-1.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c61b4a91a702e8e04aeb0bfc40460e1f17a640977c04dda8757efb0199c75332"},
- {file = "scipy-1.9.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d79da472015d0120ba9b357b28a99146cd6c17b9609403164b1a8ed149b4dfc8"},
- {file = "scipy-1.9.1-cp310-cp310-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:825951b88f56765aeb6e5e38ac9d7d47407cfaaeb008d40aa1b45a2d7ea2731e"},
- {file = "scipy-1.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f950a04b33e17b38ff561d5a0951caf3f5b47caa841edd772ffb7959f20a6af0"},
- {file = "scipy-1.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc81ac25659fec73599ccc52c989670e5ccd8974cf34bacd7b54a8d809aff1a"},
- {file = "scipy-1.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:8d3faa40ac16c6357aaf7ea50394ea6f1e8e99d75e927a51102b1943b311b4d9"},
- {file = "scipy-1.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a412c476a91b080e456229e413792bbb5d6202865dae963d1e6e28c2bb58691"},
- {file = "scipy-1.9.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:eb954f5aca4d26f468bbebcdc5448348eb287f7bea536c6306f62ea062f63d9a"},
- {file = "scipy-1.9.1-cp38-cp38-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:3c6f5d1d4b9a5e4fe5e14f26ffc9444fc59473bbf8d45dc4a9a15283b7063a72"},
- {file = "scipy-1.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bc4e2c77d4cd015d739e75e74ebbafed59ba8497a7ed0fd400231ed7683497c4"},
- {file = "scipy-1.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0419485dbcd0ed78c0d5bf234c5dd63e86065b39b4d669e45810d42199d49521"},
- {file = "scipy-1.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34441dfbee5b002f9e15285014fd56e5e3372493c3e64ae297bae2c4b9659f5a"},
- {file = "scipy-1.9.1-cp38-cp38-win32.whl", hash = "sha256:b97b479f39c7e4aaf807efd0424dec74bbb379108f7d22cf09323086afcd312c"},
- {file = "scipy-1.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8fe305d9d67a81255e06203454729405706907dccbdfcc330b7b3482a6c371d"},
- {file = "scipy-1.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:39ab9240cd215a9349c85ab908dda6d732f7d3b4b192fa05780812495536acc4"},
- {file = "scipy-1.9.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:71487c503e036740635f18324f62a11f283a632ace9d35933b2b0a04fd898c98"},
- {file = "scipy-1.9.1-cp39-cp39-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:3bc1ab68b9a096f368ba06c3a5e1d1d50957a86665fc929c4332d21355e7e8f4"},
- {file = "scipy-1.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f7c39f7dbb57cce00c108d06d731f3b0e2a4d3a95c66d96bce697684876ce4d4"},
- {file = "scipy-1.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47d1a95bd9d37302afcfe1b84c8011377c4f81e33649c5a5785db9ab827a6ade"},
- {file = "scipy-1.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d7cf7b25c9f23c59a766385f6370dab0659741699ecc7a451f9b94604938ce"},
- {file = "scipy-1.9.1-cp39-cp39-win32.whl", hash = "sha256:09412eb7fb60b8f00b328037fd814d25d261066ebc43a1e339cdce4f7502877e"},
- {file = "scipy-1.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:90c805f30c46cf60f1e76e947574f02954d25e3bb1e97aa8a07bc53aa31cf7d1"},
- {file = "scipy-1.9.1.tar.gz", hash = "sha256:26d28c468900e6d5fdb37d2812ab46db0ccd22c63baa095057871faa3a498bc9"},
-]
-
-[package.dependencies]
-numpy = ">=1.18.5,<1.25.0"
-
-[[package]]
-name = "scipy"
-version = "1.9.3"
+version = "1.11.1"
description = "Fundamental algorithms for scientific computing in Python"
-category = "main"
optional = false
-python-versions = ">=3.8"
+python-versions = "<3.13,>=3.9"
files = [
- {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"},
- {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"},
- {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"},
- {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"},
- {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"},
- {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"},
- {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"},
- {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"},
- {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"},
- {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"},
- {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"},
- {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"},
- {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"},
- {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"},
- {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"},
- {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"},
- {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"},
- {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"},
- {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"},
- {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"},
- {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"},
+ {file = "scipy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aec8c62fbe52914f9cf28d846cf0401dd80ab80788bbab909434eb336ed07c04"},
+ {file = "scipy-1.11.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3b9963798df1d8a52db41a6fc0e6fa65b1c60e85d73da27ae8bb754de4792481"},
+ {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e8eb42db36526b130dfbc417609498a6192381abc1975b91e3eb238e0b41c1a"},
+ {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:366a6a937110d80dca4f63b3f5b00cc89d36f678b2d124a01067b154e692bab1"},
+ {file = "scipy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08d957ca82d3535b3b9ba6c8ff355d78fe975271874e2af267cb5add5bd78625"},
+ {file = "scipy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:e866514bc2d660608447b6ba95c8900d591f2865c07cca0aa4f7ff3c4ca70f30"},
+ {file = "scipy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba94eeef3c9caa4cea7b402a35bb02a5714ee1ee77eb98aca1eed4543beb0f4c"},
+ {file = "scipy-1.11.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:512fdc18c65f76dadaca139348e525646d440220d8d05f6d21965b8d4466bccd"},
+ {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce154372f0ebe88556ed06d7b196e9c2e0c13080ecb58d0f35062dc7cc28b47"},
+ {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4bb943010203465ac81efa392e4645265077b4d9e99b66cf3ed33ae12254173"},
+ {file = "scipy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:249cfa465c379c9bb2c20123001e151ff5e29b351cbb7f9c91587260602c58d0"},
+ {file = "scipy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:ffb28e3fa31b9c376d0fb1f74c1f13911c8c154a760312fbee87a21eb21efe31"},
+ {file = "scipy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:39154437654260a52871dfde852adf1b93b1d1bc5dc0ffa70068f16ec0be2624"},
+ {file = "scipy-1.11.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b588311875c58d1acd4ef17c983b9f1ab5391755a47c3d70b6bd503a45bfaf71"},
+ {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d51565560565a0307ed06fa0ec4c6f21ff094947d4844d6068ed04400c72d0c3"},
+ {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b41a0f322b4eb51b078cb3441e950ad661ede490c3aca66edef66f4b37ab1877"},
+ {file = "scipy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:396fae3f8c12ad14c5f3eb40499fd06a6fef8393a6baa352a652ecd51e74e029"},
+ {file = "scipy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:be8c962a821957fdde8c4044efdab7a140c13294997a407eaee777acf63cbf0c"},
+ {file = "scipy-1.11.1.tar.gz", hash = "sha256:fb5b492fa035334fd249f0973cc79ecad8b09c604b42a127a677b45a9a3d4289"},
]
[package.dependencies]
-numpy = ">=1.18.5,<1.26.0"
+numpy = ">=1.21.6,<1.28.0"
[package.extras]
-dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"]
-doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"]
-test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
+dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"]
+doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"]
+test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
[[package]]
name = "seaborn"
version = "0.12.2"
description = "Statistical data visualization"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -3236,7 +3091,6 @@ stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"]
name = "send2trash"
version = "1.8.2"
description = "Send file to trash natively under Mac OS X, Windows and Linux"
-category = "dev"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
files = [
@@ -3251,26 +3105,24 @@ win32 = ["pywin32"]
[[package]]
name = "setuptools"
-version = "67.7.2"
+version = "68.0.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"},
- {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"},
+ {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"},
+ {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"},
]
[package.extras]
docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
-testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
+testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
[[package]]
name = "six"
version = "1.16.0"
description = "Python 2 and 3 compatibility utilities"
-category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
files = [
@@ -3282,7 +3134,6 @@ files = [
name = "sniffio"
version = "1.3.0"
description = "Sniff out which async library your code is running under"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3294,7 +3145,6 @@ files = [
name = "soupsieve"
version = "2.4.1"
description = "A modern CSS selector implementation for Beautiful Soup."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3306,7 +3156,6 @@ files = [
name = "stack-data"
version = "0.6.2"
description = "Extract data from python stack frames and tracebacks for informative displays"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -3326,7 +3175,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
name = "terminado"
version = "0.17.1"
description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3347,7 +3195,6 @@ test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"]
name = "threadpoolctl"
version = "3.1.0"
description = "threadpoolctl"
-category = "main"
optional = false
python-versions = ">=3.6"
files = [
@@ -3357,14 +3204,13 @@ files = [
[[package]]
name = "tifffile"
-version = "2023.4.12"
+version = "2023.7.4"
description = "Read and write TIFF files"
-category = "main"
optional = false
python-versions = ">=3.8"
files = [
- {file = "tifffile-2023.4.12-py3-none-any.whl", hash = "sha256:3161954746fe32c4f4244d0fb2eb0a272f3a3760b78882a42faa83ac5e6e0b74"},
- {file = "tifffile-2023.4.12.tar.gz", hash = "sha256:2fa99f9890caab919d932a0acaa9d0f5843dc2ef3594e212963932e20713badd"},
+ {file = "tifffile-2023.7.4-py3-none-any.whl", hash = "sha256:f56d20ecce270f2ca5704ade578edfe4bf30158db96f50f5da39c816655311b8"},
+ {file = "tifffile-2023.7.4.tar.gz", hash = "sha256:2f9ed41bb531832b5a32c35e241fcb5a0aa322323485f2a82afb7df78b900534"},
]
[package.dependencies]
@@ -3377,7 +3223,6 @@ all = ["defusedxml", "fsspec", "imagecodecs (>=2023.1.23)", "lxml", "matplotlib"
name = "tinycss2"
version = "1.2.1"
description = "A tiny CSS parser"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3396,7 +3241,6 @@ test = ["flake8", "isort", "pytest"]
name = "tomli"
version = "2.0.1"
description = "A lil' TOML parser"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3406,30 +3250,28 @@ files = [
[[package]]
name = "tornado"
-version = "6.3.1"
+version = "6.3.2"
description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
-category = "main"
optional = false
python-versions = ">= 3.8"
files = [
- {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:db181eb3df8738613ff0a26f49e1b394aade05034b01200a63e9662f347d4415"},
- {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b4e7b956f9b5e6f9feb643ea04f07e7c6b49301e03e0023eedb01fa8cf52f579"},
- {file = "tornado-6.3.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661aa8bc0e9d83d757cd95b6f6d1ece8ca9fd1ccdd34db2de381e25bf818233"},
- {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81c17e0cc396908a5e25dc8e9c5e4936e6dfd544c9290be48bd054c79bcad51e"},
- {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a27a1cfa9997923f80bdd962b3aab048ac486ad8cfb2f237964f8ab7f7eb824b"},
- {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d7117f3c7ba5d05813b17a1f04efc8e108a1b811ccfddd9134cc68553c414864"},
- {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:ffdce65a281fd708da5a9def3bfb8f364766847fa7ed806821a69094c9629e8a"},
- {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:90f569a35a8ec19bde53aa596952071f445da678ec8596af763b9b9ce07605e6"},
- {file = "tornado-6.3.1-cp38-abi3-win32.whl", hash = "sha256:3455133b9ff262fd0a75630af0a8ee13564f25fb4fd3d9ce239b8a7d3d027bf8"},
- {file = "tornado-6.3.1-cp38-abi3-win_amd64.whl", hash = "sha256:1285f0691143f7ab97150831455d4db17a267b59649f7bd9700282cba3d5e771"},
- {file = "tornado-6.3.1.tar.gz", hash = "sha256:5e2f49ad371595957c50e42dd7e5c14d64a6843a3cf27352b69c706d1b5918af"},
+ {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"},
+ {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"},
+ {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"},
+ {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"},
+ {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"},
+ {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"},
+ {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"},
+ {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"},
+ {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"},
+ {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"},
+ {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"},
]
[[package]]
name = "tqdm"
version = "4.65.0"
description = "Fast, Extensible Progress Meter"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -3450,7 +3292,6 @@ telegram = ["requests"]
name = "traitlets"
version = "5.9.0"
description = "Traitlets Python configuration system"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -3464,41 +3305,49 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"]
[[package]]
name = "typing-extensions"
-version = "4.5.0"
+version = "4.7.1"
description = "Backported and Experimental Type Hints for Python 3.7+"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"},
- {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"},
+ {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"},
+ {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"},
+]
+
+[[package]]
+name = "tzdata"
+version = "2023.3"
+description = "Provider of IANA time zone data"
+optional = false
+python-versions = ">=2"
+files = [
+ {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"},
+ {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"},
]
[[package]]
name = "uri-template"
-version = "1.2.0"
+version = "1.3.0"
description = "RFC 6570 URI Template Processor"
-category = "dev"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
files = [
- {file = "uri_template-1.2.0-py3-none-any.whl", hash = "sha256:f1699c77b73b925cf4937eae31ab282a86dc885c333f2e942513f08f691fc7db"},
- {file = "uri_template-1.2.0.tar.gz", hash = "sha256:934e4d09d108b70eb8a24410af8615294d09d279ce0e7cbcdaef1bd21f932b06"},
+ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"},
+ {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"},
]
[package.extras]
-dev = ["flake8 (<4.0.0)", "flake8-annotations", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-noqa", "flake8-requirements", "flake8-type-annotations", "flake8-use-fstring", "mypy", "pep8-naming"]
+dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"]
[[package]]
name = "urllib3"
-version = "2.0.2"
+version = "2.0.3"
description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"},
- {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"},
+ {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"},
+ {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"},
]
[package.extras]
@@ -3511,7 +3360,6 @@ zstd = ["zstandard (>=0.18.0)"]
name = "watchdog"
version = "3.0.0"
description = "Filesystem events monitoring"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -3551,7 +3399,6 @@ watchmedo = ["PyYAML (>=3.10)"]
name = "wcwidth"
version = "0.2.6"
description = "Measures the displayed width of unicode strings in a terminal"
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -3563,7 +3410,6 @@ files = [
name = "webcolors"
version = "1.13"
description = "A library for working with the color formats defined by HTML and CSS."
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3579,7 +3425,6 @@ tests = ["pytest", "pytest-cov"]
name = "webencodings"
version = "0.5.1"
description = "Character encoding aliases for legacy web content"
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -3589,14 +3434,13 @@ files = [
[[package]]
name = "websocket-client"
-version = "1.5.1"
+version = "1.6.1"
description = "WebSocket client for Python with low level API options"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
- {file = "websocket-client-1.5.1.tar.gz", hash = "sha256:3f09e6d8230892547132177f575a4e3e73cfdf06526e20cc02aa1c3b47184d40"},
- {file = "websocket_client-1.5.1-py3-none-any.whl", hash = "sha256:cdf5877568b7e83aa7cf2244ab56a3213de587bbe0ce9d8b9600fc77b455d89e"},
+ {file = "websocket-client-1.6.1.tar.gz", hash = "sha256:c951af98631d24f8df89ab1019fc365f2227c0892f12fd150e935607c79dd0dd"},
+ {file = "websocket_client-1.6.1-py3-none-any.whl", hash = "sha256:f1f9f2ad5291f0225a49efad77abf9e700b6fef553900623060dad6e26503b9d"},
]
[package.extras]
@@ -3606,26 +3450,38 @@ test = ["websockets"]
[[package]]
name = "widgetsnbextension"
-version = "4.0.7"
+version = "4.0.8"
description = "Jupyter interactive widgets for Jupyter Notebook"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
- {file = "widgetsnbextension-4.0.7-py3-none-any.whl", hash = "sha256:be3228a73bbab189a16be2d4a3cd89ecbd4e31948bfdc64edac17dcdee3cd99c"},
- {file = "widgetsnbextension-4.0.7.tar.gz", hash = "sha256:ea67c17a7cd4ae358f8f46c3b304c40698bc0423732e3f273321ee141232c8be"},
+ {file = "widgetsnbextension-4.0.8-py3-none-any.whl", hash = "sha256:2e37f0ce9da11651056280c7efe96f2db052fe8fc269508e3724f5cbd6c93018"},
+ {file = "widgetsnbextension-4.0.8.tar.gz", hash = "sha256:9ec291ba87c2dfad42c3d5b6f68713fa18be1acd7476569516b2431682315c17"},
]
+[[package]]
+name = "win32-setctime"
+version = "1.1.0"
+description = "A small Python utility to set file creation time on Windows"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"},
+ {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"},
+]
+
+[package.extras]
+dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"]
+
[[package]]
name = "xarray"
-version = "2023.4.2"
+version = "2023.6.0"
description = "N-D labeled arrays and datasets in Python"
-category = "main"
optional = false
python-versions = ">=3.9"
files = [
- {file = "xarray-2023.4.2-py3-none-any.whl", hash = "sha256:1b6d577c1217ad6bf7458426af19ed7a489ab6c41220ca791f55f5df9648173a"},
- {file = "xarray-2023.4.2.tar.gz", hash = "sha256:958ec588220352343b910cbc05e54e7ab54d4e8c1c3a7783d6bfe7549d0bd0d2"},
+ {file = "xarray-2023.6.0-py3-none-any.whl", hash = "sha256:bdd4c45511ab4e84f4249ea1030336db59b750968f25369d8e132d6d7ead7cc9"},
+ {file = "xarray-2023.6.0.tar.gz", hash = "sha256:267a231ee4efc0341ebbffc6d4ec60e4a66e4849c16e0305c03fcefeca77698c"},
]
[package.dependencies]
@@ -3645,7 +3501,6 @@ viz = ["matplotlib", "nc-time-axis", "seaborn"]
name = "xmltodict"
version = "0.13.0"
description = "Makes working with XML feel like you are working with JSON"
-category = "main"
optional = false
python-versions = ">=3.4"
files = [
@@ -3657,7 +3512,6 @@ files = [
name = "y-py"
version = "0.5.9"
description = "Python bindings for the Y-CRDT built from yrs (Rust)"
-category = "dev"
optional = false
python-versions = "*"
files = [
@@ -3733,7 +3587,6 @@ files = [
name = "ypy-websocket"
version = "0.8.2"
description = "WebSocket connector for Ypy"
-category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3753,7 +3606,6 @@ test = ["mypy", "pre-commit", "pytest", "pytest-asyncio", "websockets (>=10.0)"]
name = "zipp"
version = "3.15.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -3767,5 +3619,5 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more
[metadata]
lock-version = "2.0"
-python-versions = "^3.9"
-content-hash = "80560b3ed1dc640fb5b10966688a1811f351aa968d2094567b2f0d8a62a6770a"
+python-versions = ">=3.9,<3.12"
+content-hash = "2fe07f2c6eb19f355a5dd660202faf5465ebcc36ad7beb2212588b1ec62e1ea1"
diff --git a/pyproject.toml b/pyproject.toml
index 53259f9e..5a15e8ff 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -36,8 +36,8 @@ style = "pep440"
metadata = false
[tool.poetry.dependencies]
-python = "^3.9"
-alpineer = "0.1.7"
+python = ">=3.9,<3.12"
+alpineer = ">=0.1.9"
mibi-bin-tools = "0.2.9"
ipywidgets = "^8"
numpy = "1.*"
@@ -46,7 +46,8 @@ seaborn = "^0.12"
scikit-learn = "^1"
watchdog = "^3"
tqdm = "^4"
-pandas = "^1"
+scipy = "^1.10.1"
+pandas = "^2"
[tool.poetry.group.test]
optional = true
@@ -69,6 +70,7 @@ black = "^22.10.0"
isort = "^5.10.1"
jupyterlab = "^3.6.1"
jupyter-contrib-nbextensions = "^0.7.0"
+loguru = "^0.7.0"
## TYPE CHECKING ##
diff --git a/src/toffy/bin_extraction.py b/src/toffy/bin_extraction.py
index 707c560d..3dbd400c 100644
--- a/src/toffy/bin_extraction.py
+++ b/src/toffy/bin_extraction.py
@@ -24,7 +24,6 @@ def extract_missing_fovs(
extract_intensities (bool): whether to extract intensities from the bin files
replace (bool): whether to replace pulse images with intensity
"""
-
# retrieve all fov names from base_dir and extracted fovs from extraction_dir
fovs = io_utils.remove_file_extensions(io_utils.list_files(bin_file_dir, substrs=".bin"))
extracted_fovs = io_utils.list_folders(extraction_dir, substrs="fov")
diff --git a/src/toffy/qc_comp.py b/src/toffy/qc_comp.py
index 1bf6b6cb..339b1722 100644
--- a/src/toffy/qc_comp.py
+++ b/src/toffy/qc_comp.py
@@ -1,17 +1,24 @@
import copy
+import itertools
import os
import pathlib
+import re
+from dataclasses import dataclass, field
from shutil import rmtree
-from typing import List, Optional, Union
+from typing import Dict, List, Optional, Tuple, Union
-import matplotlib.pyplot as plt
+import natsort as ns
import numpy as np
+import numpy.ma as ma
import pandas as pd
-import seaborn as sns
-import seaborn.objects as so
+import xarray as xr
from alpineer import image_utils, io_utils, load_utils, misc_utils
+from numpy.ma import MaskedArray
+from pandas.core.groupby import DataFrameGroupBy
from requests.exceptions import HTTPError
from scipy.ndimage import gaussian_filter
+from scipy.stats import rankdata
+from tqdm.auto import tqdm
from toffy import settings
from toffy.mibitracker_utils import MibiRequests, MibiTrackerError
@@ -278,7 +285,7 @@ def compute_qc_metrics(
Args:
extracted_imgs_path (str):
- the directory when extracted images are stored
+ the directory where extracted images are stored
fov_name (str):
the name of the FOV to extract from `bin_file_path`, needs to correspond with JSON name
gaussian_blur (bool):
@@ -291,8 +298,7 @@ def compute_qc_metrics(
path to save csvs of the qc metrics to
Returns:
- None | Dict[str, pd.DataFrame]:
- If save_csv is False, returns qc metrics. Otherwise, no return
+ None
"""
# path validation checks
@@ -325,10 +331,6 @@ def compute_qc_metrics_direct(image_data, fov_name, gaussian_blur=False, blur_fa
set to 0 to use raw inputs without Gaussian blurring
ignored if `gaussian_blur` set to `False`
- Returns:
- Dict[str, pd.DataFrame]:
- Returns qc metrics
-
"""
# there's only 1 FOV and 1 type ('pulse'), so subset on that
@@ -418,129 +420,500 @@ def combine_qc_metrics(qc_metrics_dir):
metric_df.to_csv(os.path.join(qc_metrics_dir, "combined_%s.csv" % ms), index=False)
-def visualize_qc_metrics(
- metric_name: str,
- qc_metric_dir: Union[str, pathlib.Path],
- save_dir: Union[str, pathlib.Path],
- channel_filters: Optional[List[str]] = ["chan_"],
- axes_font_size: int = 16,
- wrap: int = 6,
- dpi: int = 300,
- return_plot: bool = False,
-) -> Optional[sns.FacetGrid]:
+def format_img_data(img_data):
+ """Formats the image array from load_imgs_from_tree to be same structure as the array returned
+ by extract_bin_files. Works for one FOV data at a time.
+ Args:
+ img_data (str): current image data array as produced by load function
+ Returns:
+ xarray.DataArray: image data array with shape [fov, type, x, y, channel]
+ """
+
+ # add type dimension
+ img_data = img_data.assign_coords(type="pulse")
+ img_data = img_data.expand_dims("type", 1)
+
+ # edit dimension names
+ img_data = img_data.rename({"fovs": "fov", "rows": "x", "cols": "y", "channels": "channel"})
+
+ return img_data
+
+
+def qc_filtering(qc_metrics: List[str]) -> Tuple[List[str], List[str]]:
+ """
+ Filters the QC columns and suffixes based on the user specified QC metrics,
+ then sorts the suffixes w.r.t the columns. Refer to `settings.py` for the
+ Column and Suffixes available.
+
+ Args:
+ qc_metrics (List[str]): A list of QC metrics to use. Options include:
+
+ - `"Non-zero mean intensity"`
+ - `"Total intensity"`
+ - `"99.9% intensity value"`
+
+
+ Returns:
+ Tuple[List[str], List[str]]: Returns the QC Columns and the QC Suffixes
+ """
+ # Filter out unused QC columns and suffixes
+ if qc_metrics is not None:
+ selected_qcs: List[bool] = [qcm in qc_metrics for qcm in settings.QC_COLUMNS]
+ qc_cols = list(itertools.compress(settings.QC_COLUMNS, selected_qcs))
+ qc_suffixes = list(itertools.compress(settings.QC_SUFFIXES, selected_qcs))
+ else:
+ qc_cols: List[str] = settings.QC_COLUMNS
+ qc_suffixes: List[str] = settings.QC_SUFFIXES
+
+ return qc_cols, qc_suffixes
+
+
+def _channel_filtering(
+ df: pd.DataFrame, channel_include: List[str] = None, channel_exclude: List[str] = None
+) -> pd.DataFrame:
"""
- Visualize the barplot of a specific QC metric.
+ Filters the DataFrame based on the included and excluded channels. In addition
+ the default ignored channels; Au, Fe, Na, Ta, Noodle, are removed.
Args:
- metric_name (str):
- The name of the QC metric to plot. Used as the y-axis label. Options include:
- `"Non-zero mean intensity"`, `"Total intensity"`, `"99.9% intensity value"`.
- qc_metric_dir (Union[str, pathlib.Path]):
- The path to the directory containing the `'combined_{qc_metric}.csv'` files
- save_dir (Optional[Union[str, pathlib.Path]], optional):
- The name of the directory to save the plot to. Defaults to None.
- channel_filters (List[str], optional):
- A list of channels to filter out.
- axes_font_size (int, optional):
- The font size of the axes labels. Defaults to 16.
- wrap (int, optional):
- The number of plots to display per row. Defaults to 6.
- dpi (Optional[int], optional):
- The resolution of the image to use for saving. Defaults to None.
- return_plot (bool):
- If `True`, this will return the plot. Defaults to `False`
-
- Raises:
- ValueError:
- When an invalid metric is provided.
- FileNotFoundError:
- The QC metric directory `qc_metric_dir` does not exist.
- FileNotFoundError:
- The QC metric `combined_csv` file is does not exist in `qc_metric_dir`.
+ df (pd.DataFrame): The DataFrame to filter.
+ channel_include (List[str], optional): A list of channels to include. Defaults to None.
+ channel_exclude (List[str], optional): A list of channels to exclude. Defaults to None.
Returns:
- Optional[sns.FacetGrid]: Returns the Seaborn FacetGrid catplot of the QC metrics.
+ pd.DataFrame: The filtered DataFrame.
"""
- # verify the metric provided is valid
- if metric_name not in settings.QC_COLUMNS:
- raise ValueError(
- "Invalid metric %s provided, must be set to 'Non-zero mean intensity', "
- "'Total intensity', or '99.9%% intensity value'" % metric_name
+
+ if (
+ isinstance(channel_include, list)
+ and isinstance(channel_exclude, list)
+ and not set(channel_exclude).isdisjoint(set(channel_include))
+ ):
+ raise ValueError("You cannot include and exclude the same channel.")
+
+ # Filter out the default ignored channels
+ df = df[~df["channel"].isin(settings.QC_CHANNEL_IGNORE)]
+
+ # Remove the excluded channels
+ # If a channel does not exist, it is ignored
+ if channel_exclude is not None:
+ df: pd.DataFrame = df[~df["channel"].isin(channel_exclude)]
+
+ # Then filter the excluded channels
+ # If a channel does not exist, it is ignored
+ if channel_include is not None:
+ df: pd.DataFrame = df[df["channel"].isin(channel_include)]
+ return df
+
+
+@dataclass
+class QCTMA:
+ """
+ Computes the QC metrics for a given list of TMAs of interest and saves TMA specific QC files
+ in the `qc_tma_metrics_dir` directory.
+
+
+ Args:
+ cohort_path (Union[str,pathlib.Path]): The directory where the extracted images are
+ stored.
+ qc_tma_metrics_dir (Union[str, pathlib.path]): The directory where to save the QC TMA
+ metrics.
+ qc_metrics (List[str]): A list of QC metrics to use. Options include:
+
+ - `"Non-zero mean intensity"`
+ - `"Total intensity"`
+ - `"99.9% intensity value"`
+
+ Attributes:
+ qc_cols (List[str]): A list of the QC columns.
+ qc_suffixes (List[str]): A list of the QC suffixes, ordered w.r.t `qc_cols`.
+ search_term (re.Pattern): The regex pattern to extract n,m from FOV names of the form RnCm.
+ tma_avg_ranks (Dict[str, xr.DataArray]): A dictionary containing the average ranks for each
+ TMA for each QC Metric in `qc_metrics`.
+ """
+
+ qc_metrics: Optional[List[str]]
+ cohort_path: Union[str, pathlib.Path]
+ metrics_dir: Union[str, pathlib.Path]
+
+ # Fields initialized after `__post_init__`
+ search_term: re.Pattern = field(init=False)
+ qc_cols: List[str] = field(init=False)
+ qc_suffixes: List[str] = field(init=False)
+
+ # Set by methods
+ tma_avg_ranks: Dict[str, xr.DataArray] = field(init=False)
+
+ def __post_init__(self):
+ # Input validation: Ensure that the paths exist
+ io_utils.validate_paths([self.cohort_path, self.metrics_dir])
+
+ self.qc_cols, self.qc_suffixes = qc_filtering(qc_metrics=self.qc_metrics)
+
+ # Create regex pattern for searching RnCm
+ self.search_term: re.Pattern = re.compile(r"R\+?(\d+)C\+?(\d+)")
+
+ # Set the tma_avg_ranks to be an empty dictionary
+ self.tma_avg_ranks = {}
+
+ def _get_r_c(self, fov_name: pd.Series) -> pd.Series:
+ """Extracts the row and column value from a FOV's name containing RnCm.
+
+ Args:
+ fov_name (pd.Series): The FOV's name.
+ Returns:
+ pd.Series: Returns `n` and `m` as a series of integers.
+ """
+ r, c = map(int, re.search(self.search_term, fov_name).group(1, 2))
+ return pd.Series([r, c])
+
+ def _create_r_c_tma_matrix(
+ self, group: DataFrameGroupBy, n_cols: int, n_rows: int, qc_col: str
+ ) -> pd.Series:
+ """
+ Ranks all FOVS for a given channel and creates a matrix of size `n_rows` by `n_cols`
+ as the TMA grid.
+
+
+ Args:
+ group (DataFrameGroupBy): Each group consists of an individual channel, and all of it's
+ associated FOVs.
+ n_cols (int): The number of columns in the matrix.
+ n_rows (int): The number of rows in the matrix.
+ qc_col (str): The column to get the the QC data.
+
+ Returns:
+ pd.Series[np.ndarray]: Returns the a series containing the ranked matrix.
+ """
+
+ rc_array: np.ndarray = np.full(shape=(n_cols, n_rows), fill_value=np.nan)
+ rc_array[group["column"] - 1, group["row"] - 1] = group[qc_col].rank()
+
+ return pd.Series([rc_array])
+
+ def compute_qc_tma_metrics(self, tmas: List[str]):
+ """
+ Calculates the QC metrics for a user specified list of TMAs.
+
+ Args:
+ tmas (List[str]): The FOVs with the TMA in the folder name to gather.
+ """
+ with tqdm(
+ total=len(tmas), desc="Computing QC TMA Metrics", unit="TMA", leave=True
+ ) as tma_pbar:
+ for tma in tmas:
+ self._compute_qc_tma_metrics(tma=tma)
+ tma_pbar.set_postfix(TMA=tma)
+ tma_pbar.update(n=1)
+
+ def _compute_qc_tma_metrics(self, tma: str):
+ """
+ Computes the FOV QC metrics for all FOVs in a given TMA.
+ If the QC metrics have already been computed, then
+
+ Args:
+ tma (str): The TMA to compute the QC metrics for.
+ """
+
+ # cannot use `io_utils.list_folders` because it cannot do a partial "exact match"
+ # i.e. if we want to match `tma_1_Rn_Cm` but not `tma_10_Rn_Cm`, `io_utils.list_folders`
+ # will return both for `tma_1`
+ fovs: List[str] = ns.natsorted(
+ seq=(p.name for p in pathlib.Path(self.cohort_path).glob(f"{tma}_*"))
)
- # verify the path to the QC metric datasets exist
- if not os.path.exists(qc_metric_dir):
- raise FileNotFoundError("qc_metric_dir %s does not exist" % qc_metric_dir)
+ # Compute the QC metrics
+ with tqdm(fovs, desc="Computing QC Metrics", unit="FOV", leave=False) as pbar:
+ for fov in pbar:
+ # Gather the qc tma files for the current fov if they exist
+ pre_computed_metrics = filter(
+ lambda f: "combined" not in f,
+ io_utils.list_files(
+ dir_name=self.metrics_dir,
+ substrs=[f"{fov}_{qc_suffix}.csv" for qc_suffix in self.qc_suffixes],
+ ),
+ )
- # get the file name of the combined QC metric .csv file to use
- qc_metric_index = settings.QC_COLUMNS.index(metric_name)
- qc_metric_suffix = settings.QC_SUFFIXES[qc_metric_index]
- qc_metric_path = os.path.join(qc_metric_dir, "combined_%s.csv" % qc_metric_suffix)
+ # only compute if any QC files are missing for the current fov
+ if len(list(pre_computed_metrics)) != len(self.qc_cols):
+ compute_qc_metrics(
+ extracted_imgs_path=self.cohort_path,
+ fov_name=fov,
+ save_csv=self.metrics_dir,
+ )
+ pbar.set_postfix(FOV=fov, status="Computing")
+ else:
+ pbar.set_postfix(FOV=fov, status="Already Computed")
+
+ # Generate the combined metrics for each TMA
+ for qc_suffix in self.qc_suffixes:
+ metric_files: List[str] = ns.natsorted(
+ (
+ io_utils.list_files(
+ dir_name=self.metrics_dir,
+ substrs=[f"{fov}_{qc_suffix}.csv" for fov in fovs],
+ )
+ )
+ )
+
+ # Define an aggregated metric DataFrame
+ combined_metric_tissue_df: pd.DataFrame = pd.concat(
+ (pd.read_csv(os.path.join(self.metrics_dir, mf)) for mf in metric_files)
+ )
+
+ combined_metric_tissue_df.to_csv(
+ os.path.join(self.metrics_dir, f"{tma}_combined_{qc_suffix}.csv"),
+ index=False,
+ )
- # ensure the user set the right qc_metric_dir
- if not os.path.exists(qc_metric_path):
- raise FileNotFoundError(
- "Could not locate %s, ensure qc_metric_dir is correct" % qc_metric_path
+ def qc_tma_metrics_rank(self, tmas: List[str], channel_exclude: List[str] = None):
+ """
+ Creates the average rank for a given TMA across all FOVs and unexcluded channels.
+ By default the following channels are excluded: Au, Fe, Na, Ta, Noodle.
+
+
+ Args:
+ tmas (List[str]): The FOVs withmetet the TMA in the folder name to gather.
+ channel_exclude (List[str], optional): An optional list of channels to further filter
+ out. Defaults to None.
+ """
+
+ with tqdm(total=len(tmas), desc="Computing QC TMA Metric Ranks", unit="TMA") as pbar:
+ for tma in tmas:
+ self.tma_avg_ranks[tma] = self._compute_qc_tma_metrics_rank(
+ tma, channel_exclude=channel_exclude
+ )
+ pbar.set_postfix(TMA=tma)
+ pbar.update()
+
+ def _compute_qc_tma_metrics_rank(
+ self,
+ tma: str,
+ channel_exclude: List[str] = None,
+ ) -> xr.DataArray:
+ """
+ Creates the average rank for a given TMA across all FOVs and unexcluded channels.
+ By default the following channels are excluded: Au, Fe, Na, Ta, Noodle.
+
+
+ Args:
+ tma (str): The TMA to compute the average rank for.
+ channel_exclude (List[str], optional): An optional list of channels to further filter
+ out. Defaults to None.
+
+ Returns:
+ xr.DataArray: An xarray DataArray containing the average rank for each channel across
+ a TMA.
+ """
+
+ # Sort the loaded combined csv files based on the filtered `qc_suffixes`
+ combined_metric_tmas: List[str] = ns.natsorted(
+ io_utils.list_files(self.metrics_dir, substrs=f"{tma}_combined"),
+ key=lambda tma_mf: (i for i, qc_s in enumerate(self.qc_suffixes) if qc_s in tma_mf),
)
- # read in the QC metric data
- qc_metric_df = pd.read_csv(qc_metric_path)
-
- # filter out naturally-occurring elements as well as Noodle
- qc_metric_df = qc_metric_df[~qc_metric_df["channel"].isin(settings.QC_CHANNEL_IGNORE)]
-
- # filter out any channel in the channel_filters list
- if channel_filters is not None:
- qc_metric_df: pd.DataFrame = qc_metric_df[
- ~qc_metric_df["channel"].str.contains("|".join(channel_filters))
- ]
-
- # catplot allows for easy facets on a barplot
- qc_fg: sns.FacetGrid = sns.catplot(
- x="fov",
- y=metric_name,
- col="channel",
- col_wrap=wrap,
- data=qc_metric_df,
- kind="bar",
- color="black",
- sharex=True,
- sharey=False,
- )
+ ranked_channels_matrix = []
+ n_cols: int = None
+ n_rows: int = None
- # remove the 'channel =' in each subplot title
- qc_fg.set_titles(template="{col_name}")
- qc_fg.figure.supxlabel(t="fov", x=0.5, y=0, ha="center", size=axes_font_size)
- qc_fg.figure.supylabel(t=f"{metric_name}", x=0, y=0.5, va="center", size=axes_font_size)
- qc_fg.set(xticks=[])
+ for cmt, qc_col in zip(combined_metric_tmas, self.qc_cols):
+ # Open and filter the default ignored channels, along with the user specified channels
+ cmt_df: pd.DataFrame = _channel_filtering(
+ df=pd.read_csv(os.path.join(self.metrics_dir, cmt)), channel_exclude=channel_exclude
+ )
- # per Erin's visualization remove the default axis title on the y-axis
- # and instead show 'fov' along x-axis and the metric name along the y-axis (overarching)
- qc_fg.set_axis_labels(x_var="", y_var="")
- qc_fg.set_xticklabels([])
+ cmt_df[["column", "row"]] = cmt_df["fov"].apply(self._get_r_c)
- # save the figure always
- # Return the figure if specified.
- qc_fg.savefig(os.path.join(save_dir, f"{metric_name}_barplot_stats.png"), dpi=dpi)
+ # Get matrix dimensions
+ n_cols = cmt_df["column"].max()
+ n_rows = cmt_df["row"].max()
- if return_plot:
- return qc_fg
+ # Rank all FOVs per channel, and then create the heatmap matrix
+ ranked_channel_tmas: pd.DataFrame = cmt_df.groupby(by="channel", sort=True).apply(
+ lambda group: self._create_r_c_tma_matrix(group, n_cols, n_rows, qc_col)
+ )
+ ranked_channel_matrices: np.ndarray = np.array(
+ [c_tma[0] for c_tma in ranked_channel_tmas.values],
+ )
+ avg_rank = np.mean(ranked_channel_matrices, axis=0)
+
+ ranked_channels_matrix.append(avg_rank)
+
+ return xr.DataArray(
+ data=np.stack(ranked_channels_matrix),
+ coords=[self.qc_cols, np.arange(n_cols), np.arange(n_rows)],
+ dims=["qc_col", "cols", "rows"],
+ )
+
+
+@dataclass
+class QCControlMetrics:
+ """
+ Computes QC Metrics for a set of control sample FOVs across various runs, and saves the QC
+ files in the `longitudinal_control_metrics_dir`.
-def format_img_data(img_data):
- """Formats the image array from load_imgs_from_tree to be same structure as the array returned
- by extract_bin_files. Works for one FOV data at a time.
Args:
- img_data (str): current image data array as produced by load function
- Returns:
- xarray.DataArray: image data array with shape [fov, type, x, y, channel]
+ cohort_path (Union[str,pathlib.Path]): The directory where the extracted images are
+ stored for the control FOVs.
+ longitudinal_control_metrics_dir (Union[str, pathlib.Path]): The directory where to save
+ the QC Control metrics.
+ qc_metrics (List[str]): A list of QC metrics to use. Options include:
+
+ - `"Non-zero mean intensity"`
+ - `"Total intensity"`
+ - `"99.9% intensity value"`
+
+ Attributes:
+ qc_cols (List[str]): A list of the QC columns.
+ qc_suffixes (List[str]): A list of the QC suffixes, ordered w.r.t `qc_cols`.
"""
- # add type dimension
- img_data = img_data.assign_coords(type="pulse")
- img_data = img_data.expand_dims("type", 1)
+ qc_metrics: Optional[List[str]]
+ cohort_path: Union[str, pathlib.Path]
+ metrics_dir: Union[str, pathlib.Path]
+
+ # Fields initialized after `__post_init__`
+ qc_cols: List[str] = field(init=False)
+ qc_suffixes: List[str] = field(init=False)
+ longitudinal_control_metrics: Dict[Tuple[str, str], pd.DataFrame] = field(init=False)
+
+ def __post_init__(self):
+ # Input validation: Ensure that the paths exist
+ io_utils.validate_paths([self.cohort_path, self.metrics_dir])
+
+ self.qc_cols, self.qc_suffixes = qc_filtering(qc_metrics=self.qc_metrics)
+
+ self.longitudinal_control_metrics = {}
+
+ def compute_control_qc_metrics(
+ self,
+ control_sample_name: str,
+ fovs: List[str],
+ channel_exclude: List[str] = None,
+ channel_include: List[str] = None,
+ ) -> None:
+ """
+ Computes QC metrics for a set of Control Sample FOVs and saves their QC files in the
+ `longitudinal_control_metrics_dir`. Calculates the following metrics for the specified
+ control samples:
+ - `"Non-zero mean intensity"`
+ - `"Total intensity"`
+ - `"99.9% intensity value"`
+
+ Args:
+ control_sample_name (str): An identifier for naming the control sample.
+ fovs (List[str]): A list of control samples to find QC metrics for.
+ channel_exclude (List[str], optional): A list of channels to exclude. Defaults to None.
+ channel_include (List[str], optional): A list of channels to include. Defaults to None.
+
+
+ Raises:
+ ValueError: Errors if `tissues` is either None, or a list of size 0.
+ """
+ if fovs is None or not isinstance(fovs, list):
+ raise ValueError("The tissues must be specified as a list of strings")
+
+ with tqdm(
+ total=len(fovs),
+ desc=f"Computing QC Longitudinal Control metrics - {control_sample_name}",
+ unit="FOVs",
+ ) as pbar:
+ for fov in ns.natsorted(fovs):
+ # Gather the qc files for the current fov if they exist
+ pre_computed_metrics = filter(
+ lambda f: "combined" not in f,
+ io_utils.list_files(
+ dir_name=self.metrics_dir,
+ substrs=[f"{fov}_{qc_suffix}.csv" for qc_suffix in self.qc_suffixes],
+ ),
+ )
- # edit dimension names
- img_data = img_data.rename({"fovs": "fov", "rows": "x", "cols": "y", "channels": "channel"})
+ if len(list(pre_computed_metrics)) != len(self.qc_cols):
+ compute_qc_metrics(
+ extracted_imgs_path=self.cohort_path,
+ fov_name=fov,
+ save_csv=self.metrics_dir,
+ )
+ pbar.set_postfix(FOV=fov, status="Computing")
+ else:
+ pbar.set_postfix(FOV=fov, status="Already Computed")
+ pbar.update()
+
+ # Combine metrics for the set of FOVs into a single file per QC metric
+ for qc_col, qc_suffix in zip(self.qc_cols, self.qc_suffixes):
+ metric_files = filter(
+ lambda f: "combined" not in f,
+ io_utils.list_files(
+ dir_name=self.metrics_dir,
+ substrs=[f"{fov}_{qc_suffix}.csv" for fov in fovs],
+ ),
+ )
- return img_data
+ # Define an aggregated metric DataFrame, and filter channels
+ combined_lc_df: pd.DataFrame = _channel_filtering(
+ df=pd.concat(
+ (pd.read_csv(os.path.join(self.metrics_dir, mf)) for mf in metric_files),
+ ),
+ channel_include=channel_include,
+ channel_exclude=channel_exclude,
+ )
+
+ self.longitudinal_control_metrics.update(
+ {(control_sample_name, qc_col): combined_lc_df}
+ )
+
+ combined_lc_df.to_csv(
+ os.path.join(self.metrics_dir, f"{control_sample_name}_combined_{qc_suffix}.csv"),
+ index=False,
+ )
+
+ def transformed_control_effects_data(
+ self, control_sample_name: str, qc_metric: str
+ ) -> pd.DataFrame:
+ """
+ Creates a transformed DataFrame for the Longitudinal Control effects data, normalizing by the mean,
+ then taking the `log2` of each value.
+
+ Args:
+ control_sample_name (str): A control sample to tranform the longitudinal control effects for.
+ qc_metric (str): The metric to transform.
+
+ Returns:
+ pd.DataFrame: The transformed QC Longitudinal Control data.
+ """
+ misc_utils.verify_in_list(user_metric=qc_metric, qc_metrics=self.qc_cols)
+
+ try:
+ df: pd.DataFrame = self.longitudinal_control_metrics[control_sample_name, qc_metric]
+ except KeyError:
+ # A qc file which isn't stored in the longitudinal_control_metrics dictionary, try to load it
+ # in if it exists as a file
+ df: pd.DataFrame = pd.read_csv(
+ os.path.join(
+ self.metrics_dir,
+ f"{control_sample_name}_combined_{self.qc_suffixes[self.qc_cols.index(qc_metric)]}.csv",
+ )
+ )
+ except FileNotFoundError as e:
+ raise FileNotFoundError(
+ f"QC Metric Not Found for the Control Sample {control_sample_name}"
+ ) from e
+
+ # Apply a log2 transformation to the mean normalized data.
+ log2_norm_df: pd.DataFrame = df.pivot(
+ index="channel", columns="fov", values=qc_metric
+ ).transform(func=lambda row: np.log2(row / row.mean()), axis=1)
+
+ mean_log2_norm_df: pd.DataFrame = (
+ log2_norm_df.mean(axis=0)
+ .to_frame(name="mean")
+ .transpose()
+ .sort_values(by="mean", axis=1)
+ )
+
+ transformed_df: pd.DataFrame = pd.concat(
+ objs=[log2_norm_df, mean_log2_norm_df]
+ ).sort_values(by="mean", axis=1, inplace=False)
+
+ return transformed_df
diff --git a/src/toffy/qc_metrics_plots.py b/src/toffy/qc_metrics_plots.py
index 058634ca..0cd91afa 100644
--- a/src/toffy/qc_metrics_plots.py
+++ b/src/toffy/qc_metrics_plots.py
@@ -1,87 +1,338 @@
+import os
+import pathlib
+from typing import List, Optional, Union
+
+import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
+import natsort as ns
+import numpy as np
import pandas as pd
import seaborn as sns
-from alpineer import io_utils, load_utils
+from matplotlib import cm
+from matplotlib.axes import Axes
+from matplotlib.colors import ListedColormap, Normalize
+from matplotlib.figure import Figure
+from tqdm.auto import tqdm
+
+from toffy import settings
+from toffy.qc_comp import QCTMA, QCControlMetrics
-from toffy import qc_comp
+def visualize_qc_metrics(
+ metric_name: str,
+ qc_metric_dir: Union[str, pathlib.Path],
+ save_dir: Union[str, pathlib.Path],
+ channel_filters: Optional[List[str]] = ["chan_"],
+ axes_font_size: int = 16,
+ wrap: int = 6,
+ dpi: int = 300,
+ return_plot: bool = False,
+) -> Optional[sns.FacetGrid]:
+ """
+ Visualize the barplot of a specific QC metric.
+
+ Args:
+ metric_name (str):
+ The name of the QC metric to plot. Used as the y-axis label. Options include:
+ `"Non-zero mean intensity"`, `"Total intensity"`, `"99.9% intensity value"`.
+ qc_metric_dir (Union[str, pathlib.Path]):
+ The path to the directory containing the `'combined_{qc_metric}.csv'` files
+ save_dir (Optional[Union[str, pathlib.Path]], optional):
+ The name of the directory to save the plot to. Defaults to None.
+ channel_filters (List[str], optional):
+ A list of channels to filter out.
+ axes_font_size (int, optional):
+ The font size of the axes labels. Defaults to 16.
+ wrap (int, optional):
+ The number of plots to display per row. Defaults to 6.
+ dpi (Optional[int], optional):
+ The resolution of the image to use for saving. Defaults to None.
+ return_plot (bool):
+ If `True`, this will return the plot. Defaults to `False`
-def call_violin_swarm_plot(plotting_df, fig_label, figsize=(20, 3), fig_dir=None):
- """Makes violin plot with swarm dots. Used with make_batch_effect_plot()
+ Raises:
+ ValueError:
+ When an invalid metric is provided.
+ FileNotFoundError:
+ The QC metric directory `qc_metric_dir` does not exist.
+ FileNotFoundError:
+ The QC metric `combined_csv` file is does not exist in `qc_metric_dir`.
- Args: plotting_df (pandas dataframe): "sample", "channel", "tma", "99.9th_percentile"
- figsize (tuple): (length x width) of figsize
- fig_dir (str): Dir to save plots.
+ Returns:
+ Optional[sns.FacetGrid]: Returns the Seaborn FacetGrid catplot of the QC metrics.
"""
- plt.figure(figsize=figsize)
- ax = sns.violinplot(
- x="channel",
- y="99.9th_percentile",
- data=plotting_df,
- inner=None,
- scale="width",
- color="gray",
- )
- ax = sns.swarmplot(
- x="channel",
- y="99.9th_percentile",
- data=plotting_df,
- edgecolor="black",
- hue="tma",
- palette="tab20",
+ # verify the metric provided is valid
+ if metric_name not in settings.QC_COLUMNS:
+ raise ValueError(
+ "Invalid metric %s provided, must be set to 'Non-zero mean intensity', "
+ "'Total intensity', or '99.9%% intensity value'" % metric_name
+ )
+
+ # verify the path to the QC metric datasets exist
+ if not os.path.exists(qc_metric_dir):
+ raise FileNotFoundError("qc_metric_dir %s does not exist" % qc_metric_dir)
+
+ # get the file name of the combined QC metric .csv file to use
+ qc_metric_index = settings.QC_COLUMNS.index(metric_name)
+ qc_metric_suffix = settings.QC_SUFFIXES[qc_metric_index]
+ qc_metric_path = os.path.join(qc_metric_dir, "combined_%s.csv" % qc_metric_suffix)
+
+ # ensure the user set the right qc_metric_dir
+ if not os.path.exists(qc_metric_path):
+ raise FileNotFoundError(
+ "Could not locate %s, ensure qc_metric_dir is correct" % qc_metric_path
+ )
+
+ # read in the QC metric data
+ qc_metric_df = pd.read_csv(qc_metric_path)
+
+ # filter out naturally-occurring elements as well as Noodle
+ qc_metric_df = qc_metric_df[~qc_metric_df["channel"].isin(settings.QC_CHANNEL_IGNORE)]
+
+ # filter out any channel in the channel_filters list
+ if channel_filters is not None:
+ qc_metric_df: pd.DataFrame = qc_metric_df[
+ ~qc_metric_df["channel"].str.contains("|".join(channel_filters))
+ ]
+
+ # catplot allows for easy facets on a barplot
+ qc_fg: sns.FacetGrid = sns.catplot(
+ x="fov",
+ y=metric_name,
+ col="channel",
+ col_wrap=wrap,
+ data=qc_metric_df,
+ kind="bar",
+ color="black",
+ sharex=True,
+ sharey=False,
)
- ax.set_title(fig_label)
- plt.xticks(rotation=45)
- if fig_dir:
- plt.savefig(fig_dir + fig_label + "_batch_effects.png", dpi=300)
- return ax
-
-
-def make_batch_effect_plot(
- data_dir,
- normal_tissues,
- exclude_channels=None,
- img_sub_folder=None,
- qc_metric="99.9th_percentile",
- fig_dir=None,
-):
- """Makes violin plots based on tissue type. Calls call_violin_swarm_plot.
+
+ # remove the 'channel =' in each subplot title
+ qc_fg.set_titles(template="{col_name}")
+ qc_fg.figure.supxlabel(t="fov", x=0.5, y=0, ha="center", size=axes_font_size)
+ qc_fg.figure.supylabel(t=f"{metric_name}", x=0, y=0.5, va="center", size=axes_font_size)
+ qc_fg.set(xticks=[])
+
+ # per Erin's visualization remove the default axis title on the y-axis
+ # and instead show 'fov' along x-axis and the metric name along the y-axis (overarching)
+ qc_fg.set_axis_labels(x_var="", y_var="")
+ qc_fg.set_xticklabels([])
+
+ # save the figure always
+ # Return the figure if specified.
+ qc_fg.savefig(os.path.join(save_dir, f"{metric_name}_barplot_stats.png"), dpi=dpi)
+
+ if return_plot:
+ return qc_fg
+
+
+def qc_tmas_metrics_plot(
+ qc_tmas: QCTMA,
+ tmas: List[str],
+ save_figure: bool = False,
+ dpi: int = 300,
+) -> None:
+ """
+ Produces the QC TMA metrics plot for a given set of QC metrics applied to a user specified
+ TMA. The figures are saved in `qc_tma_metrics_dir/figures`.
Args:
- normal_tissues (str): is a list of the tissue type substring to match
- exclude_channels (str): is a list of channels to not plot
- img_sub_folder (str): in case theres additional sub folder structure
- qc_metric (str): Type of qc_metric. Currently only 99.9th percentile.
+ qc_tmas (QCTMA): The class which contains the QC TMA data, filepaths, and methods.
+ QC matrix.
+ tma (str): The TMAs to plot the QC metrics for.
+ save_figure (bool, optional): If `True`, the figure is saved in a subdirectory in the
+ `QCTMA.qc_tma_metrics_dir` directory. Defaults to `False`.
+ dpi (int, optional): Dots per inch, the resolution of the image. Defaults to 300.
+ """
+
+ if save_figure:
+ fig_dir: pathlib.Path = pathlib.Path(qc_tmas.metrics_dir) / "figures"
+ fig_dir.mkdir(parents=True, exist_ok=True)
+ with tqdm(total=len(tmas), desc="Plotting QC TMA Metric Ranks", unit="TMAs") as pbar:
+ for tma in tmas:
+ _qc_tma_metrics_plot(qc_tmas, tma, fig_dir=fig_dir, save_figure=save_figure, dpi=dpi)
+ pbar.set_postfix(TMA=tma)
+ pbar.update(n=1)
+
+
+def _qc_tma_metrics_plot(
+ qc_tmas: QCTMA,
+ tma: str,
+ fig_dir: pathlib.Path,
+ save_figure: bool = False,
+ dpi: int = 300,
+) -> None:
"""
- for i in range(len(normal_tissues)):
- samples = io_utils.list_folders(dir_name=data_dir, substrs=normal_tissues[i])
- data = load_utils.load_imgs_from_tree(
- data_dir=data_dir, img_sub_folder=img_sub_folder, fovs=samples
+ Produces the QC TMA metrics plot for a given set of QC metrics applied to a user specified
+ TMA. The figures are saved in `qc_tma_metrics_dir/figures`.
+
+ Args:
+ qc_tmas (QCTMA): The class which contains the QC TMA data, filepaths, and methods.
+ tma (str): The TMA to plot the metrics for.
+ save_figure (bool, optional): If `True`, the figure is saved in a subdirectory in the
+ `qc_tma_metrics_dir` directory. Defaults to `False`.
+ dpi (int, optional): Dots per inch, the resolution of the image. Defaults to 300.
+ """
+
+ for qc_metric, suffix in zip(qc_tmas.qc_cols, qc_tmas.qc_suffixes):
+ qc_tma_data: np.ndarray = qc_tmas.tma_avg_ranks[tma].loc[qc_metric].values
+
+ # Set up the Figure for multiple axes
+ fig: Figure = plt.figure(dpi=dpi)
+ fig.set_layout_engine(layout="constrained")
+ gs = gridspec.GridSpec(1, 2, figure=fig, wspace=0.05)
+ fig.suptitle(f"{tma} - {qc_metric}")
+
+ # Heatmap
+ ax_heatmap: Axes = fig.add_subplot(gs[0, 0])
+ sns.heatmap(
+ data=qc_tma_data,
+ square=True,
+ ax=ax_heatmap,
+ linewidths=1,
+ linecolor="black",
+ cbar_kws={"shrink": 0.5},
+ annot=True,
+ cmap=sns.color_palette(palette="Blues", as_cmap=True),
+ )
+ # Set ticks
+ ax_heatmap.set_xticks(
+ ticks=ax_heatmap.get_xticks(),
+ labels=[f"{i+1}" for i in range(qc_tma_data.shape[1])],
+ rotation=0,
+ )
+
+ ax_heatmap.set_yticks(
+ ticks=ax_heatmap.get_yticks(),
+ labels=[f"{i+1}" for i in range(qc_tma_data.shape[0])],
+ rotation=0,
)
- channels = list(data.channels.values)
- if exclude_channels:
- channels = [x for x in channels if x not in exclude_channels]
-
- # i could add a separate function to produce the plotting_df that is testable
- plotting_df = pd.DataFrame(columns=["sample", "channel", "tma", "99.9th_percentile"])
-
- for j in range(len(channels)):
- qc_metrics_per_channel = []
-
- for k in range(len(samples)):
- tma = [x for x in samples[k].split("_") if "TMA" in x][0]
- qc_metrics_per_channel += [
- [
- normal_tissues[i],
- channels[j],
- tma,
- qc_comp.compute_99_9_intensity(data.loc[samples[k], :, :, channels[j]]),
- ]
- ]
-
- plotting_df = plotting_df.append(
- pd.DataFrame(qc_metrics_per_channel, columns=plotting_df.columns)
+
+ ax_heatmap.set_xlabel("Column")
+ ax_heatmap.set_ylabel("Row")
+ ax_heatmap.set_title("Average Rank")
+
+ # Histogram
+ ax_hist: Axes = fig.add_subplot(gs[0, 1])
+ sns.histplot(qc_tma_data.ravel(), ax=ax_hist, bins=10)
+ ax_hist.set(xlabel="Average Rank", ylabel="Count")
+ ax_hist.set_title("Average Rank Distribution")
+
+ if save_figure:
+ fig.savefig(
+ fname=fig_dir / f"{tma}_{suffix}.png",
+ dpi=dpi,
+ bbox_inches="tight",
)
+ plt.close(fig)
+
+
+def longitudinal_control_heatmap(
+ qc_control: QCControlMetrics,
+ control_sample_name: str,
+ save_figure: bool = False,
+ dpi: int = 300,
+) -> None:
+ """
+ Generates a heatmap of the QC metrics for the QC Control FOVs.
+
+ Args:
+ qc_control (QCControlMetrics): The class which contains the QC LC data, filepaths
+ , and methods.
+ control_sample_name (List[str]): A list of tissues to plot the QC metrics for.
+ save_figure (bool, optional): If `True`, the figure is saved in a subdirectory in the
+ `longitudinal_control_metrics_dir` directory. Defaults to `False`.
+ dpi (int, optional): Dots per inch, the resolution of the image. Defaults to 300.
+
+ Raises:
+ ValueError: Raised when the input tissues are not a list of strings.
+ """
+ if control_sample_name is None or not isinstance(control_sample_name, str):
+ raise ValueError("The control sample name must be string.")
+ if save_figure:
+ fig_dir: pathlib.Path = pathlib.Path(qc_control.metrics_dir) / "figures"
+ fig_dir.mkdir(parents=True, exist_ok=True)
+
+ for qc_col, qc_suffix in zip(qc_control.qc_cols, qc_control.qc_suffixes):
+ t_df: pd.DataFrame = qc_control.transformed_control_effects_data(
+ control_sample_name=control_sample_name, qc_metric=qc_col
+ )
- call_violin_swarm_plot(plotting_df, fig_label=normal_tissues[i], fig_dir=fig_dir)
+ # Set up the Figure for multiple axes
+ fig: Figure = plt.figure(figsize=(12, 12), dpi=dpi)
+ fig.set_layout_engine(layout="constrained")
+ gs = gridspec.GridSpec(nrows=2, ncols=1, figure=fig, height_ratios=[len(t_df.index) - 1, 1])
+
+ # Colorbar Normalization
+ _norm = Normalize(vmin=-1, vmax=1)
+ _cmap = sns.color_palette("vlag", as_cmap=True)
+
+ fig.suptitle(f"{control_sample_name} - QC: {qc_col}")
+
+ # Heatmap
+ ax_heatmap: Axes = fig.add_subplot(gs[0, 0])
+
+ sns.heatmap(
+ t_df[~t_df.index.isin(["mean"])],
+ ax=ax_heatmap,
+ linewidths=1,
+ linecolor="black",
+ cbar_kws={"shrink": 0.5},
+ annot=True,
+ xticklabels=False,
+ norm=_norm,
+ cmap=_cmap,
+ )
+
+ # cbar title
+ ax_heatmap.collections[0].colorbar.ax.set_title(r"$\log_2(QC)$")
+
+ # Axes labels, and ticks
+ ax_heatmap.set_yticks(
+ ticks=ax_heatmap.get_yticks(),
+ labels=ax_heatmap.get_yticklabels(),
+ rotation=0,
+ )
+ ax_heatmap.set_xlabel(None)
+
+ # Averaged values
+ ax_avg: Axes = fig.add_subplot(gs[1, 0])
+
+ sns.heatmap(
+ data=t_df[t_df.index.isin(["mean"])],
+ ax=ax_avg,
+ linewidths=1,
+ linecolor="black",
+ annot=True,
+ fmt=".2f",
+ cmap=ListedColormap(["white"]),
+ cbar=False,
+ )
+ ax_avg.set_yticks(
+ ticks=ax_avg.get_yticks(),
+ labels=["Mean"],
+ rotation=0,
+ )
+ ax_avg.set_xticks(
+ ticks=ax_avg.get_xticks(),
+ labels=ax_avg.get_xticklabels(),
+ rotation=45,
+ ha="right",
+ rotation_mode="anchor",
+ )
+ ax_heatmap.set_ylabel("Channel")
+ ax_avg.set_xlabel("FOV")
+
+ # Save figure
+ if save_figure:
+ fig.savefig(
+ fname=pathlib.Path(qc_control.metrics_dir)
+ / "figures"
+ / f"{control_sample_name}_heatmap_{qc_suffix}.png",
+ dpi=dpi,
+ bbox_inches="tight",
+ )
+ plt.show()
+ plt.close(fig)
diff --git a/src/toffy/rosetta.py b/src/toffy/rosetta.py
index 0cb7d3a0..6e714a60 100644
--- a/src/toffy/rosetta.py
+++ b/src/toffy/rosetta.py
@@ -1,5 +1,4 @@
import copy
-import json
import os
import random
import shutil
diff --git a/src/toffy/watcher_callbacks.py b/src/toffy/watcher_callbacks.py
index d288016a..aad6836b 100644
--- a/src/toffy/watcher_callbacks.py
+++ b/src/toffy/watcher_callbacks.py
@@ -1,6 +1,5 @@
import inspect
import os
-import platform
from dataclasses import dataclass, field
from typing import Iterable
@@ -9,7 +8,6 @@
matplotlib.use("Agg")
-import matplotlib.pyplot as plt
import pandas as pd
import xarray as xr
from alpineer import misc_utils
@@ -19,8 +17,9 @@
from toffy.image_stitching import stitch_images
from toffy.mph_comp import combine_mph_metrics, compute_mph_metrics, visualize_mph
from toffy.normalize import write_mph_per_mass
-from toffy.qc_comp import combine_qc_metrics, compute_qc_metrics_direct, visualize_qc_metrics
-from toffy.settings import QC_COLUMNS, QC_SUFFIXES
+from toffy.qc_comp import combine_qc_metrics, compute_qc_metrics_direct
+from toffy.qc_metrics_plots import visualize_qc_metrics
+from toffy.settings import QC_COLUMNS
RUN_PREREQUISITES = {
"plot_qc_metrics": set(["generate_qc"]),
diff --git a/templates/3c_generate_qc_metrics.ipynb b/templates/3c_generate_qc_metrics.ipynb
index 746a7152..b93afd59 100644
--- a/templates/3c_generate_qc_metrics.ipynb
+++ b/templates/3c_generate_qc_metrics.ipynb
@@ -1,6 +1,7 @@
{
"cells": [
{
+ "attachments": {},
"cell_type": "markdown",
"id": "78c18a71",
"metadata": {},
@@ -9,6 +10,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "cf556c06-55eb-4ce1-a040-cb5260379244",
"metadata": {},
@@ -26,11 +28,12 @@
"import os\n",
"import natsort as ns\n",
"\n",
- "from toffy import qc_comp\n",
+ "from toffy import qc_comp, qc_metrics_plots\n",
"from alpineer import io_utils"
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "e764f21a",
"metadata": {},
@@ -39,6 +42,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "54dae734",
"metadata": {},
@@ -62,6 +66,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "2572f3e4",
"metadata": {},
@@ -89,6 +94,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "58f57192",
"metadata": {},
@@ -124,6 +130,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "87e82396",
"metadata": {
@@ -145,6 +152,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "25542275-207a-44d2-b315-358f9759c221",
"metadata": {},
@@ -205,7 +213,7 @@
],
"source": [
"# visualize the QC stats\n",
- "qc_comp.visualize_qc_metrics(\n",
+ "qc_metrics_plots.visualize_qc_metrics(\n",
" qc_metric,\n",
" qc_out_dir,\n",
" axes_font_size=16,\n",
diff --git a/templates/6_tma_batch_qc_metrics.ipynb b/templates/6_tma_batch_qc_metrics.ipynb
new file mode 100644
index 00000000..5a24c7c4
--- /dev/null
+++ b/templates/6_tma_batch_qc_metrics.ipynb
@@ -0,0 +1,545 @@
+{
+ "cells": [
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Computing TMA and Cohort-wise QC Metrics Notebook"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This notebook requires that you run `5_rename_and_reorganize.ipynb` beforehand. After you have your reorganized data, it may be useful to investigate if there are any widespread issues for TMAs and control tissues.\n",
+ "\n",
+ "The purpose of this notebook is to run QC checks on the following conditions:\n",
+ "- FOVs across a TMA\n",
+ "- Across various Samples for a control Tissue\n",
+ "\n",
+ "There are two parts which can be done in any order, depending on which type of QC effects are of interest to you."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "from toffy import qc_comp, qc_metrics_plots"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## QC TMA Metrics"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can utilize QC Metrics to validate that are no spatial biases across your TMAs, or if they do exist, identify where they are most prevalent."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 0. Prerequisites"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In order to use the QC TMA Metrics functionality, you need to have run `5_rename_and_reorganize.ipynb` beforehand. In addition, each FOV within the cohort should be suffixed with the Row number and Column number it's associated TMA.\n",
+ "\n",
+ "For example, use Notebook 5 to combine, reorganize and rename the runs to something akin to `MY_COHORT_TMA1_R1C1` and `MY_COHORT_TMA11_R10C11`.\n",
+ "\n",
+ "To make use of the QC TMA Metrics, your cohort should look like something below:\n",
+ "\n",
+ "\n",
+ "```sh\n",
+ "my_cohort_tmas/\n",
+ "├── MY_COHORT_TMA1_R1C1/\n",
+ "├── MY_COHORT_TMA1_R1C2/\n",
+ "├── ...\n",
+ "├── MY_COHORT_TMA2_R1C2/\n",
+ "├── ...\n",
+ "├── MY_COHORT_TMA2_R7C10/\n",
+ "├── ...\n",
+ "└── MY_COHORT_TMA11_R11C10/\n",
+ "```\n",
+ "\n",
+ "It is **necessary** that the Row number and Column number values are the suffixes for each FOV."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 1. Select QC Metrics and TMAs"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Specify the name of the relevant folders:\n",
+ "- `cohort_path`: The path to the cohort containing ready-to-analyze FOVs.\n",
+ "\n",
+ "The following folder will be created for you:\n",
+ "- `qc_tma_metrics_dir`: The path where the QC TMA metrics should be saved."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cohort_path = \"D:\\\\Cohorts\\\\20220101_new_cohort\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qc_tma_metrics_dir = os.path.join(cohort_path, \"qc_tma_metrics\")\n",
+ "\n",
+ "if not os.path.exists(qc_tma_metrics_dir):\n",
+ " os.makedirs(qc_tma_metrics_dir)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Set `tmas` to a list of TMAs you wish to compute QC metrics for."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Change the `tmas` variable to be a list of the tmas you want to run the QC on\n",
+ "tmas = [\"MY_COHORT_TMA1\", \"MY_COHORT_TMA1\", \"MY_COHORT_TMA1\"]"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Select any combination of the following three QC metrics:\n",
+ "1. `\"Non-zero mean intensity\"`\n",
+ "2. `\"Total intensity\"`\n",
+ "3. `\"99.9% intensity value\"`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qc_metrics = [\"Non-zero mean intensity\"]"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 2. Compute QC TMA Metrics"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Initialize the QCTMA class with the path to your cohort (`cohort_path`), the path to the folder containing the QC TMA metrics (`qc_tma_metrics_dir`) and the QC Metrics of interest themselves (`qc_metrics`).\n",
+ "\n",
+ "Then compute the QC metrics per FOV. FOVs which already have QC metrics files do not get theirs recomputed."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qc_tmas = qc_comp.QCTMA(\n",
+ " qc_metrics=qc_metrics,\n",
+ " cohort_path=cohort_path,\n",
+ " metrics_dir=qc_tma_metrics_dir,\n",
+ ")\n",
+ "\n",
+ "qc_tmas.compute_qc_tma_metrics(tmas=tmas)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You may want to exclude channels depending on their impact, the `channel_exclude` variable will filter out those channels when creating the ranked QC metrics.\n",
+ "\n",
+ "The following channels will *always* be excluded from the TMA Metrics ranking below:\n",
+ "- Au\n",
+ "- Fe\n",
+ "- Na\n",
+ "- Ta\n",
+ "- Noodle"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "channel_exclude = [\"chan_39\", \"chan_45\"]"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 3. Compute the Ranked QC TMA Metrics"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qc_tmas.qc_tma_metrics_rank(tmas=tmas, channel_exclude=channel_exclude)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 3. Plot the QC TMA Metrics\n",
+ "\n",
+ "The following plot below depicts a heatmap of the TMA along with a histogram. \n",
+ "\n",
+ "The TMA QC metrics are processed first by a FOV wise ranking for each channel, then each channel is averaged for each FOV.\n",
+ "\n",
+ "What we are looking for is that any particular region's average rank isn't higher than any other. An issue arises when, say all FOVs in the upper left corner of the TMA are systematically brighter than the others.\n",
+ "\n",
+ "\n",
+ "These plots get saved in a `figures` subfolder within `qc_tma_metrics_dir`."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
\n",
+ "
\n",
+ "
\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qc_metrics_plots.qc_tmas_metrics_plot(qc_tmas=qc_tmas, tmas=tmas, save_figure=True, dpi=300)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## QC Longitudinal Control Metrics"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The second half of this notebook is dedicated to looking at QC metrics for a particular control sample across many runs, these are called *longitudinal control* metrics."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 0. Prerequisites"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In order to make use of the QC Longitudinal Control Metrics, you need to have run `5_rename_and_reorganize.ipynb` beforehand. There is no set naming convention here for each FOV.\n",
+ "\n",
+ "To make use of the LC Metrics, your cohort should consist of one control sample across several runs\n",
+ "\n",
+ "```sh\n",
+ "my_control_sample_runs/\n",
+ "├── MY_CONTROL_SAMPLE_RUN1/\n",
+ "├── MY_CONTROL_SAMPLE_RUN2/\n",
+ "├── ...\n",
+ "├── MY_CONTROL_SAMPLE_RUN5/\n",
+ "├── MY_CONTROL_SAMPLE_RUN6/\n",
+ "└── MY_CONTROL_SAMPLE_RUN7/\n",
+ "```\n",
+ "\n",
+ "Longitudinal Control Metrics can be computed for control sample FOVs across different cohorts. For a given control sample, we will be able to analyze it's run-to-run variance. "
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 1. Set QC metrics, Control Sample FOVs, Paths, and the Control Sample Name"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Specify the names of the relevant folders:\n",
+ "- `control_path`: The path to the cohort containing ready-to-analyze FOVs.\n",
+ "\n",
+ "The following folder will be created for you:\n",
+ "- `qc_control_metrics_dir`: The path where the QC TMA metrics should be saved."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "control_path = \"D:\\\\Cohorts\\\\20220101_new_cohort_controls\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qc_control_metrics_dir = os.path.join(control_path, \"qc_longitudinal_control\")\n",
+ "\n",
+ "if not os.path.exists(qc_control_metrics_dir):\n",
+ " os.makedirs(qc_control_metrics_dir)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Select any combination of the following three QC metrics:\n",
+ "1. `\"Non-zero mean intensity\"`\n",
+ "2. `\"Total intensity\"`\n",
+ "3. `\"99.9% intensity value\"`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qc_metrics = [\"Non-zero mean intensity\"]"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Set `control_sample_name` to an informative name."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "control_sample_name = \"MY_CONTROL_SAMPLE\""
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Set `fovs` to a list of FOVs you wish to compute the Longitudinal QC Metrics for."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fovs = [\"MY_CONTROL_SAMPLE_RUN1\", \"MY_CONTROL_SAMPLE_RUN2\", \"MY_CONTROL_SAMPLE_RUN3\"]"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You may want to include, and exclude various channels depending on their impact.\n",
+ "\n",
+ "- `channel_exclude`: A list of channels to filter out for the Longitudinal Control QC Metrics.\n",
+ "- `channel_include`: A list of channels to *only* include for the Longitudinal Control QC Metrics.\n",
+ "\n",
+ "The following channels will always be excluded from the Longitudinal Control QC Metrics ranking below:\n",
+ "- Au\n",
+ "- Fe\n",
+ "- Na\n",
+ "- Ta\n",
+ "- Noodle\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "channel_exclude = [\"chan_39\", \"Biotin\", \"PDL1\", \"chan_45\"]\n",
+ "channel_include = None"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 2. Compute the Longitudinal Control QC metrics for the set of Control Sample FOVs."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Initialize the QC Control Metrics class\n",
+ "qc_control = qc_comp.QCControlMetrics(\n",
+ " qc_metrics=qc_metrics,\n",
+ " cohort_path=control_path,\n",
+ " metrics_dir=qc_control_metrics_dir,\n",
+ ")\n",
+ "\n",
+ "# Compute the QC metrics for the FOVs provided\n",
+ "qc_control.compute_control_qc_metrics(\n",
+ " control_sample_name=control_sample_name,\n",
+ " fovs=fovs,\n",
+ " channel_exclude=channel_exclude,\n",
+ " channel_include=channel_include,\n",
+ ")"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 4. Longitudinal Control Heatmap"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The following plot below is a heatmap for each Control Sample FOV associated with a particular tissue, in this case it is `\"MY_CONTROL_SAMPLE\"`.\n",
+ "\n",
+ "Given each FOV $i$, it's associated QC metric $qc_i$, we calculate the Longitudinal value $l_i$ with the following:\n",
+ "\n",
+ "$$\n",
+ "l_i = \\log_2\\left(\\frac{qc_i}{\\frac{1}{n}\\sum_{i}^{n} qc_i}\\right)\n",
+ "$$\n",
+ "\n",
+ "\n",
+ "A value of $1$ would be interpreted as be $2$ times greater than the row average, and a value of $-1$ would be $2$ times less than the row average.\n",
+ "\n",
+ "These plots get saved in a `figures` subfolder within `qc_control_effect_metrics_dir`."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "
\n",
+ "
\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qc_metrics_plots.longitudinal_control_heatmap(\n",
+ " qc_control=qc_control, control_sample_name=control_sample_name, save_figure=True, dpi=300\n",
+ ")"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "toffy-r1jqSdeC-py3.11",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.4"
+ },
+ "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/templates/batch_effects_violin_example.ipynb b/templates/batch_effects_violin_example.ipynb
deleted file mode 100644
index ee7bd648..00000000
--- a/templates/batch_effects_violin_example.ipynb
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "043d3cf0",
- "metadata": {},
- "outputs": [],
- "source": [
- "from toffy import qc_metrics_plots"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "b203e00a",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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RERERERE9CiBpYiIiIhxkLSPpO9L+p6kT7fNb5T0H5L+u5O9JGk5SV+RdIuk2yS9rW1fXdKdks6VdIekf5e0dHvsa5JOknSjpB9L2qJtX1zSyZK+28Z+70gOPiIiImKMBJYiIiIiFpGk1wDHANvY/jPgsPbQS4DNgR2BE9u2x4C3214P2Bo4VZLaY2sDZ9p+DXA/sFvXMLNsbwQcDvy/tm1/4AHbGwIbAgdIenn/jzAiIiJifGaNegIRERERU8g2wCW27wOw/dsWK7rM9jzgB5Je1PYVcLykNwLzgNWAzmM/sX1r+/+bgdW7xrh0AdvfDKzT1ctpBSo49eO+HVlEREREDxJYioiIiJi4x7v+v5OVtBewCrC+7Scl/RRYagH7Pw0svYDnepr552oCDrF9Tfegklaf8MwjIiIiJiClcBERERGL7jrgnZJeACBppYXsuwLwmxZU2hp42QTGvQY4UNLsNu4rJC07geeLiIiI6ItkLEVEREQsItt3SDoO+Lqkp4H/XMjunwWukHQbcBPwwwkMfR5VFndL69N0L7DLBJ4vIiIioi9ke9RziIiIiIiIiIiIKSilcBERERERERER0ZMEliIiIiIiIiIioicJLEVERERERERERE8SWIqIiIiIiIiIiJ4ksBQRERERERERET1JYCkiIiIiIiIiInqSwFJERERERERERPQkgaWIiIiIiIiIiOjJ/weO40SU4qT40QAAAABJRU5ErkJggg==",
- "text/plain": [
- "