From ef4193400107da09f4a5acc73fc6049f30050675 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Mon, 17 Jan 2022 11:06:45 +0000 Subject: [PATCH 01/59] chore: Use prefix v in release tags --- scripts/release-tags.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/release-tags.sh b/scripts/release-tags.sh index 89c436f..9ac3036 100644 --- a/scripts/release-tags.sh +++ b/scripts/release-tags.sh @@ -15,7 +15,7 @@ if [[ "${GIT_BRANCH}" != "main" ]]; then fi ## TODO: get package version from pyproject.toml -CURRENT_VERSION=2.3.0 +CURRENT_VERSION=v2.3.0 ## Create GitHub Release git tag -a ${CURRENT_VERSION} -m "v${CURRENT_VERSION}" From 077bd9d761b84035e06decfccf864808104430bd Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sun, 6 Feb 2022 14:58:44 +0000 Subject: [PATCH 02/59] chore: Add poetry update script to update python dependencies to latest --- scripts/poetry-update.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 scripts/poetry-update.sh diff --git a/scripts/poetry-update.sh b/scripts/poetry-update.sh new file mode 100644 index 0000000..3027958 --- /dev/null +++ b/scripts/poetry-update.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# file: poetry-update.sh +# description: Update Python dependencies to latest. + +# POETRY_UPDATE_OPTS=--dry-run +# POETRY_UPDATE_ARGS=anki +poetry update "${POETRY_UPDATE_OPTS}" "${POETRY_UPDATE_ARGS}" + +# TODO: Run poetry export +# TODO: Create git branch and commit \ No newline at end of file From cf7d0144b8f3ea575305f834cb7bb4da4e8ea4f9 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 4 Feb 2022 20:47:40 +0800 Subject: [PATCH 03/59] requirements anki version to 2.1.46 --- src/requirements-dev.txt | 29 +++++++++++++---------------- src/requirements.txt | 8 ++++---- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/requirements-dev.txt b/src/requirements-dev.txt index dbfffb6..3ffacb7 100644 --- a/src/requirements-dev.txt +++ b/src/requirements-dev.txt @@ -1,22 +1,19 @@ # THE FILE WAS GENERATED BY POETRY, DO NOT EDIT! -anki==2.1.43; python_version >= "3.8" -appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.8" and sys_platform == "darwin" -argon2-cffi-bindings==21.2.0; python_version >= "3.6" -argon2-cffi==21.3.0; python_version >= "3.6" -asttokens==2.0.5; python_version >= "3.8" -attrs==21.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -backcall==0.2.0; python_version >= "3.8" -beautifulsoup4==4.10.0; python_full_version > "3.0.0" -black==21.12b0; python_full_version >= "3.6.2" and python_version >= "3.8" -bleach==4.1.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -cffi==1.15.0; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.6.1" -charset-normalizer==2.0.10; python_full_version >= "3.6.0" and python_version >= "3.8" -click==8.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" -colorama==0.4.4; python_version >= "3.8" and python_full_version < "3.0.0" and platform_system == "Windows" and sys_platform == "win32" or platform_system == "Windows" and python_version >= "3.8" and python_full_version >= "3.5.0" and sys_platform == "win32" -debugpy==1.5.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" +anki==2.1.46; python_version >= "3.8" +appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.7" and sys_platform == "darwin" +argon2-cffi==20.1.0; python_version >= "3.5" +async-generator==1.10; python_version >= "3.6" +attrs==20.3.0; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.5" +backcall==0.2.0; python_version >= "3.7" +beautifulsoup4==4.9.3 +bleach==3.3.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +certifi==2020.12.5; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" +cffi==1.14.4; implementation_name == "pypy" and python_version >= "3.6" +chardet==4.0.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" +click==7.1.2; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5" +colorama==0.4.4; python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.5.0" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") defusedxml==0.7.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" distro==1.6.0 diff --git a/src/requirements.txt b/src/requirements.txt index 017ae90..e752a5f 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,10 +1,10 @@ # THE FILE WAS GENERATED BY POETRY, DO NOT EDIT! -anki==2.1.43; python_version >= "3.8" -beautifulsoup4==4.10.0; python_full_version > "3.0.0" -certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -charset-normalizer==2.0.10; python_full_version >= "3.6.0" and python_version >= "3.8" +anki==2.1.46; python_version >= "3.8" +beautifulsoup4==4.9.3 +certifi==2020.12.5; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" +chardet==4.0.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") distro==1.6.0 idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" From 30bc574d8d7248f0af10e66fd2968a8cd247dd8e Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Sat, 5 Feb 2022 14:30:58 +0800 Subject: [PATCH 04/59] try to resolve conflicts --- src/requirements-dev.txt | 27 +++++++++++++++------------ src/requirements.txt | 6 +++--- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/requirements-dev.txt b/src/requirements-dev.txt index 3ffacb7..78a299b 100644 --- a/src/requirements-dev.txt +++ b/src/requirements-dev.txt @@ -2,18 +2,21 @@ anki==2.1.46; python_version >= "3.8" -appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.7" and sys_platform == "darwin" -argon2-cffi==20.1.0; python_version >= "3.5" -async-generator==1.10; python_version >= "3.6" -attrs==20.3.0; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.5" -backcall==0.2.0; python_version >= "3.7" -beautifulsoup4==4.9.3 -bleach==3.3.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" -certifi==2020.12.5; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" -cffi==1.14.4; implementation_name == "pypy" and python_version >= "3.6" -chardet==4.0.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" -click==7.1.2; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5" -colorama==0.4.4; python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.5.0" +appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.8" and sys_platform == "darwin" +argon2-cffi-bindings==21.2.0; python_version >= "3.6" +argon2-cffi==21.3.0; python_version >= "3.6" +asttokens==2.0.5; python_version >= "3.8" +attrs==21.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +backcall==0.2.0; python_version >= "3.8" +beautifulsoup4==4.10.0; python_full_version > "3.0.0" +black==21.12b0; python_full_version >= "3.6.2" and python_version >= "3.8" +bleach==4.1.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" +cffi==1.15.0; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.6.1" +charset-normalizer==2.0.10; python_full_version >= "3.6.0" and python_version >= "3.8" +click==8.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" +colorama==0.4.4; python_version >= "3.8" and python_full_version < "3.0.0" and platform_system == "Windows" and sys_platform == "win32" or platform_system == "Windows" and python_version >= "3.8" and python_full_version >= "3.5.0" and sys_platform == "win32" +debugpy==1.5.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") defusedxml==0.7.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" distro==1.6.0 diff --git a/src/requirements.txt b/src/requirements.txt index e752a5f..02caaed 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -2,9 +2,9 @@ anki==2.1.46; python_version >= "3.8" -beautifulsoup4==4.9.3 -certifi==2020.12.5; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" -chardet==4.0.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" +beautifulsoup4==4.10.0; python_full_version > "3.0.0" +certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" +charset-normalizer==2.0.10; python_full_version >= "3.6.0" and python_version >= "3.8" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") distro==1.6.0 idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" From a4a264d782404390e1d506205b43af96788b3db6 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sun, 6 Feb 2022 14:54:18 +0000 Subject: [PATCH 05/59] chore: Update anki dependency to latest version --- poetry.lock | 287 +++++++++++++++++++++------------------ pyproject.toml | 2 +- src/requirements-dev.txt | 47 +++---- src/requirements.txt | 13 +- 4 files changed, 190 insertions(+), 159 deletions(-) diff --git a/poetry.lock b/poetry.lock index a95441e..58b4f2a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,6 +1,6 @@ [[package]] name = "anki" -version = "2.1.43" +version = "2.1.49" description = "" category = "main" optional = false @@ -10,10 +10,12 @@ python-versions = ">=3.8" beautifulsoup4 = "*" decorator = "*" distro = {version = "*", markers = "sys_platform != \"darwin\" and sys_platform != \"win32\""} +markdown = "*" orjson = {version = "*", markers = "platform_machine == \"x86_64\""} -protobuf = "*" +protobuf = ">=3.17" psutil = {version = "*", markers = "sys_platform == \"win32\""} requests = {version = "*", extras = ["socks"]} +stringcase = "*" [package.extras] syncserver = ["flask", "waitress"] @@ -110,28 +112,24 @@ lxml = ["lxml"] [[package]] name = "black" -version = "21.12b0" +version = "22.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] +tomli = ">=1.1.0" +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -168,7 +166,7 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.10" +version = "2.0.11" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false @@ -230,11 +228,11 @@ python-versions = "*" [[package]] name = "entrypoints" -version = "0.3" +version = "0.4" description = "Discover and load entry points from installed packages." category = "dev" optional = false -python-versions = ">=2.7" +python-versions = ">=3.6" [[package]] name = "executing" @@ -268,7 +266,7 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.10.0" +version = "4.10.1" description = "Read metadata from Python packages" category = "main" optional = false @@ -299,7 +297,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "ipykernel" -version = "6.7.0" +version = "6.8.0" description = "IPython Kernel for Jupyter" category = "dev" optional = false @@ -320,7 +318,7 @@ test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "ipyparallel"] [[package]] name = "ipython" -version = "8.0.0" +version = "8.0.1" description = "IPython: Productive Interactive Computing" category = "dev" optional = false @@ -456,7 +454,7 @@ qtconsole = "*" [[package]] name = "jupyter-client" -version = "7.1.1" +version = "7.1.2" description = "Jupyter protocol implementation and client libraries" category = "dev" optional = false @@ -702,7 +700,7 @@ nbconvert = ">=6.2.0,<7.0.0" [[package]] name = "mkdocs-material" -version = "8.1.7" +version = "8.1.10" description = "A Material Design theme for MkDocs" category = "dev" optional = false @@ -752,7 +750,7 @@ test = ["ipython", "ipykernel", "ipywidgets (<8.0.0)", "pytest (>=4.1)", "pytest [[package]] name = "nbconvert" -version = "6.4.0" +version = "6.4.1" description = "Converting Jupyter Notebooks" category = "dev" optional = false @@ -808,7 +806,7 @@ python-versions = ">=3.5" [[package]] name = "notebook" -version = "6.4.7" +version = "6.4.8" description = "A web-based notebook environment for interactive computing" category = "dev" optional = false @@ -838,7 +836,7 @@ test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "re [[package]] name = "orjson" -version = "3.6.5" +version = "3.6.6" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -916,18 +914,18 @@ test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock [[package]] name = "prometheus-client" -version = "0.12.0" +version = "0.13.1" description = "Python client for the Prometheus monitoring system." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.extras] twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.24" +version = "3.0.26" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false @@ -938,7 +936,7 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "3.19.3" +version = "3.19.4" description = "Protocol Buffers" category = "main" optional = false @@ -965,7 +963,7 @@ python-versions = "*" [[package]] name = "pure-eval" -version = "0.2.1" +version = "0.2.2" description = "Safely evaluate AST nodes without side effects" category = "dev" optional = false @@ -1011,7 +1009,7 @@ Markdown = ">=3.2" [[package]] name = "pyparsing" -version = "3.0.6" +version = "3.0.7" description = "Python parsing module" category = "dev" optional = false @@ -1057,7 +1055,7 @@ python-versions = "*" [[package]] name = "pywinpty" -version = "1.1.6" +version = "2.0.2" description = "Pseudo terminal support for Windows from Python." category = "dev" optional = false @@ -1118,7 +1116,7 @@ test = ["flaky", "pytest", "pytest-qt"] [[package]] name = "qtpy" -version = "2.0.0" +version = "2.0.1" description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." category = "dev" optional = false @@ -1128,7 +1126,7 @@ python-versions = ">=3.6" packaging = "*" [package.extras] -test = ["pytest (>=6.0.0,<7.0)", "pytest-cov (>=2.11.0)"] +test = ["pytest (>=6.0.0)", "pytest-cov (>=3.0.0)", "pytest-qt"] [[package]] name = "requests" @@ -1194,13 +1192,21 @@ pure-eval = "*" [package.extras] tests = ["pytest", "typeguard", "pygments", "littleutils"] +[[package]] +name = "stringcase" +version = "1.2.0" +description = "String case converter." +category = "main" +optional = false +python-versions = "*" + [[package]] name = "terminado" -version = "0.12.1" +version = "0.13.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] ptyprocess = {version = "*", markers = "os_name != \"nt\""} @@ -1231,11 +1237,11 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.3" +version = "2.0.0" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "tornado" @@ -1372,13 +1378,13 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "f26c642c8662d0d142590221b2d0bda76233983b930d282ee7c64dad36db42a3" +content-hash = "c0c6dee5f71c5cfd437cc762c613d39b1991580214802ec9b5cf03e2b03eaca9" [metadata.files] anki = [ - {file = "anki-2.1.43-cp38-abi3-macosx_10_7_x86_64.whl", hash = "sha256:95676155bd782106ba3fb7c46082fdfe334916957c4f15d4563b26911a188da5"}, - {file = "anki-2.1.43-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:fdac906a9a8534362fbf6830aa195e7cef127e08dfd14177c49a59f9a5f01b76"}, - {file = "anki-2.1.43-cp38-abi3-win_amd64.whl", hash = "sha256:5cc7131843c1bf6eb2c6bcbec976000dce47d7a6e7c160e5232f6d109836f53a"}, + {file = "anki-2.1.49-cp38-abi3-macosx_10_7_x86_64.whl", hash = "sha256:9f4384db0432468f94e69e65244a0a28a6718cd6d187a02463bf0dd64803bdb9"}, + {file = "anki-2.1.49-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:746c9807d5f2f87503eb993b28b660fd8e0bc70b969796855dbd48bdaa995af4"}, + {file = "anki-2.1.49-cp38-abi3-win_amd64.whl", hash = "sha256:fda47880fbc4bf232090ea171fb337c4301d7f001bb2647fccb83785886cc6f8"}, ] appnope = [ {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, @@ -1428,8 +1434,29 @@ beautifulsoup4 = [ {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, ] black = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, + {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, + {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, + {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, + {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, + {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, + {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, + {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, + {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, + {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, + {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, + {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, + {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, + {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, + {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, + {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, + {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, + {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, + {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, + {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, + {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, + {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, + {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, + {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, ] bleach = [ {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, @@ -1492,8 +1519,8 @@ cffi = [ {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.10.tar.gz", hash = "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd"}, - {file = "charset_normalizer-2.0.10-py3-none-any.whl", hash = "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455"}, + {file = "charset-normalizer-2.0.11.tar.gz", hash = "sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c"}, + {file = "charset_normalizer-2.0.11-py3-none-any.whl", hash = "sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45"}, ] click = [ {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, @@ -1539,8 +1566,8 @@ distro = [ {file = "distro-1.6.0.tar.gz", hash = "sha256:83f5e5a09f9c5f68f60173de572930effbcc0287bb84fdc4426cb4168c088424"}, ] entrypoints = [ - {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, - {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, ] executing = [ {file = "executing-0.8.2-py2.py3-none-any.whl", hash = "sha256:32fc6077b103bd19e6494a72682d66d5763cf20a106d5aa7c5ccbea4e47b0df7"}, @@ -1555,20 +1582,20 @@ idna = [ {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.10.0-py3-none-any.whl", hash = "sha256:b7cf7d3fef75f1e4c80a96ca660efbd51473d7e8f39b5ab9210febc7809012a4"}, - {file = "importlib_metadata-4.10.0.tar.gz", hash = "sha256:92a8b58ce734b2a4494878e0ecf7d79ccd7a128b5fc6014c401e0b61f006f0f6"}, + {file = "importlib_metadata-4.10.1-py3-none-any.whl", hash = "sha256:899e2a40a8c4a1aec681feef45733de8a6c58f3f6a0dbed2eb6574b4387a77b6"}, + {file = "importlib_metadata-4.10.1.tar.gz", hash = "sha256:951f0d8a5b7260e9db5e41d429285b5f451e928479f19d80818878527d36e95e"}, ] importlib-resources = [ {file = "importlib_resources-5.4.0-py3-none-any.whl", hash = "sha256:33a95faed5fc19b4bc16b29a6eeae248a3fe69dd55d4d229d2b480e23eeaad45"}, {file = "importlib_resources-5.4.0.tar.gz", hash = "sha256:d756e2f85dd4de2ba89be0b21dba2a3bbec2e871a42a3a16719258a11f87506b"}, ] ipykernel = [ - {file = "ipykernel-6.7.0-py3-none-any.whl", hash = "sha256:6203ccd5510ff148e9433fd4a2707c5ce8d688f026427f46e13d7ebf9b3e9787"}, - {file = "ipykernel-6.7.0.tar.gz", hash = "sha256:d82b904fdc2fd8c7b1fbe0fa481c68a11b4cd4c8ef07e6517da1f10cc3114d24"}, + {file = "ipykernel-6.8.0-py3-none-any.whl", hash = "sha256:6c977ead67ec22151993a5f848b97e57a5e771f979b510941e157b2e7fe54184"}, + {file = "ipykernel-6.8.0.tar.gz", hash = "sha256:67d316d527eca24e3ded45a2b38689615bcda1aa520a11af0accdcea7152c18a"}, ] ipython = [ - {file = "ipython-8.0.0-py3-none-any.whl", hash = "sha256:5b58cf977635abad74d76be49dbb2e97fddd825fb8503083d55496aa1160b854"}, - {file = "ipython-8.0.0.tar.gz", hash = "sha256:004a0d05aeecd32adec4841b6e2586d5ca35785b1477db4d8333a39333e0ce98"}, + {file = "ipython-8.0.1-py3-none-any.whl", hash = "sha256:c503a0dd6ccac9c8c260b211f2dd4479c042b49636b097cc9a0d55fe62dff64c"}, + {file = "ipython-8.0.1.tar.gz", hash = "sha256:ab564d4521ea8ceaac26c3a2c6e5ddbca15c8848fd5a5cc325f960da88d42974"}, ] ipython-genutils = [ {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, @@ -1600,8 +1627,8 @@ jupyter = [ {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, ] jupyter-client = [ - {file = "jupyter_client-7.1.1-py3-none-any.whl", hash = "sha256:f0c576cce235c727e30b0a0da88c2755d0947d0070fa1bc45f195079ffd64e66"}, - {file = "jupyter_client-7.1.1.tar.gz", hash = "sha256:540ca35e57e83c5ece81abd9b781a57cba39a37c60a2a30c8c1b2f6663544343"}, + {file = "jupyter_client-7.1.2-py3-none-any.whl", hash = "sha256:d56f1c57bef42ff31e61b1185d3348a5b2bcde7c9a05523ae4dbe5ee0871797c"}, + {file = "jupyter_client-7.1.2.tar.gz", hash = "sha256:4ea61033726c8e579edb55626d8ee2e6bf0a83158ddf3751b8dd46b2c5cd1e96"}, ] jupyter-console = [ {file = "jupyter_console-6.4.0-py3-none-any.whl", hash = "sha256:7799c4ea951e0e96ba8260575423cb323ea5a03fcf5503560fa3e15748869e27"}, @@ -1734,8 +1761,8 @@ mkdocs-jupyter = [ {file = "mkdocs-jupyter-0.19.0.tar.gz", hash = "sha256:40bb752658156706adabe6140551e5efe4164256861cc72f082bdaf50139575b"}, ] mkdocs-material = [ - {file = "mkdocs-material-8.1.7.tar.gz", hash = "sha256:16a50e3f08f1e41bdc3115a00045d174e7fd8219c26917d0d0b48b2cc9d5a18f"}, - {file = "mkdocs_material-8.1.7-py2.py3-none-any.whl", hash = "sha256:71bcac6795b22dcf8bab8b9ad3fe462242c4cd05d28398281902425401f23462"}, + {file = "mkdocs-material-8.1.10.tar.gz", hash = "sha256:10970bfe2628eaa41c379e9075121b1232f4304cac9876feac8ac9d0d2e9035b"}, + {file = "mkdocs_material-8.1.10-py2.py3-none-any.whl", hash = "sha256:e47ad89b98c32a0832509a72ade2114e0c84727a573018d768f4c6de19886b2f"}, ] mkdocs-material-extensions = [ {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, @@ -1750,8 +1777,8 @@ nbclient = [ {file = "nbclient-0.5.10.tar.gz", hash = "sha256:b5fdea88d6fa52ca38de6c2361401cfe7aaa7cd24c74effc5e489cec04d79088"}, ] nbconvert = [ - {file = "nbconvert-6.4.0-py3-none-any.whl", hash = "sha256:f5ec6a1fad9e3aa2bee7c6a1c4ad3e0fafaa7ff64f29ba56d9da7e1669f8521c"}, - {file = "nbconvert-6.4.0.tar.gz", hash = "sha256:5412ec774c6db4fccecb8c4ba07ec5d37d6dcf5762593cb3d6ecbbeb562ebbe5"}, + {file = "nbconvert-6.4.1-py3-none-any.whl", hash = "sha256:fe93bc42485c54c5a49a2324c834aca1ff315f320a535bed3e3c4e085d3eebe3"}, + {file = "nbconvert-6.4.1.tar.gz", hash = "sha256:7dce3f977c2f9651841a3c49b5b7314c742f24dd118b99e51b8eec13c504f555"}, ] nbformat = [ {file = "nbformat-5.1.3-py3-none-any.whl", hash = "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"}, @@ -1762,34 +1789,34 @@ nest-asyncio = [ {file = "nest_asyncio-1.5.4.tar.gz", hash = "sha256:f969f6013a16fadb4adcf09d11a68a4f617c6049d7af7ac2c676110169a63abd"}, ] notebook = [ - {file = "notebook-6.4.7-py3-none-any.whl", hash = "sha256:968e9c09639fe4b9dbf4b9f028daf861b563c124d735a99d6d48c09317553f31"}, - {file = "notebook-6.4.7.tar.gz", hash = "sha256:b01da66f11a203b3839d6afa4013674bcfff41c36552f9ad0fbcb2d93c92764a"}, + {file = "notebook-6.4.8-py3-none-any.whl", hash = "sha256:3e702fcc54b8ae597533c3864793b7a1e971dec9e112f67235828d8a798fd654"}, + {file = "notebook-6.4.8.tar.gz", hash = "sha256:1e985c9dc6f678bdfffb9dc657306b5469bfa62d73e03f74e8defbf76d284312"}, ] orjson = [ - {file = "orjson-3.6.5-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:6c444edc073eb69cf85b28851a7a957807a41ce9bb3a9c14eefa8b33030cf050"}, - {file = "orjson-3.6.5-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:432c6da3d8d4630739f5303dcc45e8029d357b7ff8e70b7239be7bd047df6b19"}, - {file = "orjson-3.6.5-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:0fa32319072fadf0732d2c1746152f868a1b0f83c8cce2cad4996f5f3ca4e979"}, - {file = "orjson-3.6.5-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:0d65cc67f2e358712e33bc53810022ef5181c2378a7603249cd0898aa6cd28d4"}, - {file = "orjson-3.6.5-cp310-none-win_amd64.whl", hash = "sha256:fa8e3d0f0466b7d771a8f067bd8961bc17ca6ea4c89a91cd34d6648e6b1d1e47"}, - {file = "orjson-3.6.5-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:470596fbe300a7350fd7bbcf94d2647156401ab6465decb672a00e201af1813a"}, - {file = "orjson-3.6.5-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:d2680d9edc98171b0c59e52c1ed964619be5cb9661289c0dd2e667773fa87f15"}, - {file = "orjson-3.6.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:001962a334e1ab2162d2f695f2770d2383c7ffd2805cec6dbb63ea2ad96bf0ad"}, - {file = "orjson-3.6.5-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:522c088679c69e0dd2c72f43cd26a9e73df4ccf9ed725ac73c151bbe816fe51a"}, - {file = "orjson-3.6.5-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:d2b871a745a64f72631b633271577c99da628a9b63e10bd5c9c20706e19fe282"}, - {file = "orjson-3.6.5-cp37-none-win_amd64.whl", hash = "sha256:51ab01fed3b3e21561f21386a2f86a0415338541938883b6ca095001a3014a3e"}, - {file = "orjson-3.6.5-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:fc7e62edbc7ece95779a034d9e206d7ba9e2b638cc548fd3a82dc5225f656625"}, - {file = "orjson-3.6.5-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:0720d60db3fa25956011a573274a269eb37de98070f3bc186582af1222a2d084"}, - {file = "orjson-3.6.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169a8876aed7a5bff413c53257ef1fa1d9b68c855eb05d658c4e73ed8dff508"}, - {file = "orjson-3.6.5-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:331f9a3bdba30a6913ad1d149df08e4837581e3ce92bf614277d84efccaf796f"}, - {file = "orjson-3.6.5-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:ece5dfe346b91b442590a41af7afe61df0af369195fed13a1b29b96b1ba82905"}, - {file = "orjson-3.6.5-cp38-none-win_amd64.whl", hash = "sha256:6a5e9eb031b44b7a429c705ca48820371d25b9467c9323b6ae7a712daf15fbef"}, - {file = "orjson-3.6.5-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:206237fa5e45164a678b12acc02aac7c5b50272f7f31116e1e08f8bcaf654f93"}, - {file = "orjson-3.6.5-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:d5aceeb226b060d11ccb5a84a4cfd760f8024289e3810ec446ef2993a85dbaca"}, - {file = "orjson-3.6.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80dba3dbc0563c49719e8cc7d1568a5cf738accfcd1aa6ca5e8222b57436e75e"}, - {file = "orjson-3.6.5-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:443f39bc5e7966880142430ce091e502aea068b38cb9db5f1ffdcfee682bc2d4"}, - {file = "orjson-3.6.5-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:a06f2dd88323a480ac1b14d5829fb6cdd9b0d72d505fabbfbd394da2e2e07f6f"}, - {file = "orjson-3.6.5-cp39-none-win_amd64.whl", hash = "sha256:82cb42dbd45a3856dbad0a22b54deb5e90b2567cdc2b8ea6708e0c4fe2e12be3"}, - {file = "orjson-3.6.5.tar.gz", hash = "sha256:eb3a7d92d783c89df26951ef3e5aca9d96c9c6f2284c752aa3382c736f950597"}, + {file = "orjson-3.6.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:e4a7cad6c63306318453980d302c7c0b74c0cc290dd1f433bbd7d31a5af90cf1"}, + {file = "orjson-3.6.6-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e533941dca4a0530a876de32e54bf2fd3269cdec3751aebde7bfb5b5eba98e74"}, + {file = "orjson-3.6.6-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:9adf63be386eaa34278967512b83ff8fc4bed036a246391ae236f68d23c47452"}, + {file = "orjson-3.6.6-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:3b636753ae34d4619b11ea7d664a2f1e87e55e9738e5123e12bcce22acae9d13"}, + {file = "orjson-3.6.6-cp310-none-win_amd64.whl", hash = "sha256:78a10295ed048fd916c6584d6d27c232eae805a43e7c14be56e3745f784f0eb6"}, + {file = "orjson-3.6.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:82b4f9fb2af7799b52932a62eac484083f930d5519560d6f64b24d66a368d03f"}, + {file = "orjson-3.6.6-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:a0033d07309cc7d8b8c4bc5d42f0dd4422b53ceb91dee9f4086bb2afa70b7772"}, + {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b321f99473116ab7c7c028377372f7b4adba4029aaca19cd567e83898f55579"}, + {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:b9c98ed94f1688cc11b5c61b8eea39d854a1a2f09f71d8a5af005461b14994ed"}, + {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:00b333a41392bd07a8603c42670547dbedf9b291485d773f90c6470eff435608"}, + {file = "orjson-3.6.6-cp37-none-win_amd64.whl", hash = "sha256:8d4fd3bdee65a81f2b79c50937d4b3c054e1e6bfa3fc72ed018a97c0c7c3d521"}, + {file = "orjson-3.6.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:954c9f8547247cd7a8c91094ff39c9fe314b5eaeaec90b7bfb7384a4108f416f"}, + {file = "orjson-3.6.6-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:74e5aed657ed0b91ef05d44d6a26d3e3e12ce4d2d71f75df41a477b05878c4a9"}, + {file = "orjson-3.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4008a5130e6e9c33abaa95e939e0e755175da10745740aa6968461b2f16830e2"}, + {file = "orjson-3.6.6-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:012761d5f3d186deb4f6238f15e9ea7c1aac6deebc8f5b741ba3b4fafe017460"}, + {file = "orjson-3.6.6-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b464546718a940b48d095a98df4c04808bfa6c8706fe751fc3f9390bc2f82643"}, + {file = "orjson-3.6.6-cp38-none-win_amd64.whl", hash = "sha256:f10a800f4e5a4aab52076d4628e9e4dab9370bdd9d8ea254ebfde846b653ab25"}, + {file = "orjson-3.6.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:8010d2610cfab721725ef14d578c7071e946bbdae63322d8f7b49061cf3fde8d"}, + {file = "orjson-3.6.6-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:8dca67a4855e1e0f9a2ea0386e8db892708522e1171dc0ddf456932288fbae63"}, + {file = "orjson-3.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af065d60523139b99bd35b839c7a2d8c5da55df8a8c4402d2eb6cdc07fa7a624"}, + {file = "orjson-3.6.6-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:fa1f389cc9f766ae0cf7ba3533d5089836b01a5ccb3f8d904297f1fcf3d9dc34"}, + {file = "orjson-3.6.6-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:ec1221ad78f94d27b162a1d35672b62ef86f27f0e4c2b65051edb480cc86b286"}, + {file = "orjson-3.6.6-cp39-none-win_amd64.whl", hash = "sha256:afed2af55eeda1de6b3f1cbc93431981b19d380fcc04f6ed86e74c1913070304"}, + {file = "orjson-3.6.6.tar.gz", hash = "sha256:55dd988400fa7fbe0e31407c683f5aaab013b5bd967167b8fe058186773c4d6c"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1820,40 +1847,40 @@ platformdirs = [ {file = "platformdirs-2.4.1.tar.gz", hash = "sha256:440633ddfebcc36264232365d7840a970e75e1018d15b4327d11f91909045fda"}, ] prometheus-client = [ - {file = "prometheus_client-0.12.0-py2.py3-none-any.whl", hash = "sha256:317453ebabff0a1b02df7f708efbab21e3489e7072b61cb6957230dd004a0af0"}, - {file = "prometheus_client-0.12.0.tar.gz", hash = "sha256:1b12ba48cee33b9b0b9de64a1047cbd3c5f2d0ab6ebcead7ddda613a750ec3c5"}, + {file = "prometheus_client-0.13.1-py3-none-any.whl", hash = "sha256:357a447fd2359b0a1d2e9b311a0c5778c330cfbe186d880ad5a6b39884652316"}, + {file = "prometheus_client-0.13.1.tar.gz", hash = "sha256:ada41b891b79fca5638bd5cfe149efa86512eaa55987893becd2c6d8d0a5dfc5"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.24-py3-none-any.whl", hash = "sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506"}, - {file = "prompt_toolkit-3.0.24.tar.gz", hash = "sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6"}, + {file = "prompt_toolkit-3.0.26-py3-none-any.whl", hash = "sha256:4bcf119be2200c17ed0d518872ef922f1de336eb6d1ddbd1e089ceb6447d97c6"}, + {file = "prompt_toolkit-3.0.26.tar.gz", hash = "sha256:a51d41a6a45fd9def54365bca8f0402c8f182f2b6f7e29c74d55faeb9fb38ac4"}, ] protobuf = [ - {file = "protobuf-3.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1cb2ed66aac593adbf6dca4f07cd7ee7e2958b17bbc85b2cc8bc564ebeb258ec"}, - {file = "protobuf-3.19.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:898bda9cd37ec0c781b598891e86435de80c3bfa53eb483a9dac5a11ec93e942"}, - {file = "protobuf-3.19.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ad761ef3be34c8bdc7285bec4b40372a8dad9e70cfbdc1793cd3cf4c1a4ce74"}, - {file = "protobuf-3.19.3-cp310-cp310-win32.whl", hash = "sha256:2cddcbcc222f3144765ccccdb35d3621dc1544da57a9aca7e1944c1a4fe3db11"}, - {file = "protobuf-3.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:6202df8ee8457cb00810c6e76ced480f22a1e4e02c899a14e7b6e6e1de09f938"}, - {file = "protobuf-3.19.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:397d82f1c58b76445469c8c06b8dee1ff67b3053639d054f52599a458fac9bc6"}, - {file = "protobuf-3.19.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e54b8650e849ee8e95e481024bff92cf98f5ec61c7650cb838d928a140adcb63"}, - {file = "protobuf-3.19.3-cp36-cp36m-win32.whl", hash = "sha256:3bf3a07d17ba3511fe5fa916afb7351f482ab5dbab5afe71a7a384274a2cd550"}, - {file = "protobuf-3.19.3-cp36-cp36m-win_amd64.whl", hash = "sha256:afa8122de8064fd577f49ae9eef433561c8ace97a0a7b969d56e8b1d39b5d177"}, - {file = "protobuf-3.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18c40a1b8721026a85187640f1786d52407dc9c1ba8ec38accb57a46e84015f6"}, - {file = "protobuf-3.19.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:af7238849fa79285d448a24db686517570099739527a03c9c2971cce99cc5ae2"}, - {file = "protobuf-3.19.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e765e6dfbbb02c55e4d6d1145743401a84fc0b508f5a81b2c5a738cf86353139"}, - {file = "protobuf-3.19.3-cp37-cp37m-win32.whl", hash = "sha256:c781402ed5396ab56358d7b866d78c03a77cbc26ba0598d8bb0ac32084b1a257"}, - {file = "protobuf-3.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:544fe9705189b249380fae07952d220c97f5c6c9372a6f936cc83a79601dcb70"}, - {file = "protobuf-3.19.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:84bf3aa3efb00dbe1c7ed55da0f20800b0662541e582d7e62b3e1464d61ed365"}, - {file = "protobuf-3.19.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3f80a3491eaca767cdd86cb8660dc778f634b44abdb0dffc9b2a8e8d0cd617d0"}, - {file = "protobuf-3.19.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9401d96552befcc7311f5ef8f0fa7dba0ef5fd805466b158b141606cd0ab6a8"}, - {file = "protobuf-3.19.3-cp38-cp38-win32.whl", hash = "sha256:ef02d112c025e83db5d1188a847e358beab3e4bbfbbaf10eaf69e67359af51b2"}, - {file = "protobuf-3.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:1291a0a7db7d792745c99d4657b4c5c4942695c8b1ac1bfb993a34035ec123f7"}, - {file = "protobuf-3.19.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:49677e5e9c7ea1245a90c2e8a00d304598f22ea3aa0628f0e0a530a9e70665fa"}, - {file = "protobuf-3.19.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:df2ba379ee42427e8fcc6a0a76843bff6efb34ef5266b17f95043939b5e25b69"}, - {file = "protobuf-3.19.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2acd7ca329be544d1a603d5f13a4e34a3791c90d651ebaf130ba2e43ae5397c6"}, - {file = "protobuf-3.19.3-cp39-cp39-win32.whl", hash = "sha256:b53519b2ebec70cfe24b4ddda21e9843f0918d7c3627a785393fb35d402ab8ad"}, - {file = "protobuf-3.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:8ceaf5fdb72c8e1fcb7be9f2b3b07482ce058a3548180c0bdd5c7e4ac5e14165"}, - {file = "protobuf-3.19.3-py2.py3-none-any.whl", hash = "sha256:f6d4b5b7595a57e69eb7314c67bef4a3c745b4caf91accaf72913d8e0635111b"}, - {file = "protobuf-3.19.3.tar.gz", hash = "sha256:d975a6314fbf5c524d4981e24294739216b5fb81ef3c14b86fb4b045d6690907"}, + {file = "protobuf-3.19.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f51d5a9f137f7a2cec2d326a74b6e3fc79d635d69ffe1b036d39fc7d75430d37"}, + {file = "protobuf-3.19.4-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09297b7972da685ce269ec52af761743714996b4381c085205914c41fcab59fb"}, + {file = "protobuf-3.19.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072fbc78d705d3edc7ccac58a62c4c8e0cec856987da7df8aca86e647be4e35c"}, + {file = "protobuf-3.19.4-cp310-cp310-win32.whl", hash = "sha256:7bb03bc2873a2842e5ebb4801f5c7ff1bfbdf426f85d0172f7644fcda0671ae0"}, + {file = "protobuf-3.19.4-cp310-cp310-win_amd64.whl", hash = "sha256:f358aa33e03b7a84e0d91270a4d4d8f5df6921abe99a377828839e8ed0c04e07"}, + {file = "protobuf-3.19.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1c91ef4110fdd2c590effb5dca8fdbdcb3bf563eece99287019c4204f53d81a4"}, + {file = "protobuf-3.19.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c438268eebb8cf039552897d78f402d734a404f1360592fef55297285f7f953f"}, + {file = "protobuf-3.19.4-cp36-cp36m-win32.whl", hash = "sha256:835a9c949dc193953c319603b2961c5c8f4327957fe23d914ca80d982665e8ee"}, + {file = "protobuf-3.19.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4276cdec4447bd5015453e41bdc0c0c1234eda08420b7c9a18b8d647add51e4b"}, + {file = "protobuf-3.19.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6cbc312be5e71869d9d5ea25147cdf652a6781cf4d906497ca7690b7b9b5df13"}, + {file = "protobuf-3.19.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:54a1473077f3b616779ce31f477351a45b4fef8c9fd7892d6d87e287a38df368"}, + {file = "protobuf-3.19.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:435bb78b37fc386f9275a7035fe4fb1364484e38980d0dd91bc834a02c5ec909"}, + {file = "protobuf-3.19.4-cp37-cp37m-win32.whl", hash = "sha256:16f519de1313f1b7139ad70772e7db515b1420d208cb16c6d7858ea989fc64a9"}, + {file = "protobuf-3.19.4-cp37-cp37m-win_amd64.whl", hash = "sha256:cdc076c03381f5c1d9bb1abdcc5503d9ca8b53cf0a9d31a9f6754ec9e6c8af0f"}, + {file = "protobuf-3.19.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69da7d39e39942bd52848438462674c463e23963a1fdaa84d88df7fbd7e749b2"}, + {file = "protobuf-3.19.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:48ed3877fa43e22bcacc852ca76d4775741f9709dd9575881a373bd3e85e54b2"}, + {file = "protobuf-3.19.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd95d1dfb9c4f4563e6093a9aa19d9c186bf98fa54da5252531cc0d3a07977e7"}, + {file = "protobuf-3.19.4-cp38-cp38-win32.whl", hash = "sha256:b38057450a0c566cbd04890a40edf916db890f2818e8682221611d78dc32ae26"}, + {file = "protobuf-3.19.4-cp38-cp38-win_amd64.whl", hash = "sha256:7ca7da9c339ca8890d66958f5462beabd611eca6c958691a8fe6eccbd1eb0c6e"}, + {file = "protobuf-3.19.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:36cecbabbda242915529b8ff364f2263cd4de7c46bbe361418b5ed859677ba58"}, + {file = "protobuf-3.19.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c1068287025f8ea025103e37d62ffd63fec8e9e636246b89c341aeda8a67c934"}, + {file = "protobuf-3.19.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96bd766831596d6014ca88d86dc8fe0fb2e428c0b02432fd9db3943202bf8c5e"}, + {file = "protobuf-3.19.4-cp39-cp39-win32.whl", hash = "sha256:84123274d982b9e248a143dadd1b9815049f4477dc783bf84efe6250eb4b836a"}, + {file = "protobuf-3.19.4-cp39-cp39-win_amd64.whl", hash = "sha256:3112b58aac3bac9c8be2b60a9daf6b558ca3f7681c130dcdd788ade7c9ffbdca"}, + {file = "protobuf-3.19.4-py2.py3-none-any.whl", hash = "sha256:8961c3a78ebfcd000920c9060a262f082f29838682b1f7201889300c1fbe0616"}, + {file = "protobuf-3.19.4.tar.gz", hash = "sha256:9df0c10adf3e83015ced42a9a7bd64e13d06c4cf45c340d2c63020ea04499d0a"}, ] psutil = [ {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, @@ -1894,8 +1921,8 @@ ptyprocess = [ {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, ] pure-eval = [ - {file = "pure_eval-0.2.1-py3-none-any.whl", hash = "sha256:94eeb505a88721bec7bb21a4ac49758b8b1a01530da1a70d4ffc1d9937689d71"}, - {file = "pure_eval-0.2.1.tar.gz", hash = "sha256:0f04483b16c9429532d2c0ddc96e2b3bb6b2dc37a2bfb0e986248dbfd0b78873"}, + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, ] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, @@ -1914,8 +1941,8 @@ pymdown-extensions = [ {file = "pymdown_extensions-9.1-py3-none-any.whl", hash = "sha256:b03e66f91f33af4a6e7a0e20c740313522995f69a03d86316b1449766c473d0e"}, ] pyparsing = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, + {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, + {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] pyrsistent = [ {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, @@ -1964,12 +1991,11 @@ pywin32 = [ {file = "pywin32-303-cp39-cp39-win_amd64.whl", hash = "sha256:79cbb862c11b9af19bcb682891c1b91942ec2ff7de8151e2aea2e175899cda34"}, ] pywinpty = [ - {file = "pywinpty-1.1.6-cp310-none-win_amd64.whl", hash = "sha256:5f526f21b569b5610a61e3b6126259c76da979399598e5154498582df3736ade"}, - {file = "pywinpty-1.1.6-cp36-none-win_amd64.whl", hash = "sha256:7576e14f42b31fa98b62d24ded79754d2ea4625570c016b38eb347ce158a30f2"}, - {file = "pywinpty-1.1.6-cp37-none-win_amd64.whl", hash = "sha256:979ffdb9bdbe23db3f46fc7285fd6dbb86b80c12325a50582b211b3894072354"}, - {file = "pywinpty-1.1.6-cp38-none-win_amd64.whl", hash = "sha256:2308b1fc77545427610a705799d4ead5e7f00874af3fb148a03e202437456a7e"}, - {file = "pywinpty-1.1.6-cp39-none-win_amd64.whl", hash = "sha256:c703bf569a98ab7844b9daf37e88ab86f31862754ef6910a8b3824993a525c72"}, - {file = "pywinpty-1.1.6.tar.gz", hash = "sha256:8808f07350c709119cc4464144d6e749637f98e15acc1e5d3c37db1953d2eebc"}, + {file = "pywinpty-2.0.2-cp310-none-win_amd64.whl", hash = "sha256:4b421379b407bf2f52a64a4c58f61deffe623b5add02d871acb290b771bb6227"}, + {file = "pywinpty-2.0.2-cp37-none-win_amd64.whl", hash = "sha256:238b75fc456a6bc558761a89c9e6b3c8f2f54d79db03ae28997a68313c24b2ca"}, + {file = "pywinpty-2.0.2-cp38-none-win_amd64.whl", hash = "sha256:344858a0b956fdc64a547d5e1980b0257b47f5433ed7cb89bf7b6268cb280c6c"}, + {file = "pywinpty-2.0.2-cp39-none-win_amd64.whl", hash = "sha256:a4a066eaf2e30944d3028d946883ceb7883a499b53c4b89ca2d54bd7a4210550"}, + {file = "pywinpty-2.0.2.tar.gz", hash = "sha256:20ec117183f79642eff555ce0dd1823f942618d65813fb6122d14b6e34b5d05a"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, @@ -2064,8 +2090,8 @@ qtconsole = [ {file = "qtconsole-5.2.2.tar.gz", hash = "sha256:8f9db97b27782184efd0a0f2d57ea3bd852d053747a2e442a9011329c082976d"}, ] qtpy = [ - {file = "QtPy-2.0.0-py3-none-any.whl", hash = "sha256:74bf26be3288aadc843cf3381d5ef0b82f11417ecdcbf26718a408f32590f1ac"}, - {file = "QtPy-2.0.0.tar.gz", hash = "sha256:777e333df4d711b2ec9743117ab319dadfbd743a5a0eee35923855ca3d35cd9d"}, + {file = "QtPy-2.0.1-py3-none-any.whl", hash = "sha256:d93f2c98e97387fcc9d623d509772af5b6c15ab9d8f9f4c5dfbad9a73ad34812"}, + {file = "QtPy-2.0.1.tar.gz", hash = "sha256:adfd073ffbd2de81dc7aaa0b983499ef5c59c96adcfdcc9dea60d42ca885eb8f"}, ] requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, @@ -2087,9 +2113,12 @@ stack-data = [ {file = "stack_data-0.1.4-py3-none-any.whl", hash = "sha256:02cc0683cbc445ae4ca8c4e3a0e58cb1df59f252efb0aa016b34804a707cf9bc"}, {file = "stack_data-0.1.4.tar.gz", hash = "sha256:7769ed2482ce0030e00175dd1bf4ef1e873603b6ab61cd3da443b410e64e9477"}, ] +stringcase = [ + {file = "stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008"}, +] terminado = [ - {file = "terminado-0.12.1-py3-none-any.whl", hash = "sha256:09fdde344324a1c9c6e610ee4ca165c4bb7f5bbf982fceeeb38998a988ef8452"}, - {file = "terminado-0.12.1.tar.gz", hash = "sha256:b20fd93cc57c1678c799799d117874367cc07a3d2d55be95205b1a88fa08393f"}, + {file = "terminado-0.13.1-py3-none-any.whl", hash = "sha256:f446b522b50a7aa68b5def0a02893978fb48cb82298b0ebdae13003c6ee6f198"}, + {file = "terminado-0.13.1.tar.gz", hash = "sha256:5b82b5c6e991f0705a76f961f43262a7fb1e55b093c16dca83f16384a7f39b7b"}, ] testpath = [ {file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"}, @@ -2100,8 +2129,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, + {file = "tomli-2.0.0-py3-none-any.whl", hash = "sha256:b5bde28da1fed24b9bd1d4d2b8cba62300bfb4ec9a6187a957e8ddb9434c5224"}, + {file = "tomli-2.0.0.tar.gz", hash = "sha256:c292c34f58502a1eb2bbb9f5bbc9a5ebc37bee10ffb8c2d6bbdfa8eb13cc14e1"}, ] tornado = [ {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, diff --git a/pyproject.toml b/pyproject.toml index 433d8a4..56ba0f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ packages = [ [tool.poetry.dependencies] python = "^3.8" -anki = "2.1.43" +anki = "^2.1.43" beautifulsoup4 = "^4.9.1" requests = "^2.24.0" markdown = "^3.2.2" diff --git a/src/requirements-dev.txt b/src/requirements-dev.txt index 78a299b..8c02a89 100644 --- a/src/requirements-dev.txt +++ b/src/requirements-dev.txt @@ -1,7 +1,7 @@ # THE FILE WAS GENERATED BY POETRY, DO NOT EDIT! -anki==2.1.46; python_version >= "3.8" +anki==2.1.49; python_version >= "3.8" appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.8" and sys_platform == "darwin" argon2-cffi-bindings==21.2.0; python_version >= "3.6" argon2-cffi==21.3.0; python_version >= "3.6" @@ -9,32 +9,32 @@ asttokens==2.0.5; python_version >= "3.8" attrs==21.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" backcall==0.2.0; python_version >= "3.8" beautifulsoup4==4.10.0; python_full_version > "3.0.0" -black==21.12b0; python_full_version >= "3.6.2" and python_version >= "3.8" +black==22.1.0; python_full_version >= "3.6.2" and python_version >= "3.8" bleach==4.1.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" cffi==1.15.0; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.6.1" -charset-normalizer==2.0.10; python_full_version >= "3.6.0" and python_version >= "3.8" +charset-normalizer==2.0.11; python_full_version >= "3.6.0" and python_version >= "3.8" click==8.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" colorama==0.4.4; python_version >= "3.8" and python_full_version < "3.0.0" and platform_system == "Windows" and sys_platform == "win32" or platform_system == "Windows" and python_version >= "3.8" and python_full_version >= "3.5.0" and sys_platform == "win32" debugpy==1.5.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") defusedxml==0.7.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" distro==1.6.0 -entrypoints==0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +entrypoints==0.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" executing==0.8.2; python_version >= "3.8" ghp-import==2.0.2; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -importlib-metadata==4.10.0; python_version < "3.10" and python_version >= "3.7" and python_full_version >= "3.7.1" +importlib-metadata==4.10.1; python_version < "3.10" and python_version >= "3.8" and python_full_version >= "3.7.1" importlib-resources==5.4.0; python_version < "3.9" and python_version >= "3.7" and python_full_version >= "3.7.1" -ipykernel==6.7.0; python_version >= "3.7" +ipykernel==6.8.0; python_version >= "3.7" ipython-genutils==0.2.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -ipython==8.0.0; python_version >= "3.8" +ipython==8.0.1; python_version >= "3.8" ipywidgets==7.6.5 jedi==0.18.1; python_version >= "3.8" jinja2==3.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" json5==0.9.6; python_version >= "3.5" jsonschema==4.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -jupyter-client==7.1.1; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4" +jupyter-client==7.1.2; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4" jupyter-console==6.4.0; python_version >= "3.6" jupyter-core==4.9.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" jupyter==1.0.0 @@ -52,15 +52,15 @@ mergedeep==1.3.4; python_full_version >= "3.7.1" and python_version < "4" and py mistune==0.8.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" mkdocs-jupyter==0.19.0; python_full_version >= "3.7.1" and python_version < "4" mkdocs-material-extensions==1.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" -mkdocs-material==8.1.7; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" +mkdocs-material==8.1.10; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" mkdocs==1.2.3; python_version >= "3.6" mypy-extensions==0.4.3; python_full_version >= "3.6.2" and python_version >= "3.8" nbclient==0.5.10; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -nbconvert==6.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +nbconvert==6.4.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" nbformat==5.1.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" nest-asyncio==1.5.4; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4" -notebook==6.4.7; python_version >= "3.6" -orjson==3.6.5; platform_machine == "x86_64" and python_version >= "3.8" +notebook==6.4.8; python_version >= "3.6" +orjson==3.6.6; platform_machine == "x86_64" and python_version >= "3.8" packaging==21.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" pandocfilters==1.5.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" parso==0.8.3; python_version >= "3.8" @@ -68,39 +68,40 @@ pathspec==0.9.0; python_full_version >= "3.6.2" and python_version >= "3.8" pexpect==4.8.0; sys_platform != "win32" and python_version >= "3.8" pickleshare==0.7.5; python_version >= "3.8" platformdirs==2.4.1; python_full_version >= "3.6.2" and python_version >= "3.8" -prometheus-client==0.12.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" -prompt-toolkit==3.0.24; python_full_version >= "3.6.2" and python_version >= "3.8" -protobuf==3.19.3; python_version >= "3.8" +prometheus-client==0.13.1; python_version >= "3.6" +prompt-toolkit==3.0.26; python_full_version >= "3.6.2" and python_version >= "3.8" +protobuf==3.19.4; python_version >= "3.8" psutil==5.9.0; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") ptyprocess==0.7.0; os_name != "nt" and python_version >= "3.8" and sys_platform != "win32" -pure-eval==0.2.1; python_version >= "3.8" +pure-eval==0.2.2; python_version >= "3.8" py==1.11.0; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.6.1" pycparser==2.21; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.6.1" pygments==2.11.2; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" pymdown-extensions==9.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" -pyparsing==3.0.6; python_version >= "3.6" +pyparsing==3.0.7; python_version >= "3.6" pyrsistent==0.18.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" pysocks==1.7.1; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" python-dateutil==2.8.2; python_full_version >= "3.6.1" and python_version >= "3.7" pywin32==303; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -pywinpty==1.1.6; os_name == "nt" and python_version >= "3.6" +pywinpty==2.0.2; os_name == "nt" and python_version >= "3.7" pyyaml-env-tag==0.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" pyyaml==6.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" pyzmq==22.3.0; python_full_version >= "3.6.1" and python_version >= "3.7" qtconsole==5.2.2; python_version >= "3.6" -qtpy==2.0.0; python_version >= "3.6" +qtpy==2.0.1; python_version >= "3.6" requests==2.27.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0") send2trash==1.8.0 six==1.16.0; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4" and (python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.8") soupsieve==2.3.1; python_full_version > "3.0.0" and python_version >= "3.8" stack-data==0.1.4; python_version >= "3.8" -terminado==0.12.1; python_version >= "3.6" +stringcase==1.2.0; python_version >= "3.8" +terminado==0.13.1; python_version >= "3.7" testpath==0.5.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" toml==0.10.2; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" -tomli==1.2.3; python_full_version >= "3.6.2" and python_version >= "3.8" +tomli==2.0.0; python_full_version >= "3.6.2" and python_version >= "3.8" tornado==6.1; python_full_version >= "3.6.1" and python_version >= "3.7" traitlets==5.1.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" -typing-extensions==4.0.1 +typing-extensions==4.0.1; python_full_version >= "3.6.2" and python_version >= "3.8" and python_version < "3.10" urllib3==1.26.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" waitress==2.0.0; python_full_version >= "3.6.0" watchdog==2.1.6; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" @@ -109,5 +110,5 @@ webencodings==0.5.1; python_full_version >= "3.7.1" and python_version < "4" and webob==1.8.7; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") webtest==2.0.35 widgetsnbextension==3.5.2 -zipp==3.7.0; python_version < "3.9" and python_version >= "3.7" and python_full_version >= "3.7.1" +zipp==3.7.0; python_version < "3.9" and python_version >= "3.8" and python_full_version >= "3.7.1" -e src/. diff --git a/src/requirements.txt b/src/requirements.txt index 02caaed..ab0442c 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,22 +1,23 @@ # THE FILE WAS GENERATED BY POETRY, DO NOT EDIT! -anki==2.1.46; python_version >= "3.8" +anki==2.1.49; python_version >= "3.8" beautifulsoup4==4.10.0; python_full_version > "3.0.0" certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -charset-normalizer==2.0.10; python_full_version >= "3.6.0" and python_version >= "3.8" +charset-normalizer==2.0.11; python_full_version >= "3.6.0" and python_version >= "3.8" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") distro==1.6.0 idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -importlib-metadata==4.10.0; python_version < "3.10" and python_version >= "3.7" +importlib-metadata==4.10.1; python_version < "3.10" and python_version >= "3.8" markdown==3.3.6; python_version >= "3.6" -orjson==3.6.5; platform_machine == "x86_64" and python_version >= "3.8" -protobuf==3.19.3; python_version >= "3.8" +orjson==3.6.6; platform_machine == "x86_64" and python_version >= "3.8" +protobuf==3.19.4; python_version >= "3.8" psutil==5.9.0; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") pysocks==1.7.1; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" requests==2.27.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0") send2trash==1.8.0 soupsieve==2.3.1; python_full_version > "3.0.0" and python_version >= "3.8" +stringcase==1.2.0; python_version >= "3.8" urllib3==1.26.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" webob==1.8.7; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") -zipp==3.7.0; python_version < "3.10" and python_version >= "3.7" +zipp==3.7.0; python_version < "3.10" and python_version >= "3.8" From e47ed57212c7beb1a593bb54ba5717ffaad2c8de Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sun, 6 Feb 2022 15:32:39 +0000 Subject: [PATCH 06/59] feat: Move cli scripts into a single package --- src/{ => ankisyncd_cli}/ankisyncctl.py | 0 src/{utils => ankisyncd_cli}/migrate_user_tables.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/{ => ankisyncd_cli}/ankisyncctl.py (100%) mode change 100755 => 100644 rename src/{utils => ankisyncd_cli}/migrate_user_tables.py (100%) mode change 100755 => 100644 diff --git a/src/ankisyncctl.py b/src/ankisyncd_cli/ankisyncctl.py old mode 100755 new mode 100644 similarity index 100% rename from src/ankisyncctl.py rename to src/ankisyncd_cli/ankisyncctl.py diff --git a/src/utils/migrate_user_tables.py b/src/ankisyncd_cli/migrate_user_tables.py old mode 100755 new mode 100644 similarity index 100% rename from src/utils/migrate_user_tables.py rename to src/ankisyncd_cli/migrate_user_tables.py From 83b11079c35dc9967ff55c7a17173fcd9ae34d9b Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sun, 6 Feb 2022 15:40:30 +0000 Subject: [PATCH 07/59] lint: Add line break --- src/ankisyncd/sync_app.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index 2333839..49b5de1 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -631,4 +631,5 @@ def main(): finally: shutdown() -if __name__ == '__main__': main() +if __name__ == '__main__': + main() From 7cbc3d94d4228c0c77dc74a3cc19f78d1b2ed12a Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sun, 6 Feb 2022 16:08:45 +0000 Subject: [PATCH 08/59] chore: Add config folder rules to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index c3241a4..3ea0749 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,9 @@ /collections /venv +/config/* +!/config/.env.example + # Created by https://www.toptal.com/developers/gitignore/api/windows,linux,macos,python,jupyternotebooks # Edit at https://www.toptal.com/developers/gitignore?templates=windows,linux,macos,python,jupyternotebooks From 0f0af487364bfba85111483d6d971c90343a6a01 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Fri, 4 Mar 2022 22:19:10 +0000 Subject: [PATCH 09/59] fix: use absolute path in package import to find module --- src/ankisyncd_cli/ankisyncctl.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ankisyncd_cli/ankisyncctl.py b/src/ankisyncd_cli/ankisyncctl.py index c851006..8d0d055 100644 --- a/src/ankisyncd_cli/ankisyncctl.py +++ b/src/ankisyncd_cli/ankisyncctl.py @@ -3,11 +3,11 @@ import os import sys import getpass -import ankisyncd.config -from ankisyncd.users import get_user_manager +from src.ankisyncd import config +from src.ankisyncd.users import get_user_manager -config = ankisyncd.config.load() +config = config.load() def usage(): print("usage: {} []".format(sys.argv[0])) From 8ccf4453e1bc0f44efacac96ab4d5b4719921122 Mon Sep 17 00:00:00 2001 From: Marcel Ackermann <31695+dreamflasher@users.noreply.github.com> Date: Tue, 23 Mar 2021 08:30:32 +0100 Subject: [PATCH 10/59] include env config for docker --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ebc0d18..fdcae30 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Installing $ pip install -r src/requirements.txt -2. Modify ankisyncd.conf according to your needs +2. Configuration: The config file can be found here: `https://github.com/ankicommunity/anki-sync-server/src/ankisyncd.conf`. Copying the config file from `src/ankisyncd.conf` to `src/ankisyncd/ankisyncd.conf` will allow you to configure the server. Subsequent commands refer to `/anki-sync-server/src/ankisyncd`. 3. Create user: @@ -88,6 +88,16 @@ Installing (Docker) Follow [these instructions](https://github.com/ankicommunity/anki-devops-services#about-this-docker-image). +Configuration: .env.local (Environment variables) +* The environment variables can be found here: config/.env.example. +* The file also includes other development variables, but the notable ones are the ones with the prefix ANKISYNCD_ +* Environment variables will override the config files values (which is why I recommend you use them) +* This is what we use in the Docker images (see: https://github.com/ankicommunity/anki-devops-services/blob/develop/services/anki-sync-server/examples/docker-compose.yml). +* Copying the config file from config/.env.example to config/.env.local will allow you to configure the server when using the make commands +* You can also set it when running the server e.g. ANKISYNCD_PORT=5001 make run +* The above two options are useful for development. But if you're only going for usage, you can also set it globally by adding it to your ~/.bashrc file e.g. export ANKISYNCD_PORT=50001 + + Setting up Anki --------------- From 127c35eec69efd4b8f25c8760482fd3aaa35d896 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Tue, 8 Mar 2022 21:03:05 +0000 Subject: [PATCH 11/59] docs: Move info on environment variables under the appropriate heading --- README.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index fdcae30..0a9dc60 100644 --- a/README.md +++ b/README.md @@ -88,15 +88,6 @@ Installing (Docker) Follow [these instructions](https://github.com/ankicommunity/anki-devops-services#about-this-docker-image). -Configuration: .env.local (Environment variables) -* The environment variables can be found here: config/.env.example. -* The file also includes other development variables, but the notable ones are the ones with the prefix ANKISYNCD_ -* Environment variables will override the config files values (which is why I recommend you use them) -* This is what we use in the Docker images (see: https://github.com/ankicommunity/anki-devops-services/blob/develop/services/anki-sync-server/examples/docker-compose.yml). -* Copying the config file from config/.env.example to config/.env.local will allow you to configure the server when using the make commands -* You can also set it when running the server e.g. ANKISYNCD_PORT=5001 make run -* The above two options are useful for development. But if you're only going for usage, you can also set it globally by adding it to your ~/.bashrc file e.g. export ANKISYNCD_PORT=50001 - Setting up Anki --------------- @@ -204,6 +195,14 @@ to the uppercase form of the configuration value. E.g. the environment variable, Environment variables override the values set in the `ankisyncd.conf`. +* The environment variables can be found here: config/.env.example. +* The file also includes other development variables, but the notable ones are the ones with the prefix ANKISYNCD_ +* Environment variables will override the config files values (which is why I recommend you use them) +* This is what we use in the Docker images (see: https://github.com/ankicommunity/anki-devops-services/blob/develop/services/anki-sync-server/examples/docker-compose.yml). +* Copying the config file from config/.env.example to config/.env.local will allow you to configure the server when using the make commands +* You can also set it when running the server e.g. ANKISYNCD_PORT=5001 make run +* The above two options are useful for development. But if you're only going for usage, you can also set it globally by adding it to your ~/.bashrc file e.g. export ANKISYNCD_PORT=50001 + Support for other database backends ----------------------------------- From f0da921f5350b447726b97fa92b833577a14c551 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Tue, 8 Mar 2022 21:05:43 +0000 Subject: [PATCH 12/59] docs: Add command to simplify the process of using config file --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0a9dc60..195e75e 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,9 @@ Installing $ pip install -r src/requirements.txt -2. Configuration: The config file can be found here: `https://github.com/ankicommunity/anki-sync-server/src/ankisyncd.conf`. Copying the config file from `src/ankisyncd.conf` to `src/ankisyncd/ankisyncd.conf` will allow you to configure the server. Subsequent commands refer to `/anki-sync-server/src/ankisyncd`. +2. Copy the default config file ([ankisyncd.conf](src/ankisyncd.conf)) to configure the server using the command below. Environment variables can be used instead, see: [ENVVAR configuration overrides](#envvar-configuration-overrides). + + $ cp src/ankisyncd.conf src/ankisyncd/. 3. Create user: From ef2086fbbe5a753161ff796927b1ecd7f5baccf5 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Tue, 8 Mar 2022 21:12:35 +0000 Subject: [PATCH 13/59] docs: Add sub-headers for the two types of configuration --- README.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 195e75e..68fddc6 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,9 @@ It supports Python 3 and Anki 2.1. - [AnkiDroid](#ankidroid) - [Development](#development) - [Testing](#testing) - - [ENVVAR configuration overrides](#envvar-configuration-overrides) + - [Configuration](#configuration) + - [Environment Variables](#environment-variables-preferred) + - [Config File](#config-file-ankisyncdconf) - [Support for other database backends](#support-for-other-database-backends) @@ -42,7 +44,7 @@ Installing $ pip install -r src/requirements.txt -2. Copy the default config file ([ankisyncd.conf](src/ankisyncd.conf)) to configure the server using the command below. Environment variables can be used instead, see: [ENVVAR configuration overrides](#envvar-configuration-overrides). +2. Copy the default config file ([ankisyncd.conf](src/ankisyncd.conf)) to configure the server using the command below. Environment variables can be used instead, see: [Configuration](#configuration). $ cp src/ankisyncd.conf src/ankisyncd/. @@ -174,7 +176,7 @@ This project uses [GNU Make](https://www.gnu.org/software/make/) to simplify the $ cp config/.env.example config/.env.local ``` -See [ENVVAR configuration overrides](#envvar-configuration-overrides) for more information. +See [Configuration](#configuration) for more information. 2. Download Python dependencies. @@ -188,8 +190,9 @@ $ make init $ make tests ``` -ENVVAR configuration overrides ------------------------------- +## Configuration + +### Environment Variables (preferred) Configuration values can be set via environment variables using `ANKISYNCD_` prepended to the uppercase form of the configuration value. E.g. the environment variable, @@ -205,6 +208,11 @@ Environment variables override the values set in the `ankisyncd.conf`. * You can also set it when running the server e.g. ANKISYNCD_PORT=5001 make run * The above two options are useful for development. But if you're only going for usage, you can also set it globally by adding it to your ~/.bashrc file e.g. export ANKISYNCD_PORT=50001 +### Config File: ankisyncd.conf + +A config file can be used to configuring the server. It can be found here: [src/ankisyncd.conf](src/ankisyncd.conf). + + Support for other database backends ----------------------------------- From 7ef846c52e6a9db1dfd84100ede3cc86087692fd Mon Sep 17 00:00:00 2001 From: TomRomeo <60541979+TomRomeo@users.noreply.github.com> Date: Wed, 16 Feb 2022 08:45:49 +0100 Subject: [PATCH 14/59] fix: modified nginx config --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 68fddc6..bec0891 100644 --- a/README.md +++ b/README.md @@ -74,11 +74,14 @@ Installing location / { proxy_http_version 1.0; proxy_pass http://127.0.0.1:27702/; + client_max_body_size 222M; } } ``` + Adding the line `client_max_body_size 222M;` to Nginx prevents bigger collections from not being able to sync due to size limitations. + 5. Run ankisyncd: ``` From 682e8a3c48c911b44b88ed12bc94d308e5d55d3d Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Tue, 8 Mar 2022 22:13:05 +0000 Subject: [PATCH 15/59] docs: Fix path to example nginx config file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bec0891..3ab6078 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Installing requests to ankisyncd. An example configuration with ankisyncd running on the same machine as Nginx - and listening on port `27702` may look like ([entire config template click me](https://github.com/ankicommunity/anki-sync-server/blob/develop/docs/nginx.conf)): + and listening on port `27702` may look like ([entire config template click me](docs/src/nginx/nginx.example.conf)): ```nginx server { From 251df33e4e8d6114c803f908331804d76879c177 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Tue, 8 Mar 2022 22:13:46 +0000 Subject: [PATCH 16/59] docs: Fix indentation in nginx example snippet --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3ab6078..28850c6 100644 --- a/README.md +++ b/README.md @@ -69,13 +69,13 @@ Installing ```nginx server { - listen 27701; - server_name default; - location / { - proxy_http_version 1.0; - proxy_pass http://127.0.0.1:27702/; - client_max_body_size 222M; - } + listen 27701; + server_name default; + location / { + proxy_http_version 1.0; + proxy_pass http://127.0.0.1:27702/; + client_max_body_size 222M; + } } ``` From 1c21733ef27d0f0aebc51da54aff3944545bca2d Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Wed, 8 Sep 2021 19:51:16 +0800 Subject: [PATCH 17/59] enable_chunked_transfer_encoding_without_browser --- src/ankisyncd/sync.py | 138 +++++++---------- src/ankisyncd/sync_app.py | 183 +++++++++++++++++++---- src/ankisyncd_cli/migrate_user_tables.py | 0 3 files changed, 211 insertions(+), 110 deletions(-) mode change 100644 => 100755 src/ankisyncd_cli/migrate_user_tables.py diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index 99ce184..b8a9b8d 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -41,6 +41,21 @@ class Syncer(object): self.col = col self.server = server +# new added functions related to Syncer: +# these are removed from latest anki module +######################################################################## + def scm(self): + """return schema""" + scm=self.col.db.scalar("select scm from col") + return scm + def increment_usn(self): + """usn+1 in db""" + self.col.db.execute("update col set usn = usn + 1") + def set_modified_time(self,now:int): + self.col.db.execute("update col set mod=?", now) + def set_last_sync(self,now:int): + self.col.db.execute("update col set ls = ?", now) +######################################################################### def meta(self): return dict( mod=self.col.mod, @@ -66,7 +81,7 @@ class Syncer(object): # then the other objects self.mergeModels(rchg['models']) self.mergeDecks(rchg['decks']) - self.mergeTags(rchg['tags']) + # self.mergeTags(rchg['tags']) if 'conf' in rchg: self.mergeConf(rchg['conf']) # this was left out of earlier betas @@ -105,25 +120,25 @@ select id from notes where mid = ?) limit 1""" return False return True - def sanityCheck(self, full): - if not self.basicCheck(): - return "failed basic check" - for t in "cards", "notes", "revlog", "graves": - if self.col.db.scalar( - "select count() from %s where usn = -1" % t): - return "%s had usn = -1" % t - for g in self.col.decks.all(): - if g['usn'] == -1: - return "deck had usn = -1" - for t, usn in self.allItems(): - if usn == -1: - return "tag had usn = -1" - found = False - for m in self.col.models.all(): - if m['usn'] == -1: - return "model had usn = -1" - if found: - self.col.models.save() + def sanityCheck(self): + # basicCheck() seems to have no effect on this procedure, + # if necessary remove comment + # if not self.basicCheck(): + # return "failed basic check" + tables=["cards", + "notes", + "revlog", + "graves", + "decks", + "deck_config", + "tags", + "notetypes", + ] + for tb in tables: + print(self.col.db.scalar(f'select null from {tb} where usn=-1')) + if self.col.db.scalar(f'select null from {tb} where usn=-1'): + return f'table had usn=-1: {tb}' + self.col.sched.reset() # check for missing parent decks #self.col.sched.deckDueList() @@ -142,13 +157,15 @@ select id from notes where mid = ?) limit 1""" def usnLim(self): return "usn = -1" - def finish(self, mod=None): - self.col.ls = mod - self.col._usn = self.maxUsn + 1 + def finish(self, now=None): + if now is not None: # ensure we save the mod time even if no changes made - self.col.db.mod = True - self.col.save(mod=mod) - return mod + self.set_modified_time(now) + self.set_last_sync(now) + self.increment_usn() + self.col.save() + # now is None not happen + return now # Chunked syncing ########################################################################## @@ -195,67 +212,26 @@ from notes where %s""" % lim, self.maxUsn) # Deletions ########################################################################## - def removed(self): - cards = [] - notes = [] - decks = [] - - curs = self.col.db.execute( - "select oid, type from graves where usn = -1") - - for oid, type in curs: - if type == REM_CARD: - cards.append(oid) - elif type == REM_NOTE: - notes.append(oid) - else: - decks.append(oid) - - self.col.db.execute("update graves set usn=? where usn=-1", - self.maxUsn) - - return dict(cards=cards, notes=notes, decks=decks) - - def remove(self, graves): - # remove card and the card's orphaned notes + def add_grave(self, ids: List[int], type: int,usn: int): + items=[(id,type,usn) for id in ids] + # make sure table graves fields order and schema version match + # query sql1='pragma table_info(graves)' version query schema='select ver from col' + self.col.db.executemany( + "INSERT OR IGNORE INTO graves (oid, type, usn) VALUES (?, ?, ?)" , + items) + + def apply_graves(self, graves,latest_usn: int): + # remove card and the card's orphaned notes self.col.remove_cards_and_orphaned_notes(graves['cards']) - + self.add_grave(graves['cards'], REM_CARD,latest_usn) # only notes self.col.remove_notes(graves['notes']) + self.add_grave(graves['notes'], REM_NOTE,latest_usn) # since level 0 deck ,we only remove deck ,but backend will delete child,it is ok, the delete # will have once effect - for oid in graves['decks']: - self.col.decks.rem(oid) - - - # we can place non-exist grave after above delete. - localgcards = [] - localgnotes = [] - localgdecks = [] - curs = self.col.db.execute( - "select oid, type from graves where usn = %d" % self.col.usn()) - - for oid, type in curs: - if type == REM_CARD: - localgcards.append(oid) - elif type == REM_NOTE: - localgnotes.append(oid) - else: - localgdecks.append(oid) - - # n meaning non-exsiting grave in the server compared to client - ncards = [ oid for oid in graves['cards'] if oid not in localgcards] - for oid in ncards: - self.col._logRem([oid], REM_CARD) - - nnotes = [ oid for oid in graves['notes'] if oid not in localgnotes] - for oid in nnotes: - self.col._logRem([oid], REM_NOTE) - - ndecks = [ oid for oid in graves['decks'] if oid not in localgdecks] - for oid in ndecks: - self.col._logRem([oid], REM_DECK) + self.col.decks.remove(graves['decks']) + self.add_grave(graves['decks'], REM_DECK,latest_usn) # Models ########################################################################## diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index 49b5de1..567f229 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -33,11 +33,12 @@ from sqlite3 import dbapi2 as sqlite from webob import Response from webob.dec import wsgify from webob.exc import * +import urllib.parse +from anki.collection import Collection import anki.db import anki.utils from anki.consts import REM_CARD, REM_NOTE - from ankisyncd.full_sync import get_full_sync_manager from ankisyncd.sessions import get_session_manager from ankisyncd.sync import Syncer, SYNC_VER, SYNC_ZIP_SIZE, SYNC_ZIP_COUNT @@ -97,8 +98,8 @@ class SyncCollectionHandler(Syncer): return { 'mod': self.col.mod, - 'scm': self.col.scm, - 'usn': self.col._usn, + 'scm': self.scm(), + 'usn': self.col.usn(), 'ts': anki.utils.intTime(), 'musn': self.col.media.lastUsn(), 'uname': self.session.name, @@ -117,19 +118,20 @@ class SyncCollectionHandler(Syncer): # Since now have not thorougly test the V2 scheduler, we leave this comments here, and # just enable the V2 scheduler in the serve code. - self.maxUsn = self.col._usn + self.maxUsn = self.col.usn() self.minUsn = minUsn self.lnewer = not lnewer + # fetch local/server graves lgraves = self.removed() - # convert grave:None to {'cards': [], 'notes': [], 'decks': []} - # because req.POST['data'] returned value of grave is None - if graves==None: - graves={'cards': [], 'notes': [], 'decks': []} - self.remove(graves) + # handle AnkiDroid using old protocol + # Only if Operations like deleting deck are performed on Ankidroid + # can (client) graves is not None + if graves is not None: + self.apply_graves(graves,self.maxUsn) return lgraves def applyGraves(self, chunk): - self.remove(chunk) + self.apply_graves(chunk,self.maxUsn) def applyChanges(self, changes): self.rchg = changes @@ -138,8 +140,8 @@ class SyncCollectionHandler(Syncer): self.mergeChanges(lchg, self.rchg) return lchg - def sanityCheck2(self, client, full=None): - server = self.sanityCheck(full) + def sanityCheck2(self, client): + server = self.sanityCheck() if client != server: logger.info( f"sanity check failed with server: {server} client: {client}" @@ -148,7 +150,7 @@ class SyncCollectionHandler(Syncer): return dict(status="bad", c=client, s=server) return dict(status="ok") - def finish(self, mod=None): + def finish(self): return super().finish(anki.utils.intTime(1000)) # This function had to be put here in its entirety because Syncer.removed() @@ -178,7 +180,7 @@ class SyncCollectionHandler(Syncer): def getDecks(self): return [ [g for g in self.col.decks.all() if g['usn'] >= self.minUsn], - [g for g in self.col.decks.allConf() if g['usn'] >= self.minUsn] + [g for g in self.col.decks.all_config() if g['usn'] >= self.minUsn] ] def getTags(self): @@ -338,7 +340,6 @@ class SyncMediaHandler: if lastUsn < server_lastUsn or lastUsn == 0: for fname,usn,csum, in self.col.media.changes(lastUsn): result.append([fname, usn, csum]) - # anki assumes server_lastUsn == result[-1][1] # ref: anki/sync.py:720 (commit cca3fcb2418880d0430a5c5c2e6b81ba260065b7) result.reverse() @@ -394,7 +395,125 @@ class SyncUserSession: # for inactivity and then later re-open it (creating a new Collection object). handler.col = col return handler +class Requests(object): + '''parse request message from client''' + def __init__(self,environ: dict): + self.query_string=environ['QUERY_STRING'] + self.environ=environ + self.data=None + @property + def path(self): + return self.environ['PATH_INFO'] + @property + def parse_request(self): + '''Return a MultiDict containing all the variables from a form + request.''' + env = self.environ + content_len= env.get('CONTENT_LENGTH', '0') + input = env.get('wsgi.input') + length = 0 if content_len == '' else int(content_len) + body=b'' + d={} + + if length == 0: + if input is None: + return + if env.get('HTTP_TRANSFER_ENCODING','0') == 'chunked': + bd=b'' + size = int(input.readline(),16) + while size > 0: + bd += (input.read(size+2)).strip() + size = int(input.readline(),16) + repeat=re.findall(b'^(.*?)Content-Disposition: form-data; name="data"',bd,re.MULTILINE) + items=re.split(repeat,bd) + # del first ,last item + items.pop() + items.pop(0) + for item in items: + if b'name="data"' in item: + dt=item.strip(b'Content-Disposition: form-data; name="data"; filename="data"') + d['data']=dt + continue + key=re.findall(b'name="(.*?)"',item)[0].decode('utf-8') + v=item[item.rfind(b'"')+1:].decode('utf-8') + d[key]=v + return d + + + if self.query_string !='': + # GET method + body=self.query_string + d=urllib.parse.parse_qs(body) + for k,v in d.items(): + d[k]=''.join(v) + return d + # request server with web server + if self.path=='/' : + d= {'url':b'Anki Sync Server'} + return d + if self.path=='/favicon.ico' : + d= {'url':b''} + return d + + else: + body = env['wsgi.input'].read(length) + + if body is None or body ==b'': + return 'empty body' + # process body to dict + repeat=body.splitlines()[0] + items=re.split(repeat,body) + # del first ,last item + items.pop() + items.pop(0) + for item in items: + if b'name="data"' in item: + bt=None + # remove \r\n + if b'application/octet-stream' in item: + # Ankidroid case + item=re.sub(b'Content-Disposition: form-data; name="data"; filename="data"',b'',item) + item=re.sub(b'Content-Type: application/octet-stream',b'',item) + bt=item.strip() + else: + # PKzip file stream and others + item=re.sub(b'Content-Disposition: form-data; name="data"; filename="data"',b'',item) + bt=item.strip() + d['data']=bt + continue + item=re.sub(b'\r\n',b'',item,flags=re.MULTILINE) + key=re.findall(b'name="(.*?)"',item)[0].decode('utf-8') + v=item[item.rfind(b'"')+1:].decode('utf-8') + d[key]=v + return d + @property + def params(self): + """ + A dictionary-like object containing both the parameters from + the query string and request body. + """ + + r=self.parse_request + if r is None : + return 'POST or GET is None' + else: + + params = MultiDict(r) + return params +class MultiDict(object): + def __init__(self, *dicts): + for d in dicts: + if not isinstance(d,dict): + raise TypeError(d) + self.dicts=dicts + def __getitem__(self,key): + for d in self.dicts: + try: + value = d[key] + return value + except KeyError: + raise KeyError(key) class SyncApp: valid_urls = SyncCollectionHandler.operations + SyncMediaHandler.operations + ['hostKey', 'upload', 'download'] @@ -467,11 +586,12 @@ class SyncApp: # local copy in Anki return self.full_sync_manager.download(col, session) - @wsgify - def __call__(self, req): + def __call__(self, env,start_resp): + req=Requests(env) + p=req.params # Get and verify the session try: - hkey = req.params['k'] + hkey = p['k'] except KeyError: hkey = None @@ -479,18 +599,18 @@ class SyncApp: if session is None: try: - skey = req.POST['sk'] + skey = p['sk'] session = self.session_manager.load_from_skey(skey, self.create_session) except KeyError: skey = None try: - compression = int(req.POST['c']) + compression = int(p['c']) except KeyError: compression = 0 try: - data = req.POST['data'].file.read() + data = p['data'] data = self._decode_data(data, compression) except KeyError: data = {} @@ -503,7 +623,8 @@ class SyncApp: if url == 'hostKey': result = self.operation_hostKey(data.get("u"), data.get("p")) if result: - return json.dumps(result) + resp=Response(json.dumps(result)) + return resp(env,start_resp) else: # TODO: do I have to pass 'null' for the client to receive None? raise HTTPForbidden('null') @@ -529,17 +650,20 @@ class SyncApp: if type(result) not in (str, bytes, Response): result = json.dumps(result) - return result + resp=Response(result) + return resp(env,start_resp) elif url == 'upload': thread = session.get_thread() result = thread.execute(self.operation_upload, [data['data'], session]) - return result + resp=Response(json.dumps(result)) + return resp(env,start_resp) elif url == 'download': thread = session.get_thread() result = thread.execute(self.operation_download, [session]) - return result + resp=Response(result) + return resp(env,start_resp) # This was one of our operations but it didn't get handled... Oops! raise HTTPInternalServerError() @@ -563,9 +687,10 @@ class SyncApp: if type(result) not in (str, bytes): result = json.dumps(result) - return result - - return "Anki Sync Server" + resp=Response(result) + return resp(env,start_resp) + resp=Response(p['url']) + return resp(env,start_resp) @staticmethod def _execute_handler_method_in_thread(method_name, keyword_args, session): @@ -631,5 +756,5 @@ def main(): finally: shutdown() -if __name__ == '__main__': +if __name__ == '__main__': main() diff --git a/src/ankisyncd_cli/migrate_user_tables.py b/src/ankisyncd_cli/migrate_user_tables.py old mode 100644 new mode 100755 From 9279ccd35d1db3a66300e32d2ca9ac00e3701d52 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Wed, 8 Sep 2021 20:15:30 +0800 Subject: [PATCH 18/59] remove_unused_import --- src/ankisyncd/sync_app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index 567f229..9993df9 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -31,7 +31,6 @@ from configparser import ConfigParser from sqlite3 import dbapi2 as sqlite from webob import Response -from webob.dec import wsgify from webob.exc import * import urllib.parse From 388ca82466b1c8e3517dbe80bf4da0325430f1b5 Mon Sep 17 00:00:00 2001 From: dobefore <46564102+dobefore@users.noreply.github.com> Date: Thu, 9 Sep 2021 11:57:37 +0800 Subject: [PATCH 19/59] Update sync_app.py --- src/ankisyncd/sync_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index 9993df9..1ac5418 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -447,7 +447,7 @@ class Requests(object): d[k]=''.join(v) return d - # request server with web server + # request server with web browser if self.path=='/' : d= {'url':b'Anki Sync Server'} return d From 6a71fc3ca552629e772a17dc25e968bb02605976 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Mon, 13 Sep 2021 11:33:12 +0800 Subject: [PATCH 20/59] fix_repeat_is_list --- src/ankisyncd/full_sync.py | 2 +- src/ankisyncd/sync.py | 2 +- src/ankisyncd/sync_app.py | 15 +++++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/ankisyncd/full_sync.py b/src/ankisyncd/full_sync.py index a6c9b9d..7050a14 100644 --- a/src/ankisyncd/full_sync.py +++ b/src/ankisyncd/full_sync.py @@ -23,7 +23,7 @@ class FullSyncManager: "Integrity check failed for uploaded collection database file." ) - def upload(self, col: Collection, data: bytes, session) -> str: + def upload(self, col: Collection, data: bytes, session) : """ Uploads a sqlite database from the client to the sync server. diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index b8a9b8d..7ddabd9 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -151,7 +151,7 @@ select id from notes where mid = ?) limit 1""" self.col.db.scalar("select count() from graves"), len(self.col.models.all()), len(self.col.decks.all()), - len(self.col.decks.allConf()), + len(self.col.decks.all_config()), ] def usnLim(self): diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index 1ac5418..960dc01 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -141,13 +141,15 @@ class SyncCollectionHandler(Syncer): def sanityCheck2(self, client): server = self.sanityCheck() + status="ok" if client != server: logger.info( f"sanity check failed with server: {server} client: {client}" ) + status='bad' + + return dict(status, c=client, s=server) - return dict(status="bad", c=client, s=server) - return dict(status="ok") def finish(self): return super().finish(anki.utils.intTime(1000)) @@ -418,13 +420,12 @@ class Requests(object): if input is None: return if env.get('HTTP_TRANSFER_ENCODING','0') == 'chunked': - bd=b'' size = int(input.readline(),16) while size > 0: - bd += (input.read(size+2)).strip() + body += (input.read(size+2)).strip() size = int(input.readline(),16) - repeat=re.findall(b'^(.*?)Content-Disposition: form-data; name="data"',bd,re.MULTILINE) - items=re.split(repeat,bd) + repeat=re.findall(b'^(.*?)Content-Disposition: form-data; name="data"',body,re.MULTILINE)[0] + items=re.split(repeat,body) # del first ,last item items.pop() items.pop(0) @@ -655,6 +656,8 @@ class SyncApp: elif url == 'upload': thread = session.get_thread() result = thread.execute(self.operation_upload, [data['data'], session]) + print('#### from call') + print(result) resp=Response(json.dumps(result)) return resp(env,start_resp) From 1e85c11ab08bf7974d52b0e902e188baac326e31 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Mon, 13 Sep 2021 12:17:32 +0800 Subject: [PATCH 21/59] add_str_method_to_Mdict --- src/ankisyncd/sync_app.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index 960dc01..b51a462 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -403,7 +403,7 @@ class Requests(object): self.environ=environ self.data=None @property - def path(self): + def path(self)-> str: return self.environ['PATH_INFO'] @property def parse_request(self): @@ -502,18 +502,18 @@ class Requests(object): params = MultiDict(r) return params class MultiDict(object): - def __init__(self, *dicts): - for d in dicts: - if not isinstance(d,dict): - raise TypeError(d) + def __init__(self, dicts: dict): + if not isinstance(dicts,dict): + raise TypeError(dicts) self.dicts=dicts + def __str__(self) -> str: + return dict.__str__(self.dicts) def __getitem__(self,key): - for d in self.dicts: - try: - value = d[key] - return value - except KeyError: - raise KeyError(key) + try: + value = self.dicts[key] + return value + except KeyError: + raise KeyError(key) class SyncApp: valid_urls = SyncCollectionHandler.operations + SyncMediaHandler.operations + ['hostKey', 'upload', 'download'] @@ -635,8 +635,8 @@ class SyncApp: if url in SyncCollectionHandler.operations + SyncMediaHandler.operations: # 'meta' passes the SYNC_VER but it isn't used in the handler if url == 'meta': - if session.skey == None and 's' in req.POST: - session.skey = req.POST['s'] + if session.skey == None and 's' in p: + session.skey = p['s'] if 'v' in data: session.version = data['v'] if 'cv' in data: From dde758857ed8c2b2d1ca3842acd71d896f0c883f Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Mon, 13 Sep 2021 17:04:10 +0800 Subject: [PATCH 22/59] can_upload_on_ankidroid --- src/ankisyncd/sync_app.py | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index b51a462..a4bc05e 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from datetime import date import gzip import hashlib import io @@ -420,22 +421,27 @@ class Requests(object): if input is None: return if env.get('HTTP_TRANSFER_ENCODING','0') == 'chunked': - size = int(input.readline(),16) - while size > 0: - body += (input.read(size+2)).strip() - size = int(input.readline(),16) - repeat=re.findall(b'^(.*?)Content-Disposition: form-data; name="data"',body,re.MULTILINE)[0] - items=re.split(repeat,body) - # del first ,last item + body =input.read() + repeat=body.splitlines()[1] + items=body.split(repeat) + items.pop() items.pop(0) - for item in items: - if b'name="data"' in item: - dt=item.strip(b'Content-Disposition: form-data; name="data"; filename="data"') - d['data']=dt - continue - key=re.findall(b'name="(.*?)"',item)[0].decode('utf-8') - v=item[item.rfind(b'"')+1:].decode('utf-8') + # parse data + data_raw=items[0] + data_raw_li=data_raw.splitlines() + data1=data_raw_li[7] + cd=data_raw_li[3] + start_len=len(data_raw_li[2])+len(cd)+len(data1)+len(data_raw_li[8])+len(data_raw_li[6])+len(b'\r\n')*9 + end_len=-len(data_raw_li[-1])-len(data_raw_li[-4])-len(b'\r\n')*5 + data=data1+data_raw[start_len:end_len] + d['data']=data + # + others=items[1:] + for i in others: + i=i.splitlines() + key=re.findall(b'name="(.*?)"',i[3])[0].decode('utf-8') + v=i[-5].decode('utf-8') d[key]=v return d @@ -658,8 +664,9 @@ class SyncApp: result = thread.execute(self.operation_upload, [data['data'], session]) print('#### from call') print(result) - resp=Response(json.dumps(result)) + resp=Response(result) return resp(env,start_resp) + elif url == 'download': thread = session.get_thread() @@ -691,6 +698,7 @@ class SyncApp: resp=Response(result) return resp(env,start_resp) + print(p) resp=Response(p['url']) return resp(env,start_resp) From 078269df889d0bd81a557b8aac5f2a9600413f24 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Mon, 13 Sep 2021 19:40:53 +0800 Subject: [PATCH 23/59] seems_to_fix_parse_chunked_data --- src/ankisyncd/sync_app.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index a4bc05e..0e08d4a 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -424,7 +424,6 @@ class Requests(object): body =input.read() repeat=body.splitlines()[1] items=body.split(repeat) - items.pop() items.pop(0) # parse data @@ -662,8 +661,6 @@ class SyncApp: elif url == 'upload': thread = session.get_thread() result = thread.execute(self.operation_upload, [data['data'], session]) - print('#### from call') - print(result) resp=Response(result) return resp(env,start_resp) @@ -698,7 +695,6 @@ class SyncApp: resp=Response(result) return resp(env,start_resp) - print(p) resp=Response(p['url']) return resp(env,start_resp) From 0409ff959284e59a1f0042595dd0a6f267b9b238 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Tue, 14 Sep 2021 12:56:25 +0800 Subject: [PATCH 24/59] fix_sanityCheck2_return_params_error --- src/ankisyncd/sync_app.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index 0e08d4a..c965b7c 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -147,9 +147,8 @@ class SyncCollectionHandler(Syncer): logger.info( f"sanity check failed with server: {server} client: {client}" ) - status='bad' - - return dict(status, c=client, s=server) + return dict(status="bad", c=client, s=server) + return dict(status="ok") def finish(self): From c95ea86a3b72e7e6e84a6997de16880a7a79ef5b Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Tue, 14 Sep 2021 16:37:20 +0800 Subject: [PATCH 25/59] fix_upload_block_process --- src/ankisyncd/sync_app.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index c965b7c..cee9806 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -14,22 +14,17 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from datetime import date import gzip -import hashlib import io import json import logging import os import random import re -import string import sys import time import unicodedata import zipfile -from configparser import ConfigParser -from sqlite3 import dbapi2 as sqlite from webob import Response from webob.exc import * @@ -420,30 +415,35 @@ class Requests(object): if input is None: return if env.get('HTTP_TRANSFER_ENCODING','0') == 'chunked': - body =input.read() - repeat=body.splitlines()[1] - items=body.split(repeat) + # method readlines() and read(no len) will block the process + leng=int(input.readline(),16) + while leng >0: + body += input.read(leng+2) + leng = int(input.readline(),16) + + boundary=body.splitlines()[0] + items=body.split(boundary) items.pop() items.pop(0) # parse data - data_raw=items[0] + data_raw=items[0].strip() data_raw_li=data_raw.splitlines() - data1=data_raw_li[7] - cd=data_raw_li[3] - start_len=len(data_raw_li[2])+len(cd)+len(data1)+len(data_raw_li[8])+len(data_raw_li[6])+len(b'\r\n')*9 - end_len=-len(data_raw_li[-1])-len(data_raw_li[-4])-len(b'\r\n')*5 - data=data1+data_raw[start_len:end_len] + data1=data_raw_li[3] + cd=data_raw_li[0] + start_len=4*len(b'\r\n')+len(cd)+len(data1) + data2=data_raw[start_len:] + data=data1+data2 d['data']=data # others=items[1:] for i in others: i=i.splitlines() - key=re.findall(b'name="(.*?)"',i[3])[0].decode('utf-8') - v=i[-5].decode('utf-8') + print(i) + key=re.findall(b'name="(.*?)"',i[2])[0].decode('utf-8') + v=i[-3].decode('utf-8') d[key]=v return d - if self.query_string !='': # GET method body=self.query_string From 92af6e21bf9a4c8e3dedefddd7e44eb89503e9fe Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Tue, 14 Sep 2021 17:11:13 +0800 Subject: [PATCH 26/59] revise_parse_request --- src/ankisyncd/sync_app.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index cee9806..a4fc2a8 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -420,25 +420,30 @@ class Requests(object): while leng >0: body += input.read(leng+2) leng = int(input.readline(),16) - + print(body) boundary=body.splitlines()[0] items=body.split(boundary) items.pop() items.pop(0) # parse data data_raw=items[0].strip() - data_raw_li=data_raw.splitlines() - data1=data_raw_li[3] - cd=data_raw_li[0] - start_len=4*len(b'\r\n')+len(cd)+len(data1) - data2=data_raw[start_len:] - data=data1+data2 + cd=data_raw.splitlines()[0] + data_without_cd=data_raw[len(cd):].strip() + if b'\r\n' in data_without_cd: + # case 2.1.44 + data_raw_li=data_without_cd.splitlines() + data1=data_raw_li[0] + data2=data_without_cd[len(data1)+len(b'\r\n'):] + data=data1+data2 + else: + # case 2.1.46 + data=data_without_cd + print(data) d['data']=data # others=items[1:] for i in others: i=i.splitlines() - print(i) key=re.findall(b'name="(.*?)"',i[2])[0].decode('utf-8') v=i[-3].decode('utf-8') d[key]=v From e4e9c512670733f822a3c07d7198936726497e90 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Tue, 14 Sep 2021 21:12:01 +0800 Subject: [PATCH 27/59] sync_seccess_in_44and46 --- src/ankisyncd/sync_app.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index a4fc2a8..f2dba4a 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -415,12 +415,11 @@ class Requests(object): if input is None: return if env.get('HTTP_TRANSFER_ENCODING','0') == 'chunked': - # method readlines() and read(no len) will block the process + # readlines and read(no argument) will block leng=int(input.readline(),16) while leng >0: body += input.read(leng+2) leng = int(input.readline(),16) - print(body) boundary=body.splitlines()[0] items=body.split(boundary) items.pop() @@ -429,16 +428,12 @@ class Requests(object): data_raw=items[0].strip() cd=data_raw.splitlines()[0] data_without_cd=data_raw[len(cd):].strip() + data=b'' if b'\r\n' in data_without_cd: - # case 2.1.44 - data_raw_li=data_without_cd.splitlines() - data1=data_raw_li[0] - data2=data_without_cd[len(data1)+len(b'\r\n'):] - data=data1+data2 + # seems b'\r\n' should not exist in data + data=re.sub(b'\r\n',b'',data_without_cd,flags=re.M) else: - # case 2.1.46 data=data_without_cd - print(data) d['data']=data # others=items[1:] @@ -447,6 +442,7 @@ class Requests(object): key=re.findall(b'name="(.*?)"',i[2])[0].decode('utf-8') v=i[-3].decode('utf-8') d[key]=v + return d if self.query_string !='': From 443f3b6fe385cfd6c7e13c5da524fcbbf9f200fa Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Wed, 15 Sep 2021 14:05:09 +0800 Subject: [PATCH 28/59] api_replace --- src/ankisyncd/sync.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index 7ddabd9..e194cad 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -73,7 +73,7 @@ class Syncer(object): decks=self.getDecks(), tags=self.getTags()) if self.lnewer: - d['conf'] = json.loads(self.col.backend.get_all_config()) + d['conf'] = json.loads(self.col.all_config()) d['crt'] = self.col.crt return d @@ -332,7 +332,7 @@ from notes where %s""" % lim, self.maxUsn) self.col.db.executemany( "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", rows) - self.col.updateFieldCache([f[0] for f in rows]) + self.col.after_note_updates([f[0] for f in rows],True) # Col config ########################################################################## From cdfa5c419151b6269ebd5d78208065d32f495f67 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Wed, 15 Sep 2021 21:39:44 +0800 Subject: [PATCH 29/59] rewrite_parse_chunked_req --- src/ankisyncd/sync.py | 2 +- src/ankisyncd/sync_app.py | 74 +++++++++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index e194cad..7c9f98d 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -332,7 +332,7 @@ from notes where %s""" % lim, self.maxUsn) self.col.db.executemany( "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", rows) - self.col.after_note_updates([f[0] for f in rows],True) + self.col.after_note_updates([f[0] for f in rows], mark_modified=False, generate_cards=False) # Col config ########################################################################## diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index f2dba4a..ab14ee0 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -410,38 +410,67 @@ class Requests(object): length = 0 if content_len == '' else int(content_len) body=b'' d={} - + if length == 0: if input is None: return if env.get('HTTP_TRANSFER_ENCODING','0') == 'chunked': # readlines and read(no argument) will block + # convert byte str to number base 16 leng=int(input.readline(),16) + c=0 + bdry=b'' + data=[] + data_other=[] while leng >0: - body += input.read(leng+2) - leng = int(input.readline(),16) - boundary=body.splitlines()[0] - items=body.split(boundary) - items.pop() - items.pop(0) - # parse data - data_raw=items[0].strip() - cd=data_raw.splitlines()[0] - data_without_cd=data_raw[len(cd):].strip() - data=b'' - if b'\r\n' in data_without_cd: - # seems b'\r\n' should not exist in data - data=re.sub(b'\r\n',b'',data_without_cd,flags=re.M) - else: - data=data_without_cd - d['data']=data - # - others=items[1:] + c+=1 + dt = input.read(leng+2) + if c==1: + bdry=dt + elif c>=3: + # data + data_other.append(dt) + line=input.readline() + leng = int(line,16) + print(line) + data_other=[item for item in data_other if item!=b'\r\n\r\n'] + for item in data_other: + if bdry in item: + break + data.append(item.strip()) + d['data']=b''.join(data) + others=data_other[len(data):] + boundary=others[0] + others=b''.join(others).split(boundary.strip()) + others.pop() + others.pop(0) for i in others: i=i.splitlines() - key=re.findall(b'name="(.*?)"',i[2])[0].decode('utf-8') - v=i[-3].decode('utf-8') + key=re.findall(b'name="(.*?)"',i[2],flags=re.M)[0].decode('utf-8') + v=i[-1].decode('utf-8') d[key]=v + # boundary=body.splitlines()[0] + # items=body.split(boundary) + # items.pop() + # items.pop(0) + # # parse data + # data_raw=items[0].strip() + # cd=data_raw.splitlines()[0] + # data_without_cd=data_raw[len(cd):].strip() + # data=b'' + # if b'\r\n' in data_without_cd: + # # seems b'\r\n' should not exist in data + # data=re.sub(b'\r\n',b'',data_without_cd,flags=re.M) + # else: + # data=data_without_cd + # d['data']=data + # # + # others=items[1:] + # for i in others: + # i=i.splitlines() + # key=re.findall(b'name="(.*?)"',i[2])[0].decode('utf-8') + # v=i[-3].decode('utf-8') + # d[key]=v return d @@ -616,6 +645,7 @@ class SyncApp: try: data = p['data'] + print(compression) data = self._decode_data(data, compression) except KeyError: data = {} From 0eaf60feca312cd2ecc65e9f9be67756a7169c37 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Thu, 16 Sep 2021 13:06:53 +0800 Subject: [PATCH 30/59] revise_parse_req_to_correctly_parse_chunked_data --- src/ankisyncd/sync_app.py | 34 +++++----------------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index ab14ee0..cc6f979 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -430,14 +430,14 @@ class Requests(object): elif c>=3: # data data_other.append(dt) - line=input.readline() - leng = int(line,16) - print(line) + leng = int(input.readline(),16) data_other=[item for item in data_other if item!=b'\r\n\r\n'] for item in data_other: if bdry in item: break - data.append(item.strip()) + # only strip \r\n if there are extra \n + # eg b'?V\xc1\x8f>\xf9\xb1\n\r\n' + data.append(item[:-2]) d['data']=b''.join(data) others=data_other[len(data):] boundary=others[0] @@ -448,30 +448,7 @@ class Requests(object): i=i.splitlines() key=re.findall(b'name="(.*?)"',i[2],flags=re.M)[0].decode('utf-8') v=i[-1].decode('utf-8') - d[key]=v - # boundary=body.splitlines()[0] - # items=body.split(boundary) - # items.pop() - # items.pop(0) - # # parse data - # data_raw=items[0].strip() - # cd=data_raw.splitlines()[0] - # data_without_cd=data_raw[len(cd):].strip() - # data=b'' - # if b'\r\n' in data_without_cd: - # # seems b'\r\n' should not exist in data - # data=re.sub(b'\r\n',b'',data_without_cd,flags=re.M) - # else: - # data=data_without_cd - # d['data']=data - # # - # others=items[1:] - # for i in others: - # i=i.splitlines() - # key=re.findall(b'name="(.*?)"',i[2])[0].decode('utf-8') - # v=i[-3].decode('utf-8') - # d[key]=v - + d[key]=v return d if self.query_string !='': @@ -645,7 +622,6 @@ class SyncApp: try: data = p['data'] - print(compression) data = self._decode_data(data, compression) except KeyError: data = {} From fcc7a0645f47f94303800a1d0c5fcf4569f0b82e Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 17 Sep 2021 14:46:55 +0800 Subject: [PATCH 31/59] replace_deprecated_fn_log --- src/ankisyncd/sync.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index 7c9f98d..16494ee 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -318,7 +318,8 @@ from notes where %s""" % lim, self.maxUsn) for r in data: if r[0] not in lmods or lmods[r[0]] < r[modIdx]: update.append(r) - self.col.log(table, data) + # replace col.log by just using print + print(table, data) return update def mergeCards(self, cards): From b9f081af7770bc405cc12d44e639719d37c0b0fb Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 17 Sep 2021 19:30:17 +0800 Subject: [PATCH 32/59] fix_col_return_type_mismatch --- src/ankisyncd/sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index 16494ee..9f37a95 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -73,7 +73,7 @@ class Syncer(object): decks=self.getDecks(), tags=self.getTags()) if self.lnewer: - d['conf'] = json.loads(self.col.all_config()) + d['conf'] = self.col.all_config() d['crt'] = self.col.crt return d From 619f0722eee39968c6e487b3eb947cb52dd4ca34 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Thu, 23 Sep 2021 13:42:00 +0800 Subject: [PATCH 33/59] remove_unnessary_print --- src/ankisyncd/sync.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index 9f37a95..b92d6a5 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -135,7 +135,6 @@ select id from notes where mid = ?) limit 1""" "notetypes", ] for tb in tables: - print(self.col.db.scalar(f'select null from {tb} where usn=-1')) if self.col.db.scalar(f'select null from {tb} where usn=-1'): return f'table had usn=-1: {tb}' From c7b1c0c358b6e3c8fe2f587c026385a7252c6543 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 1 Oct 2021 22:17:36 +0800 Subject: [PATCH 34/59] fix_duecounts_not_equal_due_to_diff_deck_selection --- src/ankisyncd/sync.py | 15 +++++++-------- src/ankisyncd/sync_app.py | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index b92d6a5..e15ce77 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -121,10 +121,7 @@ select id from notes where mid = ?) limit 1""" return True def sanityCheck(self): - # basicCheck() seems to have no effect on this procedure, - # if necessary remove comment - # if not self.basicCheck(): - # return "failed basic check" + tables=["cards", "notes", "revlog", @@ -137,13 +134,15 @@ select id from notes where mid = ?) limit 1""" for tb in tables: if self.col.db.scalar(f'select null from {tb} where usn=-1'): return f'table had usn=-1: {tb}' - self.col.sched.reset() - # check for missing parent decks - #self.col.sched.deckDueList() + # return summary of deck + # make sched.counts() equal to default [0,0,0] + # to make sure sync normally if sched.counts() + # are not equal between different clients due to + # different deck selection return [ - list(self.col.sched.counts()), + list([0,0,0]), self.col.db.scalar("select count() from cards"), self.col.db.scalar("select count() from notes"), self.col.db.scalar("select count() from revlog"), diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index cc6f979..85585cc 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -136,8 +136,8 @@ class SyncCollectionHandler(Syncer): return lchg def sanityCheck2(self, client): + client[0]=[0,0,0] server = self.sanityCheck() - status="ok" if client != server: logger.info( f"sanity check failed with server: {server} client: {client}" From 03bfd123c7435575080796fb81ee9f5815b20d5d Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Thu, 13 Jan 2022 21:53:58 +0800 Subject: [PATCH 35/59] dec not finished --- src/ankisyncd/sync_app.py | 205 +++++++++--- t.py | 665 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 820 insertions(+), 50 deletions(-) create mode 100644 t.py diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index 85585cc..ab117e6 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -391,29 +391,33 @@ class SyncUserSession: # for inactivity and then later re-open it (creating a new Collection object). handler.col = col return handler -class Requests(object): +class chunked(object): '''parse request message from client''' - def __init__(self,environ: dict): - self.query_string=environ['QUERY_STRING'] - self.environ=environ - self.data=None + # def __init__(self,environ: dict): + # self.query_string=environ['QUERY_STRING'] + # self.environ=environ + # self.data=None + def __init__(self,func=None): + self.func = func + @property def path(self)-> str: return self.environ['PATH_INFO'] @property - def parse_request(self): + def POST(self): '''Return a MultiDict containing all the variables from a form - request.''' + request.\n + include not only post req,but also get''' env = self.environ + query_string=env['QUERY_STRING'] content_len= env.get('CONTENT_LENGTH', '0') input = env.get('wsgi.input') length = 0 if content_len == '' else int(content_len) body=b'' d={} - if length == 0: if input is None: - return + return d if env.get('HTTP_TRANSFER_ENCODING','0') == 'chunked': # readlines and read(no argument) will block # convert byte str to number base 16 @@ -451,27 +455,28 @@ class Requests(object): d[key]=v return d - if self.query_string !='': + if query_string !='': # GET method - body=self.query_string + body=query_string d=urllib.parse.parse_qs(body) for k,v in d.items(): d[k]=''.join(v) return d - # request server with web browser - if self.path=='/' : - d= {'url':b'Anki Sync Server'} - return d - if self.path=='/favicon.ico' : - d= {'url':b''} - return d + # # request server with web browser + # if self.path=='/' : + # d= {'url':b'Anki Sync Server'} + # return d + # if self.path=='/favicon.ico' : + # d= {'url':b''} + # return d else: body = env['wsgi.input'].read(length) if body is None or body ==b'': - return 'empty body' + # return 'empty body' + return d # process body to dict repeat=body.splitlines()[0] items=re.split(repeat,body) @@ -498,6 +503,12 @@ class Requests(object): v=item[item.rfind(b'"')+1:].decode('utf-8') d[key]=v return d + + def __call__(self,environ: dict,*args): + + self.environ=environ + func=self.func + return func(self,environ) @property def params(self): """ @@ -505,13 +516,8 @@ class Requests(object): the query string and request body. """ - r=self.parse_request - if r is None : - return 'POST or GET is None' - else: - - params = MultiDict(r) - return params + r=self.POST + return r class MultiDict(object): def __init__(self, dicts: dict): if not isinstance(dicts,dict): @@ -596,32 +602,31 @@ class SyncApp: # returns user data (not media) as a sqlite3 database for replacing their # local copy in Anki return self.full_sync_manager.download(col, session) - - def __call__(self, env,start_resp): - req=Requests(env) - p=req.params + @chunked + def __call__(self, req): # Get and verify the session + print(f'hkey {self}') try: - hkey = p['k'] + hkey = req.params['k'] except KeyError: hkey = None - + print(f'hkey {self}') session = self.session_manager.load(hkey, self.create_session) if session is None: try: - skey = p['sk'] + skey = req.POST['sk'] session = self.session_manager.load_from_skey(skey, self.create_session) except KeyError: skey = None try: - compression = int(p['c']) + compression = int(req.POST['c']) except KeyError: compression = 0 try: - data = p['data'] + data = req.POST['data'].file.read() data = self._decode_data(data, compression) except KeyError: data = {} @@ -634,8 +639,7 @@ class SyncApp: if url == 'hostKey': result = self.operation_hostKey(data.get("u"), data.get("p")) if result: - resp=Response(json.dumps(result)) - return resp(env,start_resp) + return json.dumps(result) else: # TODO: do I have to pass 'null' for the client to receive None? raise HTTPForbidden('null') @@ -646,8 +650,8 @@ class SyncApp: if url in SyncCollectionHandler.operations + SyncMediaHandler.operations: # 'meta' passes the SYNC_VER but it isn't used in the handler if url == 'meta': - if session.skey == None and 's' in p: - session.skey = p['s'] + if session.skey == None and 's' in req.POST: + session.skey = req.POST['s'] if 'v' in data: session.version = data['v'] if 'cv' in data: @@ -661,21 +665,17 @@ class SyncApp: if type(result) not in (str, bytes, Response): result = json.dumps(result) - resp=Response(result) - return resp(env,start_resp) + return result elif url == 'upload': thread = session.get_thread() result = thread.execute(self.operation_upload, [data['data'], session]) - resp=Response(result) - return resp(env,start_resp) - + return result elif url == 'download': thread = session.get_thread() result = thread.execute(self.operation_download, [session]) - resp=Response(result) - return resp(env,start_resp) + return result # This was one of our operations but it didn't get handled... Oops! raise HTTPInternalServerError() @@ -699,10 +699,115 @@ class SyncApp: if type(result) not in (str, bytes): result = json.dumps(result) - resp=Response(result) - return resp(env,start_resp) - resp=Response(p['url']) - return resp(env,start_resp) + return result + + return "Anki Sync Server" + # def __call__(self, env,start_resp): + # req=Requests(env) + # p=req.params + # # Get and verify the session + # try: + # hkey = p['k'] + # except KeyError: + # hkey = None + + # session = self.session_manager.load(hkey, self.create_session) + + # if session is None: + # try: + # skey = p['sk'] + # session = self.session_manager.load_from_skey(skey, self.create_session) + # except KeyError: + # skey = None + + # try: + # compression = int(p['c']) + # except KeyError: + # compression = 0 + + # try: + # data = p['data'] + # data = self._decode_data(data, compression) + # except KeyError: + # data = {} + + # if req.path.startswith(self.base_url): + # url = req.path[len(self.base_url):] + # if url not in self.valid_urls: + # raise HTTPNotFound() + + # if url == 'hostKey': + # result = self.operation_hostKey(data.get("u"), data.get("p")) + # if result: + # resp=Response(json.dumps(result)) + # return resp(env,start_resp) + # else: + # # TODO: do I have to pass 'null' for the client to receive None? + # raise HTTPForbidden('null') + + # if session is None: + # raise HTTPForbidden() + + # if url in SyncCollectionHandler.operations + SyncMediaHandler.operations: + # # 'meta' passes the SYNC_VER but it isn't used in the handler + # if url == 'meta': + # if session.skey == None and 's' in p: + # session.skey = p['s'] + # if 'v' in data: + # session.version = data['v'] + # if 'cv' in data: + # session.client_version = data['cv'] + + # self.session_manager.save(hkey, session) + # session = self.session_manager.load(hkey, self.create_session) + # thread = session.get_thread() + # result = self._execute_handler_method_in_thread(url, data, session) + # # If it's a complex data type, we convert it to JSON + # if type(result) not in (str, bytes, Response): + # result = json.dumps(result) + + # resp=Response(result) + # return resp(env,start_resp) + + # elif url == 'upload': + # thread = session.get_thread() + # result = thread.execute(self.operation_upload, [data['data'], session]) + # resp=Response(result) + # return resp(env,start_resp) + + + # elif url == 'download': + # thread = session.get_thread() + # result = thread.execute(self.operation_download, [session]) + # resp=Response(result) + # return resp(env,start_resp) + + # # This was one of our operations but it didn't get handled... Oops! + # raise HTTPInternalServerError() + + # # media sync + # elif req.path.startswith(self.base_media_url): + # if session is None: + # raise HTTPForbidden() + + # url = req.path[len(self.base_media_url):] + + # if url not in self.valid_urls: + # raise HTTPNotFound() + + # if url == "begin": + # data['skey'] = session.skey + + # result = self._execute_handler_method_in_thread(url, data, session) + + # # If it's a complex data type, we convert it to JSON + # if type(result) not in (str, bytes): + # result = json.dumps(result) + + # resp=Response(result) + # return resp(env,start_resp) + # resp=Response(p['url']) + # return resp(env,start_resp) @staticmethod def _execute_handler_method_in_thread(method_name, keyword_args, session): diff --git a/t.py b/t.py new file mode 100644 index 0000000..950b430 --- /dev/null +++ b/t.py @@ -0,0 +1,665 @@ + + + +class D(object): + def __init__(self, func=None, args=()): + self.func = func + self.args = tuple(args) + print('init decorator') + print(f'func {func}') + print(f'args {args}') + def __call__(self,a,*b): + print(f'dec {self}') + self.a=a + func=self.func + # return parsed req dict + return func(A,self) + @property + def name(self): + return self.a +class A(object): + def __init__(self): + print('init') + @D + def __call__(self,a): + + print(f'a {a.name}') + return 'str 3' +a=A() +a({'c':1}) + + +# # ankisyncd - A personal Anki sync server +# # Copyright (C) 2013 David Snopek +# # +# # This program is free software: you can redistribute it and/or modify +# # it under the terms of the GNU Affero General Public License as +# # published by the Free Software Foundation, either version 3 of the +# # License, or (at your option) any later version. +# # +# # This program is distributed in the hope that it will be useful, +# # but WITHOUT ANY WARRANTY; without even the implied warranty of +# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# # GNU Affero General Public License for more details. +# # +# # You should have received a copy of the GNU Affero General Public License +# # along with this program. If not, see . + +# import gzip +# import hashlib +# import io +# import json +# import logging +# import os +# import random +# import re +# import string +# import sys +# import time +# import unicodedata +# import zipfile +# from configparser import ConfigParser +# from sqlite3 import dbapi2 as sqlite + +# from webob import Response +# from webob.dec import wsgify +# from webob.exc import * + +# import anki.db +# import anki.utils +# from anki.consts import REM_CARD, REM_NOTE + +# from ankisyncd.full_sync import get_full_sync_manager +# from ankisyncd.sessions import get_session_manager +# from ankisyncd.sync import Syncer, SYNC_VER, SYNC_ZIP_SIZE, SYNC_ZIP_COUNT +# from ankisyncd.users import get_user_manager + +# logger = logging.getLogger("ankisyncd") + + +# class SyncCollectionHandler(Syncer): +# operations = ['meta', 'applyChanges', 'start', 'applyGraves', 'chunk', 'applyChunk', 'sanityCheck2', 'finish'] + +# def __init__(self, col, session): +# # So that 'server' (the 3rd argument) can't get set +# super().__init__(col) +# self.session = session + +# @staticmethod +# def _old_client(cv): +# if not cv: +# return False + +# note = {"alpha": 0, "beta": 0, "rc": 0} +# client, version, platform = cv.split(',') + +# if 'arch' not in version: +# for name in note.keys(): +# if name in version: +# vs = version.split(name) +# version = vs[0] +# note[name] = int(vs[-1]) + +# # convert the version string, ignoring non-numeric suffixes like in beta versions of Anki +# version_nosuffix = re.sub(r'[^0-9.].*$', '', version) +# version_int = [int(x) for x in version_nosuffix.split('.')] + +# if client == 'ankidesktop': +# return version_int < [2, 0, 27] +# elif client == 'ankidroid': +# if version_int == [2, 3]: +# if note["alpha"]: +# return note["alpha"] < 4 +# else: +# return version_int < [2, 2, 3] +# else: # unknown client, assume current version +# return False + +# def meta(self, v=None, cv=None): +# if self._old_client(cv): +# return Response(status=501) # client needs upgrade +# if v > SYNC_VER: +# return {"cont": False, "msg": "Your client is using unsupported sync protocol ({}, supported version: {})".format(v, SYNC_VER)} +# if v < 9 and self.col.schedVer() >= 2: +# return {"cont": False, "msg": "Your client doesn't support the v{} scheduler.".format(self.col.schedVer())} + +# # Make sure the media database is open! +# self.col.media.connect() + +# return { +# 'mod': self.col.mod, +# 'scm': self.col.scm, +# 'usn': self.col._usn, +# 'ts': anki.utils.intTime(), +# 'musn': self.col.media.lastUsn(), +# 'uname': self.session.name, +# 'msg': '', +# 'cont': True, +# 'hostNum': 0, +# } + +# def usnLim(self): +# return "usn >= %d" % self.minUsn + +# # ankidesktop >=2.1rc2 sends graves in applyGraves, but still expects +# # server-side deletions to be returned by start +# def start(self, minUsn, lnewer, graves={"cards": [], "notes": [], "decks": []}, offset=None): +# # The offset para is passed by client V2 scheduler,which is minutes_west. +# # Since now have not thorougly test the V2 scheduler, we leave this comments here, and +# # just enable the V2 scheduler in the serve code. + +# self.maxUsn = self.col._usn +# self.minUsn = minUsn +# self.lnewer = not lnewer +# lgraves = self.removed() +# # convert grave:None to {'cards': [], 'notes': [], 'decks': []} +# # because req.POST['data'] returned value of grave is None +# if graves==None: +# graves={'cards': [], 'notes': [], 'decks': []} +# self.remove(graves) +# return lgraves + +# def applyGraves(self, chunk): +# self.remove(chunk) + +# def applyChanges(self, changes): +# self.rchg = changes +# lchg = self.changes() +# # merge our side before returning +# self.mergeChanges(lchg, self.rchg) +# return lchg + +# def sanityCheck2(self, client, full=None): +# server = self.sanityCheck(full) +# if client != server: +# logger.info( +# f"sanity check failed with server: {server} client: {client}" +# ) + +# return dict(status="bad", c=client, s=server) +# return dict(status="ok") + +# def finish(self, mod=None): +# return super().finish(anki.utils.intTime(1000)) + +# # This function had to be put here in its entirety because Syncer.removed() +# # doesn't use self.usnLim() (which we override in this class) in queries. +# # "usn=-1" has been replaced with "usn >= ?", self.minUsn by hand. +# def removed(self): +# cards = [] +# notes = [] +# decks = [] + +# curs = self.col.db.execute( +# "select oid, type from graves where usn >= ?", self.minUsn) + +# for oid, type in curs: +# if type == REM_CARD: +# cards.append(oid) +# elif type == REM_NOTE: +# notes.append(oid) +# else: +# decks.append(oid) + +# return dict(cards=cards, notes=notes, decks=decks) + +# def getModels(self): +# return [m for m in self.col.models.all() if m['usn'] >= self.minUsn] + +# def getDecks(self): +# return [ +# [g for g in self.col.decks.all() if g['usn'] >= self.minUsn], +# [g for g in self.col.decks.allConf() if g['usn'] >= self.minUsn] +# ] + +# def getTags(self): +# return [t for t, usn in self.allItems() +# if usn >= self.minUsn] + +# class SyncMediaHandler: +# operations = ['begin', 'mediaChanges', 'mediaSanity', 'uploadChanges', 'downloadFiles'] + +# def __init__(self, col, session): +# self.col = col +# self.session = session + +# def begin(self, skey): +# return { +# 'data': { +# 'sk': skey, +# 'usn': self.col.media.lastUsn(), +# }, +# 'err': '', +# } + +# def uploadChanges(self, data): +# """ +# The zip file contains files the client hasn't synced with the server +# yet ('dirty'), and info on files it has deleted from its own media dir. +# """ + +# with zipfile.ZipFile(io.BytesIO(data), "r") as z: +# self._check_zip_data(z) +# processed_count = self._adopt_media_changes_from_zip(z) + +# return { +# 'data': [processed_count, self.col.media.lastUsn()], +# 'err': '', +# } + +# @staticmethod +# def _check_zip_data(zip_file): +# max_zip_size = 100*1024*1024 +# max_meta_file_size = 100000 + +# meta_file_size = zip_file.getinfo("_meta").file_size +# sum_file_sizes = sum(info.file_size for info in zip_file.infolist()) + +# if meta_file_size > max_meta_file_size: +# raise ValueError("Zip file's metadata file is larger than %s " +# "Bytes." % max_meta_file_size) +# elif sum_file_sizes > max_zip_size: +# raise ValueError("Zip file contents are larger than %s Bytes." % +# max_zip_size) + +# def _adopt_media_changes_from_zip(self, zip_file): +# """ +# Adds and removes files to/from the database and media directory +# according to the data in zip file zipData. +# """ + +# # Get meta info first. +# meta = json.loads(zip_file.read("_meta").decode()) + +# # Remove media files that were removed on the client. +# media_to_remove = [] +# for normname, ordinal in meta: +# if not ordinal: +# media_to_remove.append(self._normalize_filename(normname)) + +# # Add media files that were added on the client. +# media_to_add = [] +# usn = self.col.media.lastUsn() +# oldUsn = usn +# media_dir = self.col.media.dir() +# os.makedirs(media_dir, exist_ok=True) + +# for i in zip_file.infolist(): +# if i.filename == "_meta": # Ignore previously retrieved metadata. +# continue + +# file_data = zip_file.read(i) +# csum = anki.utils.checksum(file_data) +# filename = self._normalize_filename(meta[int(i.filename)][0]) +# file_path = os.path.join(media_dir, filename) + +# # Save file to media directory. +# with open(file_path, 'wb') as f: +# f.write(file_data) + +# usn += 1 +# media_to_add.append((filename, usn, csum)) + +# # We count all files we are to remove, even if we don't have them in +# # our media directory and our db doesn't know about them. +# processed_count = len(media_to_remove) + len(media_to_add) + +# assert len(meta) == processed_count # sanity check + +# if media_to_remove: +# self._remove_media_files(media_to_remove) + +# if media_to_add: +# self.col.media.addMedia(media_to_add) + +# assert self.col.media.lastUsn() == oldUsn + processed_count # TODO: move to some unit test +# return processed_count + +# @staticmethod +# def _normalize_filename(filename): +# """ +# Performs unicode normalization for file names. Logic taken from Anki's +# MediaManager.addFilesFromZip(). +# """ + +# # Normalize name for platform. +# if anki.utils.isMac: # global +# filename = unicodedata.normalize("NFD", filename) +# else: +# filename = unicodedata.normalize("NFC", filename) + +# return filename + +# def _remove_media_files(self, filenames): +# """ +# Marks all files in list filenames as deleted and removes them from the +# media directory. +# """ +# logger.debug('Removing %d files from media dir.' % len(filenames)) +# for filename in filenames: +# try: +# self.col.media.syncDelete(filename) +# except OSError as err: +# logger.error("Error when removing file '%s' from media dir: " +# "%s" % (filename, str(err))) + +# def downloadFiles(self, files): +# flist = {} +# cnt = 0 +# sz = 0 +# f = io.BytesIO() + +# with zipfile.ZipFile(f, "w", compression=zipfile.ZIP_DEFLATED) as z: +# for fname in files: +# z.write(os.path.join(self.col.media.dir(), fname), str(cnt)) +# flist[str(cnt)] = fname +# sz += os.path.getsize(os.path.join(self.col.media.dir(), fname)) +# if sz > SYNC_ZIP_SIZE or cnt > SYNC_ZIP_COUNT: +# break +# cnt += 1 + +# z.writestr("_meta", json.dumps(flist)) + +# return f.getvalue() + +# def mediaChanges(self, lastUsn): +# result = [] +# server_lastUsn = self.col.media.lastUsn() + +# if lastUsn < server_lastUsn or lastUsn == 0: +# for fname,usn,csum, in self.col.media.changes(lastUsn): +# result.append([fname, usn, csum]) + +# # anki assumes server_lastUsn == result[-1][1] +# # ref: anki/sync.py:720 (commit cca3fcb2418880d0430a5c5c2e6b81ba260065b7) +# result.reverse() + +# return {'data': result, 'err': ''} + +# def mediaSanity(self, local=None): +# if self.col.media.mediaCount() == local: +# result = "OK" +# else: +# result = "FAILED" + +# return {'data': result, 'err': ''} + +# class SyncUserSession: +# def __init__(self, name, path, collection_manager, setup_new_collection=None): +# self.skey = self._generate_session_key() +# self.name = name +# self.path = path +# self.collection_manager = collection_manager +# self.setup_new_collection = setup_new_collection +# self.version = None +# self.client_version = None +# self.created = time.time() +# self.collection_handler = None +# self.media_handler = None + +# # make sure the user path exists +# if not os.path.exists(path): +# os.mkdir(path) + +# def _generate_session_key(self): +# return anki.utils.checksum(str(random.random()))[:8] + +# def get_collection_path(self): +# return os.path.realpath(os.path.join(self.path, 'collection.anki2')) + +# def get_thread(self): +# return self.collection_manager.get_collection(self.get_collection_path(), self.setup_new_collection) + +# def get_handler_for_operation(self, operation, col): +# if operation in SyncCollectionHandler.operations: +# attr, handler_class = 'collection_handler', SyncCollectionHandler +# elif operation in SyncMediaHandler.operations: +# attr, handler_class = 'media_handler', SyncMediaHandler +# else: +# raise Exception("no handler for {}".format(operation)) + +# if getattr(self, attr) is None: +# setattr(self, attr, handler_class(col, self)) +# handler = getattr(self, attr) +# # The col object may actually be new now! This happens when we close a collection +# # for inactivity and then later re-open it (creating a new Collection object). +# handler.col = col +# return handler + +# class SyncApp: +# valid_urls = SyncCollectionHandler.operations + SyncMediaHandler.operations + ['hostKey', 'upload', 'download'] + +# def __init__(self, config): +# from ankisyncd.thread import get_collection_manager + +# self.data_root = os.path.abspath(config['data_root']) +# self.base_url = config['base_url'] +# self.base_media_url = config['base_media_url'] +# self.setup_new_collection = None + +# self.user_manager = get_user_manager(config) +# self.session_manager = get_session_manager(config) +# self.full_sync_manager = get_full_sync_manager(config) +# self.collection_manager = get_collection_manager(config) + +# # make sure the base_url has a trailing slash +# if not self.base_url.endswith('/'): +# self.base_url += '/' +# if not self.base_media_url.endswith('/'): +# self.base_media_url += '/' + +# def generateHostKey(self, username): +# """Generates a new host key to be used by the given username to identify their session. +# This values is random.""" + +# import hashlib, time, random, string +# chars = string.ascii_letters + string.digits +# val = ':'.join([username, str(int(time.time())), ''.join(random.choice(chars) for x in range(8))]).encode() +# return hashlib.md5(val).hexdigest() + +# def create_session(self, username, user_path): +# return SyncUserSession(username, user_path, self.collection_manager, self.setup_new_collection) + +# def _decode_data(self, data, compression=0): +# if compression: +# with gzip.GzipFile(mode="rb", fileobj=io.BytesIO(data)) as gz: +# data = gz.read() + +# try: +# data = json.loads(data.decode()) +# except (ValueError, UnicodeDecodeError): +# data = {'data': data} + +# return data + +# def operation_hostKey(self, username, password): +# if not self.user_manager.authenticate(username, password): +# return + +# dirname = self.user_manager.userdir(username) +# if dirname is None: +# return + +# hkey = self.generateHostKey(username) +# user_path = os.path.join(self.data_root, dirname) +# session = self.create_session(username, user_path) +# self.session_manager.save(hkey, session) + +# return {'key': hkey} + +# def operation_upload(self, col, data, session): +# # Verify integrity of the received database file before replacing our +# # existing db. + +# return self.full_sync_manager.upload(col, data, session) + +# def operation_download(self, col, session): +# # returns user data (not media) as a sqlite3 database for replacing their +# # local copy in Anki +# return self.full_sync_manager.download(col, session) + +# @wsgify +# def __call__(self, req): +# # Get and verify the session +# try: +# hkey = req.params['k'] +# except KeyError: +# hkey = None + +# session = self.session_manager.load(hkey, self.create_session) + +# if session is None: +# try: +# skey = req.POST['sk'] +# session = self.session_manager.load_from_skey(skey, self.create_session) +# except KeyError: +# skey = None + +# try: +# compression = int(req.POST['c']) +# except KeyError: +# compression = 0 + +# try: +# data = req.POST['data'].file.read() +# data = self._decode_data(data, compression) +# except KeyError: +# data = {} + +# if req.path.startswith(self.base_url): +# url = req.path[len(self.base_url):] +# if url not in self.valid_urls: +# raise HTTPNotFound() + +# if url == 'hostKey': +# result = self.operation_hostKey(data.get("u"), data.get("p")) +# if result: +# return json.dumps(result) +# else: +# # TODO: do I have to pass 'null' for the client to receive None? +# raise HTTPForbidden('null') + +# if session is None: +# raise HTTPForbidden() + +# if url in SyncCollectionHandler.operations + SyncMediaHandler.operations: +# # 'meta' passes the SYNC_VER but it isn't used in the handler +# if url == 'meta': +# if session.skey == None and 's' in req.POST: +# session.skey = req.POST['s'] +# if 'v' in data: +# session.version = data['v'] +# if 'cv' in data: +# session.client_version = data['cv'] + +# self.session_manager.save(hkey, session) +# session = self.session_manager.load(hkey, self.create_session) +# thread = session.get_thread() +# result = self._execute_handler_method_in_thread(url, data, session) +# # If it's a complex data type, we convert it to JSON +# if type(result) not in (str, bytes, Response): +# result = json.dumps(result) + +# return result + +# elif url == 'upload': +# thread = session.get_thread() +# result = thread.execute(self.operation_upload, [data['data'], session]) +# return result + +# elif url == 'download': +# thread = session.get_thread() +# result = thread.execute(self.operation_download, [session]) +# return result + +# # This was one of our operations but it didn't get handled... Oops! +# raise HTTPInternalServerError() + +# # media sync +# elif req.path.startswith(self.base_media_url): +# if session is None: +# raise HTTPForbidden() + +# url = req.path[len(self.base_media_url):] + +# if url not in self.valid_urls: +# raise HTTPNotFound() + +# if url == "begin": +# data['skey'] = session.skey + +# result = self._execute_handler_method_in_thread(url, data, session) + +# # If it's a complex data type, we convert it to JSON +# if type(result) not in (str, bytes): +# result = json.dumps(result) + +# return result + +# return "Anki Sync Server" + +# @staticmethod +# def _execute_handler_method_in_thread(method_name, keyword_args, session): +# """ +# Gets and runs the handler method specified by method_name inside the +# thread for session. The handler method will access the collection as +# self.col. +# """ + +# def run_func(col, **keyword_args): +# # Retrieve the correct handler method. +# handler = session.get_handler_for_operation(method_name, col) +# handler_method = getattr(handler, method_name) + +# res = handler_method(**keyword_args) + +# col.save() +# return res + +# run_func.__name__ = method_name # More useful debugging messages. + +# # Send the closure to the thread for execution. +# thread = session.get_thread() +# result = thread.execute(run_func, kw=keyword_args) + +# return result + + +# def make_app(global_conf, **local_conf): +# return SyncApp(**local_conf) + +# def main(): +# logging.basicConfig(level=logging.INFO, format="[%(asctime)s]:%(levelname)s:%(name)s:%(message)s") +# import ankisyncd +# logger.info("ankisyncd {} ({})".format(ankisyncd._get_version(), ankisyncd._homepage)) +# from wsgiref.simple_server import make_server, WSGIRequestHandler +# from ankisyncd.thread import shutdown +# import ankisyncd.config + +# class RequestHandler(WSGIRequestHandler): +# logger = logging.getLogger("ankisyncd.http") + +# def log_error(self, format, *args): +# self.logger.error("%s %s", self.address_string(), format%args) + +# def log_message(self, format, *args): +# self.logger.info("%s %s", self.address_string(), format%args) + +# if len(sys.argv) > 1: +# # backwards compat +# config = ankisyncd.config.load(sys.argv[1]) +# else: +# config = ankisyncd.config.load() + +# ankiserver = SyncApp(config) +# httpd = make_server(config['host'], int(config['port']), ankiserver, handler_class=RequestHandler) + +# try: +# logger.info("Serving HTTP on {} port {}...".format(*httpd.server_address)) +# httpd.serve_forever() +# except KeyboardInterrupt: +# logger.info("Exiting...") +# finally: +# shutdown() + +# if __name__ == '__main__': main() From 744a9641f572f9f5fc1a1f8f1b044ae509a0a7bc Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Wed, 2 Feb 2022 18:36:56 +0800 Subject: [PATCH 36/59] class Requests as decorator to decorate SyncApp --- src/ankisyncd/sync_app.py | 213 ++++++++++---------------------------- 1 file changed, 56 insertions(+), 157 deletions(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index ab117e6..da4eb91 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -25,11 +25,11 @@ import sys import time import unicodedata import zipfile - +import types from webob import Response from webob.exc import * import urllib.parse - +from functools import wraps from anki.collection import Collection import anki.db import anki.utils @@ -391,20 +391,30 @@ class SyncUserSession: # for inactivity and then later re-open it (creating a new Collection object). handler.col = col return handler -class chunked(object): - '''parse request message from client''' - # def __init__(self,environ: dict): - # self.query_string=environ['QUERY_STRING'] - # self.environ=environ - # self.data=None - def __init__(self,func=None): - self.func = func - +class Requests(object): + def __init__(self,environ: dict): + self.environ=environ + @property + def params(self): + return self._p + @params.setter + def params(self,value): + """ + A dictionary-like object containing both the parameters from + the query string and request body. + """ + self._p= value @property def path(self)-> str: return self.environ['PATH_INFO'] @property def POST(self): + return self._x + @POST.setter + def POST(self,value): + self._x=value + @property + def parse(self): '''Return a MultiDict containing all the variables from a form request.\n include not only post req,but also get''' @@ -463,13 +473,13 @@ class chunked(object): d[k]=''.join(v) return d - # # request server with web browser - # if self.path=='/' : - # d= {'url':b'Anki Sync Server'} - # return d - # if self.path=='/favicon.ico' : - # d= {'url':b''} - # return d + # request server with web browser + if self.path=='/' : + d= {'url':b'Anki Sync Server'} + return d + if self.path=='/favicon.ico' : + d= {'url':b''} + return d else: body = env['wsgi.input'].read(length) @@ -503,34 +513,24 @@ class chunked(object): v=item[item.rfind(b'"')+1:].decode('utf-8') d[key]=v return d - - def __call__(self,environ: dict,*args): - - self.environ=environ - func=self.func - return func(self,environ) - @property - def params(self): - """ - A dictionary-like object containing both the parameters from - the query string and request body. - """ - - r=self.POST - return r -class MultiDict(object): - def __init__(self, dicts: dict): - if not isinstance(dicts,dict): - raise TypeError(dicts) - self.dicts=dicts - def __str__(self) -> str: - return dict.__str__(self.dicts) - def __getitem__(self,key): - try: - value = self.dicts[key] - return value - except KeyError: - raise KeyError(key) +class chunked(object): + '''decorator''' + def __init__(self, func): + wraps(func)(self) + def __call__(self, *args, **kwargs): + clss=args[0] + environ=args[1] + start_response = args[2] + b=Requests(environ) + args=(clss,b,) + w= self.__wrapped__(*args, **kwargs) + resp=Response(w) + return resp(environ, start_response) + def __get__(self, instance, cls): + if instance is None: + return self + else: + return types.MethodType(self, instance) class SyncApp: valid_urls = SyncCollectionHandler.operations + SyncMediaHandler.operations + ['hostKey', 'upload', 'download'] @@ -602,17 +602,20 @@ class SyncApp: # returns user data (not media) as a sqlite3 database for replacing their # local copy in Anki return self.full_sync_manager.download(col, session) + @chunked def __call__(self, req): - # Get and verify the session - print(f'hkey {self}') + # cgi file can only be read once,and will be blocked after being read once more + # so i call Requests.parse only once,and bind its return result to properties + # POST and params (set return result as property values) + # can switch back to previous version easily by commenting following two lines + req.params=req.parse + req.POST=req.params try: hkey = req.params['k'] except KeyError: hkey = None - print(f'hkey {self}') session = self.session_manager.load(hkey, self.create_session) - if session is None: try: skey = req.POST['sk'] @@ -626,7 +629,9 @@ class SyncApp: compression = 0 try: - data = req.POST['data'].file.read() + # can switch back to previous version easily + # data = req.POST['data'].file.read() + data = req.POST['data'] data = self._decode_data(data, compression) except KeyError: data = {} @@ -702,112 +707,6 @@ class SyncApp: return result return "Anki Sync Server" - # def __call__(self, env,start_resp): - # req=Requests(env) - # p=req.params - # # Get and verify the session - # try: - # hkey = p['k'] - # except KeyError: - # hkey = None - - # session = self.session_manager.load(hkey, self.create_session) - - # if session is None: - # try: - # skey = p['sk'] - # session = self.session_manager.load_from_skey(skey, self.create_session) - # except KeyError: - # skey = None - - # try: - # compression = int(p['c']) - # except KeyError: - # compression = 0 - - # try: - # data = p['data'] - # data = self._decode_data(data, compression) - # except KeyError: - # data = {} - - # if req.path.startswith(self.base_url): - # url = req.path[len(self.base_url):] - # if url not in self.valid_urls: - # raise HTTPNotFound() - - # if url == 'hostKey': - # result = self.operation_hostKey(data.get("u"), data.get("p")) - # if result: - # resp=Response(json.dumps(result)) - # return resp(env,start_resp) - # else: - # # TODO: do I have to pass 'null' for the client to receive None? - # raise HTTPForbidden('null') - - # if session is None: - # raise HTTPForbidden() - - # if url in SyncCollectionHandler.operations + SyncMediaHandler.operations: - # # 'meta' passes the SYNC_VER but it isn't used in the handler - # if url == 'meta': - # if session.skey == None and 's' in p: - # session.skey = p['s'] - # if 'v' in data: - # session.version = data['v'] - # if 'cv' in data: - # session.client_version = data['cv'] - - # self.session_manager.save(hkey, session) - # session = self.session_manager.load(hkey, self.create_session) - # thread = session.get_thread() - # result = self._execute_handler_method_in_thread(url, data, session) - # # If it's a complex data type, we convert it to JSON - # if type(result) not in (str, bytes, Response): - # result = json.dumps(result) - - # resp=Response(result) - # return resp(env,start_resp) - - # elif url == 'upload': - # thread = session.get_thread() - # result = thread.execute(self.operation_upload, [data['data'], session]) - # resp=Response(result) - # return resp(env,start_resp) - - - # elif url == 'download': - # thread = session.get_thread() - # result = thread.execute(self.operation_download, [session]) - # resp=Response(result) - # return resp(env,start_resp) - - # # This was one of our operations but it didn't get handled... Oops! - # raise HTTPInternalServerError() - - # # media sync - # elif req.path.startswith(self.base_media_url): - # if session is None: - # raise HTTPForbidden() - - # url = req.path[len(self.base_media_url):] - - # if url not in self.valid_urls: - # raise HTTPNotFound() - - # if url == "begin": - # data['skey'] = session.skey - - # result = self._execute_handler_method_in_thread(url, data, session) - - # # If it's a complex data type, we convert it to JSON - # if type(result) not in (str, bytes): - # result = json.dumps(result) - - # resp=Response(result) - # return resp(env,start_resp) - # resp=Response(p['url']) - # return resp(env,start_resp) @staticmethod def _execute_handler_method_in_thread(method_name, keyword_args, session): From 728af26c2e2627cda38f5c60a764089e6edb97ef Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Wed, 2 Feb 2022 18:46:55 +0800 Subject: [PATCH 37/59] remove test file t.py --- t.py | 665 ----------------------------------------------------------- 1 file changed, 665 deletions(-) delete mode 100644 t.py diff --git a/t.py b/t.py deleted file mode 100644 index 950b430..0000000 --- a/t.py +++ /dev/null @@ -1,665 +0,0 @@ - - - -class D(object): - def __init__(self, func=None, args=()): - self.func = func - self.args = tuple(args) - print('init decorator') - print(f'func {func}') - print(f'args {args}') - def __call__(self,a,*b): - print(f'dec {self}') - self.a=a - func=self.func - # return parsed req dict - return func(A,self) - @property - def name(self): - return self.a -class A(object): - def __init__(self): - print('init') - @D - def __call__(self,a): - - print(f'a {a.name}') - return 'str 3' -a=A() -a({'c':1}) - - -# # ankisyncd - A personal Anki sync server -# # Copyright (C) 2013 David Snopek -# # -# # This program is free software: you can redistribute it and/or modify -# # it under the terms of the GNU Affero General Public License as -# # published by the Free Software Foundation, either version 3 of the -# # License, or (at your option) any later version. -# # -# # This program is distributed in the hope that it will be useful, -# # but WITHOUT ANY WARRANTY; without even the implied warranty of -# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# # GNU Affero General Public License for more details. -# # -# # You should have received a copy of the GNU Affero General Public License -# # along with this program. If not, see . - -# import gzip -# import hashlib -# import io -# import json -# import logging -# import os -# import random -# import re -# import string -# import sys -# import time -# import unicodedata -# import zipfile -# from configparser import ConfigParser -# from sqlite3 import dbapi2 as sqlite - -# from webob import Response -# from webob.dec import wsgify -# from webob.exc import * - -# import anki.db -# import anki.utils -# from anki.consts import REM_CARD, REM_NOTE - -# from ankisyncd.full_sync import get_full_sync_manager -# from ankisyncd.sessions import get_session_manager -# from ankisyncd.sync import Syncer, SYNC_VER, SYNC_ZIP_SIZE, SYNC_ZIP_COUNT -# from ankisyncd.users import get_user_manager - -# logger = logging.getLogger("ankisyncd") - - -# class SyncCollectionHandler(Syncer): -# operations = ['meta', 'applyChanges', 'start', 'applyGraves', 'chunk', 'applyChunk', 'sanityCheck2', 'finish'] - -# def __init__(self, col, session): -# # So that 'server' (the 3rd argument) can't get set -# super().__init__(col) -# self.session = session - -# @staticmethod -# def _old_client(cv): -# if not cv: -# return False - -# note = {"alpha": 0, "beta": 0, "rc": 0} -# client, version, platform = cv.split(',') - -# if 'arch' not in version: -# for name in note.keys(): -# if name in version: -# vs = version.split(name) -# version = vs[0] -# note[name] = int(vs[-1]) - -# # convert the version string, ignoring non-numeric suffixes like in beta versions of Anki -# version_nosuffix = re.sub(r'[^0-9.].*$', '', version) -# version_int = [int(x) for x in version_nosuffix.split('.')] - -# if client == 'ankidesktop': -# return version_int < [2, 0, 27] -# elif client == 'ankidroid': -# if version_int == [2, 3]: -# if note["alpha"]: -# return note["alpha"] < 4 -# else: -# return version_int < [2, 2, 3] -# else: # unknown client, assume current version -# return False - -# def meta(self, v=None, cv=None): -# if self._old_client(cv): -# return Response(status=501) # client needs upgrade -# if v > SYNC_VER: -# return {"cont": False, "msg": "Your client is using unsupported sync protocol ({}, supported version: {})".format(v, SYNC_VER)} -# if v < 9 and self.col.schedVer() >= 2: -# return {"cont": False, "msg": "Your client doesn't support the v{} scheduler.".format(self.col.schedVer())} - -# # Make sure the media database is open! -# self.col.media.connect() - -# return { -# 'mod': self.col.mod, -# 'scm': self.col.scm, -# 'usn': self.col._usn, -# 'ts': anki.utils.intTime(), -# 'musn': self.col.media.lastUsn(), -# 'uname': self.session.name, -# 'msg': '', -# 'cont': True, -# 'hostNum': 0, -# } - -# def usnLim(self): -# return "usn >= %d" % self.minUsn - -# # ankidesktop >=2.1rc2 sends graves in applyGraves, but still expects -# # server-side deletions to be returned by start -# def start(self, minUsn, lnewer, graves={"cards": [], "notes": [], "decks": []}, offset=None): -# # The offset para is passed by client V2 scheduler,which is minutes_west. -# # Since now have not thorougly test the V2 scheduler, we leave this comments here, and -# # just enable the V2 scheduler in the serve code. - -# self.maxUsn = self.col._usn -# self.minUsn = minUsn -# self.lnewer = not lnewer -# lgraves = self.removed() -# # convert grave:None to {'cards': [], 'notes': [], 'decks': []} -# # because req.POST['data'] returned value of grave is None -# if graves==None: -# graves={'cards': [], 'notes': [], 'decks': []} -# self.remove(graves) -# return lgraves - -# def applyGraves(self, chunk): -# self.remove(chunk) - -# def applyChanges(self, changes): -# self.rchg = changes -# lchg = self.changes() -# # merge our side before returning -# self.mergeChanges(lchg, self.rchg) -# return lchg - -# def sanityCheck2(self, client, full=None): -# server = self.sanityCheck(full) -# if client != server: -# logger.info( -# f"sanity check failed with server: {server} client: {client}" -# ) - -# return dict(status="bad", c=client, s=server) -# return dict(status="ok") - -# def finish(self, mod=None): -# return super().finish(anki.utils.intTime(1000)) - -# # This function had to be put here in its entirety because Syncer.removed() -# # doesn't use self.usnLim() (which we override in this class) in queries. -# # "usn=-1" has been replaced with "usn >= ?", self.minUsn by hand. -# def removed(self): -# cards = [] -# notes = [] -# decks = [] - -# curs = self.col.db.execute( -# "select oid, type from graves where usn >= ?", self.minUsn) - -# for oid, type in curs: -# if type == REM_CARD: -# cards.append(oid) -# elif type == REM_NOTE: -# notes.append(oid) -# else: -# decks.append(oid) - -# return dict(cards=cards, notes=notes, decks=decks) - -# def getModels(self): -# return [m for m in self.col.models.all() if m['usn'] >= self.minUsn] - -# def getDecks(self): -# return [ -# [g for g in self.col.decks.all() if g['usn'] >= self.minUsn], -# [g for g in self.col.decks.allConf() if g['usn'] >= self.minUsn] -# ] - -# def getTags(self): -# return [t for t, usn in self.allItems() -# if usn >= self.minUsn] - -# class SyncMediaHandler: -# operations = ['begin', 'mediaChanges', 'mediaSanity', 'uploadChanges', 'downloadFiles'] - -# def __init__(self, col, session): -# self.col = col -# self.session = session - -# def begin(self, skey): -# return { -# 'data': { -# 'sk': skey, -# 'usn': self.col.media.lastUsn(), -# }, -# 'err': '', -# } - -# def uploadChanges(self, data): -# """ -# The zip file contains files the client hasn't synced with the server -# yet ('dirty'), and info on files it has deleted from its own media dir. -# """ - -# with zipfile.ZipFile(io.BytesIO(data), "r") as z: -# self._check_zip_data(z) -# processed_count = self._adopt_media_changes_from_zip(z) - -# return { -# 'data': [processed_count, self.col.media.lastUsn()], -# 'err': '', -# } - -# @staticmethod -# def _check_zip_data(zip_file): -# max_zip_size = 100*1024*1024 -# max_meta_file_size = 100000 - -# meta_file_size = zip_file.getinfo("_meta").file_size -# sum_file_sizes = sum(info.file_size for info in zip_file.infolist()) - -# if meta_file_size > max_meta_file_size: -# raise ValueError("Zip file's metadata file is larger than %s " -# "Bytes." % max_meta_file_size) -# elif sum_file_sizes > max_zip_size: -# raise ValueError("Zip file contents are larger than %s Bytes." % -# max_zip_size) - -# def _adopt_media_changes_from_zip(self, zip_file): -# """ -# Adds and removes files to/from the database and media directory -# according to the data in zip file zipData. -# """ - -# # Get meta info first. -# meta = json.loads(zip_file.read("_meta").decode()) - -# # Remove media files that were removed on the client. -# media_to_remove = [] -# for normname, ordinal in meta: -# if not ordinal: -# media_to_remove.append(self._normalize_filename(normname)) - -# # Add media files that were added on the client. -# media_to_add = [] -# usn = self.col.media.lastUsn() -# oldUsn = usn -# media_dir = self.col.media.dir() -# os.makedirs(media_dir, exist_ok=True) - -# for i in zip_file.infolist(): -# if i.filename == "_meta": # Ignore previously retrieved metadata. -# continue - -# file_data = zip_file.read(i) -# csum = anki.utils.checksum(file_data) -# filename = self._normalize_filename(meta[int(i.filename)][0]) -# file_path = os.path.join(media_dir, filename) - -# # Save file to media directory. -# with open(file_path, 'wb') as f: -# f.write(file_data) - -# usn += 1 -# media_to_add.append((filename, usn, csum)) - -# # We count all files we are to remove, even if we don't have them in -# # our media directory and our db doesn't know about them. -# processed_count = len(media_to_remove) + len(media_to_add) - -# assert len(meta) == processed_count # sanity check - -# if media_to_remove: -# self._remove_media_files(media_to_remove) - -# if media_to_add: -# self.col.media.addMedia(media_to_add) - -# assert self.col.media.lastUsn() == oldUsn + processed_count # TODO: move to some unit test -# return processed_count - -# @staticmethod -# def _normalize_filename(filename): -# """ -# Performs unicode normalization for file names. Logic taken from Anki's -# MediaManager.addFilesFromZip(). -# """ - -# # Normalize name for platform. -# if anki.utils.isMac: # global -# filename = unicodedata.normalize("NFD", filename) -# else: -# filename = unicodedata.normalize("NFC", filename) - -# return filename - -# def _remove_media_files(self, filenames): -# """ -# Marks all files in list filenames as deleted and removes them from the -# media directory. -# """ -# logger.debug('Removing %d files from media dir.' % len(filenames)) -# for filename in filenames: -# try: -# self.col.media.syncDelete(filename) -# except OSError as err: -# logger.error("Error when removing file '%s' from media dir: " -# "%s" % (filename, str(err))) - -# def downloadFiles(self, files): -# flist = {} -# cnt = 0 -# sz = 0 -# f = io.BytesIO() - -# with zipfile.ZipFile(f, "w", compression=zipfile.ZIP_DEFLATED) as z: -# for fname in files: -# z.write(os.path.join(self.col.media.dir(), fname), str(cnt)) -# flist[str(cnt)] = fname -# sz += os.path.getsize(os.path.join(self.col.media.dir(), fname)) -# if sz > SYNC_ZIP_SIZE or cnt > SYNC_ZIP_COUNT: -# break -# cnt += 1 - -# z.writestr("_meta", json.dumps(flist)) - -# return f.getvalue() - -# def mediaChanges(self, lastUsn): -# result = [] -# server_lastUsn = self.col.media.lastUsn() - -# if lastUsn < server_lastUsn or lastUsn == 0: -# for fname,usn,csum, in self.col.media.changes(lastUsn): -# result.append([fname, usn, csum]) - -# # anki assumes server_lastUsn == result[-1][1] -# # ref: anki/sync.py:720 (commit cca3fcb2418880d0430a5c5c2e6b81ba260065b7) -# result.reverse() - -# return {'data': result, 'err': ''} - -# def mediaSanity(self, local=None): -# if self.col.media.mediaCount() == local: -# result = "OK" -# else: -# result = "FAILED" - -# return {'data': result, 'err': ''} - -# class SyncUserSession: -# def __init__(self, name, path, collection_manager, setup_new_collection=None): -# self.skey = self._generate_session_key() -# self.name = name -# self.path = path -# self.collection_manager = collection_manager -# self.setup_new_collection = setup_new_collection -# self.version = None -# self.client_version = None -# self.created = time.time() -# self.collection_handler = None -# self.media_handler = None - -# # make sure the user path exists -# if not os.path.exists(path): -# os.mkdir(path) - -# def _generate_session_key(self): -# return anki.utils.checksum(str(random.random()))[:8] - -# def get_collection_path(self): -# return os.path.realpath(os.path.join(self.path, 'collection.anki2')) - -# def get_thread(self): -# return self.collection_manager.get_collection(self.get_collection_path(), self.setup_new_collection) - -# def get_handler_for_operation(self, operation, col): -# if operation in SyncCollectionHandler.operations: -# attr, handler_class = 'collection_handler', SyncCollectionHandler -# elif operation in SyncMediaHandler.operations: -# attr, handler_class = 'media_handler', SyncMediaHandler -# else: -# raise Exception("no handler for {}".format(operation)) - -# if getattr(self, attr) is None: -# setattr(self, attr, handler_class(col, self)) -# handler = getattr(self, attr) -# # The col object may actually be new now! This happens when we close a collection -# # for inactivity and then later re-open it (creating a new Collection object). -# handler.col = col -# return handler - -# class SyncApp: -# valid_urls = SyncCollectionHandler.operations + SyncMediaHandler.operations + ['hostKey', 'upload', 'download'] - -# def __init__(self, config): -# from ankisyncd.thread import get_collection_manager - -# self.data_root = os.path.abspath(config['data_root']) -# self.base_url = config['base_url'] -# self.base_media_url = config['base_media_url'] -# self.setup_new_collection = None - -# self.user_manager = get_user_manager(config) -# self.session_manager = get_session_manager(config) -# self.full_sync_manager = get_full_sync_manager(config) -# self.collection_manager = get_collection_manager(config) - -# # make sure the base_url has a trailing slash -# if not self.base_url.endswith('/'): -# self.base_url += '/' -# if not self.base_media_url.endswith('/'): -# self.base_media_url += '/' - -# def generateHostKey(self, username): -# """Generates a new host key to be used by the given username to identify their session. -# This values is random.""" - -# import hashlib, time, random, string -# chars = string.ascii_letters + string.digits -# val = ':'.join([username, str(int(time.time())), ''.join(random.choice(chars) for x in range(8))]).encode() -# return hashlib.md5(val).hexdigest() - -# def create_session(self, username, user_path): -# return SyncUserSession(username, user_path, self.collection_manager, self.setup_new_collection) - -# def _decode_data(self, data, compression=0): -# if compression: -# with gzip.GzipFile(mode="rb", fileobj=io.BytesIO(data)) as gz: -# data = gz.read() - -# try: -# data = json.loads(data.decode()) -# except (ValueError, UnicodeDecodeError): -# data = {'data': data} - -# return data - -# def operation_hostKey(self, username, password): -# if not self.user_manager.authenticate(username, password): -# return - -# dirname = self.user_manager.userdir(username) -# if dirname is None: -# return - -# hkey = self.generateHostKey(username) -# user_path = os.path.join(self.data_root, dirname) -# session = self.create_session(username, user_path) -# self.session_manager.save(hkey, session) - -# return {'key': hkey} - -# def operation_upload(self, col, data, session): -# # Verify integrity of the received database file before replacing our -# # existing db. - -# return self.full_sync_manager.upload(col, data, session) - -# def operation_download(self, col, session): -# # returns user data (not media) as a sqlite3 database for replacing their -# # local copy in Anki -# return self.full_sync_manager.download(col, session) - -# @wsgify -# def __call__(self, req): -# # Get and verify the session -# try: -# hkey = req.params['k'] -# except KeyError: -# hkey = None - -# session = self.session_manager.load(hkey, self.create_session) - -# if session is None: -# try: -# skey = req.POST['sk'] -# session = self.session_manager.load_from_skey(skey, self.create_session) -# except KeyError: -# skey = None - -# try: -# compression = int(req.POST['c']) -# except KeyError: -# compression = 0 - -# try: -# data = req.POST['data'].file.read() -# data = self._decode_data(data, compression) -# except KeyError: -# data = {} - -# if req.path.startswith(self.base_url): -# url = req.path[len(self.base_url):] -# if url not in self.valid_urls: -# raise HTTPNotFound() - -# if url == 'hostKey': -# result = self.operation_hostKey(data.get("u"), data.get("p")) -# if result: -# return json.dumps(result) -# else: -# # TODO: do I have to pass 'null' for the client to receive None? -# raise HTTPForbidden('null') - -# if session is None: -# raise HTTPForbidden() - -# if url in SyncCollectionHandler.operations + SyncMediaHandler.operations: -# # 'meta' passes the SYNC_VER but it isn't used in the handler -# if url == 'meta': -# if session.skey == None and 's' in req.POST: -# session.skey = req.POST['s'] -# if 'v' in data: -# session.version = data['v'] -# if 'cv' in data: -# session.client_version = data['cv'] - -# self.session_manager.save(hkey, session) -# session = self.session_manager.load(hkey, self.create_session) -# thread = session.get_thread() -# result = self._execute_handler_method_in_thread(url, data, session) -# # If it's a complex data type, we convert it to JSON -# if type(result) not in (str, bytes, Response): -# result = json.dumps(result) - -# return result - -# elif url == 'upload': -# thread = session.get_thread() -# result = thread.execute(self.operation_upload, [data['data'], session]) -# return result - -# elif url == 'download': -# thread = session.get_thread() -# result = thread.execute(self.operation_download, [session]) -# return result - -# # This was one of our operations but it didn't get handled... Oops! -# raise HTTPInternalServerError() - -# # media sync -# elif req.path.startswith(self.base_media_url): -# if session is None: -# raise HTTPForbidden() - -# url = req.path[len(self.base_media_url):] - -# if url not in self.valid_urls: -# raise HTTPNotFound() - -# if url == "begin": -# data['skey'] = session.skey - -# result = self._execute_handler_method_in_thread(url, data, session) - -# # If it's a complex data type, we convert it to JSON -# if type(result) not in (str, bytes): -# result = json.dumps(result) - -# return result - -# return "Anki Sync Server" - -# @staticmethod -# def _execute_handler_method_in_thread(method_name, keyword_args, session): -# """ -# Gets and runs the handler method specified by method_name inside the -# thread for session. The handler method will access the collection as -# self.col. -# """ - -# def run_func(col, **keyword_args): -# # Retrieve the correct handler method. -# handler = session.get_handler_for_operation(method_name, col) -# handler_method = getattr(handler, method_name) - -# res = handler_method(**keyword_args) - -# col.save() -# return res - -# run_func.__name__ = method_name # More useful debugging messages. - -# # Send the closure to the thread for execution. -# thread = session.get_thread() -# result = thread.execute(run_func, kw=keyword_args) - -# return result - - -# def make_app(global_conf, **local_conf): -# return SyncApp(**local_conf) - -# def main(): -# logging.basicConfig(level=logging.INFO, format="[%(asctime)s]:%(levelname)s:%(name)s:%(message)s") -# import ankisyncd -# logger.info("ankisyncd {} ({})".format(ankisyncd._get_version(), ankisyncd._homepage)) -# from wsgiref.simple_server import make_server, WSGIRequestHandler -# from ankisyncd.thread import shutdown -# import ankisyncd.config - -# class RequestHandler(WSGIRequestHandler): -# logger = logging.getLogger("ankisyncd.http") - -# def log_error(self, format, *args): -# self.logger.error("%s %s", self.address_string(), format%args) - -# def log_message(self, format, *args): -# self.logger.info("%s %s", self.address_string(), format%args) - -# if len(sys.argv) > 1: -# # backwards compat -# config = ankisyncd.config.load(sys.argv[1]) -# else: -# config = ankisyncd.config.load() - -# ankiserver = SyncApp(config) -# httpd = make_server(config['host'], int(config['port']), ankiserver, handler_class=RequestHandler) - -# try: -# logger.info("Serving HTTP on {} port {}...".format(*httpd.server_address)) -# httpd.serve_forever() -# except KeyboardInterrupt: -# logger.info("Exiting...") -# finally: -# shutdown() - -# if __name__ == '__main__': main() From a506785273688283b5d3ab9a728a57cbf241725c Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 4 Feb 2022 19:21:18 +0800 Subject: [PATCH 38/59] request change and readme modification --- README.md | 11 +++------ src/ankisyncd/sync_app.py | 52 +++++++++++++++------------------------ 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 28850c6..fa713b5 100644 --- a/README.md +++ b/README.md @@ -52,13 +52,10 @@ Installing $ ./ankisyncctl.py adduser -4. Setup a proxy to unchunk the requests. - - Webob does not support the header "Transfer-Encoding: chunked" used by Anki - and therefore ankisyncd sees chunked requests as empty. To solve this problem - setup Nginx (or any other webserver of your choice) and configure it to - "unchunk" the requests for ankisyncd. - +4. Setup a proxy to trans-write the requests (Optional) . + Ankisyncd currently support the header "Transfer-Encoding: chunked" used by Anki. + If you want to enable secure connection or have a better security,a proxy can be set up. + For example, if you use Nginx on the same machine as ankisyncd, you first have to change the port in `ankisyncd.conf` to something other than `27701`. Then configure Nginx to listen on port `27701` and forward the unchunked diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index da4eb91..c4b0069 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -396,23 +396,23 @@ class Requests(object): self.environ=environ @property def params(self): - return self._p + return self.request_items_dict @params.setter def params(self,value): """ A dictionary-like object containing both the parameters from the query string and request body. """ - self._p= value + self.request_items_dict= value @property def path(self)-> str: return self.environ['PATH_INFO'] @property def POST(self): - return self._x + return self._request_items_dict @POST.setter def POST(self,value): - self._x=value + self._request_items_dict=value @property def parse(self): '''Return a MultiDict containing all the variables from a form @@ -424,10 +424,10 @@ class Requests(object): input = env.get('wsgi.input') length = 0 if content_len == '' else int(content_len) body=b'' - d={} + request_items_dict={} if length == 0: if input is None: - return d + return request_items_dict if env.get('HTTP_TRANSFER_ENCODING','0') == 'chunked': # readlines and read(no argument) will block # convert byte str to number base 16 @@ -452,7 +452,7 @@ class Requests(object): # only strip \r\n if there are extra \n # eg b'?V\xc1\x8f>\xf9\xb1\n\r\n' data.append(item[:-2]) - d['data']=b''.join(data) + request_items_dict['data']=b''.join(data) others=data_other[len(data):] boundary=others[0] others=b''.join(others).split(boundary.strip()) @@ -462,31 +462,22 @@ class Requests(object): i=i.splitlines() key=re.findall(b'name="(.*?)"',i[2],flags=re.M)[0].decode('utf-8') v=i[-1].decode('utf-8') - d[key]=v - return d + request_items_dict[key]=v + return request_items_dict if query_string !='': # GET method body=query_string - d=urllib.parse.parse_qs(body) - for k,v in d.items(): - d[k]=''.join(v) - return d - - # request server with web browser - if self.path=='/' : - d= {'url':b'Anki Sync Server'} - return d - if self.path=='/favicon.ico' : - d= {'url':b''} - return d + request_items_dict=urllib.parse.parse_qs(body) + for k,v in request_items_dict.items(): + request_items_dict[k]=''.join(v) + return request_items_dict else: body = env['wsgi.input'].read(length) if body is None or body ==b'': - # return 'empty body' - return d + return request_items_dict # process body to dict repeat=body.splitlines()[0] items=re.split(repeat,body) @@ -495,24 +486,24 @@ class Requests(object): items.pop(0) for item in items: if b'name="data"' in item: - bt=None + data_field=None # remove \r\n if b'application/octet-stream' in item: # Ankidroid case item=re.sub(b'Content-Disposition: form-data; name="data"; filename="data"',b'',item) item=re.sub(b'Content-Type: application/octet-stream',b'',item) - bt=item.strip() + data_field=item.strip() else: # PKzip file stream and others item=re.sub(b'Content-Disposition: form-data; name="data"; filename="data"',b'',item) - bt=item.strip() - d['data']=bt + data_field=item.strip() + request_items_dict['data']=data_field continue item=re.sub(b'\r\n',b'',item,flags=re.MULTILINE) key=re.findall(b'name="(.*?)"',item)[0].decode('utf-8') v=item[item.rfind(b'"')+1:].decode('utf-8') - d[key]=v - return d + request_items_dict[key]=v + return request_items_dict class chunked(object): '''decorator''' def __init__(self, func): @@ -608,7 +599,6 @@ class SyncApp: # cgi file can only be read once,and will be blocked after being read once more # so i call Requests.parse only once,and bind its return result to properties # POST and params (set return result as property values) - # can switch back to previous version easily by commenting following two lines req.params=req.parse req.POST=req.params try: @@ -629,8 +619,6 @@ class SyncApp: compression = 0 try: - # can switch back to previous version easily - # data = req.POST['data'].file.read() data = req.POST['data'] data = self._decode_data(data, compression) except KeyError: From 6f39243bd0adf6cb8676d42f79c463ba8e2da9db Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 4 Feb 2022 19:36:19 +0800 Subject: [PATCH 39/59] remove commented code --- src/ankisyncd/sync.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index e15ce77..4e49e81 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -81,7 +81,6 @@ class Syncer(object): # then the other objects self.mergeModels(rchg['models']) self.mergeDecks(rchg['decks']) - # self.mergeTags(rchg['tags']) if 'conf' in rchg: self.mergeConf(rchg['conf']) # this was left out of earlier betas From a2d3ab15cacde981b34f55507c66196ec3f066ae Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 4 Feb 2022 19:55:20 +0800 Subject: [PATCH 40/59] bump anki version to 2.1.46 have not poetry set up --- pyproject.toml | 3 +-- src/requirements.txt | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 56ba0f5..6593404 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,10 +6,9 @@ authors = ["Vikash Kothary "] packages = [ { include = "ankisyncd", from = "src" } ] - [tool.poetry.dependencies] python = "^3.8" -anki = "^2.1.43" +anki = "2.1.46" beautifulsoup4 = "^4.9.1" requests = "^2.24.0" markdown = "^3.2.2" diff --git a/src/requirements.txt b/src/requirements.txt index ab0442c..e724fca 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,10 +1,10 @@ # THE FILE WAS GENERATED BY POETRY, DO NOT EDIT! -anki==2.1.49; python_version >= "3.8" -beautifulsoup4==4.10.0; python_full_version > "3.0.0" -certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -charset-normalizer==2.0.11; python_full_version >= "3.6.0" and python_version >= "3.8" +anki==2.1.46; python_version >= "3.8" +beautifulsoup4==4.9.3 +certifi==2020.12.5; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" +chardet==4.0.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") distro==1.6.0 idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" From 8e99274825aea3e97d9cc233b6b402d994e02084 Mon Sep 17 00:00:00 2001 From: dobefore <46564102+dobefore@users.noreply.github.com> Date: Fri, 4 Feb 2022 20:00:21 +0800 Subject: [PATCH 41/59] Update pyproject.toml --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 6593404..abda16f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,7 @@ authors = ["Vikash Kothary "] packages = [ { include = "ankisyncd", from = "src" } ] + [tool.poetry.dependencies] python = "^3.8" anki = "2.1.46" From 9a81c6bdfa6d9131342607e6da930a49a2f99977 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 4 Feb 2022 20:08:40 +0800 Subject: [PATCH 42/59] resolve conflicts --- src/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/requirements.txt b/src/requirements.txt index e724fca..8d153a6 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -2,9 +2,9 @@ anki==2.1.46; python_version >= "3.8" -beautifulsoup4==4.9.3 -certifi==2020.12.5; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" -chardet==4.0.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" +beautifulsoup4==4.10.0; python_full_version > "3.0.0" +certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" +charset-normalizer==2.0.10; python_full_version >= "3.6.0" and python_version >= "3.8" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") distro==1.6.0 idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" From d1813228bb850bc5c1cfbe717a81fa2a4a33519b Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 4 Feb 2022 20:30:06 +0800 Subject: [PATCH 43/59] try to resolve conflicts --- src/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/requirements.txt b/src/requirements.txt index 8d153a6..e724fca 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -2,9 +2,9 @@ anki==2.1.46; python_version >= "3.8" -beautifulsoup4==4.10.0; python_full_version > "3.0.0" -certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -charset-normalizer==2.0.10; python_full_version >= "3.6.0" and python_version >= "3.8" +beautifulsoup4==4.9.3 +certifi==2020.12.5; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" +chardet==4.0.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") distro==1.6.0 idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" From 414dd8bb47ed2ce68c7615eaf116c5e309a5bf10 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Fri, 4 Feb 2022 20:41:08 +0800 Subject: [PATCH 44/59] restore file --- src/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/requirements.txt b/src/requirements.txt index e724fca..adf5fa5 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,7 +1,7 @@ # THE FILE WAS GENERATED BY POETRY, DO NOT EDIT! -anki==2.1.46; python_version >= "3.8" +anki==2.1.40; python_version >= "3.8" beautifulsoup4==4.9.3 certifi==2020.12.5; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" chardet==4.0.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" From a53d85a75aa37c3385472ebd486ea9dc827ef205 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Mon, 7 Feb 2022 13:57:45 +0800 Subject: [PATCH 45/59] try to resolve conflicts --- src/ankisyncd/sync_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ankisyncd/sync_app.py b/src/ankisyncd/sync_app.py index c4b0069..bcf8652 100644 --- a/src/ankisyncd/sync_app.py +++ b/src/ankisyncd/sync_app.py @@ -760,5 +760,5 @@ def main(): finally: shutdown() -if __name__ == '__main__': +if __name__ == '__main__': main() From d8cf7791054e853579abb9f10978bc3344e88d58 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Mon, 7 Feb 2022 14:05:58 +0800 Subject: [PATCH 46/59] modification to sync.py add a guard case to def finish remove redundant blank line of def sanityCheck --- src/ankisyncd/sync.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ankisyncd/sync.py b/src/ankisyncd/sync.py index 4e49e81..9c45e40 100644 --- a/src/ankisyncd/sync.py +++ b/src/ankisyncd/sync.py @@ -120,7 +120,6 @@ select id from notes where mid = ?) limit 1""" return True def sanityCheck(self): - tables=["cards", "notes", "revlog", @@ -161,8 +160,9 @@ select id from notes where mid = ?) limit 1""" self.set_last_sync(now) self.increment_usn() self.col.save() - # now is None not happen - return now + return now + # even though that now is None will not happen,have to match a gurad case + return None # Chunked syncing ########################################################################## From 1b305509c1d8635e034164a33a89a49ca6bc12e3 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Mon, 7 Feb 2022 14:11:40 +0800 Subject: [PATCH 47/59] update poetry toml anki to 2.1.49 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index abda16f..fbb703e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ packages = [ [tool.poetry.dependencies] python = "^3.8" -anki = "2.1.46" +anki = "2.1.49" beautifulsoup4 = "^4.9.1" requests = "^2.24.0" markdown = "^3.2.2" From 16fbf6e27f1121336c4075061891526837a99018 Mon Sep 17 00:00:00 2001 From: dobefore <1432338032@qq.com> Date: Mon, 7 Feb 2022 14:21:51 +0800 Subject: [PATCH 48/59] modification to full_sync.py add type hint to def upload --- src/ankisyncd/full_sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ankisyncd/full_sync.py b/src/ankisyncd/full_sync.py index 7050a14..a6c9b9d 100644 --- a/src/ankisyncd/full_sync.py +++ b/src/ankisyncd/full_sync.py @@ -23,7 +23,7 @@ class FullSyncManager: "Integrity check failed for uploaded collection database file." ) - def upload(self, col: Collection, data: bytes, session) : + def upload(self, col: Collection, data: bytes, session) -> str: """ Uploads a sqlite database from the client to the sync server. From 50f002c53a2fe2d33f18a4aad0b76aae2361ba20 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Thu, 10 Mar 2022 17:45:05 +0000 Subject: [PATCH 49/59] chore: Add make config command to create new dotenv files --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index b7ee230..7f23ae7 100755 --- a/Makefile +++ b/Makefile @@ -31,6 +31,11 @@ run: @if [[ -f "scripts/${*}.sh" ]]; then \ ${BASH} "scripts/${*}.sh"; fi +.PHONY: config #: Create new config file. +config: config/.env.${ENV} +config/.env.%: + @cp -n config/.env.example config/.env.${ENV} + .PHONY: init #: Download Python dependencies. init: @${POETRY} install From 6706a56cc8b90d4f24073d28022138f4ed6abf04 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Thu, 10 Mar 2022 18:06:36 +0000 Subject: [PATCH 50/59] test: Fix import collection from anki package See: #124 --- tests/helpers/collection_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/helpers/collection_utils.py b/tests/helpers/collection_utils.py index b8e1231..a2bfbe3 100644 --- a/tests/helpers/collection_utils.py +++ b/tests/helpers/collection_utils.py @@ -3,7 +3,7 @@ import os import shutil import tempfile -from anki import Collection +from anki.collection import Collection class CollectionUtils: """ From 06a6767f8bc241ee1cbfece65ee58687c9f3af88 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Thu, 10 Mar 2022 20:12:07 +0000 Subject: [PATCH 51/59] feat: make ankisyncd_cli into a python package --- src/ankisyncd_cli/__init__.py | 0 src/ankisyncd_cli/ankisyncctl.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/ankisyncd_cli/__init__.py diff --git a/src/ankisyncd_cli/__init__.py b/src/ankisyncd_cli/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ankisyncd_cli/ankisyncctl.py b/src/ankisyncd_cli/ankisyncctl.py index 8d0d055..c681953 100644 --- a/src/ankisyncd_cli/ankisyncctl.py +++ b/src/ankisyncd_cli/ankisyncctl.py @@ -3,8 +3,8 @@ import os import sys import getpass -from src.ankisyncd import config -from src.ankisyncd.users import get_user_manager +from ankisyncd import config +from ankisyncd.users import get_user_manager config = config.load() From 1d61f03706b5779f6e5c54bf48c30f731a4c6c00 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Thu, 10 Mar 2022 20:37:41 +0000 Subject: [PATCH 52/59] refactor: Remove unused import --- src/ankisyncd_cli/ankisyncctl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ankisyncd_cli/ankisyncctl.py b/src/ankisyncd_cli/ankisyncctl.py index c681953..9ccbf15 100644 --- a/src/ankisyncd_cli/ankisyncctl.py +++ b/src/ankisyncd_cli/ankisyncctl.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -import os + import sys import getpass From d2f336c210d962ab4eeed4b1374870b8d8285010 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Mon, 16 May 2022 22:22:06 +0100 Subject: [PATCH 53/59] chore: Update poetry.lock and requirements files Resolves #132 --- poetry.lock | 988 ++++++++++++++++++--------------------- src/requirements-dev.txt | 136 +++--- src/requirements.txt | 24 +- 3 files changed, 525 insertions(+), 623 deletions(-) diff --git a/poetry.lock b/poetry.lock index 58b4f2a..dbf9101 100644 --- a/poetry.lock +++ b/poetry.lock @@ -22,7 +22,7 @@ syncserver = ["flask", "waitress"] [[package]] name = "appnope" -version = "0.1.2" +version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" category = "dev" optional = false @@ -97,11 +97,11 @@ python-versions = "*" [[package]] name = "beautifulsoup4" -version = "4.10.0" +version = "4.11.1" description = "Screen-scraping library" category = "main" optional = false -python-versions = ">3.0.0" +python-versions = ">=3.6.0" [package.dependencies] soupsieve = ">1.2" @@ -110,41 +110,22 @@ soupsieve = ">1.2" html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "black" -version = "22.1.0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6.2" - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = ">=1.1.0" -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "bleach" -version = "4.1.0" +version = "5.0.0" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -packaging = "*" six = ">=1.9.0" webencodings = "*" +[package.extras] +css = ["tinycss2 (>=1.1.0)"] +dev = ["pip-tools (==6.5.1)", "pytest (==7.1.1)", "flake8 (==4.0.1)", "tox (==3.24.5)", "sphinx (==4.3.2)", "twine (==4.0.0)", "wheel (==0.37.1)", "hashin (==0.17.0)", "black (==22.3.0)", "mypy (==0.942)"] + [[package]] name = "certifi" version = "2021.10.8" @@ -166,7 +147,7 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.11" +version = "2.0.12" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false @@ -177,11 +158,11 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.3" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -196,11 +177,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "debugpy" -version = "1.5.1" +version = "1.6.0" description = "An implementation of the Debug Adapter Protocol for Python" category = "dev" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +python-versions = ">=3.7" [[package]] name = "decorator" @@ -220,11 +201,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "distro" -version = "1.6.0" +version = "1.7.0" description = "Distro - an OS platform information API" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "entrypoints" @@ -236,15 +217,26 @@ python-versions = ">=3.6" [[package]] name = "executing" -version = "0.8.2" +version = "0.8.3" description = "Get the currently executing AST node of a frame, and other information" category = "dev" optional = false python-versions = "*" +[[package]] +name = "fastjsonschema" +version = "2.15.3" +description = "Fastest Python implementation of JSON schema" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + [[package]] name = "ghp-import" -version = "2.0.2" +version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." category = "dev" optional = false @@ -266,7 +258,7 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.10.1" +version = "4.11.3" description = "Read metadata from Python packages" category = "main" optional = false @@ -276,28 +268,28 @@ python-versions = ">=3.7" zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] [[package]] name = "importlib-resources" -version = "5.4.0" +version = "5.7.1" description = "Read resources from Python packages" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [[package]] name = "ipykernel" -version = "6.8.0" +version = "6.13.0" description = "IPython Kernel for Jupyter" category = "dev" optional = false @@ -305,20 +297,22 @@ python-versions = ">=3.7" [package.dependencies] appnope = {version = "*", markers = "platform_system == \"Darwin\""} -debugpy = ">=1.0.0,<2.0" +debugpy = ">=1.0" ipython = ">=7.23.1" -jupyter-client = "<8.0" -matplotlib-inline = ">=0.1.0,<0.2.0" +jupyter-client = ">=6.1.12" +matplotlib-inline = ">=0.1" nest-asyncio = "*" -tornado = ">=4.2,<7.0" -traitlets = ">=5.1.0,<6.0" +packaging = "*" +psutil = "*" +tornado = ">=6.1" +traitlets = ">=5.1.0" [package.extras] -test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "ipyparallel"] +test = ["pytest (>=6.0)", "pytest-cov", "flaky", "ipyparallel", "pre-commit", "pytest-timeout"] [[package]] name = "ipython" -version = "8.0.1" +version = "8.3.0" description = "IPython: Productive Interactive Computing" category = "dev" optional = false @@ -327,7 +321,6 @@ python-versions = ">=3.8" [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} backcall = "*" -black = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" jedi = ">=0.16" @@ -335,21 +328,22 @@ matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} pickleshare = "*" prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -pygments = "*" +pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" [package.extras] -all = ["Sphinx (>=1.3)", "curio", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.19)", "pandas", "pygments", "pytest", "pytest-asyncio", "qtconsole", "testpath", "trio"] +all = ["black", "Sphinx (>=1.3)", "ipykernel", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.19)", "pandas", "trio"] +black = ["black"] doc = ["Sphinx (>=1.3)"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] -notebook = ["notebook", "ipywidgets"] +notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest", "pytest-asyncio", "testpath", "pygments"] -test_extra = ["pytest", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "pygments", "trio"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "trio"] [[package]] name = "ipython-genutils" @@ -361,7 +355,7 @@ python-versions = "*" [[package]] name = "ipywidgets" -version = "7.6.5" +version = "7.7.0" description = "IPython HTML widgets for Jupyter" category = "dev" optional = false @@ -374,7 +368,7 @@ ipython-genutils = ">=0.2.0,<0.3.0" jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} nbformat = ">=4.2.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=3.5.0,<3.6.0" +widgetsnbextension = ">=3.6.0,<3.7.0" [package.extras] test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] @@ -396,11 +390,11 @@ testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.0.3" +version = "3.1.2" description = "A very fast and expressive template engine." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" @@ -410,7 +404,7 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "json5" -version = "0.9.6" +version = "0.9.8" description = "A Python implementation of the JSON5 data format." category = "dev" optional = false @@ -421,7 +415,7 @@ dev = ["hypothesis"] [[package]] name = "jsonschema" -version = "4.4.0" +version = "4.5.1" description = "An implementation of JSON Schema validation for Python" category = "dev" optional = false @@ -454,28 +448,28 @@ qtconsole = "*" [[package]] name = "jupyter-client" -version = "7.1.2" +version = "7.3.1" description = "Jupyter protocol implementation and client libraries" category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] entrypoints = "*" -jupyter-core = ">=4.6.0" -nest-asyncio = ">=1.5" -python-dateutil = ">=2.1" -pyzmq = ">=13" -tornado = ">=4.1" +jupyter-core = ">=4.9.2" +nest-asyncio = ">=1.5.4" +python-dateutil = ">=2.8.2" +pyzmq = ">=22.3" +tornado = ">=6.0" traitlets = "*" [package.extras] -doc = ["myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["codecov", "coverage", "ipykernel", "ipython", "mock", "mypy", "pre-commit", "pytest", "pytest-asyncio", "pytest-cov", "pytest-timeout", "jedi (<0.18)"] +doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-console" -version = "6.4.0" +version = "6.4.3" description = "Jupyter terminal console" category = "dev" optional = false @@ -484,7 +478,7 @@ python-versions = ">=3.6" [package.dependencies] ipykernel = "*" ipython = "*" -jupyter-client = "*" +jupyter-client = ">=7.0.0" prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" pygments = "*" @@ -493,16 +487,19 @@ test = ["pexpect"] [[package]] name = "jupyter-core" -version = "4.9.1" +version = "4.10.0" description = "Jupyter core package. A base package on which Jupyter projects rely." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} traitlets = "*" +[package.extras] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "jupyterlab" version = "2.3.2" @@ -523,14 +520,11 @@ test = ["pytest", "pytest-check-links", "requests", "wheel", "virtualenv"] [[package]] name = "jupyterlab-pygments" -version = "0.1.2" +version = "0.2.2" description = "Pygments theme using JupyterLab CSS variables" category = "dev" optional = false -python-versions = "*" - -[package.dependencies] -pygments = ">=2.4.1,<3" +python-versions = ">=3.7" [[package]] name = "jupyterlab-server" @@ -552,7 +546,7 @@ test = ["pytest", "requests"] [[package]] name = "jupyterlab-widgets" -version = "1.0.2" +version = "1.1.0" description = "A JupyterLab extension." category = "dev" optional = false @@ -560,14 +554,14 @@ python-versions = ">=3.6" [[package]] name = "jupytext" -version = "1.13.6" +version = "1.13.8" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" category = "dev" optional = false python-versions = "~=3.6" [package.dependencies] -markdown-it-py = ">=1.0,<2.0" +markdown-it-py = ">=1.0.0,<3.0.0" mdit-py-plugins = "*" nbformat = "*" pyyaml = "*" @@ -579,7 +573,7 @@ toml = ["toml"] [[package]] name = "markdown" -version = "3.3.6" +version = "3.3.7" description = "Python implementation of Markdown." category = "main" optional = false @@ -593,30 +587,32 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markdown-it-py" -version = "1.1.0" +version = "2.1.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false -python-versions = "~=3.6" +python-versions = ">=3.7" [package.dependencies] -attrs = ">=19,<22" +mdurl = ">=0.1,<1.0" [package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] -rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] -testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,<4.0)", "pytest-cov", "pytest-regressions"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.0.1" +version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "matplotlib-inline" @@ -645,6 +641,14 @@ code_style = ["pre-commit (==2.6)"] rtd = ["myst-parser (>=0.14.0,<0.15.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] +[[package]] +name = "mdurl" +version = "0.1.1" +description = "Markdown URL utilities" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "mergedeep" version = "1.3.4" @@ -663,7 +667,7 @@ python-versions = "*" [[package]] name = "mkdocs" -version = "1.2.3" +version = "1.3.0" description = "Project documentation with Markdown." category = "dev" optional = false @@ -672,8 +676,8 @@ python-versions = ">=3.6" [package.dependencies] click = ">=3.3" ghp-import = ">=1.0" -importlib-metadata = ">=3.10" -Jinja2 = ">=2.10.1" +importlib-metadata = ">=4.3" +Jinja2 = ">=2.10.2" Markdown = ">=3.2.1" mergedeep = ">=1.3.4" packaging = ">=20.5" @@ -700,19 +704,19 @@ nbconvert = ">=6.2.0,<7.0.0" [[package]] name = "mkdocs-material" -version = "8.1.10" -description = "A Material Design theme for MkDocs" +version = "8.2.15" +description = "Documentation that simply works" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] jinja2 = ">=2.11.1" markdown = ">=3.2" -mkdocs = ">=1.2.3" -mkdocs-material-extensions = ">=1.0" -pygments = ">=2.10" -pymdown-extensions = ">=9.0" +mkdocs = ">=1.3.0" +mkdocs-material-extensions = ">=1.0.3" +pygments = ">=2.12" +pymdown-extensions = ">=9.4" [[package]] name = "mkdocs-material-extensions" @@ -722,17 +726,9 @@ category = "dev" optional = false python-versions = ">=3.6" -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "nbclient" -version = "0.5.10" +version = "0.6.3" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." category = "dev" optional = false @@ -742,63 +738,65 @@ python-versions = ">=3.7.0" jupyter-client = ">=6.1.5" nbformat = ">=5.0" nest-asyncio = "*" -traitlets = ">=4.2" +traitlets = ">=5.0.0" [package.extras] -sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] -test = ["ipython", "ipykernel", "ipywidgets (<8.0.0)", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "xmltodict", "black", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)"] +sphinx = ["autodoc-traits", "mock", "moto", "myst-parser", "Sphinx (>=1.7)", "sphinx-book-theme"] +test = ["black", "check-manifest", "flake8", "ipykernel", "ipython (<8.0.0)", "ipywidgets (<8.0.0)", "mypy", "pip (>=18.1)", "pre-commit", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "setuptools (>=60.0)", "testpath", "twine (>=1.11.0)", "xmltodict"] [[package]] name = "nbconvert" -version = "6.4.1" +version = "6.5.0" description = "Converting Jupyter Notebooks" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] +beautifulsoup4 = "*" bleach = "*" defusedxml = "*" entrypoints = ">=0.2.2" -jinja2 = ">=2.4" -jupyter-core = "*" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" jupyterlab-pygments = "*" +MarkupSafe = ">=2.0" mistune = ">=0.8.1,<2" -nbclient = ">=0.5.0,<0.6.0" -nbformat = ">=4.4" +nbclient = ">=0.5.0" +nbformat = ">=5.1" +packaging = "*" pandocfilters = ">=1.4.1" pygments = ">=2.4.1" -testpath = "*" +tinycss2 = "*" traitlets = ">=5.0" [package.extras] -all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.6)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] +all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)", "tornado (>=6.1)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] -serve = ["tornado (>=4.0)"] -test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.6)"] -webpdf = ["pyppeteer (==0.2.6)"] +serve = ["tornado (>=6.1)"] +test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)"] +webpdf = ["pyppeteer (>=1,<1.1)"] [[package]] name = "nbformat" -version = "5.1.3" +version = "5.4.0" description = "The Jupyter Notebook format" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" [package.dependencies] -ipython-genutils = "*" -jsonschema = ">=2.4,<2.5.0 || >2.5.0" +fastjsonschema = "*" +jsonschema = ">=2.6" jupyter-core = "*" -traitlets = ">=4.1" +traitlets = ">=5.1" [package.extras] -fast = ["fastjsonschema"] -test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] +test = ["check-manifest", "testpath", "pytest", "pre-commit"] [[package]] name = "nest-asyncio" -version = "1.5.4" +version = "1.5.5" description = "Patch asyncio to allow nested event loops" category = "dev" optional = false @@ -806,11 +804,11 @@ python-versions = ">=3.5" [[package]] name = "notebook" -version = "6.4.8" +version = "6.4.11" description = "A web-based notebook environment for interactive computing" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] argon2-cffi = "*" @@ -819,7 +817,7 @@ ipython-genutils = "*" jinja2 = "*" jupyter-client = ">=5.3.4" jupyter-core = ">=4.6.1" -nbconvert = "*" +nbconvert = ">=5" nbformat = "*" nest-asyncio = ">=1.5" prometheus-client = "*" @@ -832,11 +830,11 @@ traitlets = ">=4.2.1" [package.extras] docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] json-logging = ["json-logging"] -test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] +test = ["pytest", "coverage", "requests", "testpath", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] [[package]] name = "orjson" -version = "3.6.6" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -873,14 +871,6 @@ python-versions = ">=3.6" qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] testing = ["docopt", "pytest (<6.0.0)"] -[[package]] -name = "pathspec" -version = "0.9.0" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - [[package]] name = "pexpect" version = "4.8.0" @@ -900,21 +890,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "platformdirs" -version = "2.4.1" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] - [[package]] name = "prometheus-client" -version = "0.13.1" +version = "0.14.1" description = "Python client for the Prometheus monitoring system." category = "dev" optional = false @@ -925,7 +903,7 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.26" +version = "3.0.29" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false @@ -936,11 +914,11 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "3.19.4" +version = "3.20.1" description = "Protocol Buffers" category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" [[package]] name = "psutil" @@ -990,33 +968,33 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.11.2" +version = "2.12.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "pymdown-extensions" -version = "9.1" +version = "9.4" description = "Extension pack for Python Markdown." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -Markdown = ">=3.2" +markdown = ">=3.2" [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pyrsistent" @@ -1047,7 +1025,7 @@ six = ">=1.5" [[package]] name = "pywin32" -version = "303" +version = "304" description = "Python for Window Extensions" category = "dev" optional = false @@ -1055,11 +1033,11 @@ python-versions = "*" [[package]] name = "pywinpty" -version = "2.0.2" +version = "2.0.5" description = "Pseudo terminal support for Windows from Python." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "pyyaml" @@ -1094,11 +1072,11 @@ py = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "qtconsole" -version = "5.2.2" +version = "5.3.0" description = "Jupyter Qt console" category = "dev" optional = false -python-versions = ">= 3.6" +python-versions = ">= 3.7" [package.dependencies] ipykernel = ">=4.1" @@ -1107,7 +1085,7 @@ jupyter-client = ">=4.1" jupyter-core = "*" pygments = "*" pyzmq = ">=17.1" -qtpy = "*" +qtpy = ">=2.0.1" traitlets = "*" [package.extras] @@ -1116,17 +1094,17 @@ test = ["flaky", "pytest", "pytest-qt"] [[package]] name = "qtpy" -version = "2.0.1" +version = "2.1.0" description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] packaging = "*" [package.extras] -test = ["pytest (>=6.0.0)", "pytest-cov (>=3.0.0)", "pytest-qt"] +test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] [[package]] name = "requests" @@ -1170,7 +1148,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "soupsieve" -version = "2.3.1" +version = "2.3.2.post1" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false @@ -1178,7 +1156,7 @@ python-versions = ">=3.6" [[package]] name = "stack-data" -version = "0.1.4" +version = "0.2.0" description = "Extract data from python stack frames and tracebacks for informative displays" category = "dev" optional = false @@ -1190,7 +1168,7 @@ executing = "*" pure-eval = "*" [package.extras] -tests = ["pytest", "typeguard", "pygments", "littleutils"] +tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] [[package]] name = "stringcase" @@ -1202,7 +1180,7 @@ python-versions = "*" [[package]] name = "terminado" -version = "0.13.1" +version = "0.15.0" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." category = "dev" optional = false @@ -1211,21 +1189,25 @@ python-versions = ">=3.7" [package.dependencies] ptyprocess = {version = "*", markers = "os_name != \"nt\""} pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} -tornado = ">=4" +tornado = ">=6.1.0" [package.extras] -test = ["pytest"] +test = ["pre-commit", "pytest-timeout", "pytest (>=6.0)"] [[package]] -name = "testpath" -version = "0.5.0" -description = "Test utilities for code working with files and commands" +name = "tinycss2" +version = "1.1.1" +description = "A tiny CSS parser" category = "dev" optional = false -python-versions = ">= 3.5" +python-versions = ">=3.6" + +[package.dependencies] +webencodings = ">=0.4" [package.extras] -test = ["pytest", "pathlib2"] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] [[package]] name = "toml" @@ -1235,14 +1217,6 @@ category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "tomli" -version = "2.0.0" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "tornado" version = "6.1" @@ -1253,43 +1227,35 @@ python-versions = ">= 3.5" [[package]] name = "traitlets" -version = "5.1.1" -description = "Traitlets Python configuration system" +version = "5.2.1.post0" +description = "" category = "dev" optional = false python-versions = ">=3.7" [package.extras] -test = ["pytest"] - -[[package]] -name = "typing-extensions" -version = "4.0.1" -description = "Backported and Experimental Type Hints for Python 3.6+" -category = "dev" -optional = false -python-versions = ">=3.6" +test = ["pre-commit", "pytest"] [[package]] name = "urllib3" -version = "1.26.8" +version = "1.26.9" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "waitress" -version = "2.0.0" +version = "2.1.1" description = "Waitress WSGI server" category = "dev" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.7.0" [package.extras] docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] @@ -1297,7 +1263,7 @@ testing = ["pytest", "pytest-cover", "coverage (>=5.0)"] [[package]] name = "watchdog" -version = "2.1.6" +version = "2.1.8" description = "Filesystem events monitoring" category = "dev" optional = false @@ -1354,7 +1320,7 @@ tests = ["nose (<1.3.0)", "coverage", "mock", "pastedeploy", "wsgiproxy2", "pyqu [[package]] name = "widgetsnbextension" -version = "3.5.2" +version = "3.6.0" description = "IPython HTML widgets for Jupyter" category = "dev" optional = false @@ -1365,20 +1331,20 @@ notebook = ">=4.4.1" [[package]] name = "zipp" -version = "3.7.0" +version = "3.8.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "c0c6dee5f71c5cfd437cc762c613d39b1991580214802ec9b5cf03e2b03eaca9" +content-hash = "6f1089c6991dfa4ce8fb78818b271f8db7f0d747a41288d3c6f0ac89695fe4b0" [metadata.files] anki = [ @@ -1387,8 +1353,8 @@ anki = [ {file = "anki-2.1.49-cp38-abi3-win_amd64.whl", hash = "sha256:fda47880fbc4bf232090ea171fb337c4301d7f001bb2647fccb83785886cc6f8"}, ] appnope = [ - {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, - {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, ] argon2-cffi = [ {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, @@ -1430,37 +1396,12 @@ backcall = [ {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] beautifulsoup4 = [ - {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"}, - {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, -] -black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, ] bleach = [ - {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, - {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, + {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, + {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, ] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, @@ -1519,39 +1460,36 @@ cffi = [ {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.11.tar.gz", hash = "sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c"}, - {file = "charset_normalizer-2.0.11-py3-none-any.whl", hash = "sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45"}, + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, - {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] debugpy = [ - {file = "debugpy-1.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:70b422c63a833630c33e3f9cdbd9b6971f8c5afd452697e464339a21bbe862ba"}, - {file = "debugpy-1.5.1-cp310-cp310-win32.whl", hash = "sha256:3a457ad9c0059a21a6c7d563c1f18e924f5cf90278c722bd50ede6f56b77c7fe"}, - {file = "debugpy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:5d76a4fd028d8009c3faf1185b4b78ceb2273dd2499447664b03939e0368bb90"}, - {file = "debugpy-1.5.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:16db27b4b91991442f91d73604d32080b30de655aca9ba821b1972ea8171021b"}, - {file = "debugpy-1.5.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b073ad5e8d8c488fbb6a116986858bab0c9c4558f28deb8832c7a5a27405bd6"}, - {file = "debugpy-1.5.1-cp36-cp36m-win32.whl", hash = "sha256:318f81f37341e4e054b4267d39896b73cddb3612ca13b39d7eea45af65165e1d"}, - {file = "debugpy-1.5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b5b3157372e0e0a1297a8b6b5280bcf1d35a40f436c7973771c972726d1e32d5"}, - {file = "debugpy-1.5.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1ec3a086e14bba6c472632025b8fe5bdfbaef2afa1ebd5c6615ce6ed8d89bc67"}, - {file = "debugpy-1.5.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:26fbe53cca45a608679094791ce587b6e2798acd1d4777a8b303b07622e85182"}, - {file = "debugpy-1.5.1-cp37-cp37m-win32.whl", hash = "sha256:d876db8c312eeb02d85611e0f696abe66a2c1515e6405943609e725d5ff36f2a"}, - {file = "debugpy-1.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4404a62fb5332ea5c8c9132290eef50b3a0ba38cecacad5529e969a783bcbdd7"}, - {file = "debugpy-1.5.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f3a3dca9104aa14fd4210edcce6d9ce2b65bd9618c0b222135a40b9d6e2a9eeb"}, - {file = "debugpy-1.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2df2c373e85871086bd55271c929670cd4e1dba63e94a08d442db830646203b"}, - {file = "debugpy-1.5.1-cp38-cp38-win32.whl", hash = "sha256:82f5f9ce93af6861a0713f804e62ab390bb12a17f113153e47fea8bbb1dfbe36"}, - {file = "debugpy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:17a25ce9d7714f92fc97ef00cc06269d7c2b163094990ada30156ed31d9a5030"}, - {file = "debugpy-1.5.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:01e98c594b3e66d529e40edf314f849cd1a21f7a013298df58cd8e263bf8e184"}, - {file = "debugpy-1.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f73988422b17f071ad3c4383551ace1ba5ed810cbab5f9c362783d22d40a08dc"}, - {file = "debugpy-1.5.1-cp39-cp39-win32.whl", hash = "sha256:23df67fc56d59e386c342428a7953c2c06cc226d8525b11319153e96afb65b0c"}, - {file = "debugpy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:a2aa64f6d2ca7ded8a7e8a4e7cae3bc71866b09876b7b05cecad231779cb9156"}, - {file = "debugpy-1.5.1-py2.py3-none-any.whl", hash = "sha256:194f95dd3e84568b5489aab5689a3a2c044e8fdc06f1890b8b4f70b6b89f2778"}, - {file = "debugpy-1.5.1.zip", hash = "sha256:d2b09e91fbd1efa4f4fda121d49af89501beda50c18ed7499712c71a4bf3452e"}, + {file = "debugpy-1.6.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:eb1946efac0c0c3d411cea0b5ac772fbde744109fd9520fb0c5a51979faf05ad"}, + {file = "debugpy-1.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e3513399177dd37af4c1332df52da5da1d0c387e5927dc4c0709e26ee7302e8f"}, + {file = "debugpy-1.6.0-cp310-cp310-win32.whl", hash = "sha256:5c492235d6b68f879df3bdbdb01f25c15be15682665517c2c7d0420e5658d71f"}, + {file = "debugpy-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:40de9ba137d355538432209d05e0f5fe5d0498dce761c39119ad4b950b51db31"}, + {file = "debugpy-1.6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0d383b91efee57dbb923ba20801130cf60450a0eda60bce25bccd937de8e323a"}, + {file = "debugpy-1.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ff853e60e77e1c16f85a31adb8360bb2d98ca588d7ed645b7f0985b240bdb5e"}, + {file = "debugpy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:8e972c717d95f56b6a3a7a29a5ede1ee8f2c3802f6f0e678203b0778eb322bf1"}, + {file = "debugpy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a8aaeb53e87225141fda7b9081bd87155c1debc13e2f5a532d341112d1983b65"}, + {file = "debugpy-1.6.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:132defb585b518955358321d0f42f6aa815aa15b432be27db654807707c70b2f"}, + {file = "debugpy-1.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ee75844242b4537beb5899f3e60a578454d1f136b99e8d57ac424573797b94a"}, + {file = "debugpy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:a65a2499761d47df3e9ea9567109be6e73d412e00ac3ffcf74839f3ddfcdf028"}, + {file = "debugpy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:bd980d533d0ddfc451e03a3bb32acb2900049fec39afc3425b944ebf0889be62"}, + {file = "debugpy-1.6.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:245c7789a012f86210847ec7ee9f38c30a30d4c2223c3e111829a76c9006a5d0"}, + {file = "debugpy-1.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e3aa2368883e83e7b689ddff3cafb595f7b711f6a065886b46a96a7fef874e7"}, + {file = "debugpy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:72bcfa97f3afa0064afc77ab811f48ad4a06ac330f290b675082c24437730366"}, + {file = "debugpy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:30abefefd2ff5a5481162d613cb70e60e2fa80a5eb4c994717c0f008ed25d2e1"}, + {file = "debugpy-1.6.0-py2.py3-none-any.whl", hash = "sha256:4de7777842da7e08652f2776c552070bbdd758557fdec73a15d7be0e4aab95ce"}, + {file = "debugpy-1.6.0.zip", hash = "sha256:7b79c40852991f7b6c3ea65845ed0f5f6b731c37f4f9ad9c61e2ab4bd48a9275"}, ] decorator = [ {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, @@ -1562,64 +1500,67 @@ defusedxml = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] distro = [ - {file = "distro-1.6.0-py2.py3-none-any.whl", hash = "sha256:c8713330ab31a034623a9515663ed87696700b55f04556b97c39cd261aa70dc7"}, - {file = "distro-1.6.0.tar.gz", hash = "sha256:83f5e5a09f9c5f68f60173de572930effbcc0287bb84fdc4426cb4168c088424"}, + {file = "distro-1.7.0-py3-none-any.whl", hash = "sha256:d596311d707e692c2160c37807f83e3820c5d539d5a83e87cfb6babd8ba3a06b"}, + {file = "distro-1.7.0.tar.gz", hash = "sha256:151aeccf60c216402932b52e40ee477a939f8d58898927378a02abbe852c1c39"}, ] entrypoints = [ {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, ] executing = [ - {file = "executing-0.8.2-py2.py3-none-any.whl", hash = "sha256:32fc6077b103bd19e6494a72682d66d5763cf20a106d5aa7c5ccbea4e47b0df7"}, - {file = "executing-0.8.2.tar.gz", hash = "sha256:c23bf42e9a7b9b212f185b1b2c3c91feb895963378887bb10e64a2e612ec0023"}, + {file = "executing-0.8.3-py2.py3-none-any.whl", hash = "sha256:d1eef132db1b83649a3905ca6dd8897f71ac6f8cac79a7e58a1a09cf137546c9"}, + {file = "executing-0.8.3.tar.gz", hash = "sha256:c6554e21c6b060590a6d3be4b82fb78f8f0194d809de5ea7df1c093763311501"}, +] +fastjsonschema = [ + {file = "fastjsonschema-2.15.3-py3-none-any.whl", hash = "sha256:ddb0b1d8243e6e3abb822bd14e447a89f4ab7439342912d590444831fa00b6a0"}, + {file = "fastjsonschema-2.15.3.tar.gz", hash = "sha256:0a572f0836962d844c1fc435e200b2e4f4677e4e6611a2e3bdd01ba697c275ec"}, ] ghp-import = [ - {file = "ghp-import-2.0.2.tar.gz", hash = "sha256:947b3771f11be850c852c64b561c600fdddf794bab363060854c1ee7ad05e071"}, - {file = "ghp_import-2.0.2-py3-none-any.whl", hash = "sha256:5f8962b30b20652cdffa9c5a9812f7de6bcb56ec475acac579807719bf242c46"}, + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, ] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.10.1-py3-none-any.whl", hash = "sha256:899e2a40a8c4a1aec681feef45733de8a6c58f3f6a0dbed2eb6574b4387a77b6"}, - {file = "importlib_metadata-4.10.1.tar.gz", hash = "sha256:951f0d8a5b7260e9db5e41d429285b5f451e928479f19d80818878527d36e95e"}, + {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, + {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, ] importlib-resources = [ - {file = "importlib_resources-5.4.0-py3-none-any.whl", hash = "sha256:33a95faed5fc19b4bc16b29a6eeae248a3fe69dd55d4d229d2b480e23eeaad45"}, - {file = "importlib_resources-5.4.0.tar.gz", hash = "sha256:d756e2f85dd4de2ba89be0b21dba2a3bbec2e871a42a3a16719258a11f87506b"}, + {file = "importlib_resources-5.7.1-py3-none-any.whl", hash = "sha256:e447dc01619b1e951286f3929be820029d48c75eb25d265c28b92a16548212b8"}, + {file = "importlib_resources-5.7.1.tar.gz", hash = "sha256:b6062987dfc51f0fcb809187cffbd60f35df7acb4589091f154214af6d0d49d3"}, ] ipykernel = [ - {file = "ipykernel-6.8.0-py3-none-any.whl", hash = "sha256:6c977ead67ec22151993a5f848b97e57a5e771f979b510941e157b2e7fe54184"}, - {file = "ipykernel-6.8.0.tar.gz", hash = "sha256:67d316d527eca24e3ded45a2b38689615bcda1aa520a11af0accdcea7152c18a"}, + {file = "ipykernel-6.13.0-py3-none-any.whl", hash = "sha256:2b0987af43c0d4b62cecb13c592755f599f96f29aafe36c01731aaa96df30d39"}, + {file = "ipykernel-6.13.0.tar.gz", hash = "sha256:0e28273e290858393e86e152b104e5506a79c13d25b951ac6eca220051b4be60"}, ] ipython = [ - {file = "ipython-8.0.1-py3-none-any.whl", hash = "sha256:c503a0dd6ccac9c8c260b211f2dd4479c042b49636b097cc9a0d55fe62dff64c"}, - {file = "ipython-8.0.1.tar.gz", hash = "sha256:ab564d4521ea8ceaac26c3a2c6e5ddbca15c8848fd5a5cc325f960da88d42974"}, + {file = "ipython-8.3.0-py3-none-any.whl", hash = "sha256:341456643a764c28f670409bbd5d2518f9b82c013441084ff2c2fc999698f83b"}, + {file = "ipython-8.3.0.tar.gz", hash = "sha256:807ae3cf43b84693c9272f70368440a9a7eaa2e7e6882dad943c32fbf7e51402"}, ] ipython-genutils = [ {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, ] ipywidgets = [ - {file = "ipywidgets-7.6.5-py2.py3-none-any.whl", hash = "sha256:d258f582f915c62ea91023299603be095de19afb5ee271698f88327b9fe9bf43"}, - {file = "ipywidgets-7.6.5.tar.gz", hash = "sha256:00974f7cb4d5f8d494c19810fedb9fa9b64bffd3cda7c2be23c133a1ad3c99c5"}, + {file = "ipywidgets-7.7.0-py2.py3-none-any.whl", hash = "sha256:e58ff58bc94d481e91ecb6e13a5cb96a87b6b8ade135e055603d0ca24593df38"}, + {file = "ipywidgets-7.7.0.tar.gz", hash = "sha256:ab4a5596855a88b83761921c768707d65e5847068139bc1729ddfe834703542a"}, ] jedi = [ {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, ] jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] json5 = [ - {file = "json5-0.9.6-py2.py3-none-any.whl", hash = "sha256:823e510eb355949bed817e1f3e2d682455dc6af9daf6066d5698d6a2ca4481c2"}, - {file = "json5-0.9.6.tar.gz", hash = "sha256:9175ad1bc248e22bb8d95a8e8d765958bf0008fef2fe8abab5bc04e0f1ac8302"}, + {file = "json5-0.9.8.tar.gz", hash = "sha256:0fa6e4d3ef062f93ba9cf2a9103fe8e68c7917dfa33519ae3ac8c7e48e3c84ff"}, ] jsonschema = [ - {file = "jsonschema-4.4.0-py3-none-any.whl", hash = "sha256:77281a1f71684953ee8b3d488371b162419767973789272434bbc3f29d9c8823"}, - {file = "jsonschema-4.4.0.tar.gz", hash = "sha256:636694eb41b3535ed608fe04129f26542b59ed99808b4f688aa32dcf55317a83"}, + {file = "jsonschema-4.5.1-py3-none-any.whl", hash = "sha256:71b5e39324422543546572954ce71c67728922c104902cb7ce252e522235b33f"}, + {file = "jsonschema-4.5.1.tar.gz", hash = "sha256:7c6d882619340c3347a1bf7315e147e6d3dae439033ae6383d6acb908c101dfc"}, ] jupyter = [ {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, @@ -1627,115 +1568,86 @@ jupyter = [ {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, ] jupyter-client = [ - {file = "jupyter_client-7.1.2-py3-none-any.whl", hash = "sha256:d56f1c57bef42ff31e61b1185d3348a5b2bcde7c9a05523ae4dbe5ee0871797c"}, - {file = "jupyter_client-7.1.2.tar.gz", hash = "sha256:4ea61033726c8e579edb55626d8ee2e6bf0a83158ddf3751b8dd46b2c5cd1e96"}, + {file = "jupyter_client-7.3.1-py3-none-any.whl", hash = "sha256:404abe552540aff3527e66e16beb114b6b4ff58479d51a301f4eb9701e4f52ef"}, + {file = "jupyter_client-7.3.1.tar.gz", hash = "sha256:05d4ff6a0ade25138c6bb0fbeac7ddc26b5fe835e7dd816b64b4a45b931bdc0b"}, ] jupyter-console = [ - {file = "jupyter_console-6.4.0-py3-none-any.whl", hash = "sha256:7799c4ea951e0e96ba8260575423cb323ea5a03fcf5503560fa3e15748869e27"}, - {file = "jupyter_console-6.4.0.tar.gz", hash = "sha256:242248e1685039cd8bff2c2ecb7ce6c1546eb50ee3b08519729e6e881aec19c7"}, + {file = "jupyter_console-6.4.3-py3-none-any.whl", hash = "sha256:e630bcb682c0088dda45688ad7c2424d4a825c8acf494cb036ced03ed0424841"}, + {file = "jupyter_console-6.4.3.tar.gz", hash = "sha256:55f32626b0be647a85e3217ddcdb22db69efc79e8b403b9771eb9ecc696019b5"}, ] jupyter-core = [ - {file = "jupyter_core-4.9.1-py3-none-any.whl", hash = "sha256:1c091f3bbefd6f2a8782f2c1db662ca8478ac240e962ae2c66f0b87c818154ea"}, - {file = "jupyter_core-4.9.1.tar.gz", hash = "sha256:dce8a7499da5a53ae3afd5a9f4b02e5df1d57250cf48f3ad79da23b4778cd6fa"}, + {file = "jupyter_core-4.10.0-py3-none-any.whl", hash = "sha256:e7f5212177af7ab34179690140f188aa9bf3d322d8155ed972cbded19f55b6f3"}, + {file = "jupyter_core-4.10.0.tar.gz", hash = "sha256:a6de44b16b7b31d7271130c71a6792c4040f077011961138afed5e5e73181aec"}, ] jupyterlab = [ {file = "jupyterlab-2.3.2-py3-none-any.whl", hash = "sha256:2dbb5d1e5e3e0fc8c8cc1e5bec277b8892c7f98e62ee58d43bd4434fe318ab8f"}, {file = "jupyterlab-2.3.2.tar.gz", hash = "sha256:45c0d7820b15c87addcb7d8a7584c1573a23c02e331521907bc1775342df2a6d"}, ] jupyterlab-pygments = [ - {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, - {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, + {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, + {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, ] jupyterlab-server = [ {file = "jupyterlab_server-1.2.0-py3-none-any.whl", hash = "sha256:55d256077bf13e5bc9e8fbd5aac51bef82f6315111cec6b712b9a5ededbba924"}, {file = "jupyterlab_server-1.2.0.tar.gz", hash = "sha256:5431d9dde96659364b7cc877693d5d21e7b80cea7ae3959ecc2b87518e5f5d8c"}, ] jupyterlab-widgets = [ - {file = "jupyterlab_widgets-1.0.2-py3-none-any.whl", hash = "sha256:f5d9efface8ec62941173ba1cffb2edd0ecddc801c11ae2931e30b50492eb8f7"}, - {file = "jupyterlab_widgets-1.0.2.tar.gz", hash = "sha256:7885092b2b96bf189c3a705cc3c412a4472ec5e8382d0b47219a66cccae73cfa"}, + {file = "jupyterlab_widgets-1.1.0-py3-none-any.whl", hash = "sha256:c2a9bd3789f120f64d73268c066ed3b000c56bc1dda217be5cdc43e7b4ebad3f"}, + {file = "jupyterlab_widgets-1.1.0.tar.gz", hash = "sha256:d5f41bc1713795385f718d44dcba47e1e1473c6289f28a95aa6b2c0782ee372a"}, ] jupytext = [ - {file = "jupytext-1.13.6-py3-none-any.whl", hash = "sha256:2160774e30587fb427213231f0267ed070ba4ede41cf6121dbb2b14225eb83ba"}, - {file = "jupytext-1.13.6.tar.gz", hash = "sha256:c6c25918ddb6403d0d8504e08d35f6efc447baf0dbeb6a28b73adf39e866a0c4"}, + {file = "jupytext-1.13.8-py3-none-any.whl", hash = "sha256:625d2d2012763cc87d3f0dd60383516cec442c11894f53ad0c5ee5aa2a52caa2"}, + {file = "jupytext-1.13.8.tar.gz", hash = "sha256:60148537de5aa08bb9cbe8797500a49360b7a8eb6667736ae5b80e3ec7ba084d"}, ] markdown = [ - {file = "Markdown-3.3.6-py3-none-any.whl", hash = "sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3"}, - {file = "Markdown-3.3.6.tar.gz", hash = "sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006"}, + {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, + {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, ] markdown-it-py = [ - {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, - {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, ] markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] matplotlib-inline = [ {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, @@ -1745,6 +1657,10 @@ mdit-py-plugins = [ {file = "mdit-py-plugins-0.3.0.tar.gz", hash = "sha256:ecc24f51eeec6ab7eecc2f9724e8272c2fb191c2e93cf98109120c2cace69750"}, {file = "mdit_py_plugins-0.3.0-py3-none-any.whl", hash = "sha256:b1279701cee2dbf50e188d3da5f51fee8d78d038cdf99be57c6b9d1aa93b4073"}, ] +mdurl = [ + {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, + {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, +] mergedeep = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -1754,69 +1670,73 @@ mistune = [ {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, ] mkdocs = [ - {file = "mkdocs-1.2.3-py3-none-any.whl", hash = "sha256:a1fa8c2d0c1305d7fc2b9d9f607c71778572a8b110fb26642aa00296c9e6d072"}, - {file = "mkdocs-1.2.3.tar.gz", hash = "sha256:89f5a094764381cda656af4298727c9f53dc3e602983087e1fe96ea1df24f4c1"}, + {file = "mkdocs-1.3.0-py3-none-any.whl", hash = "sha256:26bd2b03d739ac57a3e6eed0b7bcc86168703b719c27b99ad6ca91dc439aacde"}, + {file = "mkdocs-1.3.0.tar.gz", hash = "sha256:b504405b04da38795fec9b2e5e28f6aa3a73bb0960cb6d5d27ead28952bd35ea"}, ] mkdocs-jupyter = [ {file = "mkdocs-jupyter-0.19.0.tar.gz", hash = "sha256:40bb752658156706adabe6140551e5efe4164256861cc72f082bdaf50139575b"}, ] mkdocs-material = [ - {file = "mkdocs-material-8.1.10.tar.gz", hash = "sha256:10970bfe2628eaa41c379e9075121b1232f4304cac9876feac8ac9d0d2e9035b"}, - {file = "mkdocs_material-8.1.10-py2.py3-none-any.whl", hash = "sha256:e47ad89b98c32a0832509a72ade2114e0c84727a573018d768f4c6de19886b2f"}, + {file = "mkdocs-material-8.2.15.tar.gz", hash = "sha256:93b57e53733051431cc83216446e774bdf08bf516a6251ff2f24974f45f98149"}, + {file = "mkdocs_material-8.2.15-py2.py3-none-any.whl", hash = "sha256:9d6c4ca1ceecc00b2e38c214665ed7605d275321dcaa22f38b9d1175edc58955"}, ] mkdocs-material-extensions = [ {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, {file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"}, ] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] nbclient = [ - {file = "nbclient-0.5.10-py3-none-any.whl", hash = "sha256:5b582e21c8b464e6676a9d60acc6871d7fbc3b080f74bef265a9f90411b31f6f"}, - {file = "nbclient-0.5.10.tar.gz", hash = "sha256:b5fdea88d6fa52ca38de6c2361401cfe7aaa7cd24c74effc5e489cec04d79088"}, + {file = "nbclient-0.6.3-py3-none-any.whl", hash = "sha256:2747ac9b385720d8a6c34f2f71e72cbe64aec6cadaadcc064a4df0b0e99c5874"}, + {file = "nbclient-0.6.3.tar.gz", hash = "sha256:b80726fc1fb89a0e8f8be1e77e28d0026b1e8ed90bc143c8a0c7622e4f8cdd9e"}, ] nbconvert = [ - {file = "nbconvert-6.4.1-py3-none-any.whl", hash = "sha256:fe93bc42485c54c5a49a2324c834aca1ff315f320a535bed3e3c4e085d3eebe3"}, - {file = "nbconvert-6.4.1.tar.gz", hash = "sha256:7dce3f977c2f9651841a3c49b5b7314c742f24dd118b99e51b8eec13c504f555"}, + {file = "nbconvert-6.5.0-py3-none-any.whl", hash = "sha256:c56dd0b8978a1811a5654f74c727ff16ca87dd5a43abd435a1c49b840fcd8360"}, + {file = "nbconvert-6.5.0.tar.gz", hash = "sha256:223e46e27abe8596b8aed54301fadbba433b7ffea8196a68fd7b1ff509eee99d"}, ] nbformat = [ - {file = "nbformat-5.1.3-py3-none-any.whl", hash = "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"}, - {file = "nbformat-5.1.3.tar.gz", hash = "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8"}, + {file = "nbformat-5.4.0-py3-none-any.whl", hash = "sha256:0d6072aaec95dddc39735c144ee8bbc6589c383fb462e4058abc855348152dad"}, + {file = "nbformat-5.4.0.tar.gz", hash = "sha256:44ba5ca6acb80c5d5a500f1e5b83ede8cbe364d5a495c4c8cf60aaf1ba656501"}, ] nest-asyncio = [ - {file = "nest_asyncio-1.5.4-py3-none-any.whl", hash = "sha256:3fdd0d6061a2bb16f21fe8a9c6a7945be83521d81a0d15cff52e9edee50101d6"}, - {file = "nest_asyncio-1.5.4.tar.gz", hash = "sha256:f969f6013a16fadb4adcf09d11a68a4f617c6049d7af7ac2c676110169a63abd"}, + {file = "nest_asyncio-1.5.5-py3-none-any.whl", hash = "sha256:b98e3ec1b246135e4642eceffa5a6c23a3ab12c82ff816a92c612d68205813b2"}, + {file = "nest_asyncio-1.5.5.tar.gz", hash = "sha256:e442291cd942698be619823a17a86a5759eabe1f8613084790de189fe9e16d65"}, ] notebook = [ - {file = "notebook-6.4.8-py3-none-any.whl", hash = "sha256:3e702fcc54b8ae597533c3864793b7a1e971dec9e112f67235828d8a798fd654"}, - {file = "notebook-6.4.8.tar.gz", hash = "sha256:1e985c9dc6f678bdfffb9dc657306b5469bfa62d73e03f74e8defbf76d284312"}, + {file = "notebook-6.4.11-py3-none-any.whl", hash = "sha256:b4a6baf2eba21ce67a0ca11a793d1781b06b8078f34d06c710742e55f3eee505"}, + {file = "notebook-6.4.11.tar.gz", hash = "sha256:709b1856a564fe53054796c80e17a67262071c86bfbdfa6b96aaa346113c555a"}, ] orjson = [ - {file = "orjson-3.6.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:e4a7cad6c63306318453980d302c7c0b74c0cc290dd1f433bbd7d31a5af90cf1"}, - {file = "orjson-3.6.6-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e533941dca4a0530a876de32e54bf2fd3269cdec3751aebde7bfb5b5eba98e74"}, - {file = "orjson-3.6.6-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:9adf63be386eaa34278967512b83ff8fc4bed036a246391ae236f68d23c47452"}, - {file = "orjson-3.6.6-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:3b636753ae34d4619b11ea7d664a2f1e87e55e9738e5123e12bcce22acae9d13"}, - {file = "orjson-3.6.6-cp310-none-win_amd64.whl", hash = "sha256:78a10295ed048fd916c6584d6d27c232eae805a43e7c14be56e3745f784f0eb6"}, - {file = "orjson-3.6.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:82b4f9fb2af7799b52932a62eac484083f930d5519560d6f64b24d66a368d03f"}, - {file = "orjson-3.6.6-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:a0033d07309cc7d8b8c4bc5d42f0dd4422b53ceb91dee9f4086bb2afa70b7772"}, - {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b321f99473116ab7c7c028377372f7b4adba4029aaca19cd567e83898f55579"}, - {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:b9c98ed94f1688cc11b5c61b8eea39d854a1a2f09f71d8a5af005461b14994ed"}, - {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:00b333a41392bd07a8603c42670547dbedf9b291485d773f90c6470eff435608"}, - {file = "orjson-3.6.6-cp37-none-win_amd64.whl", hash = "sha256:8d4fd3bdee65a81f2b79c50937d4b3c054e1e6bfa3fc72ed018a97c0c7c3d521"}, - {file = "orjson-3.6.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:954c9f8547247cd7a8c91094ff39c9fe314b5eaeaec90b7bfb7384a4108f416f"}, - {file = "orjson-3.6.6-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:74e5aed657ed0b91ef05d44d6a26d3e3e12ce4d2d71f75df41a477b05878c4a9"}, - {file = "orjson-3.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4008a5130e6e9c33abaa95e939e0e755175da10745740aa6968461b2f16830e2"}, - {file = "orjson-3.6.6-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:012761d5f3d186deb4f6238f15e9ea7c1aac6deebc8f5b741ba3b4fafe017460"}, - {file = "orjson-3.6.6-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b464546718a940b48d095a98df4c04808bfa6c8706fe751fc3f9390bc2f82643"}, - {file = "orjson-3.6.6-cp38-none-win_amd64.whl", hash = "sha256:f10a800f4e5a4aab52076d4628e9e4dab9370bdd9d8ea254ebfde846b653ab25"}, - {file = "orjson-3.6.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:8010d2610cfab721725ef14d578c7071e946bbdae63322d8f7b49061cf3fde8d"}, - {file = "orjson-3.6.6-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:8dca67a4855e1e0f9a2ea0386e8db892708522e1171dc0ddf456932288fbae63"}, - {file = "orjson-3.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af065d60523139b99bd35b839c7a2d8c5da55df8a8c4402d2eb6cdc07fa7a624"}, - {file = "orjson-3.6.6-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:fa1f389cc9f766ae0cf7ba3533d5089836b01a5ccb3f8d904297f1fcf3d9dc34"}, - {file = "orjson-3.6.6-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:ec1221ad78f94d27b162a1d35672b62ef86f27f0e4c2b65051edb480cc86b286"}, - {file = "orjson-3.6.6-cp39-none-win_amd64.whl", hash = "sha256:afed2af55eeda1de6b3f1cbc93431981b19d380fcc04f6ed86e74c1913070304"}, - {file = "orjson-3.6.6.tar.gz", hash = "sha256:55dd988400fa7fbe0e31407c683f5aaab013b5bd967167b8fe058186773c4d6c"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1830,10 +1750,6 @@ parso = [ {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, ] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] pexpect = [ {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, @@ -1842,45 +1758,39 @@ pickleshare = [ {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] -platformdirs = [ - {file = "platformdirs-2.4.1-py3-none-any.whl", hash = "sha256:1d7385c7db91728b83efd0ca99a5afb296cab9d0ed8313a45ed8ba17967ecfca"}, - {file = "platformdirs-2.4.1.tar.gz", hash = "sha256:440633ddfebcc36264232365d7840a970e75e1018d15b4327d11f91909045fda"}, -] prometheus-client = [ - {file = "prometheus_client-0.13.1-py3-none-any.whl", hash = "sha256:357a447fd2359b0a1d2e9b311a0c5778c330cfbe186d880ad5a6b39884652316"}, - {file = "prometheus_client-0.13.1.tar.gz", hash = "sha256:ada41b891b79fca5638bd5cfe149efa86512eaa55987893becd2c6d8d0a5dfc5"}, + {file = "prometheus_client-0.14.1-py3-none-any.whl", hash = "sha256:522fded625282822a89e2773452f42df14b5a8e84a86433e3f8a189c1d54dc01"}, + {file = "prometheus_client-0.14.1.tar.gz", hash = "sha256:5459c427624961076277fdc6dc50540e2bacb98eebde99886e59ec55ed92093a"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.26-py3-none-any.whl", hash = "sha256:4bcf119be2200c17ed0d518872ef922f1de336eb6d1ddbd1e089ceb6447d97c6"}, - {file = "prompt_toolkit-3.0.26.tar.gz", hash = "sha256:a51d41a6a45fd9def54365bca8f0402c8f182f2b6f7e29c74d55faeb9fb38ac4"}, + {file = "prompt_toolkit-3.0.29-py3-none-any.whl", hash = "sha256:62291dad495e665fca0bda814e342c69952086afb0f4094d0893d357e5c78752"}, + {file = "prompt_toolkit-3.0.29.tar.gz", hash = "sha256:bd640f60e8cecd74f0dc249713d433ace2ddc62b65ee07f96d358e0b152b6ea7"}, ] protobuf = [ - {file = "protobuf-3.19.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f51d5a9f137f7a2cec2d326a74b6e3fc79d635d69ffe1b036d39fc7d75430d37"}, - {file = "protobuf-3.19.4-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09297b7972da685ce269ec52af761743714996b4381c085205914c41fcab59fb"}, - {file = "protobuf-3.19.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072fbc78d705d3edc7ccac58a62c4c8e0cec856987da7df8aca86e647be4e35c"}, - {file = "protobuf-3.19.4-cp310-cp310-win32.whl", hash = "sha256:7bb03bc2873a2842e5ebb4801f5c7ff1bfbdf426f85d0172f7644fcda0671ae0"}, - {file = "protobuf-3.19.4-cp310-cp310-win_amd64.whl", hash = "sha256:f358aa33e03b7a84e0d91270a4d4d8f5df6921abe99a377828839e8ed0c04e07"}, - {file = "protobuf-3.19.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1c91ef4110fdd2c590effb5dca8fdbdcb3bf563eece99287019c4204f53d81a4"}, - {file = "protobuf-3.19.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c438268eebb8cf039552897d78f402d734a404f1360592fef55297285f7f953f"}, - {file = "protobuf-3.19.4-cp36-cp36m-win32.whl", hash = "sha256:835a9c949dc193953c319603b2961c5c8f4327957fe23d914ca80d982665e8ee"}, - {file = "protobuf-3.19.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4276cdec4447bd5015453e41bdc0c0c1234eda08420b7c9a18b8d647add51e4b"}, - {file = "protobuf-3.19.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6cbc312be5e71869d9d5ea25147cdf652a6781cf4d906497ca7690b7b9b5df13"}, - {file = "protobuf-3.19.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:54a1473077f3b616779ce31f477351a45b4fef8c9fd7892d6d87e287a38df368"}, - {file = "protobuf-3.19.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:435bb78b37fc386f9275a7035fe4fb1364484e38980d0dd91bc834a02c5ec909"}, - {file = "protobuf-3.19.4-cp37-cp37m-win32.whl", hash = "sha256:16f519de1313f1b7139ad70772e7db515b1420d208cb16c6d7858ea989fc64a9"}, - {file = "protobuf-3.19.4-cp37-cp37m-win_amd64.whl", hash = "sha256:cdc076c03381f5c1d9bb1abdcc5503d9ca8b53cf0a9d31a9f6754ec9e6c8af0f"}, - {file = "protobuf-3.19.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69da7d39e39942bd52848438462674c463e23963a1fdaa84d88df7fbd7e749b2"}, - {file = "protobuf-3.19.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:48ed3877fa43e22bcacc852ca76d4775741f9709dd9575881a373bd3e85e54b2"}, - {file = "protobuf-3.19.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd95d1dfb9c4f4563e6093a9aa19d9c186bf98fa54da5252531cc0d3a07977e7"}, - {file = "protobuf-3.19.4-cp38-cp38-win32.whl", hash = "sha256:b38057450a0c566cbd04890a40edf916db890f2818e8682221611d78dc32ae26"}, - {file = "protobuf-3.19.4-cp38-cp38-win_amd64.whl", hash = "sha256:7ca7da9c339ca8890d66958f5462beabd611eca6c958691a8fe6eccbd1eb0c6e"}, - {file = "protobuf-3.19.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:36cecbabbda242915529b8ff364f2263cd4de7c46bbe361418b5ed859677ba58"}, - {file = "protobuf-3.19.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c1068287025f8ea025103e37d62ffd63fec8e9e636246b89c341aeda8a67c934"}, - {file = "protobuf-3.19.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96bd766831596d6014ca88d86dc8fe0fb2e428c0b02432fd9db3943202bf8c5e"}, - {file = "protobuf-3.19.4-cp39-cp39-win32.whl", hash = "sha256:84123274d982b9e248a143dadd1b9815049f4477dc783bf84efe6250eb4b836a"}, - {file = "protobuf-3.19.4-cp39-cp39-win_amd64.whl", hash = "sha256:3112b58aac3bac9c8be2b60a9daf6b558ca3f7681c130dcdd788ade7c9ffbdca"}, - {file = "protobuf-3.19.4-py2.py3-none-any.whl", hash = "sha256:8961c3a78ebfcd000920c9060a262f082f29838682b1f7201889300c1fbe0616"}, - {file = "protobuf-3.19.4.tar.gz", hash = "sha256:9df0c10adf3e83015ced42a9a7bd64e13d06c4cf45c340d2c63020ea04499d0a"}, + {file = "protobuf-3.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996"}, + {file = "protobuf-3.20.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3"}, + {file = "protobuf-3.20.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde"}, + {file = "protobuf-3.20.1-cp310-cp310-win32.whl", hash = "sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c"}, + {file = "protobuf-3.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7"}, + {file = "protobuf-3.20.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153"}, + {file = "protobuf-3.20.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f"}, + {file = "protobuf-3.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20"}, + {file = "protobuf-3.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531"}, + {file = "protobuf-3.20.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e"}, + {file = "protobuf-3.20.1-cp37-cp37m-win32.whl", hash = "sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c"}, + {file = "protobuf-3.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067"}, + {file = "protobuf-3.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf"}, + {file = "protobuf-3.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab"}, + {file = "protobuf-3.20.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c"}, + {file = "protobuf-3.20.1-cp38-cp38-win32.whl", hash = "sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7"}, + {file = "protobuf-3.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739"}, + {file = "protobuf-3.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7"}, + {file = "protobuf-3.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f"}, + {file = "protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9"}, + {file = "protobuf-3.20.1-cp39-cp39-win32.whl", hash = "sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8"}, + {file = "protobuf-3.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91"}, + {file = "protobuf-3.20.1-py2.py3-none-any.whl", hash = "sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388"}, + {file = "protobuf-3.20.1.tar.gz", hash = "sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9"}, ] psutil = [ {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, @@ -1933,16 +1843,16 @@ pycparser = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, ] pymdown-extensions = [ - {file = "pymdown-extensions-9.1.tar.gz", hash = "sha256:74247f2c80f1d9e3c7242abe1c16317da36c6f26c7ad4b8a7f457f0ec20f0365"}, - {file = "pymdown_extensions-9.1-py3-none-any.whl", hash = "sha256:b03e66f91f33af4a6e7a0e20c740313522995f69a03d86316b1449766c473d0e"}, + {file = "pymdown_extensions-9.4-py3-none-any.whl", hash = "sha256:5b7432456bf555ce2b0ab3c2439401084cda8110f24f6b3ecef952b8313dfa1b"}, + {file = "pymdown_extensions-9.4.tar.gz", hash = "sha256:1baa22a60550f731630474cad28feb0405c8101f1a7ddc3ec0ed86ee510bcc43"}, ] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pyrsistent = [ {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, @@ -1977,25 +1887,27 @@ python-dateutil = [ {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] pywin32 = [ - {file = "pywin32-303-cp310-cp310-win32.whl", hash = "sha256:6fed4af057039f309263fd3285d7b8042d41507343cd5fa781d98fcc5b90e8bb"}, - {file = "pywin32-303-cp310-cp310-win_amd64.whl", hash = "sha256:51cb52c5ec6709f96c3f26e7795b0bf169ee0d8395b2c1d7eb2c029a5008ed51"}, - {file = "pywin32-303-cp311-cp311-win32.whl", hash = "sha256:d9b5d87ca944eb3aa4cd45516203ead4b37ab06b8b777c54aedc35975dec0dee"}, - {file = "pywin32-303-cp311-cp311-win_amd64.whl", hash = "sha256:fcf44032f5b14fcda86028cdf49b6ebdaea091230eb0a757282aa656e4732439"}, - {file = "pywin32-303-cp36-cp36m-win32.whl", hash = "sha256:aad484d52ec58008ca36bd4ad14a71d7dd0a99db1a4ca71072213f63bf49c7d9"}, - {file = "pywin32-303-cp36-cp36m-win_amd64.whl", hash = "sha256:2a09632916b6bb231ba49983fe989f2f625cea237219530e81a69239cd0c4559"}, - {file = "pywin32-303-cp37-cp37m-win32.whl", hash = "sha256:b1675d82bcf6dbc96363fca747bac8bff6f6e4a447a4287ac652aa4b9adc796e"}, - {file = "pywin32-303-cp37-cp37m-win_amd64.whl", hash = "sha256:c268040769b48a13367221fced6d4232ed52f044ffafeda247bd9d2c6bdc29ca"}, - {file = "pywin32-303-cp38-cp38-win32.whl", hash = "sha256:5f9ec054f5a46a0f4dfd72af2ce1372f3d5a6e4052af20b858aa7df2df7d355b"}, - {file = "pywin32-303-cp38-cp38-win_amd64.whl", hash = "sha256:793bf74fce164bcffd9d57bb13c2c15d56e43c9542a7b9687b4fccf8f8a41aba"}, - {file = "pywin32-303-cp39-cp39-win32.whl", hash = "sha256:7d3271c98434617a11921c5ccf74615794d97b079e22ed7773790822735cc352"}, - {file = "pywin32-303-cp39-cp39-win_amd64.whl", hash = "sha256:79cbb862c11b9af19bcb682891c1b91942ec2ff7de8151e2aea2e175899cda34"}, + {file = "pywin32-304-cp310-cp310-win32.whl", hash = "sha256:3c7bacf5e24298c86314f03fa20e16558a4e4138fc34615d7de4070c23e65af3"}, + {file = "pywin32-304-cp310-cp310-win_amd64.whl", hash = "sha256:4f32145913a2447736dad62495199a8e280a77a0ca662daa2332acf849f0be48"}, + {file = "pywin32-304-cp310-cp310-win_arm64.whl", hash = "sha256:d3ee45adff48e0551d1aa60d2ec066fec006083b791f5c3527c40cd8aefac71f"}, + {file = "pywin32-304-cp311-cp311-win32.whl", hash = "sha256:30c53d6ce44c12a316a06c153ea74152d3b1342610f1b99d40ba2795e5af0269"}, + {file = "pywin32-304-cp311-cp311-win_amd64.whl", hash = "sha256:7ffa0c0fa4ae4077e8b8aa73800540ef8c24530057768c3ac57c609f99a14fd4"}, + {file = "pywin32-304-cp311-cp311-win_arm64.whl", hash = "sha256:cbbe34dad39bdbaa2889a424d28752f1b4971939b14b1bb48cbf0182a3bcfc43"}, + {file = "pywin32-304-cp36-cp36m-win32.whl", hash = "sha256:be253e7b14bc601718f014d2832e4c18a5b023cbe72db826da63df76b77507a1"}, + {file = "pywin32-304-cp36-cp36m-win_amd64.whl", hash = "sha256:de9827c23321dcf43d2f288f09f3b6d772fee11e809015bdae9e69fe13213988"}, + {file = "pywin32-304-cp37-cp37m-win32.whl", hash = "sha256:f64c0377cf01b61bd5e76c25e1480ca8ab3b73f0c4add50538d332afdf8f69c5"}, + {file = "pywin32-304-cp37-cp37m-win_amd64.whl", hash = "sha256:bb2ea2aa81e96eee6a6b79d87e1d1648d3f8b87f9a64499e0b92b30d141e76df"}, + {file = "pywin32-304-cp38-cp38-win32.whl", hash = "sha256:94037b5259701988954931333aafd39cf897e990852115656b014ce72e052e96"}, + {file = "pywin32-304-cp38-cp38-win_amd64.whl", hash = "sha256:ead865a2e179b30fb717831f73cf4373401fc62fbc3455a0889a7ddac848f83e"}, + {file = "pywin32-304-cp39-cp39-win32.whl", hash = "sha256:25746d841201fd9f96b648a248f731c1dec851c9a08b8e33da8b56148e4c65cc"}, + {file = "pywin32-304-cp39-cp39-win_amd64.whl", hash = "sha256:d24a3382f013b21aa24a5cfbfad5a2cd9926610c0affde3e8ab5b3d7dbcf4ac9"}, ] pywinpty = [ - {file = "pywinpty-2.0.2-cp310-none-win_amd64.whl", hash = "sha256:4b421379b407bf2f52a64a4c58f61deffe623b5add02d871acb290b771bb6227"}, - {file = "pywinpty-2.0.2-cp37-none-win_amd64.whl", hash = "sha256:238b75fc456a6bc558761a89c9e6b3c8f2f54d79db03ae28997a68313c24b2ca"}, - {file = "pywinpty-2.0.2-cp38-none-win_amd64.whl", hash = "sha256:344858a0b956fdc64a547d5e1980b0257b47f5433ed7cb89bf7b6268cb280c6c"}, - {file = "pywinpty-2.0.2-cp39-none-win_amd64.whl", hash = "sha256:a4a066eaf2e30944d3028d946883ceb7883a499b53c4b89ca2d54bd7a4210550"}, - {file = "pywinpty-2.0.2.tar.gz", hash = "sha256:20ec117183f79642eff555ce0dd1823f942618d65813fb6122d14b6e34b5d05a"}, + {file = "pywinpty-2.0.5-cp310-none-win_amd64.whl", hash = "sha256:f86c76e2881c37e69678cbbf178109f8da1fa8584db24d58e1b9369b0276cfcb"}, + {file = "pywinpty-2.0.5-cp37-none-win_amd64.whl", hash = "sha256:ff9b52f182650cfdf3db1b264a6fe0963eb9d996a7a1fa843ac406c1e32111f8"}, + {file = "pywinpty-2.0.5-cp38-none-win_amd64.whl", hash = "sha256:651ee1467bd7eb6f64d44dbc954b7ab7d15ab6d8adacc4e13299692c67c5d5d2"}, + {file = "pywinpty-2.0.5-cp39-none-win_amd64.whl", hash = "sha256:e59a508ae78374febada3e53b5bbc90b5ad07ae68cbfd72a2e965f9793ae04f3"}, + {file = "pywinpty-2.0.5.tar.gz", hash = "sha256:e125d3f1804d8804952b13e33604ad2ca8b9b2cac92b27b521c005d1604794f8"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, @@ -2086,12 +1998,12 @@ pyzmq = [ {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"}, ] qtconsole = [ - {file = "qtconsole-5.2.2-py3-none-any.whl", hash = "sha256:4aa6a3e600e0c8cf16853f2378311bc2371f57cb0f22ecfc28994f4cf409ee2e"}, - {file = "qtconsole-5.2.2.tar.gz", hash = "sha256:8f9db97b27782184efd0a0f2d57ea3bd852d053747a2e442a9011329c082976d"}, + {file = "qtconsole-5.3.0-py3-none-any.whl", hash = "sha256:75f2ded876444454edcb5a53262149e33b53db3a4a53116b7c3df52830905b0f"}, + {file = "qtconsole-5.3.0.tar.gz", hash = "sha256:8e3520fdc75e46abc4cc6cffeca16fa2652754109b8ae839fa28e27d1eba5625"}, ] qtpy = [ - {file = "QtPy-2.0.1-py3-none-any.whl", hash = "sha256:d93f2c98e97387fcc9d623d509772af5b6c15ab9d8f9f4c5dfbad9a73ad34812"}, - {file = "QtPy-2.0.1.tar.gz", hash = "sha256:adfd073ffbd2de81dc7aaa0b983499ef5c59c96adcfdcc9dea60d42ca885eb8f"}, + {file = "QtPy-2.1.0-py3-none-any.whl", hash = "sha256:aee0586081f943029312becece9f63977b0a9e3788f77a6ac8cc74802bb173d6"}, + {file = "QtPy-2.1.0.tar.gz", hash = "sha256:ca8cd4217175186344299ee4c0f7e7adcf362c70852ba35b255a534077025c06"}, ] requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, @@ -2106,32 +2018,28 @@ six = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] soupsieve = [ - {file = "soupsieve-2.3.1-py3-none-any.whl", hash = "sha256:1a3cca2617c6b38c0343ed661b1fa5de5637f257d4fe22bd9f1338010a1efefb"}, - {file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"}, + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, ] stack-data = [ - {file = "stack_data-0.1.4-py3-none-any.whl", hash = "sha256:02cc0683cbc445ae4ca8c4e3a0e58cb1df59f252efb0aa016b34804a707cf9bc"}, - {file = "stack_data-0.1.4.tar.gz", hash = "sha256:7769ed2482ce0030e00175dd1bf4ef1e873603b6ab61cd3da443b410e64e9477"}, + {file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"}, + {file = "stack_data-0.2.0.tar.gz", hash = "sha256:45692d41bd633a9503a5195552df22b583caf16f0b27c4e58c98d88c8b648e12"}, ] stringcase = [ {file = "stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008"}, ] terminado = [ - {file = "terminado-0.13.1-py3-none-any.whl", hash = "sha256:f446b522b50a7aa68b5def0a02893978fb48cb82298b0ebdae13003c6ee6f198"}, - {file = "terminado-0.13.1.tar.gz", hash = "sha256:5b82b5c6e991f0705a76f961f43262a7fb1e55b093c16dca83f16384a7f39b7b"}, + {file = "terminado-0.15.0-py3-none-any.whl", hash = "sha256:0d5f126fbfdb5887b25ae7d9d07b0d716b1cc0ccaacc71c1f3c14d228e065197"}, + {file = "terminado-0.15.0.tar.gz", hash = "sha256:ab4eeedccfcc1e6134bfee86106af90852c69d602884ea3a1e8ca6d4486e9bfe"}, ] -testpath = [ - {file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"}, - {file = "testpath-0.5.0.tar.gz", hash = "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417"}, +tinycss2 = [ + {file = "tinycss2-1.1.1-py3-none-any.whl", hash = "sha256:fe794ceaadfe3cf3e686b22155d0da5780dd0e273471a51846d0a02bc204fec8"}, + {file = "tinycss2-1.1.1.tar.gz", hash = "sha256:b2e44dd8883c360c35dd0d1b5aad0b610e5156c2cb3b33434634e539ead9d8bf"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -tomli = [ - {file = "tomli-2.0.0-py3-none-any.whl", hash = "sha256:b5bde28da1fed24b9bd1d4d2b8cba62300bfb4ec9a6187a957e8ddb9434c5224"}, - {file = "tomli-2.0.0.tar.gz", hash = "sha256:c292c34f58502a1eb2bbb9f5bbc9a5ebc37bee10ffb8c2d6bbdfa8eb13cc14e1"}, -] tornado = [ {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, @@ -2176,45 +2084,43 @@ tornado = [ {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, ] traitlets = [ - {file = "traitlets-5.1.1-py3-none-any.whl", hash = "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"}, - {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"}, -] -typing-extensions = [ - {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"}, - {file = "typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e"}, + {file = "traitlets-5.2.1.post0-py3-none-any.whl", hash = "sha256:f44b708d33d98b0addb40c29d148a761f44af740603a8fd0e2f8b5b27cf0f087"}, + {file = "traitlets-5.2.1.post0.tar.gz", hash = "sha256:70815ecb20ec619d1af28910ade523383be13754283aef90528eb3d47b77c5db"}, ] urllib3 = [ - {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, - {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] waitress = [ - {file = "waitress-2.0.0-py3-none-any.whl", hash = "sha256:29af5a53e9fb4e158f525367678b50053808ca6c21ba585754c77d790008c746"}, - {file = "waitress-2.0.0.tar.gz", hash = "sha256:69e1f242c7f80273490d3403c3976f3ac3b26e289856936d1f620ed48f321897"}, + {file = "waitress-2.1.1-py3-none-any.whl", hash = "sha256:c549f5b2b4afd44d9d97d7cec79f3ef581e25d832827f415dc175327af674aa8"}, + {file = "waitress-2.1.1.tar.gz", hash = "sha256:e2e60576cf14a1539da79f7b7ee1e79a71e64f366a0b47db54a15e971f57bb16"}, ] watchdog = [ - {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, - {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b"}, - {file = "watchdog-2.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542"}, - {file = "watchdog-2.1.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669"}, - {file = "watchdog-2.1.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660"}, - {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3"}, - {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04"}, - {file = "watchdog-2.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b"}, - {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604"}, - {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6"}, - {file = "watchdog-2.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9"}, - {file = "watchdog-2.1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_armv7l.whl", hash = "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_i686.whl", hash = "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_s390x.whl", hash = "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15"}, - {file = "watchdog-2.1.6-py3-none-win32.whl", hash = "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d"}, - {file = "watchdog-2.1.6-py3-none-win_amd64.whl", hash = "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5"}, - {file = "watchdog-2.1.6-py3-none-win_ia64.whl", hash = "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923"}, - {file = "watchdog-2.1.6.tar.gz", hash = "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7"}, + {file = "watchdog-2.1.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:676263bee67b165f16b05abc52acc7a94feac5b5ab2449b491f1a97638a79277"}, + {file = "watchdog-2.1.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aa68d2d9a89d686fae99d28a6edf3b18595e78f5adf4f5c18fbfda549ac0f20c"}, + {file = "watchdog-2.1.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e2e51c53666850c3ecffe9d265fc5d7351db644de17b15e9c685dd3cdcd6f97"}, + {file = "watchdog-2.1.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7721ac736170b191c50806f43357407138c6748e4eb3e69b071397f7f7aaeedd"}, + {file = "watchdog-2.1.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ce7376aed3da5fd777483fe5ebc8475a440c6d18f23998024f832134b2938e7b"}, + {file = "watchdog-2.1.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f9ee4c6bf3a1b2ed6be90a2d78f3f4bbd8105b6390c04a86eb48ed67bbfa0b0b"}, + {file = "watchdog-2.1.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:68dbe75e0fa1ba4d73ab3f8e67b21770fbed0651d32ce515cd38919a26873266"}, + {file = "watchdog-2.1.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0c520009b8cce79099237d810aaa19bc920941c268578436b62013b2f0102320"}, + {file = "watchdog-2.1.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efcc8cbc1b43902571b3dce7ef53003f5b97fe4f275fe0489565fc6e2ebe3314"}, + {file = "watchdog-2.1.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:746e4c197ec1083581bb1f64d07d1136accf03437badb5ff8fcb862565c193b2"}, + {file = "watchdog-2.1.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ae17b6be788fb8e4d8753d8d599de948f0275a232416e16436363c682c6f850"}, + {file = "watchdog-2.1.8-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ddde157dc1447d8130cb5b8df102fad845916fe4335e3d3c3f44c16565becbb7"}, + {file = "watchdog-2.1.8-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4978db33fc0934c92013ee163a9db158ec216099b69fce5aec790aba704da412"}, + {file = "watchdog-2.1.8-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b962de4d7d92ff78fb2dbc6a0cb292a679dea879a0eb5568911484d56545b153"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1e5d0fdfaa265c29dc12621913a76ae99656cf7587d03950dfeb3595e5a26102"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_armv7l.whl", hash = "sha256:036ed15f7cd656351bf4e17244447be0a09a61aaa92014332d50719fc5973bc0"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_i686.whl", hash = "sha256:2962628a8777650703e8f6f2593065884c602df7bae95759b2df267bd89b2ef5"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_ppc64.whl", hash = "sha256:156ec3a94695ea68cfb83454b98754af6e276031ba1ae7ae724dc6bf8973b92a"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:47598fe6713fc1fee86b1ca85c9cbe77e9b72d002d6adeab9c3b608f8a5ead10"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_s390x.whl", hash = "sha256:fed4de6e45a4f16e4046ea00917b4fe1700b97244e5d114f594b4a1b9de6bed8"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:24dedcc3ce75e150f2a1d704661f6879764461a481ba15a57dc80543de46021c"}, + {file = "watchdog-2.1.8-py3-none-win32.whl", hash = "sha256:6ddf67bc9f413791072e3afb466e46cc72c6799ba73dea18439b412e8f2e3257"}, + {file = "watchdog-2.1.8-py3-none-win_amd64.whl", hash = "sha256:88ef3e8640ef0a64b7ad7394b0f23384f58ac19dd759da7eaa9bc04b2898943f"}, + {file = "watchdog-2.1.8-py3-none-win_ia64.whl", hash = "sha256:0fb60c7d31474b21acba54079ce9ff0136411183e9a591369417cddb1d7d00d7"}, + {file = "watchdog-2.1.8.tar.gz", hash = "sha256:6d03149126864abd32715d4e9267d2754cede25a69052901399356ad3bc5ecff"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -2233,10 +2139,10 @@ webtest = [ {file = "WebTest-2.0.35.tar.gz", hash = "sha256:aac168b5b2b4f200af4e35867cf316712210e3d5db81c1cbdff38722647bb087"}, ] widgetsnbextension = [ - {file = "widgetsnbextension-3.5.2-py2.py3-none-any.whl", hash = "sha256:763a9fdc836d141fa080005a886d63f66f73d56dba1fb5961afc239c77708569"}, - {file = "widgetsnbextension-3.5.2.tar.gz", hash = "sha256:e0731a60ba540cd19bbbefe771a9076dcd2dde90713a8f87f27f53f2d1db7727"}, + {file = "widgetsnbextension-3.6.0-py2.py3-none-any.whl", hash = "sha256:4fd321cad39fdcf8a8e248a657202d42917ada8e8ed5dd3f60f073e0d54ceabd"}, + {file = "widgetsnbextension-3.6.0.tar.gz", hash = "sha256:e84a7a9fcb9baf3d57106e184a7389a8f8eb935bf741a5eb9d60aa18cc029a80"}, ] zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, ] diff --git a/src/requirements-dev.txt b/src/requirements-dev.txt index 8c02a89..ca11720 100644 --- a/src/requirements-dev.txt +++ b/src/requirements-dev.txt @@ -2,113 +2,109 @@ anki==2.1.49; python_version >= "3.8" -appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.8" and sys_platform == "darwin" -argon2-cffi-bindings==21.2.0; python_version >= "3.6" -argon2-cffi==21.3.0; python_version >= "3.6" +appnope==0.1.3; platform_system == "Darwin" and python_version >= "3.8" and sys_platform == "darwin" +argon2-cffi-bindings==21.2.0; python_version >= "3.7" +argon2-cffi==21.3.0; python_version >= "3.7" asttokens==2.0.5; python_version >= "3.8" attrs==21.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" backcall==0.2.0; python_version >= "3.8" -beautifulsoup4==4.10.0; python_full_version > "3.0.0" -black==22.1.0; python_full_version >= "3.6.2" and python_version >= "3.8" -bleach==4.1.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +beautifulsoup4==4.11.1; python_full_version >= "3.6.0" +bleach==5.0.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -cffi==1.15.0; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.6.1" -charset-normalizer==2.0.11; python_full_version >= "3.6.0" and python_version >= "3.8" -click==8.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" +cffi==1.15.0; implementation_name == "pypy" and python_version >= "3.7" +charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.8" +click==8.1.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" colorama==0.4.4; python_version >= "3.8" and python_full_version < "3.0.0" and platform_system == "Windows" and sys_platform == "win32" or platform_system == "Windows" and python_version >= "3.8" and python_full_version >= "3.5.0" and sys_platform == "win32" -debugpy==1.5.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" +debugpy==1.6.0; python_version >= "3.7" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") defusedxml==0.7.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -distro==1.6.0 +distro==1.7.0; python_version >= "3.6" entrypoints==0.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -executing==0.8.2; python_version >= "3.8" -ghp-import==2.0.2; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" +executing==0.8.3; python_version >= "3.8" +fastjsonschema==2.15.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +ghp-import==2.1.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -importlib-metadata==4.10.1; python_version < "3.10" and python_version >= "3.8" and python_full_version >= "3.7.1" -importlib-resources==5.4.0; python_version < "3.9" and python_version >= "3.7" and python_full_version >= "3.7.1" -ipykernel==6.8.0; python_version >= "3.7" -ipython-genutils==0.2.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -ipython==8.0.1; python_version >= "3.8" -ipywidgets==7.6.5 +importlib-metadata==4.11.3; python_version < "3.10" and python_version >= "3.8" and python_full_version >= "3.7.1" +importlib-resources==5.7.1; python_version < "3.9" and python_version >= "3.7" and python_full_version >= "3.7.1" +ipykernel==6.13.0; python_version >= "3.7" +ipython-genutils==0.2.0; python_version >= "3.7" +ipython==8.3.0; python_version >= "3.8" +ipywidgets==7.7.0 jedi==0.18.1; python_version >= "3.8" -jinja2==3.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -json5==0.9.6; python_version >= "3.5" -jsonschema==4.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -jupyter-client==7.1.2; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4" -jupyter-console==6.4.0; python_version >= "3.6" -jupyter-core==4.9.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +jinja2==3.1.2; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +json5==0.9.8; python_version >= "3.5" +jsonschema==4.5.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +jupyter-client==7.3.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +jupyter-console==6.4.3; python_version >= "3.6" +jupyter-core==4.10.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" jupyter==1.0.0 -jupyterlab-pygments==0.1.2; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +jupyterlab-pygments==0.2.2; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" jupyterlab-server==1.2.0; python_version >= "3.5" -jupyterlab-widgets==1.0.2; python_version >= "3.6" +jupyterlab-widgets==1.1.0; python_version >= "3.6" jupyterlab==2.3.2; python_version >= "3.5" -jupytext==1.13.6; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" -markdown-it-py==1.1.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" -markdown==3.3.6; python_version >= "3.6" -markupsafe==2.0.1; python_version >= "3.6" +jupytext==1.13.8; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" +markdown-it-py==2.1.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.1" +markdown==3.3.7; python_version >= "3.6" +markupsafe==2.1.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" matplotlib-inline==0.1.3; python_version >= "3.8" mdit-py-plugins==0.3.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" +mdurl==0.1.1; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.1" mergedeep==1.3.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" mistune==0.8.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" mkdocs-jupyter==0.19.0; python_full_version >= "3.7.1" and python_version < "4" -mkdocs-material-extensions==1.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" -mkdocs-material==8.1.10; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" -mkdocs==1.2.3; python_version >= "3.6" -mypy-extensions==0.4.3; python_full_version >= "3.6.2" and python_version >= "3.8" -nbclient==0.5.10; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -nbconvert==6.4.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -nbformat==5.1.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -nest-asyncio==1.5.4; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4" -notebook==6.4.8; python_version >= "3.6" -orjson==3.6.6; platform_machine == "x86_64" and python_version >= "3.8" +mkdocs-material-extensions==1.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +mkdocs-material==8.2.15; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +mkdocs==1.3.0; python_version >= "3.6" +nbclient==0.6.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +nbconvert==6.5.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +nbformat==5.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +nest-asyncio==1.5.5; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +notebook==6.4.11; python_version >= "3.7" +orjson==3.6.8; platform_machine == "x86_64" and python_version >= "3.8" packaging==21.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" pandocfilters==1.5.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" parso==0.8.3; python_version >= "3.8" -pathspec==0.9.0; python_full_version >= "3.6.2" and python_version >= "3.8" pexpect==4.8.0; sys_platform != "win32" and python_version >= "3.8" pickleshare==0.7.5; python_version >= "3.8" -platformdirs==2.4.1; python_full_version >= "3.6.2" and python_version >= "3.8" -prometheus-client==0.13.1; python_version >= "3.6" -prompt-toolkit==3.0.26; python_full_version >= "3.6.2" and python_version >= "3.8" -protobuf==3.19.4; python_version >= "3.8" +prometheus-client==0.14.1; python_version >= "3.7" +prompt-toolkit==3.0.29; python_full_version >= "3.6.2" and python_version >= "3.8" +protobuf==3.20.1; python_version >= "3.8" psutil==5.9.0; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") ptyprocess==0.7.0; os_name != "nt" and python_version >= "3.8" and sys_platform != "win32" pure-eval==0.2.2; python_version >= "3.8" -py==1.11.0; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.6.1" -pycparser==2.21; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.6.1" -pygments==2.11.2; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" -pymdown-extensions==9.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" -pyparsing==3.0.7; python_version >= "3.6" +py==1.11.0; python_version >= "3.7" and python_full_version < "3.0.0" and implementation_name == "pypy" or implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.5.0" +pycparser==2.21; python_version >= "3.7" and python_full_version < "3.0.0" and implementation_name == "pypy" or implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.4.0" +pygments==2.12.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" +pymdown-extensions==9.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +pyparsing==3.0.9; python_full_version >= "3.6.8" and python_version >= "3.6" pyrsistent==0.18.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" pysocks==1.7.1; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -python-dateutil==2.8.2; python_full_version >= "3.6.1" and python_version >= "3.7" -pywin32==303; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -pywinpty==2.0.2; os_name == "nt" and python_version >= "3.7" +python-dateutil==2.8.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7" +pywin32==304; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +pywinpty==2.0.5; os_name == "nt" and python_version >= "3.7" pyyaml-env-tag==0.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" pyyaml==6.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" -pyzmq==22.3.0; python_full_version >= "3.6.1" and python_version >= "3.7" -qtconsole==5.2.2; python_version >= "3.6" -qtpy==2.0.1; python_version >= "3.6" +pyzmq==22.3.0; python_version >= "3.7" +qtconsole==5.3.0; python_version >= "3.7" +qtpy==2.1.0; python_version >= "3.7" requests==2.27.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0") send2trash==1.8.0 six==1.16.0; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4" and (python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.8") -soupsieve==2.3.1; python_full_version > "3.0.0" and python_version >= "3.8" -stack-data==0.1.4; python_version >= "3.8" +soupsieve==2.3.2.post1; python_full_version >= "3.6.0" and python_version >= "3.8" +stack-data==0.2.0; python_version >= "3.8" stringcase==1.2.0; python_version >= "3.8" -terminado==0.13.1; python_version >= "3.7" -testpath==0.5.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +terminado==0.15.0; python_version >= "3.7" +tinycss2==1.1.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" toml==0.10.2; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" -tomli==2.0.0; python_full_version >= "3.6.2" and python_version >= "3.8" -tornado==6.1; python_full_version >= "3.6.1" and python_version >= "3.7" -traitlets==5.1.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" -typing-extensions==4.0.1; python_full_version >= "3.6.2" and python_version >= "3.8" and python_version < "3.10" -urllib3==1.26.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" -waitress==2.0.0; python_full_version >= "3.6.0" -watchdog==2.1.6; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" +tornado==6.1; python_version >= "3.7" +traitlets==5.2.1.post0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" +urllib3==1.26.9; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" +waitress==2.1.1; python_full_version >= "3.7.0" +watchdog==2.1.8; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" wcwidth==0.2.5; python_full_version >= "3.6.2" and python_version >= "3.8" webencodings==0.5.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" webob==1.8.7; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") webtest==2.0.35 -widgetsnbextension==3.5.2 -zipp==3.7.0; python_version < "3.9" and python_version >= "3.8" and python_full_version >= "3.7.1" +widgetsnbextension==3.6.0 +zipp==3.8.0; python_version < "3.9" and python_version >= "3.8" and python_full_version >= "3.7.1" -e src/. diff --git a/src/requirements.txt b/src/requirements.txt index adf5fa5..5d04624 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,23 +1,23 @@ # THE FILE WAS GENERATED BY POETRY, DO NOT EDIT! -anki==2.1.40; python_version >= "3.8" -beautifulsoup4==4.9.3 -certifi==2020.12.5; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" -chardet==4.0.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.8" +anki==2.1.49; python_version >= "3.8" +beautifulsoup4==4.11.1; python_full_version >= "3.6.0" +certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" +charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.8" decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") -distro==1.6.0 +distro==1.7.0; python_version >= "3.6" idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -importlib-metadata==4.10.1; python_version < "3.10" and python_version >= "3.8" -markdown==3.3.6; python_version >= "3.6" -orjson==3.6.6; platform_machine == "x86_64" and python_version >= "3.8" -protobuf==3.19.4; python_version >= "3.8" +importlib-metadata==4.11.3; python_version < "3.10" and python_version >= "3.8" +markdown==3.3.7; python_version >= "3.6" +orjson==3.6.8; platform_machine == "x86_64" and python_version >= "3.8" +protobuf==3.20.1; python_version >= "3.8" psutil==5.9.0; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") pysocks==1.7.1; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" requests==2.27.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0") send2trash==1.8.0 -soupsieve==2.3.1; python_full_version > "3.0.0" and python_version >= "3.8" +soupsieve==2.3.2.post1; python_full_version >= "3.6.0" and python_version >= "3.8" stringcase==1.2.0; python_version >= "3.8" -urllib3==1.26.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" +urllib3==1.26.9; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" webob==1.8.7; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") -zipp==3.7.0; python_version < "3.10" and python_version >= "3.8" +zipp==3.8.0; python_version < "3.10" and python_version >= "3.8" From 48005abc59b3101b13dc424bb8b730d54977d180 Mon Sep 17 00:00:00 2001 From: Cycatz Date: Thu, 2 Jun 2022 12:02:48 +0800 Subject: [PATCH 54/59] Fix addon-folder doc link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa713b5..a4d22be 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,7 @@ and put it in `~/Anki/addons`. anki.sync.SYNC_BASE = addr anki.sync.SYNC_MEDIA_BASE = addr + "msync/" -[addons21]: https://addon-docs.ankiweb.net/#/getting-started?id=add-on-folders +[addons21]: https://addon-docs.ankiweb.net/addon-folders.html ### AnkiDroid From e54b8a8b42ab27391ec7cfb1d8c98e5f7a7ff488 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sat, 2 Jul 2022 13:44:35 +0100 Subject: [PATCH 55/59] chore: Include all packages in src folder --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fbb703e..d976ee7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "2.3.0" description = "Self-hosted Anki Sync Server." authors = ["Vikash Kothary "] packages = [ - { include = "ankisyncd", from = "src" } + { include = "*", from = "src" } ] [tool.poetry.dependencies] From f1c0e1bf6338dd5353786286c0bc716ef5a6c37c Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sat, 2 Jul 2022 13:44:55 +0100 Subject: [PATCH 56/59] chore: Add poetry publish environment variables and command --- Makefile | 8 ++++++++ config/.env.example | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/Makefile b/Makefile index 7f23ae7..f2fed91 100755 --- a/Makefile +++ b/Makefile @@ -40,9 +40,17 @@ config/.env.%: init: @${POETRY} install +.PHONY: build +build: + @${POETRY} build + .PHONY: release #: Create new Git release and tags. release: release-branch release-tags +.PHONY: publish +publish: build + @${POETRY} publish + .PHONY: open open: @${OPEN} ${ANKISYNCD_URL} \ No newline at end of file diff --git a/config/.env.example b/config/.env.example index 6098cf5..d0e26f8 100644 --- a/config/.env.example +++ b/config/.env.example @@ -25,6 +25,11 @@ MKDOCS_CMD=serve ### JUPYTER_CMD ### JUPYTER_NOTEBOOK_DIR +## Poetry +### POETRY_PYPI_TOKEN_PYPI= +### POETRY_HTTP_BASIC_PYPI_USERNAME= +### POETRY_HTTP_BASIC_PYPI_PASSWORD= + ## Make AWK=awk BASH=bash From fcaec5299566e416f3785038a967c7794b1b4005 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sat, 2 Jul 2022 14:13:37 +0100 Subject: [PATCH 57/59] chore: Add setup.py for backward compatibility --- src/setup.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/setup.py diff --git a/src/setup.py b/src/setup.py new file mode 100644 index 0000000..e6ec018 --- /dev/null +++ b/src/setup.py @@ -0,0 +1,12 @@ +from setuptools import setup, find_packages + +# TODO: Generate from or parse values from pyproject.toml. +setup( + name="anki-sync-server", + version="2.3.0", + description="Self-hosted Anki Sync Server.", + author="Anki Community", + author_email="kothary.vikash+ankicommunity@gmail.com", + packages=find_packages(), + url='https://ankicommunity.github.io/' +) From 872ea80c32449d90f5d597186990818f1d689556 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sat, 2 Jul 2022 14:18:19 +0100 Subject: [PATCH 58/59] chore: Add cli entrypoint for ankisyncd_cli --- src/ankisyncd_cli/__main__.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/ankisyncd_cli/__main__.py diff --git a/src/ankisyncd_cli/__main__.py b/src/ankisyncd_cli/__main__.py new file mode 100644 index 0000000..1a160fd --- /dev/null +++ b/src/ankisyncd_cli/__main__.py @@ -0,0 +1,4 @@ +from ankisyncd_cli import ankisyncctl + +if __name__ == '__main__': + ankisyncctl.main() \ No newline at end of file From 31036981354bc122eff0039e6c18a2a984de81b6 Mon Sep 17 00:00:00 2001 From: Vikash Kothary Date: Sat, 2 Jul 2022 14:32:02 +0100 Subject: [PATCH 59/59] build: Run poetry-update and poetry-export --- poetry.lock | 1324 +++++++++++++++++++------------------- src/requirements-dev.txt | 205 +++--- src/requirements.txt | 37 +- 3 files changed, 798 insertions(+), 768 deletions(-) diff --git a/poetry.lock b/poetry.lock index dbf9101..74e4756 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,56 +1,60 @@ [[package]] -name = "anki" -version = "2.1.49" -description = "" category = "main" +description = "" +name = "anki" optional = false python-versions = ">=3.8" +version = "2.1.49" [package.dependencies] beautifulsoup4 = "*" decorator = "*" -distro = {version = "*", markers = "sys_platform != \"darwin\" and sys_platform != \"win32\""} +distro = "*" markdown = "*" -orjson = {version = "*", markers = "platform_machine == \"x86_64\""} +orjson = "*" protobuf = ">=3.17" -psutil = {version = "*", markers = "sys_platform == \"win32\""} -requests = {version = "*", extras = ["socks"]} +psutil = "*" stringcase = "*" +[package.dependencies.requests] +extras = ["socks"] +version = "*" + [package.extras] syncserver = ["flask", "waitress"] [[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" category = "dev" +description = "Disable App Nap on macOS >= 10.9" +marker = "platform_system == \"Darwin\" or sys_platform == \"darwin\" or python_version >= \"3.3\" and sys_platform == \"darwin\"" +name = "appnope" optional = false python-versions = "*" +version = "0.1.3" [[package]] -name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." category = "dev" +description = "The secure Argon2 password hashing algorithm." +name = "argon2-cffi" optional = false python-versions = ">=3.6" +version = "21.3.0" [package.dependencies] argon2-cffi-bindings = "*" [package.extras] -dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] +dev = ["pre-commit", "cogapp", "tomli", "coverage (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] docs = ["sphinx", "sphinx-notfound-page", "furo"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] +tests = ["coverage (>=5.0.2)", "hypothesis", "pytest"] [[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -description = "Low-level CFFI bindings for Argon2" category = "dev" +description = "Low-level CFFI bindings for Argon2" +name = "argon2-cffi-bindings" optional = false python-versions = ">=3.6" +version = "21.2.0" [package.dependencies] cffi = ">=1.0.1" @@ -60,12 +64,12 @@ dev = ["pytest", "cogapp", "pre-commit", "wheel"] tests = ["pytest"] [[package]] -name = "asttokens" -version = "2.0.5" -description = "Annotate AST trees with source code positions" category = "dev" +description = "Annotate AST trees with source code positions" +name = "asttokens" optional = false python-versions = "*" +version = "2.0.5" [package.dependencies] six = "*" @@ -74,34 +78,34 @@ six = "*" test = ["astroid", "pytest"] [[package]] -name = "attrs" -version = "21.4.0" -description = "Classes Without Boilerplate" category = "dev" +description = "Classes Without Boilerplate" +name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "21.4.0" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] [[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" category = "dev" +description = "Specifications for callback functions passed in to an API" +name = "backcall" optional = false python-versions = "*" +version = "0.2.0" [[package]] -name = "beautifulsoup4" -version = "4.11.1" -description = "Screen-scraping library" category = "main" +description = "Screen-scraping library" +name = "beautifulsoup4" optional = false python-versions = ">=3.6.0" +version = "4.11.1" [package.dependencies] soupsieve = ">1.2" @@ -111,136 +115,137 @@ html5lib = ["html5lib"] lxml = ["lxml"] [[package]] -name = "bleach" -version = "5.0.0" -description = "An easy safelist-based HTML-sanitizing tool." category = "dev" +description = "An easy safelist-based HTML-sanitizing tool." +name = "bleach" optional = false python-versions = ">=3.7" +version = "5.0.1" [package.dependencies] six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0)"] -dev = ["pip-tools (==6.5.1)", "pytest (==7.1.1)", "flake8 (==4.0.1)", "tox (==3.24.5)", "sphinx (==4.3.2)", "twine (==4.0.0)", "wheel (==0.37.1)", "hashin (==0.17.0)", "black (==22.3.0)", "mypy (==0.942)"] +css = ["tinycss2 (>=1.1.0,<1.2)"] +dev = ["build (0.8.0)", "flake8 (4.0.1)", "hashin (0.17.0)", "pip-tools (6.6.2)", "pytest (7.1.2)", "Sphinx (4.3.2)", "tox (3.25.0)", "twine (4.0.1)", "wheel (0.37.1)", "black (22.3.0)", "mypy (0.961)"] [[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." category = "main" +description = "Python package for providing Mozilla's CA Bundle." +name = "certifi" optional = false -python-versions = "*" +python-versions = ">=3.6" +version = "2022.6.15" [[package]] -name = "cffi" -version = "1.15.0" -description = "Foreign Function Interface for Python calling C code." category = "dev" +description = "Foreign Function Interface for Python calling C code." +name = "cffi" optional = false python-versions = "*" +version = "1.15.1" [package.dependencies] pycparser = "*" [[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +name = "charset-normalizer" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" +version = "2.1.0" [package.extras] unicode_backport = ["unicodedata2"] [[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" category = "dev" +description = "Composable command line interface toolkit" +name = "click" optional = false python-versions = ">=3.7" +version = "8.1.3" [package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} +colorama = "*" [[package]] -name = "colorama" -version = "0.4.4" -description = "Cross-platform colored terminal text." category = "dev" +description = "Cross-platform colored terminal text." +marker = "python_version >= \"3.3\" and sys_platform == \"win32\" or sys_platform == \"win32\" or platform_system == \"Windows\"" +name = "colorama" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.4.5" [[package]] -name = "debugpy" -version = "1.6.0" -description = "An implementation of the Debug Adapter Protocol for Python" category = "dev" +description = "An implementation of the Debug Adapter Protocol for Python" +name = "debugpy" optional = false python-versions = ">=3.7" +version = "1.6.0" [[package]] -name = "decorator" -version = "4.4.2" -description = "Decorators for Humans" category = "main" +description = "Decorators for Humans" +name = "decorator" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "4.4.2" [[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" category = "dev" +description = "XML bomb protection for Python stdlib modules" +name = "defusedxml" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.7.1" [[package]] -name = "distro" -version = "1.7.0" -description = "Distro - an OS platform information API" category = "main" +description = "Distro - an OS platform information API" +name = "distro" optional = false python-versions = ">=3.6" +version = "1.7.0" [[package]] -name = "entrypoints" -version = "0.4" +category = "dev" description = "Discover and load entry points from installed packages." -category = "dev" +name = "entrypoints" optional = false python-versions = ">=3.6" +version = "0.4" [[package]] -name = "executing" -version = "0.8.3" +category = "dev" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" +name = "executing" optional = false python-versions = "*" +version = "0.8.3" [[package]] -name = "fastjsonschema" -version = "2.15.3" -description = "Fastest Python implementation of JSON schema" category = "dev" +description = "Fastest Python implementation of JSON schema" +name = "fastjsonschema" optional = false python-versions = "*" +version = "2.15.3" [package.extras] devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] [[package]] -name = "ghp-import" -version = "2.1.0" -description = "Copy your docs directly to the gh-pages branch." category = "dev" +description = "Copy your docs directly to the gh-pages branch." +name = "ghp-import" optional = false python-versions = "*" +version = "2.1.0" [package.dependencies] python-dateutil = ">=2.8.1" @@ -249,20 +254,20 @@ python-dateutil = ">=2.8.1" dev = ["twine", "markdown", "flake8", "wheel"] [[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" category = "main" +description = "Internationalized Domain Names in Applications (IDNA)" +name = "idna" optional = false python-versions = ">=3.5" +version = "3.3" [[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" category = "main" +description = "Read metadata from Python packages" +name = "importlib-metadata" optional = false python-versions = ">=3.7" +version = "4.12.0" [package.dependencies] zipp = ">=0.5" @@ -270,33 +275,36 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] [[package]] -name = "importlib-resources" -version = "5.7.1" -description = "Read resources from Python packages" category = "dev" +description = "Read resources from Python packages" +marker = "python_version < \"3.9\"" +name = "importlib-resources" optional = false python-versions = ">=3.7" +version = "5.8.0" [package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} +[package.dependencies.zipp] +python = "<3.10" +version = ">=3.1.0" [package.extras] docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [[package]] -name = "ipykernel" -version = "6.13.0" -description = "IPython Kernel for Jupyter" category = "dev" +description = "IPython Kernel for Jupyter" +name = "ipykernel" optional = false python-versions = ">=3.7" +version = "6.15.0" [package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} +appnope = "*" debugpy = ">=1.0" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" @@ -304,31 +312,33 @@ matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" +pyzmq = ">=17" tornado = ">=6.1" traitlets = ">=5.1.0" [package.extras] -test = ["pytest (>=6.0)", "pytest-cov", "flaky", "ipyparallel", "pre-commit", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest-cov", "pytest-timeout", "pytest (>=6.0)"] [[package]] -name = "ipython" -version = "8.3.0" -description = "IPython: Productive Interactive Computing" category = "dev" +description = "IPython: Productive Interactive Computing" +name = "ipython" optional = false python-versions = ">=3.8" +version = "8.4.0" [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} +appnope = "*" backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} +colorama = "*" decorator = "*" jedi = ">=0.16" matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pexpect = ">4.3" pickleshare = "*" prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" pygments = ">=2.4.0" +setuptools = ">=18.5" stack-data = "*" traitlets = ">=5" @@ -346,55 +356,60 @@ test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "trio"] [[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" category = "dev" +description = "Vestigial utilities from IPython" +name = "ipython-genutils" optional = false python-versions = "*" +version = "0.2.0" [[package]] -name = "ipywidgets" -version = "7.7.0" -description = "IPython HTML widgets for Jupyter" category = "dev" +description = "IPython HTML widgets for Jupyter" +name = "ipywidgets" optional = false python-versions = "*" +version = "7.7.1" [package.dependencies] ipykernel = ">=4.5.1" -ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} ipython-genutils = ">=0.2.0,<0.3.0" -jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} -nbformat = ">=4.2.0" traitlets = ">=4.3.1" widgetsnbextension = ">=3.6.0,<3.7.0" +[package.dependencies.ipython] +python = ">=3.3" +version = ">=4.0.0" + +[package.dependencies.jupyterlab-widgets] +python = ">=3.6" +version = ">=1.0.0" + [package.extras] test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] [[package]] -name = "jedi" -version = "0.18.1" -description = "An autocompletion tool for Python that can be used for text editors." category = "dev" +description = "An autocompletion tool for Python that can be used for text editors." +name = "jedi" optional = false python-versions = ">=3.6" +version = "0.18.1" [package.dependencies] parso = ">=0.8.0,<0.9.0" [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +qa = ["flake8 (3.8.3)", "mypy (0.782)"] testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] -name = "jinja2" -version = "3.1.2" -description = "A very fast and expressive template engine." category = "dev" +description = "A very fast and expressive template engine." +name = "jinja2" optional = false python-versions = ">=3.7" +version = "3.1.2" [package.dependencies] MarkupSafe = ">=2.0" @@ -403,40 +418,43 @@ MarkupSafe = ">=2.0" i18n = ["Babel (>=2.7)"] [[package]] -name = "json5" -version = "0.9.8" -description = "A Python implementation of the JSON5 data format." category = "dev" +description = "A Python implementation of the JSON5 data format." +name = "json5" optional = false python-versions = "*" +version = "0.9.8" [package.extras] dev = ["hypothesis"] [[package]] -name = "jsonschema" -version = "4.5.1" -description = "An implementation of JSON Schema validation for Python" category = "dev" +description = "An implementation of JSON Schema validation for Python" +name = "jsonschema" optional = false python-versions = ">=3.7" +version = "4.6.1" [package.dependencies] attrs = ">=17.4.0" -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +[package.dependencies.importlib-resources] +python = "<3.9" +version = ">=1.4.0" + [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] [[package]] -name = "jupyter" -version = "1.0.0" -description = "Jupyter metapackage. Install all the Jupyter components in one go." category = "dev" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +name = "jupyter" optional = false python-versions = "*" +version = "1.0.0" [package.dependencies] ipykernel = "*" @@ -447,33 +465,33 @@ notebook = "*" qtconsole = "*" [[package]] -name = "jupyter-client" -version = "7.3.1" -description = "Jupyter protocol implementation and client libraries" category = "dev" +description = "Jupyter protocol implementation and client libraries" +name = "jupyter-client" optional = false python-versions = ">=3.7" +version = "7.3.4" [package.dependencies] entrypoints = "*" jupyter-core = ">=4.9.2" nest-asyncio = ">=1.5.4" python-dateutil = ">=2.8.2" -pyzmq = ">=22.3" +pyzmq = ">=23.0" tornado = ">=6.0" traitlets = "*" [package.extras] -doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +doc = ["ipykernel", "myst-parser", "sphinx-rtd-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt"] test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] [[package]] -name = "jupyter-console" -version = "6.4.3" -description = "Jupyter terminal console" category = "dev" +description = "Jupyter terminal console" +name = "jupyter-console" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +version = "6.4.4" [package.dependencies] ipykernel = "*" @@ -486,27 +504,27 @@ pygments = "*" test = ["pexpect"] [[package]] -name = "jupyter-core" -version = "4.10.0" -description = "Jupyter core package. A base package on which Jupyter projects rely." category = "dev" +description = "Jupyter core package. A base package on which Jupyter projects rely." +name = "jupyter-core" optional = false python-versions = ">=3.7" +version = "4.10.0" [package.dependencies] -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +pywin32 = ">=1.0" traitlets = "*" [package.extras] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] -name = "jupyterlab" -version = "2.3.2" -description = "The JupyterLab notebook server extension." category = "dev" +description = "The JupyterLab notebook server extension." +name = "jupyterlab" optional = false python-versions = ">=3.5" +version = "2.3.2" [package.dependencies] jinja2 = ">=2.10" @@ -519,20 +537,20 @@ docs = ["jsx-lexer", "recommonmark", "sphinx", "sphinx-rtd-theme", "sphinx-copyb test = ["pytest", "pytest-check-links", "requests", "wheel", "virtualenv"] [[package]] -name = "jupyterlab-pygments" -version = "0.2.2" -description = "Pygments theme using JupyterLab CSS variables" category = "dev" +description = "Pygments theme using JupyterLab CSS variables" +name = "jupyterlab-pygments" optional = false python-versions = ">=3.7" +version = "0.2.2" [[package]] -name = "jupyterlab-server" -version = "1.2.0" -description = "JupyterLab Server" category = "dev" +description = "JupyterLab Server" +name = "jupyterlab-server" optional = false python-versions = ">=3.5" +version = "1.2.0" [package.dependencies] jinja2 = ">=2.10" @@ -545,20 +563,21 @@ requests = "*" test = ["pytest", "requests"] [[package]] -name = "jupyterlab-widgets" -version = "1.1.0" -description = "A JupyterLab extension." category = "dev" +description = "A JupyterLab extension." +marker = "python_version >= \"3.6\"" +name = "jupyterlab-widgets" optional = false python-versions = ">=3.6" +version = "1.1.1" [[package]] -name = "jupytext" -version = "1.13.8" -description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" category = "dev" +description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" +name = "jupytext" optional = false python-versions = "~=3.6" +version = "1.13.8" [package.dependencies] markdown-it-py = ">=1.0.0,<3.0.0" @@ -572,33 +591,35 @@ rst2md = ["sphinx-gallery (>=0.7.0,<0.8.0)"] toml = ["toml"] [[package]] -name = "markdown" -version = "3.3.7" -description = "Python implementation of Markdown." category = "main" +description = "Python implementation of Markdown." +name = "markdown" optional = false python-versions = ">=3.6" +version = "3.3.7" [package.dependencies] -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +[package.dependencies.importlib-metadata] +python = "<3.10" +version = ">=4.4" [package.extras] testing = ["coverage", "pyyaml"] [[package]] -name = "markdown-it-py" -version = "2.1.0" -description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" +description = "Python port of markdown-it. Markdown parsing, done right!" +name = "markdown-it-py" optional = false python-versions = ">=3.7" +version = "2.1.0" [package.dependencies] mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] -code_style = ["pre-commit (==2.6)"] +code_style = ["pre-commit (2.6)"] compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] @@ -607,81 +628,81 @@ rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx- testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." category = "dev" +description = "Safely add untrusted strings to HTML/XML markup." +name = "markupsafe" optional = false python-versions = ">=3.7" +version = "2.1.1" [[package]] -name = "matplotlib-inline" -version = "0.1.3" -description = "Inline Matplotlib backend for Jupyter" category = "dev" +description = "Inline Matplotlib backend for Jupyter" +name = "matplotlib-inline" optional = false python-versions = ">=3.5" +version = "0.1.3" [package.dependencies] traitlets = "*" [[package]] -name = "mdit-py-plugins" -version = "0.3.0" -description = "Collection of plugins for markdown-it-py" category = "dev" +description = "Collection of plugins for markdown-it-py" +name = "mdit-py-plugins" optional = false python-versions = "~=3.6" +version = "0.3.0" [package.dependencies] markdown-it-py = ">=1.0.0,<3.0.0" [package.extras] -code_style = ["pre-commit (==2.6)"] +code_style = ["pre-commit (2.6)"] rtd = ["myst-parser (>=0.14.0,<0.15.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] [[package]] -name = "mdurl" -version = "0.1.1" -description = "Markdown URL utilities" category = "dev" +description = "Markdown URL utilities" +name = "mdurl" optional = false python-versions = ">=3.7" +version = "0.1.1" [[package]] -name = "mergedeep" -version = "1.3.4" -description = "A deep merge function for 🐍." category = "dev" +description = "A deep merge function for 🐍." +name = "mergedeep" optional = false python-versions = ">=3.6" +version = "1.3.4" [[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" category = "dev" +description = "The fastest markdown parser in pure Python" +name = "mistune" optional = false python-versions = "*" +version = "0.8.4" [[package]] -name = "mkdocs" -version = "1.3.0" -description = "Project documentation with Markdown." category = "dev" +description = "Project documentation with Markdown." +name = "mkdocs" optional = false python-versions = ">=3.6" +version = "1.3.0" [package.dependencies] +Jinja2 = ">=2.10.2" +Markdown = ">=3.2.1" +PyYAML = ">=3.10" click = ">=3.3" ghp-import = ">=1.0" importlib-metadata = ">=4.3" -Jinja2 = ">=2.10.2" -Markdown = ">=3.2.1" mergedeep = ">=1.3.4" packaging = ">=20.5" -PyYAML = ">=3.10" pyyaml-env-tag = ">=0.1" watchdog = ">=2.0" @@ -689,12 +710,12 @@ watchdog = ">=2.0" i18n = ["babel (>=2.9.0)"] [[package]] -name = "mkdocs-jupyter" -version = "0.19.0" -description = "Use Jupyter in mkdocs websites" category = "dev" +description = "Use Jupyter in mkdocs websites" +name = "mkdocs-jupyter" optional = false python-versions = ">=3.7.1,<4" +version = "0.19.0" [package.dependencies] jupytext = ">=1.11.02,<2.0.0" @@ -703,15 +724,15 @@ mkdocs-material = ">=8.0.0,<9.0.0" nbconvert = ">=6.2.0,<7.0.0" [[package]] -name = "mkdocs-material" -version = "8.2.15" -description = "Documentation that simply works" category = "dev" +description = "Documentation that simply works" +name = "mkdocs-material" optional = false python-versions = ">=3.7" +version = "8.3.8" [package.dependencies] -jinja2 = ">=2.11.1" +jinja2 = ">=3.0.2" markdown = ">=3.2" mkdocs = ">=1.3.0" mkdocs-material-extensions = ">=1.0.3" @@ -719,40 +740,41 @@ pygments = ">=2.12" pymdown-extensions = ">=9.4" [[package]] -name = "mkdocs-material-extensions" -version = "1.0.3" -description = "Extension pack for Python Markdown." category = "dev" +description = "Extension pack for Python Markdown." +name = "mkdocs-material-extensions" optional = false python-versions = ">=3.6" +version = "1.0.3" [[package]] -name = "nbclient" -version = "0.6.3" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." category = "dev" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +name = "nbclient" optional = false python-versions = ">=3.7.0" +version = "0.6.6" [package.dependencies] jupyter-client = ">=6.1.5" nbformat = ">=5.0" nest-asyncio = "*" -traitlets = ">=5.0.0" +traitlets = ">=5.2.2" [package.extras] sphinx = ["autodoc-traits", "mock", "moto", "myst-parser", "Sphinx (>=1.7)", "sphinx-book-theme"] test = ["black", "check-manifest", "flake8", "ipykernel", "ipython (<8.0.0)", "ipywidgets (<8.0.0)", "mypy", "pip (>=18.1)", "pre-commit", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "setuptools (>=60.0)", "testpath", "twine (>=1.11.0)", "xmltodict"] [[package]] -name = "nbconvert" -version = "6.5.0" -description = "Converting Jupyter Notebooks" category = "dev" +description = "Converting Jupyter Notebooks" +name = "nbconvert" optional = false python-versions = ">=3.7" +version = "6.5.0" [package.dependencies] +MarkupSafe = ">=2.0" beautifulsoup4 = "*" bleach = "*" defusedxml = "*" @@ -760,7 +782,6 @@ entrypoints = ">=0.2.2" jinja2 = ">=3.0" jupyter-core = ">=4.7" jupyterlab-pygments = "*" -MarkupSafe = ">=2.0" mistune = ">=0.8.1,<2" nbclient = ">=0.5.0" nbformat = ">=5.1" @@ -778,12 +799,12 @@ test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (> webpdf = ["pyppeteer (>=1,<1.1)"] [[package]] -name = "nbformat" -version = "5.4.0" -description = "The Jupyter Notebook format" category = "dev" +description = "The Jupyter Notebook format" +name = "nbformat" optional = false python-versions = ">=3.7" +version = "5.4.0" [package.dependencies] fastjsonschema = "*" @@ -795,22 +816,23 @@ traitlets = ">=5.1" test = ["check-manifest", "testpath", "pytest", "pre-commit"] [[package]] -name = "nest-asyncio" -version = "1.5.5" -description = "Patch asyncio to allow nested event loops" category = "dev" +description = "Patch asyncio to allow nested event loops" +name = "nest-asyncio" optional = false python-versions = ">=3.5" +version = "1.5.5" [[package]] -name = "notebook" -version = "6.4.11" -description = "A web-based notebook environment for interactive computing" category = "dev" +description = "A web-based notebook environment for interactive computing" +name = "notebook" optional = false python-versions = ">=3.7" +version = "6.4.12" [package.dependencies] +Send2Trash = ">=1.8.0" argon2-cffi = "*" ipykernel = "*" ipython-genutils = "*" @@ -822,7 +844,6 @@ nbformat = "*" nest-asyncio = ">=1.5" prometheus-client = "*" pyzmq = ">=17" -Send2Trash = ">=1.8.0" terminado = ">=0.8.3" tornado = ">=6.1" traitlets = ">=4.2.1" @@ -833,250 +854,248 @@ json-logging = ["json-logging"] test = ["pytest", "coverage", "requests", "testpath", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] [[package]] -name = "orjson" -version = "3.6.8" -description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +marker = "platform_machine == \"x86_64\"" +name = "orjson" optional = false python-versions = ">=3.7" +version = "3.7.5" [[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" category = "dev" +description = "Core utilities for Python packages" +name = "packaging" optional = false python-versions = ">=3.6" +version = "21.3" [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] -name = "pandocfilters" -version = "1.5.0" -description = "Utilities for writing pandoc filters in python" category = "dev" +description = "Utilities for writing pandoc filters in python" +name = "pandocfilters" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.5.0" [[package]] -name = "parso" -version = "0.8.3" -description = "A Python Parser" category = "dev" +description = "A Python Parser" +name = "parso" optional = false python-versions = ">=3.6" +version = "0.8.3" [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +qa = ["flake8 (3.8.3)", "mypy (0.782)"] testing = ["docopt", "pytest (<6.0.0)"] [[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." category = "dev" +description = "Pexpect allows easy control of interactive console applications." +marker = "python_version >= \"3.3\" and sys_platform != \"win32\" or sys_platform != \"win32\"" +name = "pexpect" optional = false python-versions = "*" +version = "4.8.0" [package.dependencies] ptyprocess = ">=0.5" [[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" category = "dev" +description = "Tiny 'shelve'-like database with concurrency support" +name = "pickleshare" optional = false python-versions = "*" +version = "0.7.5" [[package]] -name = "prometheus-client" -version = "0.14.1" -description = "Python client for the Prometheus monitoring system." category = "dev" +description = "Python client for the Prometheus monitoring system." +name = "prometheus-client" optional = false python-versions = ">=3.6" +version = "0.14.1" [package.extras] twisted = ["twisted"] [[package]] -name = "prompt-toolkit" -version = "3.0.29" -description = "Library for building powerful interactive command lines in Python" category = "dev" +description = "Library for building powerful interactive command lines in Python" +name = "prompt-toolkit" optional = false python-versions = ">=3.6.2" +version = "3.0.30" [package.dependencies] wcwidth = "*" [[package]] -name = "protobuf" -version = "3.20.1" -description = "Protocol Buffers" category = "main" +description = "" +name = "protobuf" optional = false python-versions = ">=3.7" +version = "4.21.2" [[package]] -name = "psutil" -version = "5.9.0" -description = "Cross-platform lib for process and system monitoring in Python." category = "main" +description = "Cross-platform lib for process and system monitoring in Python." +name = "psutil" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "5.9.1" [package.extras] -test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] +test = ["ipaddress", "mock", "enum34", "pywin32", "wmi"] [[package]] -name = "ptyprocess" -version = "0.7.0" +category = "dev" description = "Run a subprocess in a pseudo terminal" -category = "dev" +marker = "sys_platform != \"win32\" or os_name != \"nt\" or python_version >= \"3.3\" and sys_platform != \"win32\"" +name = "ptyprocess" optional = false python-versions = "*" +version = "0.7.0" [[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" category = "dev" +description = "Safely evaluate AST nodes without side effects" +name = "pure-eval" optional = false python-versions = "*" +version = "0.2.2" [package.extras] tests = ["pytest"] [[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" category = "dev" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +marker = "implementation_name == \"pypy\"" +name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "1.11.0" [[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" category = "dev" +description = "C parser in Python" +name = "pycparser" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.21" [[package]] -name = "pygments" -version = "2.12.0" -description = "Pygments is a syntax highlighting package written in Python." category = "dev" +description = "Pygments is a syntax highlighting package written in Python." +name = "pygments" optional = false python-versions = ">=3.6" +version = "2.12.0" [[package]] -name = "pymdown-extensions" -version = "9.4" -description = "Extension pack for Python Markdown." category = "dev" +description = "Extension pack for Python Markdown." +name = "pymdown-extensions" optional = false python-versions = ">=3.7" +version = "9.5" [package.dependencies] markdown = ">=3.2" [[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +name = "pyparsing" optional = false python-versions = ">=3.6.8" +version = "3.0.9" [package.extras] diagrams = ["railroad-diagrams", "jinja2"] [[package]] -name = "pyrsistent" -version = "0.18.1" -description = "Persistent/Functional/Immutable data structures" category = "dev" +description = "Persistent/Functional/Immutable data structures" +name = "pyrsistent" optional = false python-versions = ">=3.7" +version = "0.18.1" [[package]] -name = "pysocks" -version = "1.7.1" -description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" category = "dev" +description = "Extensions to the standard Python datetime module" +name = "python-dateutil" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +version = "2.8.2" [package.dependencies] six = ">=1.5" [[package]] -name = "pywin32" -version = "304" -description = "Python for Window Extensions" category = "dev" +description = "Python for Window Extensions" +marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" +name = "pywin32" optional = false python-versions = "*" +version = "304" [[package]] -name = "pywinpty" -version = "2.0.5" -description = "Pseudo terminal support for Windows from Python." category = "dev" +description = "Pseudo terminal support for Windows from Python." +marker = "os_name == \"nt\"" +name = "pywinpty" optional = false python-versions = ">=3.7" +version = "2.0.5" [[package]] -name = "pyyaml" -version = "6.0" +category = "dev" description = "YAML parser and emitter for Python" -category = "dev" +name = "pyyaml" optional = false python-versions = ">=3.6" +version = "6.0" [[package]] -name = "pyyaml-env-tag" -version = "0.1" -description = "A custom YAML tag for referencing environment variables in YAML files. " category = "dev" +description = "A custom YAML tag for referencing environment variables in YAML files. " +name = "pyyaml-env-tag" optional = false python-versions = ">=3.6" +version = "0.1" [package.dependencies] pyyaml = "*" [[package]] -name = "pyzmq" -version = "22.3.0" -description = "Python bindings for 0MQ" category = "dev" +description = "Python bindings for 0MQ" +name = "pyzmq" optional = false python-versions = ">=3.6" +version = "23.2.0" [package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} -py = {version = "*", markers = "implementation_name == \"pypy\""} +cffi = "*" +py = "*" [[package]] -name = "qtconsole" -version = "5.3.0" -description = "Jupyter Qt console" category = "dev" +description = "Jupyter Qt console" +name = "qtconsole" optional = false python-versions = ">= 3.7" +version = "5.3.1" [package.dependencies] ipykernel = ">=4.1" @@ -1086,52 +1105,51 @@ jupyter-core = "*" pygments = "*" pyzmq = ">=17.1" qtpy = ">=2.0.1" -traitlets = "*" +traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" [package.extras] doc = ["Sphinx (>=1.3)"] test = ["flaky", "pytest", "pytest-qt"] [[package]] -name = "qtpy" -version = "2.1.0" -description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." category = "dev" +description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." +name = "qtpy" optional = false python-versions = ">=3.7" +version = "2.1.0" [package.dependencies] packaging = "*" [package.extras] -test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] +test = ["pytest (>=6,<7.0.0 || >7.0.0,<7.0.1 || >7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] [[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." category = "main" +description = "Python HTTP for Humans." +name = "requests" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" +version = "2.28.1" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7", optional = true, markers = "extra == \"socks\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] -name = "send2trash" -version = "1.8.0" -description = "Send file to trash natively under Mac OS X, Windows and Linux." category = "main" +description = "Send file to trash natively under Mac OS X, Windows and Linux." +name = "send2trash" optional = false python-versions = "*" +version = "1.8.0" [package.extras] nativelib = ["pyobjc-framework-cocoa", "pywin32"] @@ -1139,28 +1157,28 @@ objc = ["pyobjc-framework-cocoa"] win32 = ["pywin32"] [[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" category = "dev" +description = "Python 2 and 3 compatibility utilities" +name = "six" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +version = "1.16.0" [[package]] -name = "soupsieve" -version = "2.3.2.post1" -description = "A modern CSS selector implementation for Beautiful Soup." category = "main" +description = "A modern CSS selector implementation for Beautiful Soup." +name = "soupsieve" optional = false python-versions = ">=3.6" +version = "2.3.2.post1" [[package]] -name = "stack-data" -version = "0.2.0" -description = "Extract data from python stack frames and tracebacks for informative displays" category = "dev" +description = "Extract data from python stack frames and tracebacks for informative displays" +name = "stack-data" optional = false python-versions = "*" +version = "0.3.0" [package.dependencies] asttokens = "*" @@ -1171,36 +1189,36 @@ pure-eval = "*" tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] [[package]] -name = "stringcase" -version = "1.2.0" -description = "String case converter." category = "main" +description = "String case converter." +name = "stringcase" optional = false python-versions = "*" +version = "1.2.0" [[package]] -name = "terminado" -version = "0.15.0" -description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." category = "dev" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +name = "terminado" optional = false python-versions = ">=3.7" +version = "0.15.0" [package.dependencies] -ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +ptyprocess = "*" +pywinpty = ">=1.1.0" tornado = ">=6.1.0" [package.extras] test = ["pre-commit", "pytest-timeout", "pytest (>=6.0)"] [[package]] -name = "tinycss2" -version = "1.1.1" -description = "A tiny CSS parser" category = "dev" +description = "A tiny CSS parser" +name = "tinycss2" optional = false python-versions = ">=3.6" +version = "1.1.1" [package.dependencies] webencodings = ">=0.4" @@ -1210,141 +1228,141 @@ doc = ["sphinx", "sphinx-rtd-theme"] test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] [[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" category = "dev" +description = "Python Library for Tom's Obvious, Minimal Language" +name = "toml" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.10.2" [[package]] -name = "tornado" -version = "6.1" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." category = "dev" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +name = "tornado" optional = false python-versions = ">= 3.5" +version = "6.1" [[package]] -name = "traitlets" -version = "5.2.1.post0" -description = "" category = "dev" +description = "" +name = "traitlets" optional = false python-versions = ">=3.7" +version = "5.3.0" [package.extras] test = ["pre-commit", "pytest"] [[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" +description = "HTTP library with thread-safe connection pooling, file post, and more." +name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +version = "1.26.9" [package.extras] brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] -name = "waitress" -version = "2.1.1" -description = "Waitress WSGI server" category = "dev" +description = "Waitress WSGI server" +name = "waitress" optional = false python-versions = ">=3.7.0" +version = "2.1.2" [package.extras] docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] testing = ["pytest", "pytest-cover", "coverage (>=5.0)"] [[package]] -name = "watchdog" -version = "2.1.8" -description = "Filesystem events monitoring" category = "dev" +description = "Filesystem events monitoring" +name = "watchdog" optional = false python-versions = ">=3.6" +version = "2.1.9" [package.extras] watchmedo = ["PyYAML (>=3.10)"] [[package]] -name = "wcwidth" -version = "0.2.5" +category = "dev" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" +name = "wcwidth" optional = false python-versions = "*" +version = "0.2.5" [[package]] -name = "webencodings" -version = "0.5.1" +category = "dev" description = "Character encoding aliases for legacy web content" -category = "dev" +name = "webencodings" optional = false python-versions = "*" +version = "0.5.1" [[package]] -name = "webob" -version = "1.8.7" -description = "WSGI request and response object" category = "main" +description = "WSGI request and response object" +name = "webob" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +version = "1.8.7" [package.extras] docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] testing = ["pytest (>=3.1.0)", "coverage", "pytest-cov", "pytest-xdist"] [[package]] -name = "webtest" -version = "2.0.35" -description = "Helper to test WSGI applications" category = "dev" +description = "Helper to test WSGI applications" +name = "webtest" optional = false python-versions = "*" +version = "2.0.35" [package.dependencies] +WebOb = ">=1.2" beautifulsoup4 = "*" six = "*" waitress = ">=0.8.5" -WebOb = ">=1.2" [package.extras] docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.8)"] tests = ["nose (<1.3.0)", "coverage", "mock", "pastedeploy", "wsgiproxy2", "pyquery"] [[package]] -name = "widgetsnbextension" -version = "3.6.0" -description = "IPython HTML widgets for Jupyter" category = "dev" +description = "IPython HTML widgets for Jupyter" +name = "widgetsnbextension" optional = false python-versions = "*" +version = "3.6.1" [package.dependencies] notebook = ">=4.4.1" [[package]] -name = "zipp" -version = "3.8.0" -description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" +description = "Backport of pathlib-compatible object wrapper for zip files" +name = "zipp" optional = false python-versions = ">=3.7" +version = "3.8.0" [package.extras] docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [metadata] -lock-version = "1.1" -python-versions = "^3.8" content-hash = "6f1089c6991dfa4ce8fb78818b271f8db7f0d747a41288d3c6f0ac89695fe4b0" +lock-version = "1.0" +python-versions = "^3.8" [metadata.files] anki = [ @@ -1400,76 +1418,90 @@ beautifulsoup4 = [ {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, ] bleach = [ - {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, - {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, + {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, + {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, ] certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, + {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, + {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, ] cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, + {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, + {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, ] click = [ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] debugpy = [ {file = "debugpy-1.6.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:eb1946efac0c0c3d411cea0b5ac772fbde744109fd9520fb0c5a51979faf05ad"}, @@ -1524,28 +1556,28 @@ idna = [ {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, + {file = "importlib_metadata-4.12.0-py3-none-any.whl", hash = "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"}, + {file = "importlib_metadata-4.12.0.tar.gz", hash = "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670"}, ] importlib-resources = [ - {file = "importlib_resources-5.7.1-py3-none-any.whl", hash = "sha256:e447dc01619b1e951286f3929be820029d48c75eb25d265c28b92a16548212b8"}, - {file = "importlib_resources-5.7.1.tar.gz", hash = "sha256:b6062987dfc51f0fcb809187cffbd60f35df7acb4589091f154214af6d0d49d3"}, + {file = "importlib_resources-5.8.0-py3-none-any.whl", hash = "sha256:7952325ffd516c05a8ad0858c74dff2c3343f136fe66a6002b2623dd1d43f223"}, + {file = "importlib_resources-5.8.0.tar.gz", hash = "sha256:568c9f16cb204f9decc8d6d24a572eeea27dacbb4cee9e6b03a8025736769751"}, ] ipykernel = [ - {file = "ipykernel-6.13.0-py3-none-any.whl", hash = "sha256:2b0987af43c0d4b62cecb13c592755f599f96f29aafe36c01731aaa96df30d39"}, - {file = "ipykernel-6.13.0.tar.gz", hash = "sha256:0e28273e290858393e86e152b104e5506a79c13d25b951ac6eca220051b4be60"}, + {file = "ipykernel-6.15.0-py3-none-any.whl", hash = "sha256:b9ed519a29eb819eb82e87e0d3754088237b233e5c647b8bb0ff23c8c70ed16f"}, + {file = "ipykernel-6.15.0.tar.gz", hash = "sha256:b59f9d9672c3a483494bb75915a2b315e78b833a38b039b1ee36dc28683f0d89"}, ] ipython = [ - {file = "ipython-8.3.0-py3-none-any.whl", hash = "sha256:341456643a764c28f670409bbd5d2518f9b82c013441084ff2c2fc999698f83b"}, - {file = "ipython-8.3.0.tar.gz", hash = "sha256:807ae3cf43b84693c9272f70368440a9a7eaa2e7e6882dad943c32fbf7e51402"}, + {file = "ipython-8.4.0-py3-none-any.whl", hash = "sha256:7ca74052a38fa25fe9bedf52da0be7d3fdd2fb027c3b778ea78dfe8c212937d1"}, + {file = "ipython-8.4.0.tar.gz", hash = "sha256:f2db3a10254241d9b447232cec8b424847f338d9d36f9a577a6192c332a46abd"}, ] ipython-genutils = [ {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, ] ipywidgets = [ - {file = "ipywidgets-7.7.0-py2.py3-none-any.whl", hash = "sha256:e58ff58bc94d481e91ecb6e13a5cb96a87b6b8ade135e055603d0ca24593df38"}, - {file = "ipywidgets-7.7.0.tar.gz", hash = "sha256:ab4a5596855a88b83761921c768707d65e5847068139bc1729ddfe834703542a"}, + {file = "ipywidgets-7.7.1-py2.py3-none-any.whl", hash = "sha256:aa1076ab7102b2486ae2607c43c243200a07c17d6093676c419d4b6762489a50"}, + {file = "ipywidgets-7.7.1.tar.gz", hash = "sha256:5f2fa1b7afae1af32c88088c9828ad978de93ddda393d7ed414e553fee93dcab"}, ] jedi = [ {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, @@ -1559,8 +1591,8 @@ json5 = [ {file = "json5-0.9.8.tar.gz", hash = "sha256:0fa6e4d3ef062f93ba9cf2a9103fe8e68c7917dfa33519ae3ac8c7e48e3c84ff"}, ] jsonschema = [ - {file = "jsonschema-4.5.1-py3-none-any.whl", hash = "sha256:71b5e39324422543546572954ce71c67728922c104902cb7ce252e522235b33f"}, - {file = "jsonschema-4.5.1.tar.gz", hash = "sha256:7c6d882619340c3347a1bf7315e147e6d3dae439033ae6383d6acb908c101dfc"}, + {file = "jsonschema-4.6.1-py3-none-any.whl", hash = "sha256:5eb781753403847fb320f05e9ab2191725b58c5e7f97f1bed63285ca423159bc"}, + {file = "jsonschema-4.6.1.tar.gz", hash = "sha256:ec2802e6a37517f09d47d9ba107947589ae1d25ff557b925d83a321fc2aa5d3b"}, ] jupyter = [ {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, @@ -1568,12 +1600,12 @@ jupyter = [ {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, ] jupyter-client = [ - {file = "jupyter_client-7.3.1-py3-none-any.whl", hash = "sha256:404abe552540aff3527e66e16beb114b6b4ff58479d51a301f4eb9701e4f52ef"}, - {file = "jupyter_client-7.3.1.tar.gz", hash = "sha256:05d4ff6a0ade25138c6bb0fbeac7ddc26b5fe835e7dd816b64b4a45b931bdc0b"}, + {file = "jupyter_client-7.3.4-py3-none-any.whl", hash = "sha256:17d74b0d0a7b24f1c8c527b24fcf4607c56bee542ffe8e3418e50b21e514b621"}, + {file = "jupyter_client-7.3.4.tar.gz", hash = "sha256:aa9a6c32054b290374f95f73bb0cae91455c58dfb84f65c8591912b8f65e6d56"}, ] jupyter-console = [ - {file = "jupyter_console-6.4.3-py3-none-any.whl", hash = "sha256:e630bcb682c0088dda45688ad7c2424d4a825c8acf494cb036ced03ed0424841"}, - {file = "jupyter_console-6.4.3.tar.gz", hash = "sha256:55f32626b0be647a85e3217ddcdb22db69efc79e8b403b9771eb9ecc696019b5"}, + {file = "jupyter_console-6.4.4-py3-none-any.whl", hash = "sha256:756df7f4f60c986e7bc0172e4493d3830a7e6e75c08750bbe59c0a5403ad6dee"}, + {file = "jupyter_console-6.4.4.tar.gz", hash = "sha256:172f5335e31d600df61613a97b7f0352f2c8250bbd1092ef2d658f77249f89fb"}, ] jupyter-core = [ {file = "jupyter_core-4.10.0-py3-none-any.whl", hash = "sha256:e7f5212177af7ab34179690140f188aa9bf3d322d8155ed972cbded19f55b6f3"}, @@ -1592,8 +1624,8 @@ jupyterlab-server = [ {file = "jupyterlab_server-1.2.0.tar.gz", hash = "sha256:5431d9dde96659364b7cc877693d5d21e7b80cea7ae3959ecc2b87518e5f5d8c"}, ] jupyterlab-widgets = [ - {file = "jupyterlab_widgets-1.1.0-py3-none-any.whl", hash = "sha256:c2a9bd3789f120f64d73268c066ed3b000c56bc1dda217be5cdc43e7b4ebad3f"}, - {file = "jupyterlab_widgets-1.1.0.tar.gz", hash = "sha256:d5f41bc1713795385f718d44dcba47e1e1473c6289f28a95aa6b2c0782ee372a"}, + {file = "jupyterlab_widgets-1.1.1-py3-none-any.whl", hash = "sha256:90ab47d99da03a3697074acb23b2975ead1d6171aa41cb2812041a7f2a08177a"}, + {file = "jupyterlab_widgets-1.1.1.tar.gz", hash = "sha256:67d0ef1e407e0c42c8ab60b9d901cd7a4c68923650763f75bf17fb06c1943b79"}, ] jupytext = [ {file = "jupytext-1.13.8-py3-none-any.whl", hash = "sha256:625d2d2012763cc87d3f0dd60383516cec442c11894f53ad0c5ee5aa2a52caa2"}, @@ -1677,16 +1709,16 @@ mkdocs-jupyter = [ {file = "mkdocs-jupyter-0.19.0.tar.gz", hash = "sha256:40bb752658156706adabe6140551e5efe4164256861cc72f082bdaf50139575b"}, ] mkdocs-material = [ - {file = "mkdocs-material-8.2.15.tar.gz", hash = "sha256:93b57e53733051431cc83216446e774bdf08bf516a6251ff2f24974f45f98149"}, - {file = "mkdocs_material-8.2.15-py2.py3-none-any.whl", hash = "sha256:9d6c4ca1ceecc00b2e38c214665ed7605d275321dcaa22f38b9d1175edc58955"}, + {file = "mkdocs-material-8.3.8.tar.gz", hash = "sha256:b9cd305c3c29ef758931dae06e4aea0ca9f8bcc8ac6b2d45f10f932a015d6b83"}, + {file = "mkdocs_material-8.3.8-py2.py3-none-any.whl", hash = "sha256:949c75fa934d4b9ecc7b519964e58f0c9fc29f2ceb04736c85809cdbc403dfb5"}, ] mkdocs-material-extensions = [ {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, {file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"}, ] nbclient = [ - {file = "nbclient-0.6.3-py3-none-any.whl", hash = "sha256:2747ac9b385720d8a6c34f2f71e72cbe64aec6cadaadcc064a4df0b0e99c5874"}, - {file = "nbclient-0.6.3.tar.gz", hash = "sha256:b80726fc1fb89a0e8f8be1e77e28d0026b1e8ed90bc143c8a0c7622e4f8cdd9e"}, + {file = "nbclient-0.6.6-py3-none-any.whl", hash = "sha256:09bae4ea2df79fa6bc50aeb8278d8b79d2036792824337fa6eee834afae17312"}, + {file = "nbclient-0.6.6.tar.gz", hash = "sha256:0df76a7961d99a681b4796c74a1f2553b9f998851acc01896dce064ad19a9027"}, ] nbconvert = [ {file = "nbconvert-6.5.0-py3-none-any.whl", hash = "sha256:c56dd0b8978a1811a5654f74c727ff16ca87dd5a43abd435a1c49b840fcd8360"}, @@ -1701,42 +1733,47 @@ nest-asyncio = [ {file = "nest_asyncio-1.5.5.tar.gz", hash = "sha256:e442291cd942698be619823a17a86a5759eabe1f8613084790de189fe9e16d65"}, ] notebook = [ - {file = "notebook-6.4.11-py3-none-any.whl", hash = "sha256:b4a6baf2eba21ce67a0ca11a793d1781b06b8078f34d06c710742e55f3eee505"}, - {file = "notebook-6.4.11.tar.gz", hash = "sha256:709b1856a564fe53054796c80e17a67262071c86bfbdfa6b96aaa346113c555a"}, + {file = "notebook-6.4.12-py3-none-any.whl", hash = "sha256:8c07a3bb7640e371f8a609bdbb2366a1976c6a2589da8ef917f761a61e3ad8b1"}, + {file = "notebook-6.4.12.tar.gz", hash = "sha256:6268c9ec9048cff7a45405c990c29ac9ca40b0bc3ec29263d218c5e01f2b4e86"}, ] orjson = [ - {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, - {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, - {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, - {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, - {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, - {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, - {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, - {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, - {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, - {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, - {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, - {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, - {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, - {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, - {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, - {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, - {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, - {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, - {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, - {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, - {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, - {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, - {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, - {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, - {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, - {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, - {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, - {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, - {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, - {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, - {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, - {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, + {file = "orjson-3.7.5-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:bfa8d3412d1f73d8cceb5ce96cfb50ba897d3bc9acc5e2e13240a94a75fcdbdc"}, + {file = "orjson-3.7.5-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:fad043bd582ad4e9177d4d32173c3d388a0ab5a71ab51ce5a01aaee8ddf338d4"}, + {file = "orjson-3.7.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e481c8511bab48dbc2db7389944fa85b95fabceec6693fa5f0876cea4910cf73"}, + {file = "orjson-3.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3caade3cea3003263cb87f2c193e9dcdc82e83ae936631a494f980f677fc8a46"}, + {file = "orjson-3.7.5-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:928e1120057cea1f9a931740c840e0faeaf019ed3df767c499450057c3f878b7"}, + {file = "orjson-3.7.5-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:d849b269a55564821b64f3e781b2e7746fb5c39f28bfe27cf6330a43eb89ed2b"}, + {file = "orjson-3.7.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c124fffb72a9393f21ba27519e8a619d473b6b94c591045a8a206344425e2093"}, + {file = "orjson-3.7.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8d0983147121e9e87dddda7997c08331fdf0b26fad22a11e11bfc333169bb305"}, + {file = "orjson-3.7.5-cp310-none-win_amd64.whl", hash = "sha256:65a8d18fdaee45807b8bd7ead2898293d23d4d766cf42d63022a40758591a707"}, + {file = "orjson-3.7.5-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:fcdef342b0a810a15a559208b24f13198ce2252a441868e0265bdb82ba85b1eb"}, + {file = "orjson-3.7.5-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ad035d250d438cfd2a1d38dd54d5b800ca67290a89e14b5345c55b2fb0e186e0"}, + {file = "orjson-3.7.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7316ea00623121178139240fddc0bc2de3f730b0d93081c7f5c6780eea75417b"}, + {file = "orjson-3.7.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd46103e9d60a87e9497ccb72b6a32d0f12586d0abcd1a5a5a375bacad3b5f50"}, + {file = "orjson-3.7.5-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:78e23d0491a54d3a3cf658ee7e62134d96436850bbc6eb199e3a2514444de785"}, + {file = "orjson-3.7.5-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:dca21c76552b0b539b38121ffd397e129af6b2b0d9c586a96e33652691d3e87d"}, + {file = "orjson-3.7.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:376248b40b7c917c563311af1ce511f9e01c7e982bdf5c01d1287f7d9672cf95"}, + {file = "orjson-3.7.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4b0ab07bdc34fa54c56ab385926aadb89b6106498ed762297418189d97cc6c43"}, + {file = "orjson-3.7.5-cp37-none-win_amd64.whl", hash = "sha256:0893ff1e7952267b7e54062b9ceee670da81e52825d81f04473a40a88239200c"}, + {file = "orjson-3.7.5-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:d89e26508e50551acd97c96780be6ba7c755997985d5143c9222daab014f1bc2"}, + {file = "orjson-3.7.5-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:314ae3957a096baf0d58f9650e062bc6d1a3e554f7c8847b19cb9846134bcf62"}, + {file = "orjson-3.7.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16acac2ba4ab747acc1a8b3c72487d0a88031925f5a8662fa2dc25d812edaf10"}, + {file = "orjson-3.7.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:383ee9124f585cf75fc5fdfa01497fe89c0667b1d72c22bed2a07904bfb3d09d"}, + {file = "orjson-3.7.5-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:88a8be38e9be7cbc1227e3b4d946b5e9d3586149f92f5b78ce7a85b1c247e00c"}, + {file = "orjson-3.7.5-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:57a0e86d59c61b8cf91d84a9959b4c7f903d1243cee9b3d269aa5ea65ce2686f"}, + {file = "orjson-3.7.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:04468b96014ff953a0bc0db8ae89de4df33b5008cfa25de200deb7483eebdaa8"}, + {file = "orjson-3.7.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3202dafd6d54950b89eb872a74152f74440bc010bd5675eac39a31f940c5c545"}, + {file = "orjson-3.7.5-cp38-none-win_amd64.whl", hash = "sha256:c63bbea3fe5087b4586cd94393ecc368c7cd62018c9470e0175a483ebbcf2a8c"}, + {file = "orjson-3.7.5-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:828f4767fda30faeed7adaa2d004b400fb55d5ca3b8127ee053e9d62addadc16"}, + {file = "orjson-3.7.5-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9be3b6411a6ca75aa255f1d0139d36bdce80159738932d7311abaa82e28f2021"}, + {file = "orjson-3.7.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1ff20a4ee6571e2a4a432e2d4a6ad82cbc6a698acf860b5ceb066fdae3b859"}, + {file = "orjson-3.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e19f12762ef7693999197be1860df204589f4e907d3a7c76ad6aa764ee94877"}, + {file = "orjson-3.7.5-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:5e3c1373b069fe10cb5e84c1df12a89e1a40b04d95af1ea0e113ce9dc455db53"}, + {file = "orjson-3.7.5-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:215102b89fec7e3f8a760a6667fee3ec9fd3f1e2a89293265141e884c5a239f5"}, + {file = "orjson-3.7.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a4a221479e6b52305ce572e9a8403bbc47815ef1ed1c41d378f4de8efaa7b57c"}, + {file = "orjson-3.7.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:76e91ea4c73a9e28924bb2e1f8ebd29b969b7b3d4b6c30e17b408c36d5f79f46"}, + {file = "orjson-3.7.5-cp39-none-win_amd64.whl", hash = "sha256:d444bb261b6ce58ab7c3998cbb72a0ca2b7b4d1e120e4e22b4d2c4a927960ca6"}, + {file = "orjson-3.7.5.tar.gz", hash = "sha256:47c9d2b3f993b630b1efa58ad128b5d8a61cd7cd5c0cec8dad043a1ab9d02866"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1763,68 +1800,58 @@ prometheus-client = [ {file = "prometheus_client-0.14.1.tar.gz", hash = "sha256:5459c427624961076277fdc6dc50540e2bacb98eebde99886e59ec55ed92093a"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.29-py3-none-any.whl", hash = "sha256:62291dad495e665fca0bda814e342c69952086afb0f4094d0893d357e5c78752"}, - {file = "prompt_toolkit-3.0.29.tar.gz", hash = "sha256:bd640f60e8cecd74f0dc249713d433ace2ddc62b65ee07f96d358e0b152b6ea7"}, + {file = "prompt_toolkit-3.0.30-py3-none-any.whl", hash = "sha256:d8916d3f62a7b67ab353a952ce4ced6a1d2587dfe9ef8ebc30dd7c386751f289"}, + {file = "prompt_toolkit-3.0.30.tar.gz", hash = "sha256:859b283c50bde45f5f97829f77a4674d1c1fcd88539364f1b28a37805cfd89c0"}, ] protobuf = [ - {file = "protobuf-3.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996"}, - {file = "protobuf-3.20.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3"}, - {file = "protobuf-3.20.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde"}, - {file = "protobuf-3.20.1-cp310-cp310-win32.whl", hash = "sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c"}, - {file = "protobuf-3.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7"}, - {file = "protobuf-3.20.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153"}, - {file = "protobuf-3.20.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f"}, - {file = "protobuf-3.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20"}, - {file = "protobuf-3.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531"}, - {file = "protobuf-3.20.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e"}, - {file = "protobuf-3.20.1-cp37-cp37m-win32.whl", hash = "sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c"}, - {file = "protobuf-3.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067"}, - {file = "protobuf-3.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf"}, - {file = "protobuf-3.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab"}, - {file = "protobuf-3.20.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c"}, - {file = "protobuf-3.20.1-cp38-cp38-win32.whl", hash = "sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7"}, - {file = "protobuf-3.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739"}, - {file = "protobuf-3.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7"}, - {file = "protobuf-3.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f"}, - {file = "protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9"}, - {file = "protobuf-3.20.1-cp39-cp39-win32.whl", hash = "sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8"}, - {file = "protobuf-3.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91"}, - {file = "protobuf-3.20.1-py2.py3-none-any.whl", hash = "sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388"}, - {file = "protobuf-3.20.1.tar.gz", hash = "sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9"}, + {file = "protobuf-4.21.2-cp310-abi3-win32.whl", hash = "sha256:d622dc75e289e8b3031dd8b4e87df508f11a6b3d86a49fb50256af7ce030d35b"}, + {file = "protobuf-4.21.2-cp310-abi3-win_amd64.whl", hash = "sha256:4758b9c22ad0486639a68cea58d38571f233019a73212d78476ec648f68a49a3"}, + {file = "protobuf-4.21.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:e3d3df3292ab4bae85213b9ebef566b5aedb45f97425a92fac5b2e431d31e71c"}, + {file = "protobuf-4.21.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:29eaf8e9db33bc3bae14576ad61370aa2b64ea5d6e6cd705042692e5e0404b10"}, + {file = "protobuf-4.21.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:ef0768a609a02b2b412fa0f59f1242f1597e9bb15188d043f3fde09115ca6c69"}, + {file = "protobuf-4.21.2-cp37-cp37m-win32.whl", hash = "sha256:5f8c7488e74024fa12b46aab4258f707d7d6e94c8d322d7c45cc13770f66ab59"}, + {file = "protobuf-4.21.2-cp37-cp37m-win_amd64.whl", hash = "sha256:57a593e40257ab4f164fe6e171651b1386c98f8ec5f5a8643642889c50d4f3c4"}, + {file = "protobuf-4.21.2-cp38-cp38-win32.whl", hash = "sha256:b82ac05b0651a4d2b9d56f5aeef3d711f5858eb4b71c13d77553739e5930a74a"}, + {file = "protobuf-4.21.2-cp38-cp38-win_amd64.whl", hash = "sha256:f2f43ae8dff452aee3026b59ea0a09245ab2529a55a0984992e76bcf848610e1"}, + {file = "protobuf-4.21.2-cp39-cp39-win32.whl", hash = "sha256:7b2dcca25d88ec77358eed3d031c8260b5bf3023fff03a31c9584591c5910833"}, + {file = "protobuf-4.21.2-cp39-cp39-win_amd64.whl", hash = "sha256:095fda15fe04a79c9f0edab09b424be46dd057b15986d235b84c8cea91659df7"}, + {file = "protobuf-4.21.2-py2.py3-none-any.whl", hash = "sha256:9b42afb67e19010cdda057e439574ccd944902ea14b0d52ba0bfba2aad50858d"}, + {file = "protobuf-4.21.2-py3-none-any.whl", hash = "sha256:853708afc3a7eed4df28a8d4bd4812f829f8d736c104dd8d584ccff27969e311"}, + {file = "protobuf-4.21.2.tar.gz", hash = "sha256:863f65e137d9de4a76cac39ae731a19bea1c30997f512ecf0dc9348112313401"}, ] psutil = [ - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"}, - {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"}, - {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"}, - {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"}, - {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"}, - {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"}, - {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"}, - {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"}, - {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"}, - {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"}, - {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"}, - {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"}, - {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"}, - {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"}, - {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"}, - {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"}, - {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"}, - {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"}, - {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"}, + {file = "psutil-5.9.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:799759d809c31aab5fe4579e50addf84565e71c1dc9f1c31258f159ff70d3f87"}, + {file = "psutil-5.9.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9272167b5f5fbfe16945be3db475b3ce8d792386907e673a209da686176552af"}, + {file = "psutil-5.9.1-cp27-cp27m-win32.whl", hash = "sha256:0904727e0b0a038830b019551cf3204dd48ef5c6868adc776e06e93d615fc5fc"}, + {file = "psutil-5.9.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e7e10454cb1ab62cc6ce776e1c135a64045a11ec4c6d254d3f7689c16eb3efd2"}, + {file = "psutil-5.9.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:56960b9e8edcca1456f8c86a196f0c3d8e3e361320071c93378d41445ffd28b0"}, + {file = "psutil-5.9.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:44d1826150d49ffd62035785a9e2c56afcea66e55b43b8b630d7706276e87f22"}, + {file = "psutil-5.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7be9d7f5b0d206f0bbc3794b8e16fb7dbc53ec9e40bbe8787c6f2d38efcf6c9"}, + {file = "psutil-5.9.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd9246e4cdd5b554a2ddd97c157e292ac11ef3e7af25ac56b08b455c829dca8"}, + {file = "psutil-5.9.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29a442e25fab1f4d05e2655bb1b8ab6887981838d22effa2396d584b740194de"}, + {file = "psutil-5.9.1-cp310-cp310-win32.whl", hash = "sha256:20b27771b077dcaa0de1de3ad52d22538fe101f9946d6dc7869e6f694f079329"}, + {file = "psutil-5.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:58678bbadae12e0db55186dc58f2888839228ac9f41cc7848853539b70490021"}, + {file = "psutil-5.9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3a76ad658641172d9c6e593de6fe248ddde825b5866464c3b2ee26c35da9d237"}, + {file = "psutil-5.9.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6a11e48cb93a5fa606306493f439b4aa7c56cb03fc9ace7f6bfa21aaf07c453"}, + {file = "psutil-5.9.1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068935df39055bf27a29824b95c801c7a5130f118b806eee663cad28dca97685"}, + {file = "psutil-5.9.1-cp36-cp36m-win32.whl", hash = "sha256:0f15a19a05f39a09327345bc279c1ba4a8cfb0172cc0d3c7f7d16c813b2e7d36"}, + {file = "psutil-5.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:db417f0865f90bdc07fa30e1aadc69b6f4cad7f86324b02aa842034efe8d8c4d"}, + {file = "psutil-5.9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:91c7ff2a40c373d0cc9121d54bc5f31c4fa09c346528e6a08d1845bce5771ffc"}, + {file = "psutil-5.9.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fea896b54f3a4ae6f790ac1d017101252c93f6fe075d0e7571543510f11d2676"}, + {file = "psutil-5.9.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3054e923204b8e9c23a55b23b6df73a8089ae1d075cb0bf711d3e9da1724ded4"}, + {file = "psutil-5.9.1-cp37-cp37m-win32.whl", hash = "sha256:d2d006286fbcb60f0b391741f520862e9b69f4019b4d738a2a45728c7e952f1b"}, + {file = "psutil-5.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b14ee12da9338f5e5b3a3ef7ca58b3cba30f5b66f7662159762932e6d0b8f680"}, + {file = "psutil-5.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:19f36c16012ba9cfc742604df189f2f28d2720e23ff7d1e81602dbe066be9fd1"}, + {file = "psutil-5.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:944c4b4b82dc4a1b805329c980f270f170fdc9945464223f2ec8e57563139cf4"}, + {file = "psutil-5.9.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b6750a73a9c4a4e689490ccb862d53c7b976a2a35c4e1846d049dcc3f17d83b"}, + {file = "psutil-5.9.1-cp38-cp38-win32.whl", hash = "sha256:a8746bfe4e8f659528c5c7e9af5090c5a7d252f32b2e859c584ef7d8efb1e689"}, + {file = "psutil-5.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:79c9108d9aa7fa6fba6e668b61b82facc067a6b81517cab34d07a84aa89f3df0"}, + {file = "psutil-5.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28976df6c64ddd6320d281128817f32c29b539a52bdae5e192537bc338a9ec81"}, + {file = "psutil-5.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b88f75005586131276634027f4219d06e0561292be8bd6bc7f2f00bdabd63c4e"}, + {file = "psutil-5.9.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:645bd4f7bb5b8633803e0b6746ff1628724668681a434482546887d22c7a9537"}, + {file = "psutil-5.9.1-cp39-cp39-win32.whl", hash = "sha256:32c52611756096ae91f5d1499fe6c53b86f4a9ada147ee42db4991ba1520e574"}, + {file = "psutil-5.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:f65f9a46d984b8cd9b3750c2bdb419b2996895b005aefa6cbaba9a143b1ce2c5"}, + {file = "psutil-5.9.1.tar.gz", hash = "sha256:57f1819b5d9e95cdfb0c881a8a5b7d542ed0b7c522d575706a80bedc848c8954"}, ] ptyprocess = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -1847,8 +1874,8 @@ pygments = [ {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, ] pymdown-extensions = [ - {file = "pymdown_extensions-9.4-py3-none-any.whl", hash = "sha256:5b7432456bf555ce2b0ab3c2439401084cda8110f24f6b3ecef952b8313dfa1b"}, - {file = "pymdown_extensions-9.4.tar.gz", hash = "sha256:1baa22a60550f731630474cad28feb0405c8101f1a7ddc3ec0ed86ee510bcc43"}, + {file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"}, + {file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"}, ] pyparsing = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, @@ -1877,11 +1904,6 @@ pyrsistent = [ {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"}, {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, ] -pysocks = [ - {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, - {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, - {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, -] python-dateutil = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, @@ -1949,65 +1971,75 @@ pyyaml-env-tag = [ {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] pyzmq = [ - {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd"}, - {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149"}, - {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93"}, - {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea"}, - {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f"}, - {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f907c7359ce8bf7f7e63c82f75ad0223384105f5126f313400b7e8004d9b33c3"}, - {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:902319cfe23366595d3fa769b5b751e6ee6750a0a64c5d9f757d624b2ac3519e"}, - {file = "pyzmq-22.3.0-cp310-cp310-win32.whl", hash = "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d"}, - {file = "pyzmq-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd"}, - {file = "pyzmq-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268"}, - {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e"}, - {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0"}, - {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364"}, - {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:62bcade20813796c426409a3e7423862d50ff0639f5a2a95be4b85b09a618666"}, - {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ea5a79e808baef98c48c884effce05c31a0698c1057de8fc1c688891043c1ce1"}, - {file = "pyzmq-22.3.0-cp36-cp36m-win32.whl", hash = "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9"}, - {file = "pyzmq-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b"}, - {file = "pyzmq-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70"}, - {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df"}, - {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7"}, - {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c"}, - {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:08c4e315a76ef26eb833511ebf3fa87d182152adf43dedee8d79f998a2162a0b"}, - {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:badb868fff14cfd0e200eaa845887b1011146a7d26d579aaa7f966c203736b92"}, - {file = "pyzmq-22.3.0-cp37-cp37m-win32.whl", hash = "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d"}, - {file = "pyzmq-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d"}, - {file = "pyzmq-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a"}, - {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0"}, - {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8"}, - {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74"}, - {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:468bd59a588e276961a918a3060948ae68f6ff5a7fa10bb2f9160c18fe341067"}, - {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c88fa7410e9fc471e0858638f403739ee869924dd8e4ae26748496466e27ac59"}, - {file = "pyzmq-22.3.0-cp38-cp38-win32.whl", hash = "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7"}, - {file = "pyzmq-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45"}, - {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356"}, - {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973"}, - {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36"}, - {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57"}, - {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2"}, - {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:53f4fd13976789ffafedd4d46f954c7bb01146121812b72b4ddca286034df966"}, - {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1b5d457acbadcf8b27561deeaa386b0217f47626b29672fa7bd31deb6e91e1b"}, - {file = "pyzmq-22.3.0-cp39-cp39-win32.whl", hash = "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b"}, - {file = "pyzmq-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2"}, - {file = "pyzmq-22.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f"}, - {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf"}, - {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb"}, - {file = "pyzmq-22.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115"}, - {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"}, + {file = "pyzmq-23.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:22ac0243a41798e3eb5d5714b28c2f28e3d10792dffbc8a5fca092f975fdeceb"}, + {file = "pyzmq-23.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f685003d836ad0e5d4f08d1e024ee3ac7816eb2f873b2266306eef858f058133"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d4651de7316ec8560afe430fb042c0782ed8ac54c0be43a515944d7c78fddac8"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bcc6953e47bcfc9028ddf9ab2a321a3c51d7cc969db65edec092019bb837959f"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e08671dc202a1880fa522f921f35ca5925ba30da8bc96228d74a8f0643ead9c"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de727ea906033b30527b4a99498f19aca3f4d1073230a958679a5b726e2784e0"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5aa9da520e4bb8cee8189f2f541701405e7690745094ded7a37b425d60527ea"}, + {file = "pyzmq-23.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f3ff6abde52e702397949054cb5b06c1c75b5d6542f6a2ce029e46f71ffbbbf2"}, + {file = "pyzmq-23.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e2e2db5c6ef376e97c912733dfc24406f5949474d03e800d5f07b6aca4d870af"}, + {file = "pyzmq-23.2.0-cp310-cp310-win32.whl", hash = "sha256:e669913cb2179507628419ec4f0e453e48ce6f924de5884d396f18c31836089c"}, + {file = "pyzmq-23.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a3dc339f7bc185d5fd0fd976242a5baf35de404d467e056484def8a4dd95868b"}, + {file = "pyzmq-23.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:30c365e60c39c53f8eea042b37ea28304ffa6558fb7241cf278745095a5757da"}, + {file = "pyzmq-23.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c2d8b69a2bf239ae3d987537bf3fbc2b044a405394cf4c258fc684971dd48b2"}, + {file = "pyzmq-23.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:602835e5672ca9ca1d78e6c148fb28c4f91b748ebc41fbd2f479d8763d58bc9b"}, + {file = "pyzmq-23.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:831da96ba3f36cc892f0afbb4fb89b28b61b387261676e55d55a682addbd29f7"}, + {file = "pyzmq-23.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c8dec8a2f3f0bb462e6439df436cd8c7ec37968e90b4209ac621e7fbc0ed3b00"}, + {file = "pyzmq-23.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:814e5aaf0c3be9991a59066eafb2d6e117aed6b413e3e7e9be45d4e55f5e2748"}, + {file = "pyzmq-23.2.0-cp36-cp36m-win32.whl", hash = "sha256:8496a2a5efd055c61ac2c6a18116c768a25c644b6747dcfde43e91620ab3453c"}, + {file = "pyzmq-23.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:60746a7e8558655420a69441c0a1d47ed225ed3ac355920b96a96d0554ef7e6b"}, + {file = "pyzmq-23.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5cb642e94337b0c76c9c8cb9bfb0f8a78654575847d080d3e1504f312d691fc3"}, + {file = "pyzmq-23.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:444f7d615d5f686d0ef508b9edfa8a286e6d89f449a1ba37b60ef69d869220a3"}, + {file = "pyzmq-23.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c9638e0057e3f1a8b7c5ce33c7575349d9183a033a19b5676ad55096ae36820b"}, + {file = "pyzmq-23.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:004a431dfa0459123e6f4660d7e3c4ac19217d134ca38bacfffb2e78716fe944"}, + {file = "pyzmq-23.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5592fb4316f895922b1cacb91b04a0fa09d6f6f19bbab4442b4d0a0825177b93"}, + {file = "pyzmq-23.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c0a5f987d73fd9b46c3d180891f829afda714ab6bab30a1218724d4a0a63afd8"}, + {file = "pyzmq-23.2.0-cp37-cp37m-win32.whl", hash = "sha256:d11628212fd731b8986f1561d9bb3f8c38d9c15b330c3d8a88963519fbcd553b"}, + {file = "pyzmq-23.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:558f5f636e3e65f261b64925e8b190e8689e334911595394572cc7523879006d"}, + {file = "pyzmq-23.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61b97f624da42813f74977425a3a6144d604ea21cf065616d36ea3a866d92c1c"}, + {file = "pyzmq-23.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:693c96ae4d975eb8efa1639670e9b1fac0c3f98b7845b65c0f369141fb4bb21f"}, + {file = "pyzmq-23.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b054525c9f7e240562185bf21671ca16d56bde92e9bd0f822c07dec7626b704"}, + {file = "pyzmq-23.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:859059caf564f0c9398c9005278055ed3d37af4d73de6b1597821193b04ca09b"}, + {file = "pyzmq-23.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8355744fdbdeac5cfadfa4f38b82029b5f2b8cab7472a33453a217a7f3a9dce2"}, + {file = "pyzmq-23.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:420b9abd1a7330687a095373b8280a20cdee04342fbc8ccb3b56d9ec8efd4e62"}, + {file = "pyzmq-23.2.0-cp38-cp38-win32.whl", hash = "sha256:59928dfebe93cf1e203e3cb0fd5d5dd384da56b99c8305f2e1b0a933751710f6"}, + {file = "pyzmq-23.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:c882f1d4f96fbd807e92c334251d8ebd159a1ef89059ccd386ddea83fdb91bd8"}, + {file = "pyzmq-23.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:ced12075cdf3c7332ecc1960f77f7439d5ebb8ea20bbd3c34c8299e694f1b0a1"}, + {file = "pyzmq-23.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3a4d87342c2737fbb9eee5c33c792db27b36b04957b4e6b7edd73a5b239a2a13"}, + {file = "pyzmq-23.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:99cedf38eaddf263cf7e2a50e405f12c02cedf6d9df00a0d9c5d7b9417b57f76"}, + {file = "pyzmq-23.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1610260cc672975723fcf7705c69a95f3b88802a594c9867781bedd9b13422c"}, + {file = "pyzmq-23.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c223a13555444707a0a7ebc6f9ee63053147c8c082bd1a31fd1207a03e8b0500"}, + {file = "pyzmq-23.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5fdb00d65ec44b10cc6b9b6318ef1363b81647a4aa3270ca39565eadb2d1201"}, + {file = "pyzmq-23.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:984b232802eddf9f0be264a4d57a10b3a1fd7319df14ee6fc7b41c6d155a3e6c"}, + {file = "pyzmq-23.2.0-cp39-cp39-win32.whl", hash = "sha256:f146648941cadaaaf01254a75651a23c08159d009d36c5af42a7cc200a5e53ec"}, + {file = "pyzmq-23.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:83005d8928f8a5cebcfb33af3bfb84b1ad65d882b899141a331cc5d07d89f093"}, + {file = "pyzmq-23.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fee86542dc4ee8229e023003e3939b4d58cc2453922cf127778b69505fc9064b"}, + {file = "pyzmq-23.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5d57542429df6acff02ff022067aa75b677603cee70e3abb9742787545eec966"}, + {file = "pyzmq-23.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:057b154471e096e2dda147f7b057041acc303bb7ca4aa24c3b88c6cecdd78717"}, + {file = "pyzmq-23.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5d92e7cbeab7f70b08cc0f27255b0bb2500afc30f31075bca0b1cb87735d186c"}, + {file = "pyzmq-23.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eb4a573a8499685d62545e806d8fd143c84ac8b3439f925cd92c8763f0ed9bd7"}, + {file = "pyzmq-23.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:da338e2728410d74ddeb1479ec67cfba73311607037455a40f92b6f5c62bf11d"}, + {file = "pyzmq-23.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1b2a21f595f8cc549abd6c8de1fcd34c83441e35fb24b8a59bf161889c62a486"}, + {file = "pyzmq-23.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8c0f4d6f8c985bab83792be26ff3233940ba42e22237610ac50cbcfc10a5c235"}, + {file = "pyzmq-23.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bbabd1df23bf63ae829e81200034c0e433499275a6ed29ca1a912ea7629426d9"}, + {file = "pyzmq-23.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21552624ce69e69f7924f413b802b1fb554f4c0497f837810e429faa1cd4f163"}, + {file = "pyzmq-23.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c616893a577e9d6773a3836732fd7e2a729157a108b8fccd31c87512fa01671a"}, + {file = "pyzmq-23.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ce4f71e17fa849de41a06109030d3f6815fcc33338bf98dd0dde6d456d33c929"}, + {file = "pyzmq-23.2.0.tar.gz", hash = "sha256:a51f12a8719aad9dcfb55d456022f16b90abc8dde7d3ca93ce3120b40e3fa169"}, ] qtconsole = [ - {file = "qtconsole-5.3.0-py3-none-any.whl", hash = "sha256:75f2ded876444454edcb5a53262149e33b53db3a4a53116b7c3df52830905b0f"}, - {file = "qtconsole-5.3.0.tar.gz", hash = "sha256:8e3520fdc75e46abc4cc6cffeca16fa2652754109b8ae839fa28e27d1eba5625"}, + {file = "qtconsole-5.3.1-py3-none-any.whl", hash = "sha256:d364592d7ede3257f1e17fcdbfd339c26e2cc638ca4fa4ee56a724e26ea13c81"}, + {file = "qtconsole-5.3.1.tar.gz", hash = "sha256:b73723fac43938b684dcb237a88510dc7721c43a726cea8ade179a2927c0a2f3"}, ] qtpy = [ {file = "QtPy-2.1.0-py3-none-any.whl", hash = "sha256:aee0586081f943029312becece9f63977b0a9e3788f77a6ac8cc74802bb173d6"}, {file = "QtPy-2.1.0.tar.gz", hash = "sha256:ca8cd4217175186344299ee4c0f7e7adcf362c70852ba35b255a534077025c06"}, ] requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] send2trash = [ {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, @@ -2022,8 +2054,8 @@ soupsieve = [ {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, ] stack-data = [ - {file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"}, - {file = "stack_data-0.2.0.tar.gz", hash = "sha256:45692d41bd633a9503a5195552df22b583caf16f0b27c4e58c98d88c8b648e12"}, + {file = "stack_data-0.3.0-py3-none-any.whl", hash = "sha256:aa1d52d14d09c7a9a12bb740e6bdfffe0f5e8f4f9218d85e7c73a8c37f7ae38d"}, + {file = "stack_data-0.3.0.tar.gz", hash = "sha256:77bec1402dcd0987e9022326473fdbcc767304892a533ed8c29888dacb7dddbc"}, ] stringcase = [ {file = "stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008"}, @@ -2084,43 +2116,43 @@ tornado = [ {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, ] traitlets = [ - {file = "traitlets-5.2.1.post0-py3-none-any.whl", hash = "sha256:f44b708d33d98b0addb40c29d148a761f44af740603a8fd0e2f8b5b27cf0f087"}, - {file = "traitlets-5.2.1.post0.tar.gz", hash = "sha256:70815ecb20ec619d1af28910ade523383be13754283aef90528eb3d47b77c5db"}, + {file = "traitlets-5.3.0-py3-none-any.whl", hash = "sha256:65fa18961659635933100db8ca120ef6220555286949774b9cfc106f941d1c7a"}, + {file = "traitlets-5.3.0.tar.gz", hash = "sha256:0bb9f1f9f017aa8ec187d8b1b2a7a6626a2a1d877116baba52a129bfa124f8e2"}, ] urllib3 = [ {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] waitress = [ - {file = "waitress-2.1.1-py3-none-any.whl", hash = "sha256:c549f5b2b4afd44d9d97d7cec79f3ef581e25d832827f415dc175327af674aa8"}, - {file = "waitress-2.1.1.tar.gz", hash = "sha256:e2e60576cf14a1539da79f7b7ee1e79a71e64f366a0b47db54a15e971f57bb16"}, + {file = "waitress-2.1.2-py3-none-any.whl", hash = "sha256:7500c9625927c8ec60f54377d590f67b30c8e70ef4b8894214ac6e4cad233d2a"}, + {file = "waitress-2.1.2.tar.gz", hash = "sha256:780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba"}, ] watchdog = [ - {file = "watchdog-2.1.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:676263bee67b165f16b05abc52acc7a94feac5b5ab2449b491f1a97638a79277"}, - {file = "watchdog-2.1.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aa68d2d9a89d686fae99d28a6edf3b18595e78f5adf4f5c18fbfda549ac0f20c"}, - {file = "watchdog-2.1.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e2e51c53666850c3ecffe9d265fc5d7351db644de17b15e9c685dd3cdcd6f97"}, - {file = "watchdog-2.1.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7721ac736170b191c50806f43357407138c6748e4eb3e69b071397f7f7aaeedd"}, - {file = "watchdog-2.1.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ce7376aed3da5fd777483fe5ebc8475a440c6d18f23998024f832134b2938e7b"}, - {file = "watchdog-2.1.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f9ee4c6bf3a1b2ed6be90a2d78f3f4bbd8105b6390c04a86eb48ed67bbfa0b0b"}, - {file = "watchdog-2.1.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:68dbe75e0fa1ba4d73ab3f8e67b21770fbed0651d32ce515cd38919a26873266"}, - {file = "watchdog-2.1.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0c520009b8cce79099237d810aaa19bc920941c268578436b62013b2f0102320"}, - {file = "watchdog-2.1.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efcc8cbc1b43902571b3dce7ef53003f5b97fe4f275fe0489565fc6e2ebe3314"}, - {file = "watchdog-2.1.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:746e4c197ec1083581bb1f64d07d1136accf03437badb5ff8fcb862565c193b2"}, - {file = "watchdog-2.1.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ae17b6be788fb8e4d8753d8d599de948f0275a232416e16436363c682c6f850"}, - {file = "watchdog-2.1.8-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ddde157dc1447d8130cb5b8df102fad845916fe4335e3d3c3f44c16565becbb7"}, - {file = "watchdog-2.1.8-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4978db33fc0934c92013ee163a9db158ec216099b69fce5aec790aba704da412"}, - {file = "watchdog-2.1.8-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b962de4d7d92ff78fb2dbc6a0cb292a679dea879a0eb5568911484d56545b153"}, - {file = "watchdog-2.1.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1e5d0fdfaa265c29dc12621913a76ae99656cf7587d03950dfeb3595e5a26102"}, - {file = "watchdog-2.1.8-py3-none-manylinux2014_armv7l.whl", hash = "sha256:036ed15f7cd656351bf4e17244447be0a09a61aaa92014332d50719fc5973bc0"}, - {file = "watchdog-2.1.8-py3-none-manylinux2014_i686.whl", hash = "sha256:2962628a8777650703e8f6f2593065884c602df7bae95759b2df267bd89b2ef5"}, - {file = "watchdog-2.1.8-py3-none-manylinux2014_ppc64.whl", hash = "sha256:156ec3a94695ea68cfb83454b98754af6e276031ba1ae7ae724dc6bf8973b92a"}, - {file = "watchdog-2.1.8-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:47598fe6713fc1fee86b1ca85c9cbe77e9b72d002d6adeab9c3b608f8a5ead10"}, - {file = "watchdog-2.1.8-py3-none-manylinux2014_s390x.whl", hash = "sha256:fed4de6e45a4f16e4046ea00917b4fe1700b97244e5d114f594b4a1b9de6bed8"}, - {file = "watchdog-2.1.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:24dedcc3ce75e150f2a1d704661f6879764461a481ba15a57dc80543de46021c"}, - {file = "watchdog-2.1.8-py3-none-win32.whl", hash = "sha256:6ddf67bc9f413791072e3afb466e46cc72c6799ba73dea18439b412e8f2e3257"}, - {file = "watchdog-2.1.8-py3-none-win_amd64.whl", hash = "sha256:88ef3e8640ef0a64b7ad7394b0f23384f58ac19dd759da7eaa9bc04b2898943f"}, - {file = "watchdog-2.1.8-py3-none-win_ia64.whl", hash = "sha256:0fb60c7d31474b21acba54079ce9ff0136411183e9a591369417cddb1d7d00d7"}, - {file = "watchdog-2.1.8.tar.gz", hash = "sha256:6d03149126864abd32715d4e9267d2754cede25a69052901399356ad3bc5ecff"}, + {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"}, + {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"}, + {file = "watchdog-2.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee3e38a6cc050a8830089f79cbec8a3878ec2fe5160cdb2dc8ccb6def8552658"}, + {file = "watchdog-2.1.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64a27aed691408a6abd83394b38503e8176f69031ca25d64131d8d640a307591"}, + {file = "watchdog-2.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:195fc70c6e41237362ba720e9aaf394f8178bfc7fa68207f112d108edef1af33"}, + {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bfc4d351e6348d6ec51df007432e6fe80adb53fd41183716017026af03427846"}, + {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8250546a98388cbc00c3ee3cc5cf96799b5a595270dfcfa855491a64b86ef8c3"}, + {file = "watchdog-2.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:117ffc6ec261639a0209a3252546b12800670d4bf5f84fbd355957a0595fe654"}, + {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97f9752208f5154e9e7b76acc8c4f5a58801b338de2af14e7e181ee3b28a5d39"}, + {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:247dcf1df956daa24828bfea5a138d0e7a7c98b1a47cf1fa5b0c3c16241fcbb7"}, + {file = "watchdog-2.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:226b3c6c468ce72051a4c15a4cc2ef317c32590d82ba0b330403cafd98a62cfd"}, + {file = "watchdog-2.1.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9820fe47c20c13e3c9dd544d3706a2a26c02b2b43c993b62fcd8011bcc0adb3"}, + {file = "watchdog-2.1.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70af927aa1613ded6a68089a9262a009fbdf819f46d09c1a908d4b36e1ba2b2d"}, + {file = "watchdog-2.1.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed80a1628cee19f5cfc6bb74e173f1b4189eb532e705e2a13e3250312a62e0c9"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9f05a5f7c12452f6a27203f76779ae3f46fa30f1dd833037ea8cbc2887c60213"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_armv7l.whl", hash = "sha256:255bb5758f7e89b1a13c05a5bceccec2219f8995a3a4c4d6968fe1de6a3b2892"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_i686.whl", hash = "sha256:d3dda00aca282b26194bdd0adec21e4c21e916956d972369359ba63ade616153"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64.whl", hash = "sha256:186f6c55abc5e03872ae14c2f294a153ec7292f807af99f57611acc8caa75306"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:083171652584e1b8829581f965b9b7723ca5f9a2cd7e20271edf264cfd7c1412"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_s390x.whl", hash = "sha256:b530ae007a5f5d50b7fbba96634c7ee21abec70dc3e7f0233339c81943848dc1"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4f4e1c4aa54fb86316a62a87b3378c025e228178d55481d30d857c6c438897d6"}, + {file = "watchdog-2.1.9-py3-none-win32.whl", hash = "sha256:5952135968519e2447a01875a6f5fc8c03190b24d14ee52b0f4b1682259520b1"}, + {file = "watchdog-2.1.9-py3-none-win_amd64.whl", hash = "sha256:7a833211f49143c3d336729b0020ffd1274078e94b0ae42e22f596999f50279c"}, + {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"}, + {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -2139,8 +2171,8 @@ webtest = [ {file = "WebTest-2.0.35.tar.gz", hash = "sha256:aac168b5b2b4f200af4e35867cf316712210e3d5db81c1cbdff38722647bb087"}, ] widgetsnbextension = [ - {file = "widgetsnbextension-3.6.0-py2.py3-none-any.whl", hash = "sha256:4fd321cad39fdcf8a8e248a657202d42917ada8e8ed5dd3f60f073e0d54ceabd"}, - {file = "widgetsnbextension-3.6.0.tar.gz", hash = "sha256:e84a7a9fcb9baf3d57106e184a7389a8f8eb935bf741a5eb9d60aa18cc029a80"}, + {file = "widgetsnbextension-3.6.1-py2.py3-none-any.whl", hash = "sha256:954e0faefdd414e4e013f17dbc7fd86f24cf1d243a3ac85d5f0fc2c2d2b50c66"}, + {file = "widgetsnbextension-3.6.1.tar.gz", hash = "sha256:9c84ae64c2893c7cbe2eaafc7505221a795c27d68938454034ac487319a75b10"}, ] zipp = [ {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, diff --git a/src/requirements-dev.txt b/src/requirements-dev.txt index ca11720..13987e1 100644 --- a/src/requirements-dev.txt +++ b/src/requirements-dev.txt @@ -1,110 +1,109 @@ # THE FILE WAS GENERATED BY POETRY, DO NOT EDIT! -anki==2.1.49; python_version >= "3.8" -appnope==0.1.3; platform_system == "Darwin" and python_version >= "3.8" and sys_platform == "darwin" -argon2-cffi-bindings==21.2.0; python_version >= "3.7" -argon2-cffi==21.3.0; python_version >= "3.7" -asttokens==2.0.5; python_version >= "3.8" -attrs==21.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -backcall==0.2.0; python_version >= "3.8" -beautifulsoup4==4.11.1; python_full_version >= "3.6.0" -bleach==5.0.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -cffi==1.15.0; implementation_name == "pypy" and python_version >= "3.7" -charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.8" -click==8.1.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -colorama==0.4.4; python_version >= "3.8" and python_full_version < "3.0.0" and platform_system == "Windows" and sys_platform == "win32" or platform_system == "Windows" and python_version >= "3.8" and python_full_version >= "3.5.0" and sys_platform == "win32" -debugpy==1.6.0; python_version >= "3.7" -decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") -defusedxml==0.7.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -distro==1.7.0; python_version >= "3.6" -entrypoints==0.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -executing==0.8.3; python_version >= "3.8" -fastjsonschema==2.15.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -ghp-import==2.1.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" -idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -importlib-metadata==4.11.3; python_version < "3.10" and python_version >= "3.8" and python_full_version >= "3.7.1" -importlib-resources==5.7.1; python_version < "3.9" and python_version >= "3.7" and python_full_version >= "3.7.1" -ipykernel==6.13.0; python_version >= "3.7" -ipython-genutils==0.2.0; python_version >= "3.7" -ipython==8.3.0; python_version >= "3.8" -ipywidgets==7.7.0 -jedi==0.18.1; python_version >= "3.8" -jinja2==3.1.2; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -json5==0.9.8; python_version >= "3.5" -jsonschema==4.5.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -jupyter-client==7.3.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -jupyter-console==6.4.3; python_version >= "3.6" -jupyter-core==4.10.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" +anki==2.1.49 +appnope==0.1.3; platform_system == "Darwin" or sys_platform == "darwin" or python_version >= "3.3" and sys_platform == "darwin" +argon2-cffi==21.3.0 +argon2-cffi-bindings==21.2.0 +asttokens==2.0.5 +attrs==21.4.0 +backcall==0.2.0 +beautifulsoup4==4.11.1 +bleach==5.0.1 +certifi==2022.6.15 +cffi==1.15.1 +charset-normalizer==2.1.0 +click==8.1.3 +colorama==0.4.5; python_version >= "3.3" and sys_platform == "win32" or sys_platform == "win32" or platform_system == "Windows" +debugpy==1.6.0 +decorator==4.4.2 +defusedxml==0.7.1 +distro==1.7.0 +entrypoints==0.4 +executing==0.8.3 +fastjsonschema==2.15.3 +ghp-import==2.1.0 +idna==3.3 +importlib-metadata==4.12.0 +importlib-resources==5.8.0; python_version < "3.9" +ipykernel==6.15.0 +ipython==8.4.0 +ipython-genutils==0.2.0 +ipywidgets==7.7.1 +jedi==0.18.1 +jinja2==3.1.2 +json5==0.9.8 +jsonschema==4.6.1 jupyter==1.0.0 -jupyterlab-pygments==0.2.2; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -jupyterlab-server==1.2.0; python_version >= "3.5" -jupyterlab-widgets==1.1.0; python_version >= "3.6" -jupyterlab==2.3.2; python_version >= "3.5" -jupytext==1.13.8; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" -markdown-it-py==2.1.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.1" -markdown==3.3.7; python_version >= "3.6" -markupsafe==2.1.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -matplotlib-inline==0.1.3; python_version >= "3.8" -mdit-py-plugins==0.3.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" -mdurl==0.1.1; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.1" -mergedeep==1.3.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" -mistune==0.8.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -mkdocs-jupyter==0.19.0; python_full_version >= "3.7.1" and python_version < "4" -mkdocs-material-extensions==1.0.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -mkdocs-material==8.2.15; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -mkdocs==1.3.0; python_version >= "3.6" -nbclient==0.6.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -nbconvert==6.5.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -nbformat==5.4.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -nest-asyncio==1.5.5; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -notebook==6.4.11; python_version >= "3.7" -orjson==3.6.8; platform_machine == "x86_64" and python_version >= "3.8" -packaging==21.3; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -pandocfilters==1.5.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -parso==0.8.3; python_version >= "3.8" -pexpect==4.8.0; sys_platform != "win32" and python_version >= "3.8" -pickleshare==0.7.5; python_version >= "3.8" -prometheus-client==0.14.1; python_version >= "3.7" -prompt-toolkit==3.0.29; python_full_version >= "3.6.2" and python_version >= "3.8" -protobuf==3.20.1; python_version >= "3.8" -psutil==5.9.0; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") -ptyprocess==0.7.0; os_name != "nt" and python_version >= "3.8" and sys_platform != "win32" -pure-eval==0.2.2; python_version >= "3.8" -py==1.11.0; python_version >= "3.7" and python_full_version < "3.0.0" and implementation_name == "pypy" or implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.5.0" -pycparser==2.21; python_version >= "3.7" and python_full_version < "3.0.0" and implementation_name == "pypy" or implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.4.0" -pygments==2.12.0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" -pymdown-extensions==9.4; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -pyparsing==3.0.9; python_full_version >= "3.6.8" and python_version >= "3.6" -pyrsistent==0.18.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -pysocks==1.7.1; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -python-dateutil==2.8.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7" -pywin32==304; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -pywinpty==2.0.5; os_name == "nt" and python_version >= "3.7" -pyyaml-env-tag==0.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" -pyyaml==6.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" -pyzmq==22.3.0; python_version >= "3.7" -qtconsole==5.3.0; python_version >= "3.7" -qtpy==2.1.0; python_version >= "3.7" -requests==2.27.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0") +jupyter-client==7.3.4 +jupyter-console==6.4.4 +jupyter-core==4.10.0 +jupyterlab==2.3.2 +jupyterlab-pygments==0.2.2 +jupyterlab-server==1.2.0 +jupyterlab-widgets==1.1.1; python_version >= "3.6" +jupytext==1.13.8 +markdown==3.3.7 +markdown-it-py==2.1.0 +markupsafe==2.1.1 +matplotlib-inline==0.1.3 +mdit-py-plugins==0.3.0 +mdurl==0.1.1 +mergedeep==1.3.4 +mistune==0.8.4 +mkdocs==1.3.0 +mkdocs-jupyter==0.19.0 +mkdocs-material==8.3.8 +mkdocs-material-extensions==1.0.3 +nbclient==0.6.6 +nbconvert==6.5.0 +nbformat==5.4.0 +nest-asyncio==1.5.5 +notebook==6.4.12 +orjson==3.7.5; platform_machine == "x86_64" +packaging==21.3 +pandocfilters==1.5.0 +parso==0.8.3 +pexpect==4.8.0; python_version >= "3.3" and sys_platform != "win32" or sys_platform != "win32" +pickleshare==0.7.5 +prometheus-client==0.14.1 +prompt-toolkit==3.0.30 +protobuf==4.21.2 +psutil==5.9.1 +ptyprocess==0.7.0; sys_platform != "win32" or os_name != "nt" or python_version >= "3.3" and sys_platform != "win32" +pure-eval==0.2.2 +py==1.11.0; implementation_name == "pypy" +pycparser==2.21 +pygments==2.12.0 +pymdown-extensions==9.5 +pyparsing==3.0.9 +pyrsistent==0.18.1 +python-dateutil==2.8.2 +pywin32==304; sys_platform == "win32" and platform_python_implementation != "PyPy" +pywinpty==2.0.5; os_name == "nt" +pyyaml==6.0 +pyyaml-env-tag==0.1 +pyzmq==23.2.0 +qtconsole==5.3.1 +qtpy==2.1.0 +requests==2.28.1 send2trash==1.8.0 -six==1.16.0; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4" and (python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.8") -soupsieve==2.3.2.post1; python_full_version >= "3.6.0" and python_version >= "3.8" -stack-data==0.2.0; python_version >= "3.8" -stringcase==1.2.0; python_version >= "3.8" -terminado==0.15.0; python_version >= "3.7" -tinycss2==1.1.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -toml==0.10.2; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.1" -tornado==6.1; python_version >= "3.7" -traitlets==5.2.1.post0; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" -urllib3==1.26.9; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" -waitress==2.1.1; python_full_version >= "3.7.0" -watchdog==2.1.8; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.6" -wcwidth==0.2.5; python_full_version >= "3.6.2" and python_version >= "3.8" -webencodings==0.5.1; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.7" -webob==1.8.7; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") +six==1.16.0 +soupsieve==2.3.2.post1 +stack-data==0.3.0 +stringcase==1.2.0 +terminado==0.15.0 +tinycss2==1.1.1 +toml==0.10.2 +tornado==6.1 +traitlets==5.3.0 +urllib3==1.26.9 +waitress==2.1.2 +watchdog==2.1.9 +wcwidth==0.2.5 +webencodings==0.5.1 +webob==1.8.7 webtest==2.0.35 -widgetsnbextension==3.6.0 -zipp==3.8.0; python_version < "3.9" and python_version >= "3.8" and python_full_version >= "3.7.1" +widgetsnbextension==3.6.1 +zipp==3.8.0 -e src/. diff --git a/src/requirements.txt b/src/requirements.txt index 5d04624..ce69262 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,23 +1,22 @@ # THE FILE WAS GENERATED BY POETRY, DO NOT EDIT! -anki==2.1.49; python_version >= "3.8" -beautifulsoup4==4.11.1; python_full_version >= "3.6.0" -certifi==2021.10.8; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.8" -decorator==4.4.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.2.0") -distro==1.7.0; python_version >= "3.6" -idna==3.3; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -importlib-metadata==4.11.3; python_version < "3.10" and python_version >= "3.8" -markdown==3.3.7; python_version >= "3.6" -orjson==3.6.8; platform_machine == "x86_64" and python_version >= "3.8" -protobuf==3.20.1; python_version >= "3.8" -psutil==5.9.0; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") -pysocks==1.7.1; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" -requests==2.27.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0") +anki==2.1.49 +beautifulsoup4==4.11.1 +certifi==2022.6.15 +charset-normalizer==2.1.0 +decorator==4.4.2 +distro==1.7.0 +idna==3.3 +importlib-metadata==4.12.0 +markdown==3.3.7 +orjson==3.7.5; platform_machine == "x86_64" +protobuf==4.21.2 +psutil==5.9.1 +requests==2.28.1 send2trash==1.8.0 -soupsieve==2.3.2.post1; python_full_version >= "3.6.0" and python_version >= "3.8" -stringcase==1.2.0; python_version >= "3.8" -urllib3==1.26.9; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" -webob==1.8.7; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") -zipp==3.8.0; python_version < "3.10" and python_version >= "3.8" +soupsieve==2.3.2.post1 +stringcase==1.2.0 +urllib3==1.26.9 +webob==1.8.7 +zipp==3.8.0