From 16bdafbf7651b2ecd949ce6462753cb5e3d2a589 Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Thu, 10 Aug 2023 22:19:39 -0700 Subject: [PATCH 01/27] First pass at parsing prairielearn question files Does not try to retain assets, or defined asset values, and loses the types of non string customizations currently. --- poetry.lock | 2847 +++++++++-------- pyproject.toml | 2 + .../problem_bank_scripts.py | 308 +- 3 files changed, 1745 insertions(+), 1412 deletions(-) diff --git a/poetry.lock b/poetry.lock index b37a3661..076c6ece 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,26 +1,37 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + [[package]] name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] [[package]] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] [[package]] name = "astroid" version = "2.15.6" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, + {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, +] [package.dependencies] lazy-object-proxy = ">=1.4.0" @@ -34,9 +45,12 @@ wrapt = [ name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, + {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, +] [package.dependencies] six = "*" @@ -48,50 +62,65 @@ test = ["astroid", "pytest"] name = "atomicwrites" version = "1.4.1" description = "Atomic file writes." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] -cov = ["attrs", "coverage[toml] (>=5.3)"] -dev = ["attrs", "pre-commit"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest-mypy-plugins", "pytest-xdist", "pytest (>=4.3.0)"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "babel" version = "2.12.1" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] [[package]] name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] [[package]] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "dev" optional = false python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] [package.dependencies] +lxml = {version = "*", optional = true, markers = "extra == \"lxml\""} soupsieve = ">1.2" [package.extras] @@ -102,9 +131,12 @@ lxml = ["lxml"] name = "bleach" version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, + {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, +] [package.dependencies] six = ">=1.9.0" @@ -117,17 +149,85 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] [[package]] name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "dev" optional = false python-versions = "*" +files = [ + {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"}, +] [package.dependencies] pycparser = "*" @@ -136,17 +236,96 @@ pycparser = "*" name = "charset-normalizer" version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] [[package]] name = "click" version = "8.1.6" description = "Composable command line interface toolkit" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, + {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -155,150 +334,252 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] [[package]] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] [[package]] name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" -category = "main" optional = false python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] [[package]] name = "docutils" version = "0.16" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, + {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, +] [[package]] name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] [package.extras] -tests = ["asttokens", "pytest", "littleutils", "rich"] +tests = ["asttokens", "littleutils", "pytest", "rich"] [[package]] name = "fastjsonschema" version = "2.18.0" description = "Fastest Python implementation of JSON schema" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, + {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, +] [package.extras] -devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] [[package]] name = "greenlet" version = "2.0.2" description = "Lightweight in-process concurrent programming" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "httpimport" +version = "1.3.1" +description = "Module for remote in-memory Python package/module loading through HTTP" +optional = false +python-versions = "*" +files = [ + {file = "httpimport-1.3.1-py2.py3-none-any.whl", hash = "sha256:b1fdfaaa51892707651dcb895656b6e5274585b0ef524bad8179238c86b14843"}, + {file = "httpimport-1.3.1.tar.gz", hash = "sha256:5b3d448404bee70d4ec7b5d5d65d9777c06f15851ed7a8d96af4a0cd0ef9ebb2"}, +] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "5.5.6" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "ipykernel-5.5.6-py3-none-any.whl", hash = "sha256:66f824af1ef4650e1e2f6c42e1423074321440ef79ca3651a6cfd06a4e25e42f"}, + {file = "ipykernel-5.5.6.tar.gz", hash = "sha256:4ea44b90ae1f7c38987ad58ea0809562a17c2695a0499644326f334aecd369ec"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +ipython = ">=5.0.0" +ipython-genutils = "*" +jupyter-client = "*" +tornado = ">=4.2" +traitlets = ">=4.1.0" [package.extras] -docs = ["sphinx", "docutils (<0.18)"] -test = ["objgraph", "psutil"] - -[[package]] -name = "httpimport" -version = "1.3.1" -description = "Module for remote in-memory Python package/module loading through HTTP" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "imagesize" -version = "1.4.1" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "6.8.0" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ruff", "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 = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "ipykernel" -version = "5.5.6" -description = "IPython Kernel for Jupyter" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -ipython = ">=5.0.0" -ipython-genutils = "*" -jupyter-client = "*" -tornado = ">=4.2" -traitlets = ">=4.1.0" - -[package.extras] -test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "jedi (<=0.17.2)"] +test = ["flaky", "jedi (<=0.17.2)", "nose", "pytest (!=5.3.4)", "pytest-cov"] [[package]] name = "ipython" version = "8.14.0" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.9" +files = [ + {file = "ipython-8.14.0-py3-none-any.whl", hash = "sha256:248aca623f5c99a6635bc3857677b7320b9b8039f99f070ee0d20a5ca5a8e6bf"}, + {file = "ipython-8.14.0.tar.gz", hash = "sha256:1d197b907b6ba441b692c48cf2a3a2de280dc0ac91a3405b39349a50272ca0a1"}, +] [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} @@ -315,9 +596,9 @@ stack-data = "*" traitlets = ">=5" [package.extras] -all = ["black", "ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.21)", "pandas", "trio"] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["ipykernel", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "docrepr", "matplotlib", "stack-data", "pytest (<7)", "typing-extensions", "pytest (<7.1)", "pytest-asyncio", "testpath"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] @@ -325,29 +606,35 @@ notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "trio"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] [[package]] name = "ipython-genutils" version = "0.2.0" description = "Vestigial utilities from IPython" -category = "dev" optional = false python-versions = "*" +files = [ + {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"}, +] [[package]] name = "jedi" version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] [package.dependencies] parso = ">=0.8.0,<0.9.0" [package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx-rtd-theme (==0.4.3)", "sphinx (==1.8.5)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] @@ -355,9 +642,12 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -369,9 +659,12 @@ i18n = ["Babel (>=2.7)"] name = "jsonschema" version = "4.18.4" description = "An implementation of JSON Schema validation for Python" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.18.4-py3-none-any.whl", hash = "sha256:971be834317c22daaa9132340a51c01b50910724082c2c1a2ac87eeec153a3fe"}, + {file = "jsonschema-4.18.4.tar.gz", hash = "sha256:fb3642735399fa958c0d2aad7057901554596c63349f4f6b283c493cf692a25d"}, +] [package.dependencies] attrs = ">=22.2.0" @@ -387,9 +680,12 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.7.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, + {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, +] [package.dependencies] referencing = ">=0.28.0" @@ -398,9 +694,12 @@ referencing = ">=0.28.0" name = "jupyter-cache" version = "0.5.0" description = "A defined interface for working with a cache of jupyter notebooks." -category = "dev" optional = false python-versions = "~=3.7" +files = [ + {file = "jupyter-cache-0.5.0.tar.gz", hash = "sha256:87408030a4c8c14fe3f8fe62e6ceeb24c84e544c7ced20bfee45968053d07801"}, + {file = "jupyter_cache-0.5.0-py3-none-any.whl", hash = "sha256:642e434b9b75c4b94dc8346eaf5a639c8926a0673b87e5e8ef6460d5cf2c9516"}, +] [package.dependencies] attrs = "*" @@ -414,36 +713,42 @@ tabulate = "*" [package.extras] cli = ["click-log"] -code_style = ["pre-commit (>=2.12,<3.0)"] -rtd = ["nbdime", "jupytext", "myst-nb (>=0.12.3,<0.13.0)", "sphinx-book-theme (>=0.1.1,<0.2.0)", "sphinx-copybutton"] -testing = ["nbdime", "coverage", "ipykernel", "jupytext", "matplotlib", "nbformat (>=5.1)", "numpy", "pandas", "pytest (>=6,<7)", "pytest-cov", "pytest-regressions", "sympy"] +code-style = ["pre-commit (>=2.12,<3.0)"] +rtd = ["jupytext", "myst-nb (>=0.12.3,<0.13.0)", "nbdime", "sphinx-book-theme (>=0.1.1,<0.2.0)", "sphinx-copybutton"] +testing = ["coverage", "ipykernel", "jupytext", "matplotlib", "nbdime", "nbformat (>=5.1)", "numpy", "pandas", "pytest (>=6,<7)", "pytest-cov", "pytest-regressions", "sympy"] [[package]] name = "jupyter-client" version = "8.3.0" description = "Jupyter protocol implementation and client libraries" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"}, + {file = "jupyter_client-8.3.0.tar.gz", hash = "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f"}, +] [package.dependencies] -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" traitlets = ">=5.3" [package.extras] -docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinx (>=4)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" version = "5.3.1" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, + {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, +] [package.dependencies] platformdirs = ">=2.5" @@ -458,112 +763,331 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "jupyterlab-pygments" version = "0.2.2" description = "Pygments theme using JupyterLab CSS variables" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {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"}, +] [[package]] name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] + +[[package]] +name = "lxml" +version = "4.9.3" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.35)"] [[package]] name = "markdown-it-py" version = "2.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] [package.dependencies] mdurl = ">=0.1,<1.0" [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code_style = ["pre-commit (>=3.0,<4.0)"] +code-style = ["pre-commit (>=3.0,<4.0)"] compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] +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.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "matplotlib-inline" -version = "0.1.6" -description = "Inline Matplotlib backend for Jupyter" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mdformat" -version = "0.7.16" -description = "CommonMark compliant Markdown formatter" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -markdown-it-py = ">=1.0.0,<3.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "mdit-py-plugins" -version = "0.3.5" -description = "Collection of plugins for markdown-it-py" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -markdown-it-py = ">=1.0.0,<3.0.0" - -[package.extras] -code_style = ["pre-commit"] -rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -category = "main" optional = false python-versions = ">=3.7" - +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mdformat" +version = "0.7.16" +description = "CommonMark compliant Markdown formatter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdformat-0.7.16-py3-none-any.whl", hash = "sha256:76398d03baa394f331fb560fd0aed8257cf77b65b1c8146b92d395af16253662"}, + {file = "mdformat-0.7.16.tar.gz", hash = "sha256:99b105033207d2ab70ba1ced8e07327ed4ef1e0a6bc1c7c00207ea73ab502782"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<3.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "mdit-py-plugins" +version = "0.3.5" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, + {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<3.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "mistune" version = "3.0.1" description = "A sane and fast Markdown parser with useful plugins and renderers" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, + {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, +] [[package]] name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" -category = "main" optional = false python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] [package.extras] -develop = ["pytest (>=4.6)", "pycodestyle", "pytest-cov", "codecov", "wheel"] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] docs = ["sphinx"] gmpy = ["gmpy2 (>=2.1.0a4)"] tests = ["pytest (>=4.6)"] @@ -572,9 +1096,12 @@ tests = ["pytest (>=4.6)"] name = "myst-nb" version = "0.15.0" description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "myst-nb-0.15.0.tar.gz", hash = "sha256:fdce98e47e7f020d8c0fb479bfbcc609a67b8c0ed79f0a50dd4e758a9142aaff"}, + {file = "myst_nb-0.15.0-py3-none-any.whl", hash = "sha256:30cba4116274b7998eef1fec0f43763c5452da184f701fd63e135ca283ace9cf"}, +] [package.dependencies] docutils = ">=0.15,<0.18" @@ -591,17 +1118,20 @@ sphinx-togglebutton = ">=0.3.0,<0.4.0" typing-extensions = "*" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] +code-style = ["pre-commit (>=2.12,<3.0)"] rtd = ["alabaster", "altair", "bokeh", "coconut (>=1.4.3,<1.5.0)", "ipykernel (>=5.5,<6.0)", "ipywidgets", "jupytext (>=1.11.2,<1.12.0)", "matplotlib", "numpy", "pandas", "plotly", "sphinx-book-theme (>=0.3.0,<0.4.0)", "sphinx-copybutton", "sphinx-design (>=0.1.0,<0.2.0)", "sphinxcontrib-bibtex", "sympy"] -testing = ["coverage (<5.0)", "beautifulsoup4", "ipykernel (>=5.5,<6.0)", "ipython (!=8.1.0)", "ipywidgets", "jupytext (>=1.11.2,<1.12.0)", "matplotlib (>=3.3.0,<3.4.0)", "nbdime", "numpy", "pandas (<1.4)", "pytest (>=5.4,<6.0)", "pytest-cov (>=2.8,<3.0)", "pytest-regressions", "pytest-param-files (>=0.3.3,<0.4.0)", "sympy"] +testing = ["beautifulsoup4", "coverage (<5.0)", "ipykernel (>=5.5,<6.0)", "ipython (!=8.1.0)", "ipywidgets", "jupytext (>=1.11.2,<1.12.0)", "matplotlib (>=3.3.0,<3.4.0)", "nbdime", "numpy", "pandas (<1.4)", "pytest (>=5.4,<6.0)", "pytest-cov (>=2.8,<3.0)", "pytest-param-files (>=0.3.3,<0.4.0)", "pytest-regressions", "sympy"] [[package]] name = "myst-parser" version = "0.17.2" description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "myst-parser-0.17.2.tar.gz", hash = "sha256:4c076d649e066f9f5c7c661bae2658be1ca06e76b002bb97f02a09398707686c"}, + {file = "myst_parser-0.17.2-py3-none-any.whl", hash = "sha256:1635ce3c18965a528d6de980f989ff64d6a1effb482e1f611b1bfb79e38f3d98"}, +] [package.dependencies] docutils = ">=0.15,<0.18" @@ -613,18 +1143,21 @@ sphinx = ">=3.1,<5" typing-extensions = "*" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] +code-style = ["pre-commit (>=2.12,<3.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["ipython", "sphinx-book-theme", "sphinx-panels", "sphinxcontrib-bibtex (>=2.4,<3.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)"] -testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=6,<7)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)"] +rtd = ["ipython", "sphinx-book-theme", "sphinx-panels", "sphinxcontrib-bibtex (>=2.4,<3.0)", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=6,<7)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions"] [[package]] name = "nbclient" version = "0.5.13" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "nbclient-0.5.13-py3-none-any.whl", hash = "sha256:47ac905af59379913c1f8f541098d2550153cf8dc58553cbe18c702b181518b0"}, + {file = "nbclient-0.5.13.tar.gz", hash = "sha256:40c52c9b5e3c31faecaee69f202b3f53e38d7c1c563de0fadde9d7eda0fdafe8"}, +] [package.dependencies] jupyter-client = ">=6.1.5" @@ -633,16 +1166,19 @@ nest-asyncio = "*" traitlets = ">=5.0.0" [package.extras] -sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] -test = ["ipython (<8.0.0)", "ipykernel", "ipywidgets (<8.0.0)", "pytest (>=4.1)", "pytest-asyncio", "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 = ["Sphinx (>=1.7)", "mock", "moto", "myst-parser", "sphinx-book-theme"] +test = ["black", "check-manifest", "flake8", "ipykernel", "ipython (<8.0.0)", "ipywidgets (<8.0.0)", "mypy", "pip (>=18.1)", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "wheel (>=0.31.0)", "xmltodict"] [[package]] name = "nbconvert" version = "7.7.3" description = "Converting Jupyter Notebooks" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.7.3-py3-none-any.whl", hash = "sha256:3022adadff3f86578a47fab7c2228bb3ca9c56a24345642a22f917f6168b48fc"}, + {file = "nbconvert-7.7.3.tar.gz", hash = "sha256:4a5996bf5f3cd16aa0431897ba1aa4c64842c2079f434b3dc6b8c4b252ef3355"}, +] [package.dependencies] beautifulsoup4 = "*" @@ -662,9 +1198,9 @@ tinycss2 = "*" traitlets = ">=5.1" [package.extras] -all = ["nbconvert"] +all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["nbconvert"] +qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] @@ -674,9 +1210,12 @@ webpdf = ["playwright"] name = "nbformat" version = "5.9.1" description = "The Jupyter Notebook format" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "nbformat-5.9.1-py3-none-any.whl", hash = "sha256:b7968ebf4811178a4108ee837eae1442e3f054132100f0359219e9ed1ce3ca45"}, + {file = "nbformat-5.9.1.tar.gz", hash = "sha256:3a7f52d040639cbd8a3890218c8b0ffb93211588c57446c90095e32ba5881b5d"}, +] [package.dependencies] fastjsonschema = "*" @@ -692,9 +1231,12 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] name = "nbsphinx" version = "0.8.12" description = "Jupyter Notebook Tools for Sphinx" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "nbsphinx-0.8.12-py3-none-any.whl", hash = "sha256:c15b681c7fce287000856f91fe1edac50d29f7b0c15bbc746fbe55c8eb84750b"}, + {file = "nbsphinx-0.8.12.tar.gz", hash = "sha256:76570416cdecbeb21dbf5c3d6aa204ced6c1dd7ebef4077b5c21b8c6ece9533f"}, +] [package.dependencies] docutils = "*" @@ -708,33 +1250,91 @@ traitlets = ">=5" name = "nest-asyncio" version = "1.5.6" description = "Patch asyncio to allow nested event loops" -category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, + {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, +] [[package]] name = "numpy" version = "1.25.1" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77d339465dff3eb33c701430bcb9c325b60354698340229e1dff97745e6b3efa"}, + {file = "numpy-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d736b75c3f2cb96843a5c7f8d8ccc414768d34b0a75f466c05f3a739b406f10b"}, + {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a90725800caeaa160732d6b31f3f843ebd45d6b5f3eec9e8cc287e30f2805bf"}, + {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c6c9261d21e617c6dc5eacba35cb68ec36bb72adcff0dee63f8fbc899362588"}, + {file = "numpy-1.25.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0def91f8af6ec4bb94c370e38c575855bf1d0be8a8fbfba42ef9c073faf2cf19"}, + {file = "numpy-1.25.1-cp310-cp310-win32.whl", hash = "sha256:fd67b306320dcadea700a8f79b9e671e607f8696e98ec255915c0c6d6b818503"}, + {file = "numpy-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:c1516db588987450b85595586605742879e50dcce923e8973f79529651545b57"}, + {file = "numpy-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b82655dd8efeea69dbf85d00fca40013d7f503212bc5259056244961268b66e"}, + {file = "numpy-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e8f6049c4878cb16960fbbfb22105e49d13d752d4d8371b55110941fb3b17800"}, + {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41a56b70e8139884eccb2f733c2f7378af06c82304959e174f8e7370af112e09"}, + {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5154b1a25ec796b1aee12ac1b22f414f94752c5f94832f14d8d6c9ac40bcca6"}, + {file = "numpy-1.25.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38eb6548bb91c421261b4805dc44def9ca1a6eef6444ce35ad1669c0f1a3fc5d"}, + {file = "numpy-1.25.1-cp311-cp311-win32.whl", hash = "sha256:791f409064d0a69dd20579345d852c59822c6aa087f23b07b1b4e28ff5880fcb"}, + {file = "numpy-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:c40571fe966393b212689aa17e32ed905924120737194b5d5c1b20b9ed0fb171"}, + {file = "numpy-1.25.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d7abcdd85aea3e6cdddb59af2350c7ab1ed764397f8eec97a038ad244d2d105"}, + {file = "numpy-1.25.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a180429394f81c7933634ae49b37b472d343cccb5bb0c4a575ac8bbc433722f"}, + {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d412c1697c3853c6fc3cb9751b4915859c7afe6a277c2bf00acf287d56c4e625"}, + {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e1266411120a4f16fad8efa8e0454d21d00b8c7cee5b5ccad7565d95eb42dd"}, + {file = "numpy-1.25.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f76aebc3358ade9eacf9bc2bb8ae589863a4f911611694103af05346637df1b7"}, + {file = "numpy-1.25.1-cp39-cp39-win32.whl", hash = "sha256:247d3ffdd7775bdf191f848be8d49100495114c82c2bd134e8d5d075fb386a1c"}, + {file = "numpy-1.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:1d5d3c68e443c90b38fdf8ef40e60e2538a27548b39b12b73132456847f4b631"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:35a9527c977b924042170a0887de727cd84ff179e478481404c5dc66b4170009"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d3fe3dd0506a28493d82dc3cf254be8cd0d26f4008a417385cbf1ae95b54004"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:012097b5b0d00a11070e8f2e261128c44157a8689f7dedcf35576e525893f4fe"}, + {file = "numpy-1.25.1.tar.gz", hash = "sha256:9a3a9f3a61480cc086117b426a8bd86869c213fc4072e606f01c4e4b66eb92bf"}, +] [[package]] name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] [[package]] name = "pandas" version = "2.0.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, +] [package.dependencies] numpy = [ @@ -746,7 +1346,7 @@ pytz = ">=2020.1" tzdata = ">=2022.1" [package.extras] -all = ["beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "PyQt5 (>=5.15.1)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pytest-asyncio (>=0.17.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "scipy (>=1.7.1)", "s3fs (>=2021.08.0)", "SQLAlchemy (>=1.4.16)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] aws = ["s3fs (>=2021.08.0)"] clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] @@ -758,31 +1358,37 @@ gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] hdf5 = ["tables (>=3.6.1)"] html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] -output_formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] parquet = ["pyarrow (>=7.0.0)"] performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] plot = ["matplotlib (>=3.6.1)"] postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] spss = ["pyreadstat (>=1.1.2)"] sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pytest-asyncio (>=0.17.0)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.6.3)"] [[package]] name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] [[package]] name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] [package.extras] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] @@ -792,9 +1398,12 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] [package.dependencies] ptyprocess = ">=0.5" @@ -803,29 +1412,38 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] [[package]] name = "platformdirs" version = "3.9.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, + {file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, +] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)", "sphinx (>=7.0.1)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest (>=7.3.1)"] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" version = "1.2.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -835,1212 +1453,163 @@ testing = ["pytest", "pytest-benchmark"] name = "pockets" version = "0.9.1" description = "A collection of helpful Python tools!" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "pockets-0.9.1-py2.py3-none-any.whl", hash = "sha256:68597934193c08a08eb2bf6a1d85593f627c22f9b065cc727a4f03f669d96d86"}, + {file = "pockets-0.9.1.tar.gz", hash = "sha256:9320f1a3c6f7a9133fe3b571f283bcf3353cd70249025ae8d618e40e9f7e92b3"}, +] [package.dependencies] six = ">=1.5.2" -[[package]] -name = "problem-bank-helpers" -version = "0.2.0" -description = "Helpful utilities for the open problem bank." -category = "main" -optional = false -python-versions = ">=3.10,<4.0" - -[package.dependencies] -numpy = ">=1.20.3,<2.0.0" -pandas = ">=2.0.0,<3.0.0" -sigfig = ">=1.1.9,<2.0.0" - -[[package]] -name = "prompt-toolkit" -version = "3.0.39" -description = "Library for building powerful interactive command lines in Python" -category = "dev" -optional = false -python-versions = ">=3.7.0" - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -category = "dev" -optional = false -python-versions = "*" - -[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" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pygments" -version = "2.15.1" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pytz" -version = "2023.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pywin32" -version = "306" -description = "Python for Window Extensions" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pyyaml" -version = "6.0.1" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "pyzmq" -version = "25.1.0" -description = "Python bindings for 0MQ" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "referencing" -version = "0.30.0" -description = "JSON Referencing + Python" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "rpds-py" -version = "0.9.2" -description = "Python bindings to Rust's persistent data structures (rpds)" -category = "dev" -optional = false -python-versions = ">=3.8" - -[[package]] -name = "sigfig" -version = "1.3.2" -description = "Python library for rounding numbers (with expected results)" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -SortedContainers = "*" - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sortedcontainers" -version = "2.4.0" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "soupsieve" -version = "2.4.1" -description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autoapi" -version = "1.9.0" -description = "Sphinx API documentation generator" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -astroid = ">=2.7" -Jinja2 = "*" -PyYAML = "*" -sphinx = ">=3.0" -unidecode = "*" - -[package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] -dotnet = ["sphinxcontrib-dotnetdomain"] -go = ["sphinxcontrib-golangdomain"] - -[[package]] -name = "sphinx-rtd-theme" -version = "0.5.2" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "<0.17" -sphinx = "*" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinx-togglebutton" -version = "0.3.2" -description = "Toggle page content and collapse admonitions in Sphinx." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -sphinx = "*" - -[package.extras] -sphinx = ["matplotlib", "numpy", "myst-nb", "sphinx-book-theme", "sphinx-design", "sphinx-examples"] - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.4" -description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.1" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-napoleon" -version = "0.7" -description = "Sphinx \"napoleon\" extension." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pockets = ">=0.3" -six = ">=1.5.2" - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sqlalchemy" -version = "1.4.49" -description = "Database Abstraction Library" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} - -[package.extras] -aiomysql = ["greenlet (!=0.4.17)", "aiomysql"] -aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3,!=0.2.4)"] -mariadb_connector = ["mariadb (>=1.0.1,!=1.1.2)"] -mssql = ["pyodbc"] -mssql_pymssql = ["pymssql"] -mssql_pyodbc = ["pyodbc"] -mypy = ["sqlalchemy2-stubs", "mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0,<2)", "mysqlclient (>=1.4.0)"] -mysql_connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7,<8)", "cx_oracle (>=7)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql_asyncpg = ["greenlet (!=0.4.17)", "asyncpg"] -postgresql_pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] -postgresql_psycopg2binary = ["psycopg2-binary"] -postgresql_psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql (<1)", "pymysql"] -sqlcipher = ["sqlcipher3-binary"] - -[[package]] -name = "stack-data" -version = "0.6.2" -description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] - -[[package]] -name = "sympy" -version = "1.12" -description = "Computer algebra system (CAS) in Python" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -mpmath = ">=0.19" - -[[package]] -name = "tabulate" -version = "0.9.0" -description = "Pretty-print tabular data" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -widechars = ["wcwidth"] - -[[package]] -name = "tinycss2" -version = "1.2.1" -description = "A tiny CSS parser" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -webencodings = ">=0.4" - -[package.extras] -doc = ["sphinx", "sphinx-rtd-theme"] -test = ["pytest", "isort", "flake8"] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "tornado" -version = "6.3.2" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" -optional = false -python-versions = ">= 3.8" - -[[package]] -name = "traitlets" -version = "5.9.0" -description = "Traitlets Python configuration system" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] - -[[package]] -name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "tzdata" -version = "2023.3" -description = "Provider of IANA time zone data" -category = "main" -optional = false -python-versions = ">=2" - -[[package]] -name = "unidecode" -version = "1.3.6" -description = "ASCII transliterations of Unicode text" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "urllib3" -version = "2.0.4" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "wcwidth" -version = "0.2.6" -description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "wrapt" -version = "1.15.0" -description = "Module for decorators, wrappers and monkey patching." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[[package]] -name = "zipp" -version = "3.16.2" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ruff", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-ignore-flaky", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.10" -content-hash = "d2679c676792f05db94f4535b549510411e446b01065eb9f53412997c0d9fb5b" - -[metadata.files] -alabaster = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, -] -appnope = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] -astroid = [ - {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, - {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, -] -asttokens = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] -attrs = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] -babel = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, -] -backcall = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, -] -bleach = [ - {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, - {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, -] -certifi = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, -] -cffi = [ - {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-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, -] -click = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -decorator = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] -defusedxml = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] -docopt = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] -docutils = [ - {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, - {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, -] -executing = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, -] -fastjsonschema = [ - {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, - {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, -] -greenlet = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, -] -httpimport = [ - {file = "httpimport-1.3.1-py2.py3-none-any.whl", hash = "sha256:b1fdfaaa51892707651dcb895656b6e5274585b0ef524bad8179238c86b14843"}, - {file = "httpimport-1.3.1.tar.gz", hash = "sha256:5b3d448404bee70d4ec7b5d5d65d9777c06f15851ed7a8d96af4a0cd0ef9ebb2"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -imagesize = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] -importlib-metadata = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, -] -iniconfig = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] -ipykernel = [ - {file = "ipykernel-5.5.6-py3-none-any.whl", hash = "sha256:66f824af1ef4650e1e2f6c42e1423074321440ef79ca3651a6cfd06a4e25e42f"}, - {file = "ipykernel-5.5.6.tar.gz", hash = "sha256:4ea44b90ae1f7c38987ad58ea0809562a17c2695a0499644326f334aecd369ec"}, -] -ipython = [ - {file = "ipython-8.14.0-py3-none-any.whl", hash = "sha256:248aca623f5c99a6635bc3857677b7320b9b8039f99f070ee0d20a5ca5a8e6bf"}, - {file = "ipython-8.14.0.tar.gz", hash = "sha256:1d197b907b6ba441b692c48cf2a3a2de280dc0ac91a3405b39349a50272ca0a1"}, -] -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"}, -] -jedi = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -jsonschema = [ - {file = "jsonschema-4.18.4-py3-none-any.whl", hash = "sha256:971be834317c22daaa9132340a51c01b50910724082c2c1a2ac87eeec153a3fe"}, - {file = "jsonschema-4.18.4.tar.gz", hash = "sha256:fb3642735399fa958c0d2aad7057901554596c63349f4f6b283c493cf692a25d"}, -] -jsonschema-specifications = [ - {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, - {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, -] -jupyter-cache = [ - {file = "jupyter-cache-0.5.0.tar.gz", hash = "sha256:87408030a4c8c14fe3f8fe62e6ceeb24c84e544c7ced20bfee45968053d07801"}, - {file = "jupyter_cache-0.5.0-py3-none-any.whl", hash = "sha256:642e434b9b75c4b94dc8346eaf5a639c8926a0673b87e5e8ef6460d5cf2c9516"}, -] -jupyter-client = [ - {file = "jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"}, - {file = "jupyter_client-8.3.0.tar.gz", hash = "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f"}, -] -jupyter-core = [ - {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, - {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, -] -jupyterlab-pygments = [ - {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"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] -markdown-it-py = [ - {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, - {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, -] -matplotlib-inline = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, -] -mdformat = [ - {file = "mdformat-0.7.16-py3-none-any.whl", hash = "sha256:76398d03baa394f331fb560fd0aed8257cf77b65b1c8146b92d395af16253662"}, - {file = "mdformat-0.7.16.tar.gz", hash = "sha256:99b105033207d2ab70ba1ced8e07327ed4ef1e0a6bc1c7c00207ea73ab502782"}, -] -mdit-py-plugins = [ - {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, - {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, -] -mdurl = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] -mistune = [ - {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, - {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, -] -mpmath = [ - {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, - {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, -] -myst-nb = [ - {file = "myst-nb-0.15.0.tar.gz", hash = "sha256:fdce98e47e7f020d8c0fb479bfbcc609a67b8c0ed79f0a50dd4e758a9142aaff"}, - {file = "myst_nb-0.15.0-py3-none-any.whl", hash = "sha256:30cba4116274b7998eef1fec0f43763c5452da184f701fd63e135ca283ace9cf"}, -] -myst-parser = [ - {file = "myst-parser-0.17.2.tar.gz", hash = "sha256:4c076d649e066f9f5c7c661bae2658be1ca06e76b002bb97f02a09398707686c"}, - {file = "myst_parser-0.17.2-py3-none-any.whl", hash = "sha256:1635ce3c18965a528d6de980f989ff64d6a1effb482e1f611b1bfb79e38f3d98"}, -] -nbclient = [ - {file = "nbclient-0.5.13-py3-none-any.whl", hash = "sha256:47ac905af59379913c1f8f541098d2550153cf8dc58553cbe18c702b181518b0"}, - {file = "nbclient-0.5.13.tar.gz", hash = "sha256:40c52c9b5e3c31faecaee69f202b3f53e38d7c1c563de0fadde9d7eda0fdafe8"}, -] -nbconvert = [ - {file = "nbconvert-7.7.3-py3-none-any.whl", hash = "sha256:3022adadff3f86578a47fab7c2228bb3ca9c56a24345642a22f917f6168b48fc"}, - {file = "nbconvert-7.7.3.tar.gz", hash = "sha256:4a5996bf5f3cd16aa0431897ba1aa4c64842c2079f434b3dc6b8c4b252ef3355"}, -] -nbformat = [ - {file = "nbformat-5.9.1-py3-none-any.whl", hash = "sha256:b7968ebf4811178a4108ee837eae1442e3f054132100f0359219e9ed1ce3ca45"}, - {file = "nbformat-5.9.1.tar.gz", hash = "sha256:3a7f52d040639cbd8a3890218c8b0ffb93211588c57446c90095e32ba5881b5d"}, -] -nbsphinx = [ - {file = "nbsphinx-0.8.12-py3-none-any.whl", hash = "sha256:c15b681c7fce287000856f91fe1edac50d29f7b0c15bbc746fbe55c8eb84750b"}, - {file = "nbsphinx-0.8.12.tar.gz", hash = "sha256:76570416cdecbeb21dbf5c3d6aa204ced6c1dd7ebef4077b5c21b8c6ece9533f"}, -] -nest-asyncio = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, -] -numpy = [ - {file = "numpy-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77d339465dff3eb33c701430bcb9c325b60354698340229e1dff97745e6b3efa"}, - {file = "numpy-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d736b75c3f2cb96843a5c7f8d8ccc414768d34b0a75f466c05f3a739b406f10b"}, - {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a90725800caeaa160732d6b31f3f843ebd45d6b5f3eec9e8cc287e30f2805bf"}, - {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c6c9261d21e617c6dc5eacba35cb68ec36bb72adcff0dee63f8fbc899362588"}, - {file = "numpy-1.25.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0def91f8af6ec4bb94c370e38c575855bf1d0be8a8fbfba42ef9c073faf2cf19"}, - {file = "numpy-1.25.1-cp310-cp310-win32.whl", hash = "sha256:fd67b306320dcadea700a8f79b9e671e607f8696e98ec255915c0c6d6b818503"}, - {file = "numpy-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:c1516db588987450b85595586605742879e50dcce923e8973f79529651545b57"}, - {file = "numpy-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b82655dd8efeea69dbf85d00fca40013d7f503212bc5259056244961268b66e"}, - {file = "numpy-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e8f6049c4878cb16960fbbfb22105e49d13d752d4d8371b55110941fb3b17800"}, - {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41a56b70e8139884eccb2f733c2f7378af06c82304959e174f8e7370af112e09"}, - {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5154b1a25ec796b1aee12ac1b22f414f94752c5f94832f14d8d6c9ac40bcca6"}, - {file = "numpy-1.25.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38eb6548bb91c421261b4805dc44def9ca1a6eef6444ce35ad1669c0f1a3fc5d"}, - {file = "numpy-1.25.1-cp311-cp311-win32.whl", hash = "sha256:791f409064d0a69dd20579345d852c59822c6aa087f23b07b1b4e28ff5880fcb"}, - {file = "numpy-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:c40571fe966393b212689aa17e32ed905924120737194b5d5c1b20b9ed0fb171"}, - {file = "numpy-1.25.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d7abcdd85aea3e6cdddb59af2350c7ab1ed764397f8eec97a038ad244d2d105"}, - {file = "numpy-1.25.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a180429394f81c7933634ae49b37b472d343cccb5bb0c4a575ac8bbc433722f"}, - {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d412c1697c3853c6fc3cb9751b4915859c7afe6a277c2bf00acf287d56c4e625"}, - {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e1266411120a4f16fad8efa8e0454d21d00b8c7cee5b5ccad7565d95eb42dd"}, - {file = "numpy-1.25.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f76aebc3358ade9eacf9bc2bb8ae589863a4f911611694103af05346637df1b7"}, - {file = "numpy-1.25.1-cp39-cp39-win32.whl", hash = "sha256:247d3ffdd7775bdf191f848be8d49100495114c82c2bd134e8d5d075fb386a1c"}, - {file = "numpy-1.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:1d5d3c68e443c90b38fdf8ef40e60e2538a27548b39b12b73132456847f4b631"}, - {file = "numpy-1.25.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:35a9527c977b924042170a0887de727cd84ff179e478481404c5dc66b4170009"}, - {file = "numpy-1.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d3fe3dd0506a28493d82dc3cf254be8cd0d26f4008a417385cbf1ae95b54004"}, - {file = "numpy-1.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:012097b5b0d00a11070e8f2e261128c44157a8689f7dedcf35576e525893f4fe"}, - {file = "numpy-1.25.1.tar.gz", hash = "sha256:9a3a9f3a61480cc086117b426a8bd86869c213fc4072e606f01c4e4b66eb92bf"}, -] -packaging = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] -pandas = [ - {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, - {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, - {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, - {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, - {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, - {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, - {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, - {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, - {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, - {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, - {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, -] -pandocfilters = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, -] -parso = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -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-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, - {file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, -] -pluggy = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, -] -pockets = [ - {file = "pockets-0.9.1-py2.py3-none-any.whl", hash = "sha256:68597934193c08a08eb2bf6a1d85593f627c22f9b065cc727a4f03f669d96d86"}, - {file = "pockets-0.9.1.tar.gz", hash = "sha256:9320f1a3c6f7a9133fe3b571f283bcf3353cd70249025ae8d618e40e9f7e92b3"}, -] -problem-bank-helpers = [ +[[package]] +name = "problem-bank-helpers" +version = "0.2.0" +description = "Helpful utilities for the open problem bank." +optional = false +python-versions = ">=3.10,<4.0" +files = [ {file = "problem_bank_helpers-0.2.0-py3-none-any.whl", hash = "sha256:2ed897b7e38965cb3fd89d1f74fe7da369bf8c567423a1b8af6e3bdef93ec9b4"}, {file = "problem_bank_helpers-0.2.0.tar.gz", hash = "sha256:3db5b138f8243c32ec7d6011d2d31a2f732f7b00554959fceaa9ec1b4d3e6761"}, ] -prompt-toolkit = [ + +[package.dependencies] +numpy = ">=1.20.3,<2.0.0" +pandas = ">=2.0.0,<3.0.0" +sigfig = ">=1.1.9,<2.0.0" + +[[package]] +name = "prompt-toolkit" +version = "3.0.39" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, ] -ptyprocess = [ + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, ] -pure-eval = [ + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ {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 = [ + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] -pycparser = [ + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] -pygments = [ + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] -pytest = [ + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.6" +files = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] -python-dateutil = [ + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ {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"}, ] -pytz = [ + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] -pywin32 = [ + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, @@ -2056,7 +1625,14 @@ pywin32 = [ {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] -pyyaml = [ + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, @@ -2098,7 +1674,14 @@ pyyaml = [ {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] -pyzmq = [ + +[[package]] +name = "pyzmq" +version = "25.1.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"}, {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"}, {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"}, @@ -2177,15 +1760,53 @@ pyzmq = [ {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"}, {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"}, ] -referencing = [ + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "referencing" +version = "0.30.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ {file = "referencing-0.30.0-py3-none-any.whl", hash = "sha256:c257b08a399b6c2f5a3510a50d28ab5dbc7bbde049bcaf954d43c446f83ab548"}, {file = "referencing-0.30.0.tar.gz", hash = "sha256:47237742e990457f7512c7d27486394a9aadaf876cbfaa4be65b27b4f4d47c6b"}, ] -requests = [ + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] -rpds-py = [ + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rpds-py" +version = "0.9.2" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ {file = "rpds_py-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:ab6919a09c055c9b092798ce18c6c4adf49d24d4d9e43a92b257e3f2548231e7"}, {file = "rpds_py-0.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d55777a80f78dd09410bd84ff8c95ee05519f41113b2df90a69622f5540c4f8b"}, {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a216b26e5af0a8e265d4efd65d3bcec5fba6b26909014effe20cd302fd1138fa"}, @@ -2284,71 +1905,287 @@ rpds-py = [ {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c27ee01a6c3223025f4badd533bea5e87c988cb0ba2811b690395dfe16088cfe"}, {file = "rpds_py-0.9.2.tar.gz", hash = "sha256:8d70e8f14900f2657c249ea4def963bed86a29b81f81f5b76b5a9215680de945"}, ] -sigfig = [ + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "sigfig" +version = "1.3.2" +description = "Python library for rounding numbers (with expected results)" +optional = false +python-versions = "*" +files = [ {file = "sigfig-1.3.2-py3-none-any.whl", hash = "sha256:b54d4943ba553671bf18da2da109d7824cf44e7c80032a0fb56a6c209e558ee3"}, {file = "sigfig-1.3.2.tar.gz", hash = "sha256:97a1225a38924e0586365500668fa3f2ba023bdb103207ea676507af378fce32"}, ] -six = [ + +[package.dependencies] +SortedContainers = "*" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = false +python-versions = "*" +files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] -sortedcontainers = [ + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] -soupsieve = [ + +[[package]] +name = "soupsieve" +version = "2.4.1" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.7" +files = [ {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, ] -sphinx = [ + +[[package]] +name = "sphinx" +version = "4.5.0" +description = "Python documentation generator" +optional = false +python-versions = ">=3.6" +files = [ {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, ] -sphinx-autoapi = [ + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.18" +imagesize = "*" +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"] +test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] + +[[package]] +name = "sphinx-autoapi" +version = "1.9.0" +description = "Sphinx API documentation generator" +optional = false +python-versions = ">=3.7" +files = [ {file = "sphinx-autoapi-1.9.0.tar.gz", hash = "sha256:c897ea337df16ad0cde307cbdfe2bece207788dde1587fa4fc8b857d1fc5dcba"}, {file = "sphinx_autoapi-1.9.0-py2.py3-none-any.whl", hash = "sha256:d217953273b359b699d8cb81a5a72985a3e6e15cfe3f703d9a3c201ffc30849b"}, ] -sphinx-rtd-theme = [ + +[package.dependencies] +astroid = ">=2.7" +Jinja2 = "*" +PyYAML = "*" +sphinx = ">=3.0" +unidecode = "*" + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme"] +dotnet = ["sphinxcontrib-dotnetdomain"] +go = ["sphinxcontrib-golangdomain"] + +[[package]] +name = "sphinx-rtd-theme" +version = "0.5.2" +description = "Read the Docs theme for Sphinx" +optional = false +python-versions = "*" +files = [ {file = "sphinx_rtd_theme-0.5.2-py2.py3-none-any.whl", hash = "sha256:4a05bdbe8b1446d77a01e20a23ebc6777c74f43237035e76be89699308987d6f"}, {file = "sphinx_rtd_theme-0.5.2.tar.gz", hash = "sha256:32bd3b5d13dc8186d7a42fc816a23d32e83a4827d7d9882948e7b837c232da5a"}, ] -sphinx-togglebutton = [ + +[package.dependencies] +docutils = "<0.17" +sphinx = "*" + +[package.extras] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client"] + +[[package]] +name = "sphinx-togglebutton" +version = "0.3.2" +description = "Toggle page content and collapse admonitions in Sphinx." +optional = false +python-versions = "*" +files = [ {file = "sphinx-togglebutton-0.3.2.tar.gz", hash = "sha256:ab0c8b366427b01e4c89802d5d078472c427fa6e9d12d521c34fa0442559dc7a"}, {file = "sphinx_togglebutton-0.3.2-py3-none-any.whl", hash = "sha256:9647ba7874b7d1e2d43413d8497153a85edc6ac95a3fea9a75ef9c1e08aaae2b"}, ] -sphinxcontrib-applehelp = [ + +[package.dependencies] +docutils = "*" +setuptools = "*" +sphinx = "*" +wheel = "*" + +[package.extras] +sphinx = ["matplotlib", "myst-nb", "numpy", "sphinx-book-theme", "sphinx-design", "sphinx-examples"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.8" +files = [ {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, ] -sphinxcontrib-devhelp = [ + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +optional = false +python-versions = ">=3.5" +files = [ {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, ] -sphinxcontrib-htmlhelp = [ + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.1" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.8" +files = [ {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, ] -sphinxcontrib-jsmath = [ + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] -sphinxcontrib-napoleon = [ + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-napoleon" +version = "0.7" +description = "Sphinx \"napoleon\" extension." +optional = false +python-versions = "*" +files = [ {file = "sphinxcontrib-napoleon-0.7.tar.gz", hash = "sha256:407382beed396e9f2d7f3043fad6afda95719204a1e1a231ac865f40abcbfcf8"}, {file = "sphinxcontrib_napoleon-0.7-py2.py3-none-any.whl", hash = "sha256:711e41a3974bdf110a484aec4c1a556799eb0b3f3b897521a018ad7e2db13fef"}, ] -sphinxcontrib-qthelp = [ + +[package.dependencies] +pockets = ">=0.3" +six = ">=1.5.2" + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +optional = false +python-versions = ">=3.5" +files = [ {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, ] -sphinxcontrib-serializinghtml = [ + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +optional = false +python-versions = ">=3.5" +files = [ {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] -sqlalchemy = [ + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sqlalchemy" +version = "1.4.49" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, @@ -2388,31 +2225,125 @@ sqlalchemy = [ {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, ] -stack-data = [ + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "stack-data" +version = "0.6.2" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, ] -sympy = [ + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, ] -tabulate = [ + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, ] -tinycss2 = [ + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.7" +files = [ {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, ] -toml = [ + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -tomli = [ + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -tornado = [ + +[[package]] +name = "tornado" +version = "6.3.2" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, @@ -2425,35 +2356,115 @@ tornado = [ {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, ] -traitlets = [ + +[[package]] +name = "traitlets" +version = "5.9.0" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.7" +files = [ {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, ] -typing-extensions = [ + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] -tzdata = [ + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, ] -unidecode = [ + +[[package]] +name = "unidecode" +version = "1.3.6" +description = "ASCII transliterations of Unicode text" +optional = false +python-versions = ">=3.5" +files = [ {file = "Unidecode-1.3.6-py3-none-any.whl", hash = "sha256:547d7c479e4f377b430dd91ac1275d593308dce0fc464fb2ab7d41f82ec653be"}, {file = "Unidecode-1.3.6.tar.gz", hash = "sha256:fed09cf0be8cf415b391642c2a5addfc72194407caee4f98719e40ec2a72b830"}, ] -urllib3 = [ + +[[package]] +name = "urllib3" +version = "2.0.4" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, ] -wcwidth = [ + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, ] -webencodings = [ + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] -wrapt = [ + +[[package]] +name = "wheel" +version = "0.41.1" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.41.1-py3-none-any.whl", hash = "sha256:473219bd4cbedc62cea0cb309089b593e47c15c4a2531015f94e4e3b9a0f6981"}, + {file = "wheel-0.41.1.tar.gz", hash = "sha256:12b911f083e876e10c595779709f8a88a59f45aacc646492a67fe9ef796c1b47"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, @@ -2530,7 +2541,23 @@ wrapt = [ {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] -zipp = [ + +[[package]] +name = "zipp" +version = "3.16.2" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "867755f154e982382c912028c74e81fe8d92d2159836fc30860cd2ca535c06e8" diff --git a/pyproject.toml b/pyproject.toml index e67d3b4b..790d3bbc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,8 @@ sympy = "^1.8" problem-bank-helpers = "^0.2.0" typing-extensions = "^4.7.1" httpimport = "^1.3.1" +beautifulsoup4 = {extras = ["lxml"], version = "^4.12.2"} +lxml = "^4.9.3" [tool.poetry.dev-dependencies] Sphinx = "^4.4" diff --git a/src/problem_bank_scripts/problem_bank_scripts.py b/src/problem_bank_scripts/problem_bank_scripts.py index 8e6d3d58..a38d08a6 100644 --- a/src/problem_bank_scripts/problem_bank_scripts.py +++ b/src/problem_bank_scripts/problem_bank_scripts.py @@ -2,6 +2,10 @@ # Date: 2021-05-09 # This file contains many helper functions that will be used across the question bank project. +import inspect +import textwrap +from bs4 import BeautifulSoup +import bs4 from docopt import docopt # Imports @@ -511,7 +515,9 @@ def assemble_server_py(parsed_question, location): "import problem_bank_scripts.prairielearn as pl", ) elif "import problem_bank_helpers as pbh" not in server_dict["imports"]: - server_dict["imports"] += "\nimport problem_bank_helpers as pbh # Added in by problem bank scripts" + server_dict[ + "imports" + ] += "\nimport problem_bank_helpers as pbh # Added in by problem bank scripts" server_py = f"""""" @@ -522,7 +528,7 @@ def assemble_server_py(parsed_question, location): indented_code = code.replace("\n", "\n ") # With the custom header, add functions to server.py as-is if function == "custom": - server_py += f"{code}" + pass else: if code: server_py += f"def {function}(data):\n {indented_code}\n" @@ -542,6 +548,9 @@ def assemble_server_py(parsed_question, location): except: raise + if "custom" in server_dict.keys(): + server_py += f"{server_dict['custom']}" + return server_py @@ -1353,3 +1362,298 @@ def validate_header(header_dict): if topics.get(topic := header_dict["topic"], None) is None: raise ValueError(f"topic '{topic}' is not listed in the learning outcomes") + + +def identify_button_html(tag: bs4.Tag) -> bool: + """Identifies if the tag is a button + + Args: + tag (bs4.Tag): BeautifulSoup tag + + Returns: + bool: True if the tag is a button, False otherwise + """ + if tag.name == "p": + button = tag.find("button", class_="btn btn-primary") + if button is not None: + if button.text.strip() == "Helpful Information": + return True + elif tag.name == "div" and tag.attrs.get("id") == "collapseExample": + return True + return False + + +def pl_to_md(question: os.PathLike): + """Converts a PL question to the OPB MD format + + Args: + question (os.PathLike): Path to the PL question directory + """ + path = pathlib.Path(question) + html = path.joinpath("question.html").read_text(encoding="utf8") + start = re.match( + r"(?P.*)\n\n", + html, + re.DOTALL | re.MULTILINE, + ) + parts: list[tuple[str, str]] = re.findall( + r"(?P.*)", + html, + re.DOTALL | re.MULTILINE, + ) + end = re.search( + r"\n\n(?!)(?P.*)", + html, + re.DOTALL | re.MULTILINE, + ) + md_result = "# {{ params.vars.title }}\n\n" + header_dict = {} + # the start and end sections are special, and don't have an associated part + if start is not None: + soup = BeautifulSoup(start.group("Content"), "lxml") + if (preamble_tag := soup.find("pl-question-panel")) is not None: + md_result += preamble_tag.text.strip() + md_result += "\n\n" + if len(usefuL_info := soup.find_all(identify_button_html)) > 0: + info = usefuL_info[1] + if not isinstance(info, bs4.Tag): + raise ValueError( + f"Detected presence of useful info button components but could not parse it for question {path.name}" + ) + md_result += f"## Useful Info\n\n{info.text.strip()}\n\n" + + if end is not None: + end_md = BeautifulSoup(end.group("Content"), "lxml").contents + if not end_md: + raise ValueError( + f"Could not find attribution at end of question for question {path.name}" + ) + end_md = end_md[0].text.strip().replace("---\n", "").replace("\n", "
") + with importlib.resources.open_text( + "problem_bank_scripts", "attributions.json" + ) as file: + possible_attributions: dict[str, str] = json.load(file) + attribution = None + for possible_attribution, pl_attribution_text in possible_attributions.items(): + if end_md.endswith(pl_attribution_text.replace("
","")): + attribution = possible_attribution + if attribution is None: + raise ValueError( + f"Could not find attribution at end of question or the found attribution was not recognized for question {path.name}:\n\n{end_md!r}" + ) + else: + raise ValueError( + f"Could not find attribution at end of question for question {path.name}" + ) + + supported_input_types = { + "pl-multiple-choice": "multiple-choice", + "pl-number-input": "number-input", + "pl-checkbox": "checkbox", + "pl-symbolic-input": "symbolic-input", + "pl-dropdown": "dropdown", + "pl-longtext": "longtext", + "pl-file-upload": "file-upload", + "pl-file-editor": "file-editor", + "pl-string-input": "string-input", + "pl-matching": "matching", + } + + auto_tags = {"multi_part"} | set(supported_input_types.values()) + + parts_dict = {} # we want to try and eagerly parse the markdown for each part so we can get the question text in + # as early as possible, but this means we need to delay adding the part metadata to the + # header dictionary since insert order is preserved in python dictionaries which will preserve it on yaml dump + + for part, content in parts: + # print(part, content) + part_soup = BeautifulSoup(content, "lxml") + pl_input = part_soup.find( + [ + "pl-big-o-input", + "pl-checkbox", + "pl-dropdown", + "pl-file-editor", + "pl-file-upload", + "pl-integer-input", + "pl-matching", + "pl-matrix-component-input", + "pl-matrix-input", + "pl-multiple-choice", + "pl-number-input", + "pl-order-blocks", + "pl-rich-text-editor", + "pl-string-input", + "pl-symbolic-input", + "pl-threejs", + "pl-units-input", + ] + ) + if pl_input is not None: + pl_input = pl_input.extract() + else: + raise ValueError(f"Could not find input tag for part {part}") + if isinstance(pl_input, bs4.NavigableString): + raise ValueError(f"Could not find input tag for part {part}") + pl_customizations = pl_input.attrs + pl_input_type = pl_input.name + opb_input_type = supported_input_types.get(pl_input_type, None) + if opb_input_type is None: + raise NotImplementedError( + f"Input type {pl_input_type} is not currently supported or is missing from the input types mapping" + ) + pl_submission_panel = part_soup.find("pl-submission-panel") + if isinstance(pl_submission_panel, bs4.Tag): + submission_panel = pl_submission_panel.text.strip() + else: + submission_panel = "" + pl_answer_panel = part_soup.find("pl-answer-panel") + if isinstance(pl_answer_panel, bs4.Tag): + answer_panel = pl_answer_panel.text.strip() + else: + answer_panel = "" + question_text_tag = part_soup.find("pl-question-panel") + if question_text_tag is not None: + question_text = question_text_tag.text.strip() + else: + question_text = "" + if opb_input_type in {"multiple-choice", "checkbox", "dropdown"}: + answers = pl_input.find_all("pl-answer") + if len(answers) == 0: + print(pl_input.prettify()) + raise ValueError(f"Could not find any answers for part {part}") + answer_list = [replace_tags(answer.text.strip()) for answer in answers] + else: + answer_list = [] + + md_result += f"## Part {part}\n\n" + if question_text: + md_result += f"{question_text}\n\n" + + md_result += "### Answer Section \n\n" + + if answer_list: + for answer in answer_list: + md_result += f"- {answer}\n" + md_result += "\n" + + if submission_panel: + md_result += f"### pl-submission-panel\n\n{submission_panel}\n\n" + + if answer_panel: + md_result += f"### pl-answer-panel\n\n{answer_panel}\n\n" + + pl_customizations.pop("answers-name", None) + + parts_dict[f"part{part}"] = { + "type": opb_input_type, + "pl-customizations": pl_customizations, + } + + info_json = json.loads(path.joinpath("info.json").read_text(encoding="utf8")) + header_dict["title"] = info_json["title"] + header_dict["topic"] = info_json["topic"].split(".", 1)[-1] + header_dict["author"] = "UNABLE TO ROUNDTRIP" + header_dict["source"] = "UNABLE TO ROUNDTRIP" + header_dict["template_version"] = "UNABLE TO ROUNDTRIP" + header_dict["attribution"] = attribution + header_dict["gradingMethod"] = info_json.get("partialCredit", None) + header_dict["partialCredit"] = info_json.get("partialCredit", None) + header_dict["singleVariant"] = info_json.get("singleVariant", None) + header_dict["showCorrectAnswer"] = info_json.get("showCorrectAnswer", None) + header_dict["dependencies"] = info_json.get("dependencies", None) + header_dict["externalGradingOptions"] = info_json.get("externalGradingOptions", None) + header_dict["workspaceOptions"] = info_json.get("workspaceOptions", None) + header_dict["outcomes"] = ["UNABLE TO ROUNDTRIP"] + header_dict["difficulty"] = ["UNABLE TO ROUNDTRIP"] + header_dict["randomization"] = ["UNABLE TO ROUNDTRIP"] + header_dict["taxonomy"] = ["UNABLE TO ROUNDTRIP"] + header_dict["span"] = ["UNABLE TO ROUNDTRIP"] + header_dict["length"] = ["UNABLE TO ROUNDTRIP"] + header_dict["tags"] = sorted(list(set(info_json["tags"]) - auto_tags)) # force deterministic order + header_dict["assets"] = [] # TODO: Add support for this + header_dict["autogradeTestFiles"] = [] # TODO: Add support for this + header_dict["workspaceFiles"] = [] # TODO: Add support for this + header_dict["serverFiles"] = [] # TODO: Add support for this + + if header_dict["tags"] == []: + header_dict["tags"] = ["unknown"] + + server_py = path.joinpath("server.py") + spec = importlib.util.spec_from_file_location(f"server_{path.name}", str(server_py.absolute())) + if spec is None: + raise ValueError(f"Could not find server.py file for question {path.name}") + server = importlib.util.module_from_spec(spec) + loader = spec.loader + if loader is None: + raise ValueError(f"Could not load server.py file for question {path.name}") + loader.exec_module(server) # execute the server.py file to get code objects for it that can be access with inspect + + functions = {} + + custom_start_line_no = 0 + + for func_name in ("imports", "generate", "prepare", "parse", "grade"): + func = getattr(server, func_name, None) + if func is None: + functions[func_name] = "pass\n" + if not inspect.isfunction(func): + raise ValueError(f"Could not find a callable function {func_name} in server.py for question {path.name} (found non callable object instead)") + if func.__code__.co_argcount != 1: + raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct number of arguments (expected 1, got {func.__code__.co_argcount})") + if func.__code__.co_varnames[0] != "data": + raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct argument name (expected 'data', got {func.__code__.co_varnames[0]!r})") + func_code = inspect.getsource(func) + functions[func_name] = textwrap.dedent(func_code.split("\n", 1)[-1]) # remove "def name(data):"" line, and remove unnecessary indentation + end_line_no = func_code.count("\n") + func.__code__.co_firstlineno + custom_start_line_no = max(custom_start_line_no, end_line_no) + # get custom functions + + func_code = inspect.getsource(server).split("\n", custom_start_line_no)[-1] + if func_code.strip(): + functions["custom"] = func_code.strip() + + header_dict["server"] = functions + + for part, info in parts_dict.items(): # now add them in to force them to the bottom + header_dict[part] = info + + for opt_key in ( + "gradingMethod", + "partialCredit", + "dependencies", + "singleVariant", + "showCorrectAnswer", + "externalGradingOptions", + "workspaceOptions" + ): # trim optional keys + if header_dict[opt_key] is None: + del header_dict[opt_key] + + for asset_key in ("assets", "autogradeTestFiles", "workspaceFiles", "serverFiles"): + if header_dict[asset_key] == []: # remove empty lists + header_dict[asset_key] = None + + def str_presenter(dumper, data2): + if len(data2.splitlines()) > 1: # check for multiline string + # data2 = re.sub('\\n[\s].*\\n','\n\n',data2) # THIS IS WRONG!!! + data2 = re.sub( + "\\n\s+\\n", "\n\n", data2 + ) # # Try \s{3,} for three or more spaces + return dumper.represent_scalar("tag:yaml.org,2002:str", data2, style="|") + if data2.startswith("pass"): + return dumper.represent_scalar("tag:yaml.org,2002:str", data2, style="|") + return dumper.represent_scalar("tag:yaml.org,2002:str", data2) + + yaml.add_representer(str, str_presenter) + + def represent_none(self, _): + return self.represent_scalar('tag:yaml.org,2002:null', '') + + yaml.add_representer(type(None), represent_none) + + md_result = f"---\n{yaml.dump(header_dict, sort_keys=False)}---\n{md_result}" + + # path.joinpath("question.md").write_text(md_result, encoding="utf8") + + return md_result From f1ddfe2fb99de0ad639f0b73a7819aa887304792 Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Fri, 11 Aug 2023 07:08:43 -0700 Subject: [PATCH 02/27] Expand implementation - Add missing section to md result we cannot roundtrip right now - Move imports to a dedicated sections with a comment - Using `ast.literal_eval`, customizations that are literals are parsed back from strings to their native type --- .../problem_bank_scripts.py | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/problem_bank_scripts/problem_bank_scripts.py b/src/problem_bank_scripts/problem_bank_scripts.py index a38d08a6..1ff79725 100644 --- a/src/problem_bank_scripts/problem_bank_scripts.py +++ b/src/problem_bank_scripts/problem_bank_scripts.py @@ -2,10 +2,6 @@ # Date: 2021-05-09 # This file contains many helper functions that will be used across the question bank project. -import inspect -import textwrap -from bs4 import BeautifulSoup -import bs4 from docopt import docopt # Imports @@ -35,6 +31,13 @@ ## Loading files : https://stackoverflow.com/a/60687710 import importlib.resources +## Roundtrip PL questions back to OPB MD +import ast +import inspect +import textwrap +import bs4 +from bs4 import BeautifulSoup + ## Topic Validation path = pathlib.Path().resolve().as_posix() @@ -1545,10 +1548,24 @@ def pl_to_md(question: os.PathLike): pl_customizations.pop("answers-name", None) + for customization, value in pl_customizations.items(): + # we want to try and parse the values of the customizations as python literals + # so that we can roundtrip them through yaml and get the same values back + # but we don't want to fail if we can't parse them, nor do we want to try and parse non literals + # so using ast.literal_eval is preferred over eval here + try: + pl_customizations[customization] = ast.literal_eval(value) + except: + pass + parts_dict[f"part{part}"] = { "type": opb_input_type, "pl-customizations": pl_customizations, } + + md_result += f"## Rubric\n\nUNABLE TO ROUNDTRIP, Defaulting to {'This should be hidden from students until after the deadline.'!r}\n\n" + md_result += f"## Solution\n\nUNABLE TO ROUNDTRIP, Defaulting to {'This should never be revealed to students.'!r}.\n\n" + md_result += f"## Comments\n\nUNABLE TO ROUNDTRIP, Defaulting to {'These are random comments associated with this question.'!r}\n\n" info_json = json.loads(path.joinpath("info.json").read_text(encoding="utf8")) header_dict["title"] = info_json["title"] @@ -1634,6 +1651,9 @@ def pl_to_md(question: os.PathLike): if header_dict[asset_key] == []: # remove empty lists header_dict[asset_key] = None + + ### START Yaml Dump Configuration ### + def str_presenter(dumper, data2): if len(data2.splitlines()) > 1: # check for multiline string # data2 = re.sub('\\n[\s].*\\n','\n\n',data2) # THIS IS WRONG!!! @@ -1641,17 +1661,19 @@ def str_presenter(dumper, data2): "\\n\s+\\n", "\n\n", data2 ) # # Try \s{3,} for three or more spaces return dumper.represent_scalar("tag:yaml.org,2002:str", data2, style="|") - if data2.startswith("pass"): + if data2.startswith("pass"): # Check for default server.py functions return dumper.represent_scalar("tag:yaml.org,2002:str", data2, style="|") return dumper.represent_scalar("tag:yaml.org,2002:str", data2) yaml.add_representer(str, str_presenter) - def represent_none(self, _): + def represent_none(self, _): # This removes explicit null values return self.represent_scalar('tag:yaml.org,2002:null', '') yaml.add_representer(type(None), represent_none) + ### END Yaml Dump Configuration ### + md_result = f"---\n{yaml.dump(header_dict, sort_keys=False)}---\n{md_result}" # path.joinpath("question.md").write_text(md_result, encoding="utf8") From 945d29492abb529e559b06b80685b1246b2cbd02 Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Fri, 11 Aug 2023 07:15:48 -0700 Subject: [PATCH 03/27] Use inspect over code obj internals where possible --- src/problem_bank_scripts/problem_bank_scripts.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/problem_bank_scripts/problem_bank_scripts.py b/src/problem_bank_scripts/problem_bank_scripts.py index 1ff79725..f608845e 100644 --- a/src/problem_bank_scripts/problem_bank_scripts.py +++ b/src/problem_bank_scripts/problem_bank_scripts.py @@ -1616,10 +1616,10 @@ def pl_to_md(question: os.PathLike): functions[func_name] = "pass\n" if not inspect.isfunction(func): raise ValueError(f"Could not find a callable function {func_name} in server.py for question {path.name} (found non callable object instead)") - if func.__code__.co_argcount != 1: - raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct number of arguments (expected 1, got {func.__code__.co_argcount})") - if func.__code__.co_varnames[0] != "data": - raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct argument name (expected 'data', got {func.__code__.co_varnames[0]!r})") + if len(arguments := inspect.getargs(func.__code__)) != 1 : + raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct number of arguments (expected 1, got {len(arguments)})") + if arguments[0] != "data": + raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct argument name (expected 'data', got {arguments[0]!r})") func_code = inspect.getsource(func) functions[func_name] = textwrap.dedent(func_code.split("\n", 1)[-1]) # remove "def name(data):"" line, and remove unnecessary indentation end_line_no = func_code.count("\n") + func.__code__.co_firstlineno From 4858bc98cc5301c5f2a9a04bd88c8df7414ac8c9 Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Fri, 11 Aug 2023 07:19:48 -0700 Subject: [PATCH 04/27] Add basic asset handling now attempts to list assets found in the 4 key folders from prairielearn --- .../problem_bank_scripts.py | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/problem_bank_scripts/problem_bank_scripts.py b/src/problem_bank_scripts/problem_bank_scripts.py index f608845e..632102df 100644 --- a/src/problem_bank_scripts/problem_bank_scripts.py +++ b/src/problem_bank_scripts/problem_bank_scripts.py @@ -1647,10 +1647,32 @@ def pl_to_md(question: os.PathLike): if header_dict[opt_key] is None: del header_dict[opt_key] - for asset_key in ("assets", "autogradeTestFiles", "workspaceFiles", "serverFiles"): - if header_dict[asset_key] == []: # remove empty lists - header_dict[asset_key] = None + ### Get assets # TODO: Copy assets to destination path + client_assets = path / "clientFilesQuestion" + server_assets = path / "serverFilesQuestion" + test_assets = path / "tests" + workspace_assets = path / "workspaceFiles" + + if client_assets.exists(): + header_dict["assets"] = sorted([str(fl.relative_to(path)) for fl in client_assets.iterdir()]) + else: + header_dict["assets"] = None + + if server_assets.exists(): + header_dict["serverFiles"] = sorted([str(fl.relative_to(path)) for fl in server_assets.iterdir()]) + else: + header_dict["serverFiles"] = None + + if test_assets.exists(): + header_dict["autogradeTestFiles"] = sorted([str(fl.relative_to(path)) for fl in test_assets.iterdir()]) + else: + header_dict["autogradeTestFiles"] = None + + if workspace_assets.exists(): + header_dict["workspaceFiles"] = sorted([str(fl.relative_to(path)) for fl in workspace_assets.iterdir()]) + else: + header_dict["workspaceFiles"] = None ### START Yaml Dump Configuration ### From 27723fd9ebd9702734a1099000aa39ada5f43772 Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Fri, 11 Aug 2023 18:48:24 -0700 Subject: [PATCH 05/27] Adjust inspect usage from 945d294 Need to flatten the namedtuple to a list --- src/problem_bank_scripts/problem_bank_scripts.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/problem_bank_scripts/problem_bank_scripts.py b/src/problem_bank_scripts/problem_bank_scripts.py index 632102df..577e12af 100644 --- a/src/problem_bank_scripts/problem_bank_scripts.py +++ b/src/problem_bank_scripts/problem_bank_scripts.py @@ -1610,13 +1610,20 @@ def pl_to_md(question: os.PathLike): custom_start_line_no = 0 + def flatten(data): + if isinstance(data, tuple): + for x in data: + yield from flatten(x) + else: + yield data + for func_name in ("imports", "generate", "prepare", "parse", "grade"): func = getattr(server, func_name, None) if func is None: functions[func_name] = "pass\n" if not inspect.isfunction(func): raise ValueError(f"Could not find a callable function {func_name} in server.py for question {path.name} (found non callable object instead)") - if len(arguments := inspect.getargs(func.__code__)) != 1 : + if len(arguments := list(flatten(inspect.getargs(func.__code__)))) != 1 : raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct number of arguments (expected 1, got {len(arguments)})") if arguments[0] != "data": raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct argument name (expected 'data', got {arguments[0]!r})") From ffe2818ba34df86e01cd1a7f717b03750b9166c5 Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Fri, 11 Aug 2023 19:57:42 -0700 Subject: [PATCH 06/27] Expand pl_to_md implementation - Now copies asset files - Allows for an output directory and filename to be passed - Validates input paths are directories and not files - Improves argument checking --- .../problem_bank_scripts.py | 198 +++++++++++++----- 1 file changed, 144 insertions(+), 54 deletions(-) diff --git a/src/problem_bank_scripts/problem_bank_scripts.py b/src/problem_bank_scripts/problem_bank_scripts.py index 577e12af..4fc438e6 100644 --- a/src/problem_bank_scripts/problem_bank_scripts.py +++ b/src/problem_bank_scripts/problem_bank_scripts.py @@ -1386,14 +1386,60 @@ def identify_button_html(tag: bs4.Tag) -> bool: return False -def pl_to_md(question: os.PathLike): +def pl_to_md( + question: os.PathLike[str], output: os.PathLike[str], file_name: str | None = None +): """Converts a PL question to the OPB MD format Args: - question (os.PathLike): Path to the PL question directory + question (os.PathLike[str]): Path to the PL question directory + output (os.PathLike[str]): Path to the output directory + file_name (str, optional): Name of the output file. Defaults to the name of last segment of the output filepath. + + Raises: + FileNotFoundError: If the question directory does not exist + NotADirectoryError: If the question or output path is a file + ValueError: If the question directory is missing any of the required files, the files are not in the expected format, or the attribution at the end of the question is not recognized + UserWarning: If the output directory already exists + NotImplementedError: If the question contains a question type that is not yet supported """ path = pathlib.Path(question) - html = path.joinpath("question.html").read_text(encoding="utf8") + if not path.exists(): + raise FileNotFoundError(f"{question} does not exist") + if path.is_file(): + raise NotADirectoryError( + f"{question} is not a directory, passing a file as the question directory is not supported for converting PL to MD" + ) + + output_path = pathlib.Path(output) + if output_path.is_file(): + raise NotADirectoryError( + f"{output} is not a directory, passing a file as the output directory is not supported for converting PL to MD" + ) + if output_path.exists(): + warnings.warn( + f"Directory {output!r} already exists, any files with the same name will be overwritten", + UserWarning, + stacklevel=2, + ) + output_path.mkdir(parents=True, exist_ok=True) + output_md_file = output_path / (file_name or f"{path.name}.md") + + question_file = path / "question.html" + info_json_file = path / "info.json" + server_py = path / "server.py" + + if not (question_file.exists() and info_json_file.exists() and server_py.exists()): + error = "Error: the following files are missing and are required to convert a question:" + if not question_file.exists(): + error += f"\n\tquestion.html does not exist in {question}" + if not info_json_file.exists(): + error += f"\n\tinfo.json does not exist in {question}" + if not server_py.exists(): + error += f"\n\tserver.py does not exist in {question}" + raise FileNotFoundError(error) + + html = question_file.read_text(encoding="utf8") start = re.match( r"(?P.*)\n\n", html, @@ -1438,7 +1484,7 @@ def pl_to_md(question: os.PathLike): possible_attributions: dict[str, str] = json.load(file) attribution = None for possible_attribution, pl_attribution_text in possible_attributions.items(): - if end_md.endswith(pl_attribution_text.replace("
","")): + if end_md.endswith(pl_attribution_text.replace("
", "")): attribution = possible_attribution if attribution is None: raise ValueError( @@ -1464,9 +1510,11 @@ def pl_to_md(question: os.PathLike): auto_tags = {"multi_part"} | set(supported_input_types.values()) - parts_dict = {} # we want to try and eagerly parse the markdown for each part so we can get the question text in - # as early as possible, but this means we need to delay adding the part metadata to the - # header dictionary since insert order is preserved in python dictionaries which will preserve it on yaml dump + parts_dict = ( + {} + ) # we want to try and eagerly parse the markdown for each part so we can get the question text in + # as early as possible, but this means we need to delay adding the part metadata to the + # header dictionary since insert order is preserved in python dictionaries which will preserve it on yaml dump for part, content in parts: # print(part, content) @@ -1539,10 +1587,10 @@ def pl_to_md(question: os.PathLike): for answer in answer_list: md_result += f"- {answer}\n" md_result += "\n" - + if submission_panel: md_result += f"### pl-submission-panel\n\n{submission_panel}\n\n" - + if answer_panel: md_result += f"### pl-answer-panel\n\n{answer_panel}\n\n" @@ -1566,8 +1614,8 @@ def pl_to_md(question: os.PathLike): md_result += f"## Rubric\n\nUNABLE TO ROUNDTRIP, Defaulting to {'This should be hidden from students until after the deadline.'!r}\n\n" md_result += f"## Solution\n\nUNABLE TO ROUNDTRIP, Defaulting to {'This should never be revealed to students.'!r}.\n\n" md_result += f"## Comments\n\nUNABLE TO ROUNDTRIP, Defaulting to {'These are random comments associated with this question.'!r}\n\n" - - info_json = json.loads(path.joinpath("info.json").read_text(encoding="utf8")) + + info_json = json.loads(info_json_file.read_text(encoding="utf8")) header_dict["title"] = info_json["title"] header_dict["topic"] = info_json["topic"].split(".", 1)[-1] header_dict["author"] = "UNABLE TO ROUNDTRIP" @@ -1579,7 +1627,9 @@ def pl_to_md(question: os.PathLike): header_dict["singleVariant"] = info_json.get("singleVariant", None) header_dict["showCorrectAnswer"] = info_json.get("showCorrectAnswer", None) header_dict["dependencies"] = info_json.get("dependencies", None) - header_dict["externalGradingOptions"] = info_json.get("externalGradingOptions", None) + header_dict["externalGradingOptions"] = info_json.get( + "externalGradingOptions", None + ) header_dict["workspaceOptions"] = info_json.get("workspaceOptions", None) header_dict["outcomes"] = ["UNABLE TO ROUNDTRIP"] header_dict["difficulty"] = ["UNABLE TO ROUNDTRIP"] @@ -1587,48 +1637,62 @@ def pl_to_md(question: os.PathLike): header_dict["taxonomy"] = ["UNABLE TO ROUNDTRIP"] header_dict["span"] = ["UNABLE TO ROUNDTRIP"] header_dict["length"] = ["UNABLE TO ROUNDTRIP"] - header_dict["tags"] = sorted(list(set(info_json["tags"]) - auto_tags)) # force deterministic order - header_dict["assets"] = [] # TODO: Add support for this - header_dict["autogradeTestFiles"] = [] # TODO: Add support for this - header_dict["workspaceFiles"] = [] # TODO: Add support for this - header_dict["serverFiles"] = [] # TODO: Add support for this - + header_dict["tags"] = sorted( + list(set(info_json["tags"]) - auto_tags) + ) # force deterministic order + header_dict["assets"] = [] # TODO: Add support for this + header_dict["autogradeTestFiles"] = [] # TODO: Add support for this + header_dict["workspaceFiles"] = [] # TODO: Add support for this + header_dict["serverFiles"] = [] # TODO: Add support for this + if header_dict["tags"] == []: header_dict["tags"] = ["unknown"] - server_py = path.joinpath("server.py") - spec = importlib.util.spec_from_file_location(f"server_{path.name}", str(server_py.absolute())) + spec = importlib.util.spec_from_file_location( + f"server_{path.name}", str(server_py.absolute()) + ) if spec is None: raise ValueError(f"Could not find server.py file for question {path.name}") server = importlib.util.module_from_spec(spec) loader = spec.loader if loader is None: raise ValueError(f"Could not load server.py file for question {path.name}") - loader.exec_module(server) # execute the server.py file to get code objects for it that can be access with inspect + loader.exec_module( + server + ) # execute the server.py file to get code objects for it that can be access with inspect functions = {} custom_start_line_no = 0 - def flatten(data): - if isinstance(data, tuple): - for x in data: - yield from flatten(x) - else: - yield data + def flatten_args(data: inspect.Arguments): + args, varargs, varkw = data + if varargs is not None: + args.append(varargs) + if varkw is not None: + args.append(varkw) + return args for func_name in ("imports", "generate", "prepare", "parse", "grade"): func = getattr(server, func_name, None) if func is None: functions[func_name] = "pass\n" if not inspect.isfunction(func): - raise ValueError(f"Could not find a callable function {func_name} in server.py for question {path.name} (found non callable object instead)") - if len(arguments := list(flatten(inspect.getargs(func.__code__)))) != 1 : - raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct number of arguments (expected 1, got {len(arguments)})") + raise ValueError( + f"Could not find a callable function {func_name} in server.py for question {path.name} (found non callable object instead)" + ) + if len(arguments := flatten_args(inspect.getargs(func.__code__))) != 1: + raise ValueError( + f"Function {func_name} in server.py for question {path.name} does not have the correct number of arguments (expected 1, got {len(arguments)}: {arguments!r})" + ) if arguments[0] != "data": - raise ValueError(f"Function {func_name} in server.py for question {path.name} does not have the correct argument name (expected 'data', got {arguments[0]!r})") + raise ValueError( + f"Function {func_name} in server.py for question {path.name} does not have the correct argument name (expected 'data', got {arguments[0]!r})" + ) func_code = inspect.getsource(func) - functions[func_name] = textwrap.dedent(func_code.split("\n", 1)[-1]) # remove "def name(data):"" line, and remove unnecessary indentation + functions[func_name] = textwrap.dedent( + func_code.split("\n", 1)[-1] + ) # remove "def name(data):"" line, and remove unnecessary indentation end_line_no = func_code.count("\n") + func.__code__.co_firstlineno custom_start_line_no = max(custom_start_line_no, end_line_no) # get custom functions @@ -1636,10 +1700,10 @@ def flatten(data): func_code = inspect.getsource(server).split("\n", custom_start_line_no)[-1] if func_code.strip(): functions["custom"] = func_code.strip() - + header_dict["server"] = functions - - for part, info in parts_dict.items(): # now add them in to force them to the bottom + + for part, info in parts_dict.items(): # now add them in to force them to the bottom header_dict[part] = info for opt_key in ( @@ -1649,8 +1713,8 @@ def flatten(data): "singleVariant", "showCorrectAnswer", "externalGradingOptions", - "workspaceOptions" - ): # trim optional keys + "workspaceOptions", + ): # trim optional keys if header_dict[opt_key] is None: del header_dict[opt_key] @@ -1662,24 +1726,50 @@ def flatten(data): workspace_assets = path / "workspaceFiles" if client_assets.exists(): - header_dict["assets"] = sorted([str(fl.relative_to(path)) for fl in client_assets.iterdir()]) + header_dict["assets"] = sorted( + [str(fl.relative_to(client_assets)) for fl in client_assets.iterdir()] + ) + # copy the files from the clientFilesQuestion directory to the output directory + for fl in client_assets.iterdir(): + copy2(fl, output_path / fl.name) else: - header_dict["assets"] = None - + del header_dict["assets"] # remove the key if it the directory doesn't exist + if server_assets.exists(): - header_dict["serverFiles"] = sorted([str(fl.relative_to(path)) for fl in server_assets.iterdir()]) + header_dict["serverFiles"] = sorted( + [str(fl.relative_to(server_assets)) for fl in server_assets.iterdir()] + ) + # copy the files from the serverFilesQuestion directory to the output directory + for fl in server_assets.iterdir(): + copy2(fl, output_path / fl.name) else: - header_dict["serverFiles"] = None + del header_dict[ + "serverFiles" + ] # remove the key if it the directory doesn't exist if test_assets.exists(): - header_dict["autogradeTestFiles"] = sorted([str(fl.relative_to(path)) for fl in test_assets.iterdir()]) + header_dict["autogradeTestFiles"] = sorted( + [str(fl.relative_to(test_assets)) for fl in test_assets.iterdir()] + ) + # copy the files from the assets directory to the tests subdirectory of the output directory + for fl in test_assets.iterdir(): + copy2(fl, output_path / "tests" / fl.name) else: - header_dict["autogradeTestFiles"] = None + del header_dict[ + "autogradeTestFiles" + ] # remove the key if it the directory doesn't exist if workspace_assets.exists(): - header_dict["workspaceFiles"] = sorted([str(fl.relative_to(path)) for fl in workspace_assets.iterdir()]) + header_dict["workspaceFiles"] = sorted( + [str(fl.relative_to(workspace_assets)) for fl in workspace_assets.iterdir()] + ) + # copy the files from the workspaceFiles directory to the workspace subdirectory of the output directory + for fl in workspace_assets.iterdir(): + copy2(fl, output_path / "workspace" / fl.name) else: - header_dict["workspaceFiles"] = None + del header_dict[ + "workspaceFiles" + ] # remove the key if it the directory doesn't exist ### START Yaml Dump Configuration ### @@ -1690,21 +1780,21 @@ def str_presenter(dumper, data2): "\\n\s+\\n", "\n\n", data2 ) # # Try \s{3,} for three or more spaces return dumper.represent_scalar("tag:yaml.org,2002:str", data2, style="|") - if data2.startswith("pass"): # Check for default server.py functions + if data2.startswith("pass"): # Check for default server.py functions return dumper.represent_scalar("tag:yaml.org,2002:str", data2, style="|") return dumper.represent_scalar("tag:yaml.org,2002:str", data2) yaml.add_representer(str, str_presenter) - def represent_none(self, _): # This removes explicit null values - return self.represent_scalar('tag:yaml.org,2002:null', '') + def represent_none(self, _): # This removes explicit null values + return self.represent_scalar("tag:yaml.org,2002:null", "") yaml.add_representer(type(None), represent_none) ### END Yaml Dump Configuration ### - md_result = f"---\n{yaml.dump(header_dict, sort_keys=False)}---\n{md_result}" - - # path.joinpath("question.md").write_text(md_result, encoding="utf8") - - return md_result + # Write the completed converted question to a file + output_md_file.write_text( + f"---\n{yaml.dump(header_dict, sort_keys=False)}---\n{md_result}", + encoding="utf8", + ) From 7f3d995708fb73cbab95828bb002d013171f0d7a Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Wed, 16 Aug 2023 07:03:45 -0700 Subject: [PATCH 07/27] Fix implementation based on testing - Need to prevent `"..."` from being evaled to the `Ellipses` literal - Remove the `__pycache__` directory created by importing and executing the `server.py` file - Fix `server.py` parsing - Fix asset copying - Add `pl-rich-text-editor` to list of supported pl inputs --- src/problem_bank_scripts/problem_bank_scripts.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/problem_bank_scripts/problem_bank_scripts.py b/src/problem_bank_scripts/problem_bank_scripts.py index 4fc438e6..1d8fb831 100644 --- a/src/problem_bank_scripts/problem_bank_scripts.py +++ b/src/problem_bank_scripts/problem_bank_scripts.py @@ -13,7 +13,7 @@ import numpy as np import os from collections import defaultdict -from shutil import copy2 +from shutil import copy2, rmtree import re import codecs import importlib.util @@ -1506,6 +1506,7 @@ def pl_to_md( "pl-file-editor": "file-editor", "pl-string-input": "string-input", "pl-matching": "matching", + "pl-rich-text-editor": "longtext", } auto_tags = {"multi_part"} | set(supported_input_types.values()) @@ -1602,7 +1603,8 @@ def pl_to_md( # but we don't want to fail if we can't parse them, nor do we want to try and parse non literals # so using ast.literal_eval is preferred over eval here try: - pl_customizations[customization] = ast.literal_eval(value) + if (val := ast.literal_eval(value)) is not Ellipsis: # Ellipsis is ..., and is a valid python literal, but we don't want to unstringify it + pl_customizations[customization] = val except: pass @@ -1677,6 +1679,7 @@ def flatten_args(data: inspect.Arguments): func = getattr(server, func_name, None) if func is None: functions[func_name] = "pass\n" + continue if not inspect.isfunction(func): raise ValueError( f"Could not find a callable function {func_name} in server.py for question {path.name} (found non callable object instead)" @@ -1752,6 +1755,7 @@ def flatten_args(data: inspect.Arguments): [str(fl.relative_to(test_assets)) for fl in test_assets.iterdir()] ) # copy the files from the assets directory to the tests subdirectory of the output directory + output_path.joinpath("tests").mkdir(exist_ok=True) for fl in test_assets.iterdir(): copy2(fl, output_path / "tests" / fl.name) else: @@ -1764,6 +1768,7 @@ def flatten_args(data: inspect.Arguments): [str(fl.relative_to(workspace_assets)) for fl in workspace_assets.iterdir()] ) # copy the files from the workspaceFiles directory to the workspace subdirectory of the output directory + output_path.joinpath("workspace").mkdir(exist_ok=True) for fl in workspace_assets.iterdir(): copy2(fl, output_path / "workspace" / fl.name) else: @@ -1798,3 +1803,7 @@ def represent_none(self, _): # This removes explicit null values f"---\n{yaml.dump(header_dict, sort_keys=False)}---\n{md_result}", encoding="utf8", ) + + pycache = path / "__pycache__" + if pycache.exists(): + rmtree(pycache, ignore_errors=True) # remove the pycache directory, we don't want to leave a mess of pyc files behind From ad373ef27d4eb9df3da45fb77ad4206e0a8d05a2 Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Wed, 16 Aug 2023 07:04:17 -0700 Subject: [PATCH 08/27] Add tests Also minor updates to overall test layout to make round trip testing work nicer --- test/regen-q11_multi-part/q11_multi-part.md | 173 +++++++++++ test/regen-q11_multi-part/test1.png | Bin 0 -> 15757 bytes test/regen-q11_multi-part/test2.png | Bin 0 -> 16055 bytes tests/conftest.py | 42 +++ tests/test_md_to_pl.py | 283 ++++++++++++++++++ tests/test_pl_to_md.py | 67 +++++ tests/test_problem_bank_scripts.py | 257 +--------------- tests/test_question_templates/.gitignore | 3 +- .../q01_multiple-choice.md | 141 +++++++++ .../q01_multiple-choice/test1.png | Bin 0 -> 15757 bytes .../q01_multiple-choice/test2.png | Bin 0 -> 16055 bytes .../q02_number-input/q02_number-input.md | 141 +++++++++ .../q03_dropdown/q03_dropdown.md | 138 +++++++++ .../q04_checkbox/q04_checkbox.md | 147 +++++++++ .../q05_multi-part_feedback.md | 159 ++++++++++ .../q06_number-input_feedback.md | 148 +++++++++ .../q07a_symbolic-input.md | 111 +++++++ .../q07b_symbolic-input.md | 122 ++++++++ .../q09_file-upload/q09_file-upload.md | 91 ++++++ .../q10_integer-input/q10_integer-input.md | 106 +++++++ .../q11_multi-part/q11_multi-part.md | 170 +++++++++++ .../q11_multi-part/test1.png | Bin 0 -> 15757 bytes .../q11_multi-part/test2.png | Bin 0 -> 16055 bytes .../q12_longtext-input/q12_longtext-input.md | 96 ++++++ .../q12_longtext-input/sample.html | 11 + .../q13_file-editor-input.md | 133 ++++++++ .../q13_file-editor-input/tests/ans.py | 4 + .../q13_file-editor-input/tests/setup_code.py | 2 + .../tests/starter_code.py | 1 + .../q13_file-editor-input/tests/test.py | 64 ++++ .../q14_string-input/q14_string-input.md | 102 +++++++ .../q15_matching/q15_matching.md | 121 ++++++++ .../spring_oscillations.md | 127 ++++++++ 33 files changed, 2704 insertions(+), 256 deletions(-) create mode 100644 test/regen-q11_multi-part/q11_multi-part.md create mode 100644 test/regen-q11_multi-part/test1.png create mode 100644 test/regen-q11_multi-part/test2.png create mode 100644 tests/conftest.py create mode 100644 tests/test_md_to_pl.py create mode 100644 tests/test_pl_to_md.py create mode 100644 tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/q01_multiple-choice.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/test1.png create mode 100644 tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/test2.png create mode 100644 tests/test_question_templates/question_return_expected_outputs/q02_number-input/q02_number-input.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q03_dropdown/q03_dropdown.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q04_checkbox/q04_checkbox.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q05_multi-part_feedback/q05_multi-part_feedback.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q06_number-input_feedback/q06_number-input_feedback.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q07a_symbolic-input/q07a_symbolic-input.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q07b_symbolic-input/q07b_symbolic-input.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q09_file-upload/q09_file-upload.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q10_integer-input/q10_integer-input.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q11_multi-part/q11_multi-part.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q11_multi-part/test1.png create mode 100644 tests/test_question_templates/question_return_expected_outputs/q11_multi-part/test2.png create mode 100644 tests/test_question_templates/question_return_expected_outputs/q12_longtext-input/q12_longtext-input.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q12_longtext-input/sample.html create mode 100644 tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/q13_file-editor-input.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/ans.py create mode 100644 tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/setup_code.py create mode 100644 tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/starter_code.py create mode 100644 tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/test.py create mode 100644 tests/test_question_templates/question_return_expected_outputs/q14_string-input/q14_string-input.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/q15_matching/q15_matching.md create mode 100644 tests/test_question_templates/question_return_expected_outputs/spring_oscillations/spring_oscillations.md diff --git a/test/regen-q11_multi-part/q11_multi-part.md b/test/regen-q11_multi-part/q11_multi-part.md new file mode 100644 index 00000000..b8d84578 --- /dev/null +++ b/test/regen-q11_multi-part/q11_multi-part.md @@ -0,0 +1,173 @@ +--- +title: Multi-part Question +topic: Template +author: UNABLE TO ROUNDTRIP +source: UNABLE TO ROUNDTRIP +template_version: UNABLE TO ROUNDTRIP +attribution: standard +gradingMethod: true +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- UNABLE TO ROUNDTRIP +difficulty: +- UNABLE TO ROUNDTRIP +randomization: +- UNABLE TO ROUNDTRIP +taxonomy: +- UNABLE TO ROUNDTRIP +span: +- UNABLE TO ROUNDTRIP +length: +- UNABLE TO ROUNDTRIP +tags: +- unknown +assets: +- test1.png +- test2.png +autogradeTestFiles: +workspaceFiles: +serverFiles: +server: + imports: | + import random as rd; rd.seed(111) + import pandas as pd + import problem_bank_helpers as pbh + generate: | + data2 = pbh.create_data2() + + # define or load names/items/objects + names = pbh.names.copy() + manual_vehicles = pbh.manual_vehicles.copy() + + # store phrases etc + data2["params"]["vars"]["name"] = rd.choice(names) + data2["params"]["vars"]["vehicle"] = rd.choice(manual_vehicles) + data2["params"]["vars"]["title"] = "Distance travelled" + data2["params"]["vars"]["units"] = "m/s" + + # define bounds of the variables + v = rd.randint(2,7) + t = rd.randint(5,10) + + # store the variables in the dictionary "params" + data2["params"]["v"] = v + data2["params"]["t"] = t + + ## Part 1 + + # define correct answers + data2["correct_answers"]["part1_ans"] = v*t + + ## Part 2 + + # define possible answers + data2["params"]["part2"]["ans1"]["value"] = pbh.roundp(42) + data2["params"]["part2"]["ans1"]["correct"] = False + + data2["params"]["part2"]["ans2"]["value"] = pbh.roundp(v*t) + data2["params"]["part2"]["ans2"]["correct"] = True + + data2["params"]["part2"]["ans3"]["value"] = pbh.roundp(v+t) + data2["params"]["part2"]["ans3"]["correct"] = False + + data2["params"]["part2"]["ans4"]["value"] = pbh.roundp(v/t) + data2["params"]["part2"]["ans4"]["correct"] = False + + data2["params"]["part2"]["ans5"]["value"] = pbh.roundp(v-t) + data2["params"]["part2"]["ans5"]["correct"] = False + + data2["params"]["part2"]["ans6"]["value"] = pbh.roundp(1.3*(v-t)) + data2["params"]["part2"]["ans6"]["correct"] = False + + # Update the data object with a new dict + data.update(data2) + + # Start code added automatically by problem_bank_scripts + + # Convert backticks to code blocks/fences in answer choices. + pbh.backticks_to_code_tags(data2) + + # Update data with data2 + data.update(data2) + + # End code added in by problem bank scripts + prepare: | + pass + parse: | + pass + grade: | + pass +part1: + type: number-input + pl-customizations: + rtol: 0.05 + weight: 1 + allow-blank: true + label: $d= $ + suffix: m + comparison: sigfig + digits: 2 +part2: + type: multiple-choice + pl-customizations: + weight: 1 +--- +# {{ params.vars.title }} + +This part of the question is common to both Parts 1 and 2. + +## Part 1 + +{{ params.vars.name }} is traveling on {{ params.vars.vehicle }} at {{ params.v }} {{ params.vars.units }}. +How far does {{ vars.name }} travel in {{ params.t }} seconds, assuming they continue at the same velocity? + +### Answer Section + +### pl-submission-panel + +Everything here will get inserted directly into the pl-submission-panel element at the end of the `question.html`. +Please remove this section if it is not application for this question. + +### pl-answer-panel + +Everything here will get inserted directly into an pl-answer-panel element at the end of the `question.html`. +Please remove this section if it is not application for this question. + +## Part 2 + +{{ params.vars.name }} is traveling on {{ params.vars.vehicle }} at {{ params.v }} {{ params.vars.units }}. +How far does {{ params.vars.name }} travel in {{ params.t }} seconds, assuming they continue at the same velocity? + +### Answer Section + +- {{{ params.part2.ans1.value }}} {{ params.vars.units }} +- {{{ params.part2.ans2.value }}} {{ params.vars.units }} +- {{{ params.part2.ans3.value }}} {{ params.vars.units }} +- {{{ params.part2.ans4.value }}} {{ params.vars.units }} +- {{{ params.part2.ans5.value }}} {{ params.vars.units }} +- {{{ params.part2.ans6.value }}} {{ params.vars.units }} + +### pl-submission-panel + +Everything here will get inserted directly into the pl-submission-panel element at the end of the `question.html`. +Please remove this section if it is not application for this question. + +### pl-answer-panel + +Everything here will get inserted directly into an pl-answer-panel element at the end of the `question.html`. +Please remove this section if it is not application for this question. + +## Rubric + +UNABLE TO ROUNDTRIP, Defaulting to 'This should be hidden from students until after the deadline.' + +## Solution + +UNABLE TO ROUNDTRIP, Defaulting to 'This should never be revealed to students.'. + +## Comments + +UNABLE TO ROUNDTRIP, Defaulting to 'These are random comments associated with this question.' + diff --git a/test/regen-q11_multi-part/test1.png b/test/regen-q11_multi-part/test1.png new file mode 100644 index 0000000000000000000000000000000000000000..fdaf7b949f80bab736a6b42818564122de76919f GIT binary patch literal 15757 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 K1wVw=LSZ1PB%g?jGD7g1fs*0C|0D(|!t;NKY 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 3.8 doesn't support subscripting builtin collections - -import filecmp -import json -import os -import pathlib - -import fastjsonschema -import pandas as pd import pytest -from problem_bank_scripts import __version__, process_question_pl, process_question_md - - def test_version(): - assert __version__ == "0.9.1" - - -# TODO: excluding symbolic questions, needs to be fixed because of how sympy objects are handled -exclude_question = ( - "q07a_symbolic-input", - "q07b_symbolic-input", -) - -# Generate a list of all problems in the test problems directory -files = sorted( - [ - file.name - for file in pathlib.Path( - "tests/test_question_templates/question_inputs/" - ).iterdir() - if file.name != ".DS_Store" - ] -) - -@pytest.fixture(scope="session") -def paths(): - """Sets the paths of where to find inputs, generated outputs, and expected outputs. - - Returns: - Nothing, it's a fixture that is run before every test. - """ - p = { - "inputDest": pathlib.Path("tests/test_question_templates/question_inputs/"), - "outputDest": pathlib.Path("tests/test_question_templates/question_generated_outputs/"), - "compareDest": pathlib.Path("tests/test_question_templates/question_expected_outputs/"), - } - return p - -@pytest.fixture(scope="session") -def validate_info_json(): - """Generates a schema validator for info.json files. - - Returns: - Nothing, it's a fixture that is run before every test. - """ - with open("tests/infoSchema.json") as file: - schema = fastjsonschema.compile(json.load(file)) - return schema - -_tested_questions = set() - -def run_prairie_learn_generator(paths: dict[str, pathlib.Path], question: str, devmode: bool): - """Helper function that runs the PrairieLearn generator on a question. - - This allows us to deduplicate the code for running the generator. - - Args: - paths (dict): definition of the output and input paths - question (str): the name of the question to test, set by the parametrize decorator - devmode (bool): whether to run the generator in devmode - """ - if (question, devmode) in _tested_questions: - return # don't parse the same question twice - _tested_questions.add((question, devmode)) - outputPath = paths["outputDest"].joinpath(f"prairielearn{'-dev' if devmode else ''}/") - - baseFile = paths["inputDest"] / question / f"{question}.md" - folder = baseFile.parent.stem - outputFolder = outputPath.joinpath(folder) - process_question_pl(baseFile, outputFolder.joinpath(baseFile.name), devmode) - - -@pytest.mark.parametrize( - "question,devmode", - [ - pytest.param( - file, - dev, - id=(f"dev-{file}" if dev else f"nodev-{file}"), - marks=([pytest.mark.xfail(reason="Problem specified in the `exclude_question` list")] if file in exclude_question else []), - ) - for file in files for dev in [False, True] - ], -) -def test_prairie_learn(paths: dict[str, pathlib.Path], question: str, devmode: bool): - """Tests the PrairieLearn `process_question_pl()` - - Args: - paths (dict): set by the fixture paths() - question (str): the name of the question to test, set by the parametrize decorator - devmode (bool): whether to run the generator in devmode - """ - run_prairie_learn_generator(paths, question, devmode) - outputPath = paths["outputDest"].joinpath(f"prairielearn{'-dev' if devmode else ''}/") - comparePath = paths["compareDest"].joinpath(f"prairielearn{'-dev' if devmode else ''}/") - baseFile = paths["inputDest"].joinpath(f"{question}/{question}.md") - folder = baseFile.parent.stem - - for file in sorted(comparePath.joinpath(f"{folder}/").glob("**/*")): - isFile = os.path.isfile(file) - hiddenFile = not file.name.startswith(".") - assetFile = ( - file.name == "question.html" or not file.name.endswith((".png", ".jpg", ".jpeg", ".gif", ".html", ".DS_Store")) - ) - excludedFile = not file.parent.name in exclude_question - - print(hiddenFile, ~(hiddenFile)) - - # TODO: Find a way to separately test info.json files - infoJSON = not file.name.endswith("info.json") - - if isFile and hiddenFile and assetFile and excludedFile and infoJSON: - folder = file.parent.name - outputFolder = outputPath.joinpath(folder) - - try: - filecmp.cmp(file, outputPath / file.relative_to(comparePath)) - except FileNotFoundError: - print(file, folder, outputFolder, outputPath / file.relative_to(comparePath)) - - assert filecmp.cmp( - file, outputPath / file.relative_to(comparePath) - ), f"File: {'/'.join(file.parts[-2:])} did not match with expected output." - - - -@pytest.mark.parametrize( - "question,devmode", - [ - pytest.param( - file, - dev, - id=(f"nodev-{file}" if dev else f"dev-{file}"), - marks=([pytest.mark.xfail(reason="Problem specified in the `exclude_question` list")] if file in exclude_question else []), - ) - for file in files for dev in [False, True] - ], -) -def test_info_json(paths: dict[str, pathlib.Path], question: str , devmode: bool, validate_info_json): - """Tests the PrairieLearn `process_question_pl()` info.json file - - Args: - paths (dict): set by the fixture paths() - question (str): the name of the question to test, set by the parametrize decorator - devmode (bool): whether to run the generator in devmode - """ - run_prairie_learn_generator(paths, question, devmode) - output_info_json = paths["outputDest"].joinpath(f"prairielearn{'-dev' if devmode else ''}/{question}/info.json") - compare_info_json = paths["compareDest"].joinpath(f"prairielearn{'-dev' if devmode else ''}/{question}/info.json") - generated_json = json.load(open(output_info_json)) - expected_json = json.load(open(compare_info_json)) - validate_info_json(generated_json) - del generated_json["uuid"] # uuid is semi-randomly generated, so we can't compare reliably it - del expected_json["uuid"] - for key in expected_json: - generated = generated_json[key] - if isinstance(generated, list): - generated = sorted(generated) - expected = expected_json[key] - if isinstance(expected, list): - expected = sorted(expected) - assert expected == generated, f"info.json key {key} for {question} did not match with expected output." - -@pytest.mark.parametrize( - "question", - [ - pytest.param( - file, - id=file, - marks=([pytest.mark.xfail(reason="Problem specified in the `exclude_question` list")] if file in exclude_question else []), - ) - for file in files - ], -) -def test_public(paths: dict[str, pathlib.Path], question: str): - """Tests the PrairieLearn `process_question_md()` - - Args: - paths (dict): set by the fixture paths() - question (str): the name of the question to test, set by the parametrize decorator - """ - outputPath = paths["outputDest"].joinpath("public/") - comparePath = paths["compareDest"].joinpath("public/") - - baseFile = paths["inputDest"] / question / f"{question}.md" - folder = baseFile.parent.stem - outputFolder = outputPath.joinpath(folder) - process_question_md( - baseFile, outputFolder.joinpath(baseFile.name), instructor=False - ) - - for file in sorted(comparePath.joinpath(f"{folder}/").glob("**/*")): - isFile = os.path.isfile(file) - notHiddenFile = not file.name.startswith(".") - notImageFile = not file.name.endswith(".png") - if isFile and notHiddenFile and notImageFile: - folder = file.parent.name - outputFolder = outputPath.joinpath(folder) - assert filecmp.cmp( - file, outputPath / file.relative_to(comparePath), shallow=False - ), f"File: {'/'.join(file.parts[-2:])} did not match with expected output." - - -@pytest.mark.parametrize( - "question", - [ - pytest.param( - file, - id=file, - marks=([pytest.mark.xfail(reason="Problem specified in the `exclude_question` list")] if file in exclude_question else []), - ) - for file in files - ], -) -def test_instructor(paths: dict[str, pathlib.Path], question: str): - """Tests the PrairieLearn `process_question_md(instructor=True)` - - Args: - paths (dict): set by the fixture paths() - question (str): the name of the question to test, set by the parametrize decorator - """ - outputPath = paths["outputDest"].joinpath( - "instructor/" - ) # the path to where the newly generated file will be stored - comparePath = paths["compareDest"].joinpath( - "instructor/" - ) # the path to where the existing files to be compared are stored - - baseFile = paths["inputDest"] / question / f"{question}.md" - folder = baseFile.parent.stem - outputFolder = outputPath.joinpath(folder) - process_question_md(baseFile, outputFolder.joinpath(baseFile.name), instructor=True) - - for file in sorted(comparePath.joinpath(f"{folder}/").glob("**/*")): - isFile = os.path.isfile(file) - notHiddenFile = not file.name.startswith(".") - notImageFile = not file.name.endswith(".png") - notExcludedFile = not (file.parent.name in exclude_question) - - if isFile and notHiddenFile and notImageFile and notExcludedFile: - folder = file.parent.name - outputFolder = outputPath.joinpath(folder) - assert filecmp.cmp( - file, outputPath / file.relative_to(comparePath), shallow=False - ), f"File: {'/'.join(file.parts[-2:])} did not match with expected output." + assert __version__ == "0.9.1" \ No newline at end of file diff --git a/tests/test_question_templates/.gitignore b/tests/test_question_templates/.gitignore index 5e640221..8eae5ab9 100644 --- a/tests/test_question_templates/.gitignore +++ b/tests/test_question_templates/.gitignore @@ -1 +1,2 @@ -question_generated_outputs/ \ No newline at end of file +question_generated_outputs/ +question_return_generated_outputs/ \ No newline at end of file diff --git a/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/q01_multiple-choice.md b/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/q01_multiple-choice.md new file mode 100644 index 00000000..c0ef8ad2 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/q01_multiple-choice.md @@ -0,0 +1,141 @@ +--- +title: Distance travelled +topic: Template +author: UNABLE TO ROUNDTRIP +source: UNABLE TO ROUNDTRIP +template_version: UNABLE TO ROUNDTRIP +attribution: openstax-physics-vol2 +gradingMethod: true +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- UNABLE TO ROUNDTRIP +difficulty: +- UNABLE TO ROUNDTRIP +randomization: +- UNABLE TO ROUNDTRIP +taxonomy: +- UNABLE TO ROUNDTRIP +span: +- UNABLE TO ROUNDTRIP +length: +- UNABLE TO ROUNDTRIP +tags: +- unknown +assets: +- test1.png +- test2.png +server: + imports: | + import random as rd; rd.seed(111) + import pandas as pd + import problem_bank_helpers as pbh + generate: | + data2 = pbh.create_data2() + + # define or load names/items/objects from server files + names = pbh.names.copy() + manual_vehicles = pbh.manual_vehicles.copy() + + # store phrases etc + data2["params"]["vars"]["title"] = 'Kinematics' + data2["params"]["vars"]["name"] = rd.choice(names) + data2["params"]["vars"]["vehicle"] = rd.choice(manual_vehicles) + data2["params"]["vars"]["units"] = "m/s" + + # Randomize Variables + v = rd.randint(2,7) + t = rd.randint(5,10) + + # store the variables in the dictionary "params" + data2["params"]["v"] = v + data2["params"]["t"] = t + + # define possible answers + data2["params"]["part1"]["ans1"]["value"] = f"`{pbh.roundp(42)}`" + data2["params"]["part1"]["ans1"]["correct"] = False + data2["params"]["part1"]["ans1"]["feedback"] = "This is a random number, you probably selected this choice by mistake! Try again please!" + + data2["params"]["part1"]["ans2"]["value"] = f"`{pbh.roundp(v*t)}`" + data2["params"]["part1"]["ans2"]["correct"] = True + data2["params"]["part1"]["ans2"]["feedback"] = "Great! You got it." + + data2["params"]["part1"]["ans3"]["value"] = f"`{pbh.roundp(v+t)}`" + data2["params"]["part1"]["ans3"]["correct"] = False + data2["params"]["part1"]["ans3"]["feedback"] = "Hmm, does it make sense to add a velocity and a time? Check the units!" + + data2["params"]["part1"]["ans4"]["value"] = f"`{pbh.roundp(v/t)}`" + data2["params"]["part1"]["ans4"]["correct"] = False + data2["params"]["part1"]["ans4"]["feedback"] = "Hmm, check the units of the resulting answer: v/t." + + data2["params"]["part1"]["ans5"]["value"] = f"`{pbh.roundp(v-t)}`" + data2["params"]["part1"]["ans5"]["correct"] = False + data2["params"]["part1"]["ans5"]["feedback"] = "Hmm, does it make sense to subtract a velocity and a time? Check the units!" + + data2["params"]["part1"]["ans6"]["value"] = f"`{pbh.roundp(1.3*(v-t))}`" + data2["params"]["part1"]["ans6"]["correct"] = False + data2["params"]["part1"]["ans6"]["feedback"] = "Hmm, does it make sense to subtract a velocity and a time? Check the units!" + + # Update the data object with a new dict + data.update(data2) + + # Start code added automatically by problem_bank_scripts + + # Convert backticks to code blocks/fences in answer choices. + pbh.backticks_to_code_tags(data2) + + # Update data with data2 + data.update(data2) + + # End code added in by problem bank scripts + prepare: | + pass + parse: | + pass + grade: | + pass +part1: + type: multiple-choice + pl-customizations: + weight: 1 +--- +# {{ params.vars.title }} + +{{ params.vars.name }} is traveling on {{ params.vars.vehicle }} at {{ params.v }} {{ params.vars.units }}. + +## Part 1 + +How far does {{ params.vars.name }} travel in {{ params.t }} seconds, assuming they continue at the same velocity? + +### Answer Section + +- {{{ params.part1.ans1.value }}} {{ params.vars.units }} +- {{{ params.part1.ans2.value }}} {{ params.vars.units }} +- {{{ params.part1.ans3.value }}} {{ params.vars.units }} +- {{{ params.part1.ans4.value }}} {{ params.vars.units }} +- {{{ params.part1.ans5.value }}} {{ params.vars.units }} +- {{{ params.part1.ans6.value }}} {{ params.vars.units }} + +### pl-submission-panel + +Everything here will get inserted directly into the pl-submission-panel element at the end of the `question.html`. +Please remove this section if it is not application for this question. + +### pl-answer-panel + +Everything here will get inserted directly into an pl-answer-panel element at the end of the `question.html`. +Please remove this section if it is not application for this question. + +## Rubric + +UNABLE TO ROUNDTRIP, Defaulting to 'This should be hidden from students until after the deadline.' + +## Solution + +UNABLE TO ROUNDTRIP, Defaulting to 'This should never be revealed to students.'. + +## Comments + +UNABLE TO ROUNDTRIP, Defaulting to 'These are random comments associated with this question.' + diff --git a/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/test1.png b/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/test1.png new file mode 100644 index 0000000000000000000000000000000000000000..fdaf7b949f80bab736a6b42818564122de76919f GIT binary patch literal 15757 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 K1wVw=LSZ1PB%g?jGD7g1fs*0C|0D(|!t;NKY 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