diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 56af8c24..393d3c50 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -72,7 +72,9 @@ jobs: uses: actions/upload-artifact@v4 with: name: test-generated-files-${{ github.event_name }} - path: tests/test_question_templates/question_generated_outputs/ + path: | + tests/test_question_templates/question_generated_outputs/ + tests/test_question_templates/question_return_generated_outputs/ if-no-files-found: ignore retention-days: 5 @@ -130,7 +132,7 @@ jobs: echo "::notice::Installing ${{ matrix.dist.name }}: $path_to_file" python -m pip install --user "$path_to_file[tests]" python -m pip list - - name: Run tests against installed wheel + - name: Run tests against installed ${{ matrix.dist.name }} run: rm -rf src/ && pytest tests/ diff --git a/poetry.lock b/poetry.lock index 4ccb91a4..94e88158 100644 --- a/poetry.lock +++ b/poetry.lock @@ -110,7 +110,7 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] name = "beautifulsoup4" version = "4.12.3" description = "Screen-scraping library" -optional = true +optional = false python-versions = ">=3.6.0" files = [ {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, @@ -118,6 +118,7 @@ files = [ ] [package.dependencies] +lxml = {version = "*", optional = true, markers = "extra == \"lxml\""} soupsieve = ">1.2" [package.extras] @@ -193,89 +194,89 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = true python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.17.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = true python-versions = ">=3.8" files = [ - {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, - {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, - {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, - {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, - {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, - {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, - {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, - {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, - {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, - {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, - {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, - {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, - {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, - {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, - {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, - {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -424,66 +425,87 @@ test = ["pytest"] [[package]] name = "contourpy" -version = "1.2.1" +version = "1.3.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.9" files = [ - {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, - {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, - {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, - {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, - {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, - {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, - {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, - {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, - {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, - {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, - {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, - {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, - {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, - {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, - {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, - {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, - {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, - {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, - {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, - {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, - {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, - {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, - {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, ] [package.dependencies] -numpy = ">=1.20" +numpy = ">=1.23" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] [[package]] name = "cycler" @@ -591,13 +613,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = true -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -819,13 +841,13 @@ trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" -version = "0.27.0" +version = "0.27.2" description = "The next generation HTTP client." optional = true python-versions = ">=3.8" files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, ] [package.dependencies] @@ -840,16 +862,17 @@ brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "idna" -version = "3.7" +version = "3.8" description = "Internationalized Domain Names in Applications (IDNA)" optional = true -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, + {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, ] [[package]] @@ -865,13 +888,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.2.0" +version = "8.4.0" description = "Read metadata from Python packages" optional = true python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, - {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, + {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, + {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, ] [package.dependencies] @@ -1196,116 +1219,284 @@ files = [ [[package]] name = "kiwisolver" -version = "1.4.5" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, -] + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, +] + +[[package]] +name = "lxml" +version = "5.2.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.10)"] [[package]] name = "markdown-it-py" @@ -1727,13 +1918,13 @@ files = [ [[package]] name = "nltk" -version = "3.8.1" +version = "3.9.1" description = "Natural Language Toolkit" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, - {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, + {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, + {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, ] [package.dependencies] @@ -1797,13 +1988,13 @@ files = [ [[package]] name = "openai" -version = "1.40.6" +version = "1.43.1" description = "The official Python library for the openai API" optional = true python-versions = ">=3.7.1" files = [ - {file = "openai-1.40.6-py3-none-any.whl", hash = "sha256:b36372124a779381a420a34dd96f762baa748b6bdfaf83a6b9f2745f72ccc1c5"}, - {file = "openai-1.40.6.tar.gz", hash = "sha256:2239232bcb7f4bd4ce8e02544b5769618582411cf399816d96686d1b6c1e5c8d"}, + {file = "openai-1.43.1-py3-none-any.whl", hash = "sha256:23ed3aa71e89cf644c911f7ab80087d08c0bf46ce6b75d9a811fc7942cff85c2"}, + {file = "openai-1.43.1.tar.gz", hash = "sha256:b64843711b7c92ded36795062ea1f8cad84ec6c2848646f2a786ac4617a6b9f5"}, ] [package.dependencies] @@ -2195,122 +2386,123 @@ files = [ [[package]] name = "pydantic" -version = "2.8.2" +version = "2.9.0" description = "Data validation using Python type hints" optional = true python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.9.0-py3-none-any.whl", hash = "sha256:f66a7073abd93214a20c5f7b32d56843137a7a2e70d02111f3be287035c45370"}, + {file = "pydantic-2.9.0.tar.gz", hash = "sha256:c7a8a9fdf7d100afa49647eae340e2d23efa382466a8d177efcd1381e9be5598"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" +pydantic-core = "2.23.2" typing-extensions = [ {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, ] +tzdata = {version = "*", markers = "python_version >= \"3.9\""} [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.23.2" description = "Core functionality for Pydantic validation and serialization" optional = true python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.23.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7d0324a35ab436c9d768753cbc3c47a865a2cbc0757066cb864747baa61f6ece"}, + {file = "pydantic_core-2.23.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:276ae78153a94b664e700ac362587c73b84399bd1145e135287513442e7dfbc7"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c7aa318da542cdcc60d4a648377ffe1a2ef0eb1e996026c7f74507b720a78"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1cf842265a3a820ebc6388b963ead065f5ce8f2068ac4e1c713ef77a67b71f7c"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae90b9e50fe1bd115b24785e962b51130340408156d34d67b5f8f3fa6540938e"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ae65fdfb8a841556b52935dfd4c3f79132dc5253b12c0061b96415208f4d622"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c8aa40f6ca803f95b1c1c5aeaee6237b9e879e4dfb46ad713229a63651a95fb"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c53100c8ee5a1e102766abde2158077d8c374bee0639201f11d3032e3555dfbc"}, + {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6b9dd6aa03c812017411734e496c44fef29b43dba1e3dd1fa7361bbacfc1354"}, + {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b18cf68255a476b927910c6873d9ed00da692bb293c5b10b282bd48a0afe3ae2"}, + {file = "pydantic_core-2.23.2-cp310-none-win32.whl", hash = "sha256:e460475719721d59cd54a350c1f71c797c763212c836bf48585478c5514d2854"}, + {file = "pydantic_core-2.23.2-cp310-none-win_amd64.whl", hash = "sha256:5f3cf3721eaf8741cffaf092487f1ca80831202ce91672776b02b875580e174a"}, + {file = "pydantic_core-2.23.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7ce8e26b86a91e305858e018afc7a6e932f17428b1eaa60154bd1f7ee888b5f8"}, + {file = "pydantic_core-2.23.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e9b24cca4037a561422bf5dc52b38d390fb61f7bfff64053ce1b72f6938e6b2"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753294d42fb072aa1775bfe1a2ba1012427376718fa4c72de52005a3d2a22178"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:257d6a410a0d8aeb50b4283dea39bb79b14303e0fab0f2b9d617701331ed1515"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8319e0bd6a7b45ad76166cc3d5d6a36c97d0c82a196f478c3ee5346566eebfd"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a05c0240f6c711eb381ac392de987ee974fa9336071fb697768dfdb151345ce"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d5b0ff3218858859910295df6953d7bafac3a48d5cd18f4e3ed9999efd2245f"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:96ef39add33ff58cd4c112cbac076726b96b98bb8f1e7f7595288dcfb2f10b57"}, + {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0102e49ac7d2df3379ef8d658d3bc59d3d769b0bdb17da189b75efa861fc07b4"}, + {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6612c2a844043e4d10a8324c54cdff0042c558eef30bd705770793d70b224aa"}, + {file = "pydantic_core-2.23.2-cp311-none-win32.whl", hash = "sha256:caffda619099cfd4f63d48462f6aadbecee3ad9603b4b88b60cb821c1b258576"}, + {file = "pydantic_core-2.23.2-cp311-none-win_amd64.whl", hash = "sha256:6f80fba4af0cb1d2344869d56430e304a51396b70d46b91a55ed4959993c0589"}, + {file = "pydantic_core-2.23.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c83c64d05ffbbe12d4e8498ab72bdb05bcc1026340a4a597dc647a13c1605ec"}, + {file = "pydantic_core-2.23.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6294907eaaccf71c076abdd1c7954e272efa39bb043161b4b8aa1cd76a16ce43"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a801c5e1e13272e0909c520708122496647d1279d252c9e6e07dac216accc41"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc0c316fba3ce72ac3ab7902a888b9dc4979162d320823679da270c2d9ad0cad"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b06c5d4e8701ac2ba99a2ef835e4e1b187d41095a9c619c5b185c9068ed2a49"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82764c0bd697159fe9947ad59b6db6d7329e88505c8f98990eb07e84cc0a5d81"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b1a195efd347ede8bcf723e932300292eb13a9d2a3c1f84eb8f37cbbc905b7f"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7efb12e5071ad8d5b547487bdad489fbd4a5a35a0fc36a1941517a6ad7f23e0"}, + {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5dd0ec5f514ed40e49bf961d49cf1bc2c72e9b50f29a163b2cc9030c6742aa73"}, + {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:820f6ee5c06bc868335e3b6e42d7ef41f50dfb3ea32fbd523ab679d10d8741c0"}, + {file = "pydantic_core-2.23.2-cp312-none-win32.whl", hash = "sha256:3713dc093d5048bfaedbba7a8dbc53e74c44a140d45ede020dc347dda18daf3f"}, + {file = "pydantic_core-2.23.2-cp312-none-win_amd64.whl", hash = "sha256:e1895e949f8849bc2757c0dbac28422a04be031204df46a56ab34bcf98507342"}, + {file = "pydantic_core-2.23.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:da43cbe593e3c87d07108d0ebd73771dc414488f1f91ed2e204b0370b94b37ac"}, + {file = "pydantic_core-2.23.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:64d094ea1aa97c6ded4748d40886076a931a8bf6f61b6e43e4a1041769c39dd2"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084414ffe9a85a52940b49631321d636dadf3576c30259607b75516d131fecd0"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043ef8469f72609c4c3a5e06a07a1f713d53df4d53112c6d49207c0bd3c3bd9b"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3649bd3ae6a8ebea7dc381afb7f3c6db237fc7cebd05c8ac36ca8a4187b03b30"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6db09153d8438425e98cdc9a289c5fade04a5d2128faff8f227c459da21b9703"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5668b3173bb0b2e65020b60d83f5910a7224027232c9f5dc05a71a1deac9f960"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c7b81beaf7c7ebde978377dc53679c6cba0e946426fc7ade54251dfe24a7604"}, + {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ae579143826c6f05a361d9546446c432a165ecf1c0b720bbfd81152645cb897d"}, + {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:19f1352fe4b248cae22a89268720fc74e83f008057a652894f08fa931e77dced"}, + {file = "pydantic_core-2.23.2-cp313-none-win32.whl", hash = "sha256:e1a79ad49f346aa1a2921f31e8dbbab4d64484823e813a002679eaa46cba39e1"}, + {file = "pydantic_core-2.23.2-cp313-none-win_amd64.whl", hash = "sha256:582871902e1902b3c8e9b2c347f32a792a07094110c1bca6c2ea89b90150caac"}, + {file = "pydantic_core-2.23.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:743e5811b0c377eb830150d675b0847a74a44d4ad5ab8845923d5b3a756d8100"}, + {file = "pydantic_core-2.23.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6650a7bbe17a2717167e3e23c186849bae5cef35d38949549f1c116031b2b3aa"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56e6a12ec8d7679f41b3750ffa426d22b44ef97be226a9bab00a03365f217b2b"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810ca06cca91de9107718dc83d9ac4d2e86efd6c02cba49a190abcaf33fb0472"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:785e7f517ebb9890813d31cb5d328fa5eda825bb205065cde760b3150e4de1f7"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ef71ec876fcc4d3bbf2ae81961959e8d62f8d74a83d116668409c224012e3af"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d50ac34835c6a4a0d456b5db559b82047403c4317b3bc73b3455fefdbdc54b0a"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16b25a4a120a2bb7dab51b81e3d9f3cde4f9a4456566c403ed29ac81bf49744f"}, + {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:41ae8537ad371ec018e3c5da0eb3f3e40ee1011eb9be1da7f965357c4623c501"}, + {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07049ec9306ec64e955b2e7c40c8d77dd78ea89adb97a2013d0b6e055c5ee4c5"}, + {file = "pydantic_core-2.23.2-cp38-none-win32.whl", hash = "sha256:086c5db95157dc84c63ff9d96ebb8856f47ce113c86b61065a066f8efbe80acf"}, + {file = "pydantic_core-2.23.2-cp38-none-win_amd64.whl", hash = "sha256:67b6655311b00581914aba481729971b88bb8bc7996206590700a3ac85e457b8"}, + {file = "pydantic_core-2.23.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:358331e21a897151e54d58e08d0219acf98ebb14c567267a87e971f3d2a3be59"}, + {file = "pydantic_core-2.23.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c4d9f15ffe68bcd3898b0ad7233af01b15c57d91cd1667f8d868e0eacbfe3f87"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0123655fedacf035ab10c23450163c2f65a4174f2bb034b188240a6cf06bb123"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6e3ccebdbd6e53474b0bb7ab8b88e83c0cfe91484b25e058e581348ee5a01a5"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc535cb898ef88333cf317777ecdfe0faac1c2a3187ef7eb061b6f7ecf7e6bae"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aab9e522efff3993a9e98ab14263d4e20211e62da088298089a03056980a3e69"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05b366fb8fe3d8683b11ac35fa08947d7b92be78ec64e3277d03bd7f9b7cda79"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7568f682c06f10f30ef643a1e8eec4afeecdafde5c4af1b574c6df079e96f96c"}, + {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cdd02a08205dc90238669f082747612cb3c82bd2c717adc60f9b9ecadb540f80"}, + {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a2ab4f410f4b886de53b6bddf5dd6f337915a29dd9f22f20f3099659536b2f6"}, + {file = "pydantic_core-2.23.2-cp39-none-win32.whl", hash = "sha256:0448b81c3dfcde439551bb04a9f41d7627f676b12701865c8a2574bcea034437"}, + {file = "pydantic_core-2.23.2-cp39-none-win_amd64.whl", hash = "sha256:4cebb9794f67266d65e7e4cbe5dcf063e29fc7b81c79dc9475bd476d9534150e"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e758d271ed0286d146cf7c04c539a5169a888dd0b57026be621547e756af55bc"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f477d26183e94eaafc60b983ab25af2a809a1b48ce4debb57b343f671b7a90b6"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da3131ef2b940b99106f29dfbc30d9505643f766704e14c5d5e504e6a480c35e"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329a721253c7e4cbd7aad4a377745fbcc0607f9d72a3cc2102dd40519be75ed2"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7706e15cdbf42f8fab1e6425247dfa98f4a6f8c63746c995d6a2017f78e619ae"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e64ffaf8f6e17ca15eb48344d86a7a741454526f3a3fa56bc493ad9d7ec63936"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dd59638025160056687d598b054b64a79183f8065eae0d3f5ca523cde9943940"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:12625e69b1199e94b0ae1c9a95d000484ce9f0182f9965a26572f054b1537e44"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d813fd871b3d5c3005157622ee102e8908ad6011ec915a18bd8fde673c4360e"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1eb37f7d6a8001c0f86dc8ff2ee8d08291a536d76e49e78cda8587bb54d8b329"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce7eaf9a98680b4312b7cebcdd9352531c43db00fca586115845df388f3c465"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f087879f1ffde024dd2788a30d55acd67959dcf6c431e9d3682d1c491a0eb474"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ce883906810b4c3bd90e0ada1f9e808d9ecf1c5f0b60c6b8831d6100bcc7dd6"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a8031074a397a5925d06b590121f8339d34a5a74cfe6970f8a1124eb8b83f4ac"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23af245b8f2f4ee9e2c99cb3f93d0e22fb5c16df3f2f643f5a8da5caff12a653"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c57e493a0faea1e4c38f860d6862ba6832723396c884fbf938ff5e9b224200e2"}, + {file = "pydantic_core-2.23.2.tar.gz", hash = "sha256:95d6bf449a1ac81de562d65d180af5d8c19672793c81877a2eda8fde5d08f2fd"}, ] [package.dependencies] @@ -2332,13 +2524,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, ] [package.extras] @@ -2507,120 +2699,120 @@ files = [ [[package]] name = "pyzmq" -version = "26.1.0" +version = "26.2.0" description = "Python bindings for 0MQ" optional = true python-versions = ">=3.7" files = [ - {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:263cf1e36862310bf5becfbc488e18d5d698941858860c5a8c079d1511b3b18e"}, - {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d5c8b17f6e8f29138678834cf8518049e740385eb2dbf736e8f07fc6587ec682"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a95c2358fcfdef3374cb8baf57f1064d73246d55e41683aaffb6cfe6862917"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99de52b8fbdb2a8f5301ae5fc0f9e6b3ba30d1d5fc0421956967edcc6914242"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bcbfbab4e1895d58ab7da1b5ce9a327764f0366911ba5b95406c9104bceacb0"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77ce6a332c7e362cb59b63f5edf730e83590d0ab4e59c2aa5bd79419a42e3449"}, - {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba0a31d00e8616149a5ab440d058ec2da621e05d744914774c4dde6837e1f545"}, - {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8b88641384e84a258b740801cd4dbc45c75f148ee674bec3149999adda4a8598"}, - {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2fa76ebcebe555cce90f16246edc3ad83ab65bb7b3d4ce408cf6bc67740c4f88"}, - {file = "pyzmq-26.1.0-cp310-cp310-win32.whl", hash = "sha256:fbf558551cf415586e91160d69ca6416f3fce0b86175b64e4293644a7416b81b"}, - {file = "pyzmq-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a7b8aab50e5a288c9724d260feae25eda69582be84e97c012c80e1a5e7e03fb2"}, - {file = "pyzmq-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:08f74904cb066e1178c1ec706dfdb5c6c680cd7a8ed9efebeac923d84c1f13b1"}, - {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:46d6800b45015f96b9d92ece229d92f2aef137d82906577d55fadeb9cf5fcb71"}, - {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bc2431167adc50ba42ea3e5e5f5cd70d93e18ab7b2f95e724dd8e1bd2c38120"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3bb34bebaa1b78e562931a1687ff663d298013f78f972a534f36c523311a84d"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3f6329340cef1c7ba9611bd038f2d523cea79f09f9c8f6b0553caba59ec562"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:471880c4c14e5a056a96cd224f5e71211997d40b4bf5e9fdded55dafab1f98f2"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ce6f2b66799971cbae5d6547acefa7231458289e0ad481d0be0740535da38d8b"}, - {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a1f6ea5b1d6cdbb8cfa0536f0d470f12b4b41ad83625012e575f0e3ecfe97f0"}, - {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b45e6445ac95ecb7d728604bae6538f40ccf4449b132b5428c09918523abc96d"}, - {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:94c4262626424683feea0f3c34951d39d49d354722db2745c42aa6bb50ecd93b"}, - {file = "pyzmq-26.1.0-cp311-cp311-win32.whl", hash = "sha256:a0f0ab9df66eb34d58205913f4540e2ad17a175b05d81b0b7197bc57d000e829"}, - {file = "pyzmq-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8efb782f5a6c450589dbab4cb0f66f3a9026286333fe8f3a084399149af52f29"}, - {file = "pyzmq-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f133d05aaf623519f45e16ab77526e1e70d4e1308e084c2fb4cedb1a0c764bbb"}, - {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:3d3146b1c3dcc8a1539e7cc094700b2be1e605a76f7c8f0979b6d3bde5ad4072"}, - {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d9270fbf038bf34ffca4855bcda6e082e2c7f906b9eb8d9a8ce82691166060f7"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995301f6740a421afc863a713fe62c0aaf564708d4aa057dfdf0f0f56525294b"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7eca8b89e56fb8c6c26dd3e09bd41b24789022acf1cf13358e96f1cafd8cae3"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d4feb2e83dfe9ace6374a847e98ee9d1246ebadcc0cb765482e272c34e5820"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d4fafc2eb5d83f4647331267808c7e0c5722c25a729a614dc2b90479cafa78bd"}, - {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58c33dc0e185dd97a9ac0288b3188d1be12b756eda67490e6ed6a75cf9491d79"}, - {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:68a0a1d83d33d8367ddddb3e6bb4afbb0f92bd1dac2c72cd5e5ddc86bdafd3eb"}, - {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae7c57e22ad881af78075e0cea10a4c778e67234adc65c404391b417a4dda83"}, - {file = "pyzmq-26.1.0-cp312-cp312-win32.whl", hash = "sha256:347e84fc88cc4cb646597f6d3a7ea0998f887ee8dc31c08587e9c3fd7b5ccef3"}, - {file = "pyzmq-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9f136a6e964830230912f75b5a116a21fe8e34128dcfd82285aa0ef07cb2c7bd"}, - {file = "pyzmq-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4b7a989c8f5a72ab1b2bbfa58105578753ae77b71ba33e7383a31ff75a504c4"}, - {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d416f2088ac8f12daacffbc2e8918ef4d6be8568e9d7155c83b7cebed49d2322"}, - {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ecb6c88d7946166d783a635efc89f9a1ff11c33d680a20df9657b6902a1d133b"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:471312a7375571857a089342beccc1a63584315188560c7c0da7e0a23afd8a5c"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e6cea102ffa16b737d11932c426f1dc14b5938cf7bc12e17269559c458ac334"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7248673ffc7104b54e4957cee38b2f3075a13442348c8d651777bf41aa45ee"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0614aed6f87d550b5cecb03d795f4ddbb1544b78d02a4bd5eecf644ec98a39f6"}, - {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8746ce968be22a8a1801bf4a23e565f9687088580c3ed07af5846580dd97f76"}, - {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7688653574392d2eaeef75ddcd0b2de5b232d8730af29af56c5adf1df9ef8d6f"}, - {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8d4dac7d97f15c653a5fedcafa82626bd6cee1450ccdaf84ffed7ea14f2b07a4"}, - {file = "pyzmq-26.1.0-cp313-cp313-win32.whl", hash = "sha256:ccb42ca0a4a46232d716779421bbebbcad23c08d37c980f02cc3a6bd115ad277"}, - {file = "pyzmq-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e1e5d0a25aea8b691a00d6b54b28ac514c8cc0d8646d05f7ca6cb64b97358250"}, - {file = "pyzmq-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:fc82269d24860cfa859b676d18850cbb8e312dcd7eada09e7d5b007e2f3d9eb1"}, - {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:416ac51cabd54f587995c2b05421324700b22e98d3d0aa2cfaec985524d16f1d"}, - {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:ff832cce719edd11266ca32bc74a626b814fff236824aa1aeaad399b69fe6eae"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:393daac1bcf81b2a23e696b7b638eedc965e9e3d2112961a072b6cd8179ad2eb"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9869fa984c8670c8ab899a719eb7b516860a29bc26300a84d24d8c1b71eae3ec"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b3b8e36fd4c32c0825b4461372949ecd1585d326802b1321f8b6dc1d7e9318c"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3ee647d84b83509b7271457bb428cc347037f437ead4b0b6e43b5eba35fec0aa"}, - {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:45cb1a70eb00405ce3893041099655265fabcd9c4e1e50c330026e82257892c1"}, - {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:5cca7b4adb86d7470e0fc96037771981d740f0b4cb99776d5cb59cd0e6684a73"}, - {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:91d1a20bdaf3b25f3173ff44e54b1cfbc05f94c9e8133314eb2962a89e05d6e3"}, - {file = "pyzmq-26.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c0665d85535192098420428c779361b8823d3d7ec4848c6af3abb93bc5c915bf"}, - {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:96d7c1d35ee4a495df56c50c83df7af1c9688cce2e9e0edffdbf50889c167595"}, - {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b281b5ff5fcc9dcbfe941ac5c7fcd4b6c065adad12d850f95c9d6f23c2652384"}, - {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5384c527a9a004445c5074f1e20db83086c8ff1682a626676229aafd9cf9f7d1"}, - {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:754c99a9840839375ee251b38ac5964c0f369306eddb56804a073b6efdc0cd88"}, - {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9bdfcb74b469b592972ed881bad57d22e2c0acc89f5e8c146782d0d90fb9f4bf"}, - {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bd13f0231f4788db619347b971ca5f319c5b7ebee151afc7c14632068c6261d3"}, - {file = "pyzmq-26.1.0-cp37-cp37m-win32.whl", hash = "sha256:c5668dac86a869349828db5fc928ee3f58d450dce2c85607067d581f745e4fb1"}, - {file = "pyzmq-26.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad875277844cfaeca7fe299ddf8c8d8bfe271c3dc1caf14d454faa5cdbf2fa7a"}, - {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:65c6e03cc0222eaf6aad57ff4ecc0a070451e23232bb48db4322cc45602cede0"}, - {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:038ae4ffb63e3991f386e7fda85a9baab7d6617fe85b74a8f9cab190d73adb2b"}, - {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bdeb2c61611293f64ac1073f4bf6723b67d291905308a7de9bb2ca87464e3273"}, - {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:61dfa5ee9d7df297c859ac82b1226d8fefaf9c5113dc25c2c00ecad6feeeb04f"}, - {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3292d384537b9918010769b82ab3e79fca8b23d74f56fc69a679106a3e2c2cf"}, - {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f9499c70c19ff0fbe1007043acb5ad15c1dec7d8e84ab429bca8c87138e8f85c"}, - {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d3dd5523ed258ad58fed7e364c92a9360d1af8a9371e0822bd0146bdf017ef4c"}, - {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baba2fd199b098c5544ef2536b2499d2e2155392973ad32687024bd8572a7d1c"}, - {file = "pyzmq-26.1.0-cp38-cp38-win32.whl", hash = "sha256:ddbb2b386128d8eca92bd9ca74e80f73fe263bcca7aa419f5b4cbc1661e19741"}, - {file = "pyzmq-26.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:79e45a4096ec8388cdeb04a9fa5e9371583bcb826964d55b8b66cbffe7b33c86"}, - {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:add52c78a12196bc0fda2de087ba6c876ea677cbda2e3eba63546b26e8bf177b"}, - {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c03bd7f3339ff47de7ea9ac94a2b34580a8d4df69b50128bb6669e1191a895"}, - {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dcc37d9d708784726fafc9c5e1232de655a009dbf97946f117aefa38d5985a0f"}, - {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a6ed52f0b9bf8dcc64cc82cce0607a3dfed1dbb7e8c6f282adfccc7be9781de"}, - {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451e16ae8bea3d95649317b463c9f95cd9022641ec884e3d63fc67841ae86dfe"}, - {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:906e532c814e1d579138177a00ae835cd6becbf104d45ed9093a3aaf658f6a6a"}, - {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05bacc4f94af468cc82808ae3293390278d5f3375bb20fef21e2034bb9a505b6"}, - {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:57bb2acba798dc3740e913ffadd56b1fcef96f111e66f09e2a8db3050f1f12c8"}, - {file = "pyzmq-26.1.0-cp39-cp39-win32.whl", hash = "sha256:f774841bb0e8588505002962c02da420bcfb4c5056e87a139c6e45e745c0e2e2"}, - {file = "pyzmq-26.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:359c533bedc62c56415a1f5fcfd8279bc93453afdb0803307375ecf81c962402"}, - {file = "pyzmq-26.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:7907419d150b19962138ecec81a17d4892ea440c184949dc29b358bc730caf69"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b24079a14c9596846bf7516fe75d1e2188d4a528364494859106a33d8b48be38"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59d0acd2976e1064f1b398a00e2c3e77ed0a157529779e23087d4c2fb8aaa416"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:911c43a4117915203c4cc8755e0f888e16c4676a82f61caee2f21b0c00e5b894"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10163e586cc609f5f85c9b233195554d77b1e9a0801388907441aaeb22841c5"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:28a8b2abb76042f5fd7bd720f7fea48c0fd3e82e9de0a1bf2c0de3812ce44a42"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bef24d3e4ae2c985034439f449e3f9e06bf579974ce0e53d8a507a1577d5b2ab"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2cd0f4d314f4a2518e8970b6f299ae18cff7c44d4a1fc06fc713f791c3a9e3ea"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fa25a620eed2a419acc2cf10135b995f8f0ce78ad00534d729aa761e4adcef8a"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef3b048822dca6d231d8a8ba21069844ae38f5d83889b9b690bf17d2acc7d099"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9a6847c92d9851b59b9f33f968c68e9e441f9a0f8fc972c5580c5cd7cbc6ee24"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9b9305004d7e4e6a824f4f19b6d8f32b3578aad6f19fc1122aaf320cbe3dc83"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:63c1d3a65acb2f9c92dce03c4e1758cc552f1ae5c78d79a44e3bb88d2fa71f3a"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d36b8fffe8b248a1b961c86fbdfa0129dfce878731d169ede7fa2631447331be"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67976d12ebfd61a3bc7d77b71a9589b4d61d0422282596cf58c62c3866916544"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:998444debc8816b5d8d15f966e42751032d0f4c55300c48cc337f2b3e4f17d03"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5c88b2f13bcf55fee78ea83567b9fe079ba1a4bef8b35c376043440040f7edb"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d906d43e1592be4b25a587b7d96527cb67277542a5611e8ea9e996182fae410"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b0c9942430d731c786545da6be96d824a41a51742e3e374fedd9018ea43106"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:314d11564c00b77f6224d12eb3ddebe926c301e86b648a1835c5b28176c83eab"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:093a1a3cae2496233f14b57f4b485da01b4ff764582c854c0f42c6dd2be37f3d"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c397b1b450f749a7e974d74c06d69bd22dd362142f370ef2bd32a684d6b480c"}, - {file = "pyzmq-26.1.0.tar.gz", hash = "sha256:6c5aeea71f018ebd3b9115c7cb13863dd850e98ca6b9258509de1246461a7e7f"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, ] [package.dependencies] @@ -2923,36 +3115,44 @@ tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc ( [[package]] name = "scipy" -version = "1.14.0" +version = "1.14.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "scipy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484"}, - {file = "scipy-1.14.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6"}, - {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7"}, - {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1"}, - {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0"}, - {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0"}, - {file = "scipy-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d"}, - {file = "scipy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86"}, - {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8"}, - {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74"}, - {file = "scipy-1.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb"}, - {file = "scipy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"}, - {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"}, - {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"}, - {file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"}, - {file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"}, - {file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69"}, + {file = "scipy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad"}, + {file = "scipy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2"}, + {file = "scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2"}, + {file = "scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066"}, + {file = "scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1"}, + {file = "scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e"}, + {file = "scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06"}, + {file = "scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84"}, + {file = "scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417"}, ] [package.dependencies] @@ -2960,8 +3160,8 @@ numpy = ">=1.23.5,<2.3" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] -doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<=7.3.7)", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "sigfig" @@ -3036,7 +3236,7 @@ files = [ name = "soupsieve" version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." -optional = true +optional = false python-versions = ">=3.8" files = [ {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, @@ -3207,60 +3407,60 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "2.0.32" +version = "2.0.34" description = "Database Abstraction Library" optional = true python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, - {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, - {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d0b2cf8791ab5fb9e3aa3d9a79a0d5d51f55b6357eecf532a120ba3b5524db"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:243f92596f4fd4c8bd30ab8e8dd5965afe226363d75cab2468f2c707f64cd83b"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea54f7300553af0a2a7235e9b85f4204e1fc21848f917a3213b0e0818de9a24"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173f5f122d2e1bff8fbd9f7811b7942bead1f5e9f371cdf9e670b327e6703ebd"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:196958cde924a00488e3e83ff917be3b73cd4ed8352bbc0f2989333176d1c54d"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd90c221ed4e60ac9d476db967f436cfcecbd4ef744537c0f2d5291439848768"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-win32.whl", hash = "sha256:3166dfff2d16fe9be3241ee60ece6fcb01cf8e74dd7c5e0b64f8e19fab44911b"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-win_amd64.whl", hash = "sha256:6831a78bbd3c40f909b3e5233f87341f12d0b34a58f14115c9e94b4cdaf726d3"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7db3db284a0edaebe87f8f6642c2b2c27ed85c3e70064b84d1c9e4ec06d5d84"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:430093fce0efc7941d911d34f75a70084f12f6ca5c15d19595c18753edb7c33b"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79cb400c360c7c210097b147c16a9e4c14688a6402445ac848f296ade6283bbc"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1b30f31a36c7f3fee848391ff77eebdd3af5750bf95fbf9b8b5323edfdb4ec"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fddde2368e777ea2a4891a3fb4341e910a056be0bb15303bf1b92f073b80c02"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80bd73ea335203b125cf1d8e50fef06be709619eb6ab9e7b891ea34b5baa2287"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-win32.whl", hash = "sha256:6daeb8382d0df526372abd9cb795c992e18eed25ef2c43afe518c73f8cccb721"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-win_amd64.whl", hash = "sha256:5bc08e75ed11693ecb648b7a0a4ed80da6d10845e44be0c98c03f2f880b68ff4"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:53e68b091492c8ed2bd0141e00ad3089bcc6bf0e6ec4142ad6505b4afe64163e"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcd18441a49499bf5528deaa9dee1f5c01ca491fc2791b13604e8f972877f812"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:165bbe0b376541092bf49542bd9827b048357f4623486096fc9aaa6d4e7c59a2"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3330415cd387d2b88600e8e26b510d0370db9b7eaf984354a43e19c40df2e2b"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97b850f73f8abbffb66ccbab6e55a195a0eb655e5dc74624d15cff4bfb35bd74"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee4c6917857fd6121ed84f56d1dc78eb1d0e87f845ab5a568aba73e78adf83"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-win32.whl", hash = "sha256:fbb034f565ecbe6c530dff948239377ba859420d146d5f62f0271407ffb8c580"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-win_amd64.whl", hash = "sha256:707c8f44931a4facd4149b52b75b80544a8d824162602b8cd2fe788207307f9a"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:24af3dc43568f3780b7e1e57c49b41d98b2d940c1fd2e62d65d3928b6f95f021"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60ed6ef0a35c6b76b7640fe452d0e47acc832ccbb8475de549a5cc5f90c2c06"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:413c85cd0177c23e32dee6898c67a5f49296640041d98fddb2c40888fe4daa2e"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:25691f4adfb9d5e796fd48bf1432272f95f4bbe5f89c475a788f31232ea6afba"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:526ce723265643dbc4c7efb54f56648cc30e7abe20f387d763364b3ce7506c82"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-win32.whl", hash = "sha256:13be2cc683b76977a700948411a94c67ad8faf542fa7da2a4b167f2244781cf3"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-win_amd64.whl", hash = "sha256:e54ef33ea80d464c3dcfe881eb00ad5921b60f8115ea1a30d781653edc2fd6a2"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43f28005141165edd11fbbf1541c920bd29e167b8bbc1fb410d4fe2269c1667a"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b68094b165a9e930aedef90725a8fcfafe9ef95370cbb54abc0464062dbf808f"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1e03db964e9d32f112bae36f0cc1dcd1988d096cfd75d6a588a3c3def9ab2b"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:203d46bddeaa7982f9c3cc693e5bc93db476ab5de9d4b4640d5c99ff219bee8c"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ae92bebca3b1e6bd203494e5ef919a60fb6dfe4d9a47ed2453211d3bd451b9f5"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9661268415f450c95f72f0ac1217cc6f10256f860eed85c2ae32e75b60278ad8"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-win32.whl", hash = "sha256:895184dfef8708e15f7516bd930bda7e50ead069280d2ce09ba11781b630a434"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-win_amd64.whl", hash = "sha256:6e7cde3a2221aa89247944cafb1b26616380e30c63e37ed19ff0bba5e968688d"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbcdf987f3aceef9763b6d7b1fd3e4ee210ddd26cac421d78b3c206d07b2700b"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce119fc4ce0d64124d37f66a6f2a584fddc3c5001755f8a49f1ca0a177ef9796"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a17d8fac6df9835d8e2b4c5523666e7051d0897a93756518a1fe101c7f47f2f0"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ebc11c54c6ecdd07bb4efbfa1554538982f5432dfb8456958b6d46b9f834bb7"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e6965346fc1491a566e019a4a1d3dfc081ce7ac1a736536367ca305da6472a8"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:220574e78ad986aea8e81ac68821e47ea9202b7e44f251b7ed8c66d9ae3f4278"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-win32.whl", hash = "sha256:b75b00083e7fe6621ce13cfce9d4469c4774e55e8e9d38c305b37f13cf1e874c"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-win_amd64.whl", hash = "sha256:c29d03e0adf3cc1a8c3ec62d176824972ae29b67a66cbb18daff3062acc6faa8"}, + {file = "SQLAlchemy-2.0.34-py3-none-any.whl", hash = "sha256:7286c353ee6475613d8beff83167374006c6b3e3f0e6491bfe8ca610eb1dec0f"}, + {file = "sqlalchemy-2.0.34.tar.gz", hash = "sha256:10d8f36990dd929690666679b0f42235c159a7051534adb135728ee52828dd22"}, ] [package.dependencies] @@ -3500,18 +3700,22 @@ files = [ [[package]] name = "zipp" -version = "3.20.0" +version = "3.20.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = true python-versions = ">=3.8" files = [ - {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, - {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, + {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, + {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [extras] docs = ["Sphinx", "ipykernel", "myst-nb", "myst-parser", "nbsphinx", "sphinx-rtd-theme"] @@ -3521,4 +3725,4 @@ tui = ["nltk", "openai", "pdf2image", "python-dotenv", "questionary", "scikit-le [metadata] lock-version = "2.0" python-versions = ">=3.10" -content-hash = "3c8f592608716d2882ee635e30085368506e44991e2be46a0c9b698b0c590e6b" +content-hash = "a4f1c9d0c4044596aaac2891c113c6fd6858040c7fc3f5c6633b660128103462" diff --git a/pyproject.toml b/pyproject.toml index 0f6540db..eda4e00f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,8 @@ problem-bank-helpers = "^0.3.2" typing-extensions = "^4.12.2" black = "^24.8.0" gitpython = "^3.1.43" +lxml = "^5.2.0,<5.3.0" +beautifulsoup4 = {extras = ["lxml"], version = "^4.12.3"} exceptiongroup = {version = "^1.2.2", python = "<3.11"} questionary = {version = "^2.0.1", optional = true} nltk = {version = "^3.8.1", optional = true} @@ -56,4 +58,4 @@ process_q = "problem_bank_scripts.scripts.process_q:main" checkq = "problem_bank_scripts.scripts.check_question:main" [tool.pytest.ini_options] -filterwarnings = ["error", "ignore::DeprecationWarning:problem_bank_helpers"] +filterwarnings = ["error", "ignore::DeprecationWarning:problem_bank_helpers", "ignore:The 'strip_cdata':DeprecationWarning"] diff --git a/src/problem_bank_scripts/pl_to_md.py b/src/problem_bank_scripts/pl_to_md.py new file mode 100644 index 00000000..1360db9c --- /dev/null +++ b/src/problem_bank_scripts/pl_to_md.py @@ -0,0 +1,415 @@ +# Author: Gavin Kendal-Freedman +# Date: 2023-08-15 + +import ast +import importlib.util +import inspect +import json +import os +import pathlib +import re +import textwrap +import warnings +from shutil import copy2, rmtree + +import bs4 +import yaml +from bs4 import BeautifulSoup + +from .inputs import OPB_INPUT_TYPES, replace_tags +from .problem_bank_scripts import _ATTRIBUTIONS + + +_FLAGS = re.DOTALL | re.MULTILINE + +START_PATTERN = re.compile(r"(?P.*)\n\n", _FLAGS) +PARTS_PATTERN = re.compile(r"(?P.*)", _FLAGS) +END_PATTERN = re.compile(r"\n\n(?!)(?P.*)", _FLAGS) +IMPORTS_PATTERN = re.compile(r"(^(?:import|from) .*?(?=\n+def))", re.DOTALL) + +def _extract_tag_instance(soup: bs4.BeautifulSoup, tag: str, index: int = -1) -> str: + """Extracts the specified instance of a tag from a BeautifulSoup object + + Args: + soup (bs4.BeautifulSoup): BeautifulSoup object + tag (str): Tag to search for + index (int, optional): Index of the tag to extract. Defaults to -1. + + Returns: + str: The complete contents of the of the tag (with HTML comments) or an empty string if the tag was not found + """ + try: + tag = soup.find_all(tag)[-1] + except IndexError: + return "" + else: + if isinstance(tag, bs4.Tag): + try: + while tag.markdown is not None: + tag.markdown.unwrap() + except AttributeError: + pass + return textwrap.dedent("\n".join(line.lstrip(" ") for line in tag.prettify().splitlines()[1:-1])) + else: + return "" + +def pl_to_md( + question: os.PathLike[str] | str | pathlib.Path, output: os.PathLike[str] | str | pathlib.Path, file_name: str | None = None +) -> None: + """Converts a PL question to the OPB MD format + + Args: + question (os.PathLike[str] | str | pathlib.Path): Path to the PL question directory + output (os.PathLike[str] | str | pathlib.Path): 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 + ModuleNotFoundError: If the server.py file fails to be able to be dynamically imported + 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 + """ + # Validate the inputs from the user + path = pathlib.Path(question) + if not path.exists(): + msg = f"{question} does not exist" + raise FileNotFoundError(msg) + if path.is_file(): + msg = f"{question} is not a directory, passing a file as the question directory is not supported for converting PL to MD" + raise NotADirectoryError(msg) + + output_path = pathlib.Path(output) + if output_path.is_file(): + msg = f"{output} is not a directory, passing a file as the output directory is not supported for converting PL to MD" + raise NotADirectoryError(msg) + 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 = START_PATTERN.match(html) + parts: list[tuple[str, str]] = PARTS_PATTERN.findall(html) + end = END_PATTERN.search(html) + + md_result = "# {{ params.vars.title }}\n\n" + header_dict = {} + # the start and end sections are special, and don't have an associated part + + # Determine the question title, preamble, and useful info sections + 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("pl-hidden-hints")) > 0: + info = usefuL_info[0] + err_msg = f"Detected presence of useful info components but could not parse it for question {path.name}" + if not isinstance(info, bs4.Tag): + raise ValueError(err_msg) + info = info.find("markdown") + if not isinstance(info, bs4.Tag): + raise ValueError(err_msg) + info = info.string + if not isinstance(info, str): + raise ValueError(err_msg) + md_result += f"## Useful Info\n\n{info.strip()}\n\n" + + # Determine the attribution for the question + if end is not None: + end_md = BeautifulSoup(end.group("Content"), "lxml").contents + if not end_md: + msg = f"Could not find attribution at end of question for question {path.name}" + raise ValueError(msg) + end_md = end_md[0].text.strip().replace("---\n", "").replace("\n", "
") + attribution = None + for possible_attribution, pl_attribution_text in _ATTRIBUTIONS.items(): + if end_md.endswith(pl_attribution_text.replace("
", "")): + attribution = possible_attribution + if attribution is None: + msg = 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}" + raise ValueError(msg) + else: + msg = f"Could not find attribution at end of question for question {path.name}" + raise ValueError(msg) + + auto_tags = {"multi_part", "DEV"} | set(OPB_INPUT_TYPES.values()) + + # 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 = {} + + for part, content in parts: + # print(part, content) + part_soup = BeautifulSoup(content, "lxml") + # Find the input tag for the question part + pl_input = part_soup.find( + [ + *OPB_INPUT_TYPES.keys(), + "pl-big-o-input", + "pl-units-input", + "pl-order-blocks", + "pl-threejs", + ] + ) + if pl_input is not None: + pl_input = pl_input.extract() + else: + msg = f"Could not find input tag for part {part}" + raise ValueError(msg) + if isinstance(pl_input, bs4.NavigableString): + msg = f"Could not find input tag for part {part}" + raise ValueError(msg) # noqa: TRY004 + pl_customizations = pl_input.attrs + pl_input_type = pl_input.name + opb_input_type = OPB_INPUT_TYPES.get(pl_input_type, None) + if opb_input_type is None: + msg = f"Input type {pl_input_type} is not currently supported or is missing from the input types mapping" + raise NotImplementedError(msg) + + # Extract the different panels and sections of the question part + submission_panel = _extract_tag_instance(part_soup, "pl-submission-panel") + answer_panel = _extract_tag_instance(part_soup, "pl-answer-panel") + question_text = _extract_tag_instance(part_soup, "pl-question-panel", 0) + + if opb_input_type in {"multiple-choice", "checkbox", "dropdown"}: + answers = pl_input.find_all("pl-answer") + if len(answers) == 0: + msg = f"Could not find any answers for part {part} in question {path.name}:\n{pl_input.prettify()}" + raise ValueError(msg) + 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) + + 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: + 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: # noqa: E722, S110 + pass + + parts_dict[f"part{part}"] = { + "type": opb_input_type, + "pl-customizations": pl_customizations, + } + + # Parse the info.json file, and pull all possible fields from it (and populate as much of the yaml header as we can here) + + info_json: dict = json.loads(info_json_file.read_text(encoding="utf8")) + metadata: dict = info_json.get("comment", {}).get("METADATA", {}) + + md_result += f"## Rubric\n\n{metadata.get('Rubric', '')}\n\n" + md_result += f"## Solution\n\n{metadata.get('Solution', '')}\n\n" + md_result += f"## Comments\n\n{metadata.get('Comments', '')}\n\n" + + header_dict["title"] = info_json["title"] + header_dict["topic"] = info_json["topic"].split(".", 1)[-1] + header_dict["author"] = metadata.get("author", "Unknown") + header_dict["source"] = metadata.get("source", "Unknown") + header_dict["template_version"] = metadata.get("template_version", "Unknown") + header_dict["attribution"] = attribution + header_dict["gradingMethod"] = info_json.get("gradingMethod") + header_dict["partialCredit"] = info_json.get("partialCredit") + header_dict["singleVariant"] = info_json.get("singleVariant") + header_dict["showCorrectAnswer"] = info_json.get("showCorrectAnswer") + header_dict["dependencies"] = info_json.get("dependencies") + header_dict["externalGradingOptions"] = info_json.get("externalGradingOptions") + header_dict["workspaceOptions"] = metadata.get("workspaceOptions") + header_dict["outcomes"] = metadata.get("outcomes", ["unknown"]) + header_dict["difficulty"] = metadata.get("difficulty", "undefined") + header_dict["randomization"] = metadata.get("randomization", ["undefined"]) + header_dict["taxonomy"] = metadata.get("taxonomy", ["undefined"]) + header_dict["span"] = metadata.get("span", ["undefined"]) + header_dict["length"] = metadata.get("length", ["undefined"]) + header_dict["tags"] = sorted(set(info_json["tags"]) - auto_tags) # Force deterministic order + header_dict["assets"] = [] # Populated with _copy_assets(...) later + header_dict["autogradeTestFiles"] = [] # Populated with _copy_assets(...) later + header_dict["workspaceFiles"] = [] # Populated with _copy_assets(...) later + header_dict["serverFiles"] = [] # Populated with _copy_assets(...) later + + if header_dict["tags"] == []: + header_dict["tags"] = ["unknown"] + + # Get the module spec for the server.py file so we can load it and get the functions from it + spec = importlib.util.spec_from_file_location( + f"server_{path.name}", str(server_py.absolute()) + ) + # validate the file exists and a module spec was created for it + if spec is None: + msg = f"Could not find server.py file for question {path.name}" + raise ModuleNotFoundError(msg) + server = importlib.util.module_from_spec(spec) # create a module object from the spec + loader = spec.loader # get the loader from the spec + if loader is None: # validate the loader exists, since we need it to get the code objects for the functions + msg = f"Could not load server.py file for question {path.name}" + raise ModuleNotFoundError(msg) + # load the code objects for the module into the module object by executing the module code with the loader + # and execute the server.py file to get code objects for it that can be access with inspect + loader.exec_module(server) + + imports = IMPORTS_PATTERN.match(server_py.read_text(encoding="utf8")) + if imports is None: + msg = f"Could not find imports in server.py for question {path.name}" + raise ValueError(msg) + + functions = {"imports": imports.group().strip()+"\n"} + + custom_start_line_no = 0 + + for func_name in ("generate", "prepare", "parse", "grade"): + func = getattr(server, func_name, None) + if func is None: + functions[func_name] = "pass\n" + continue + # We could use the builtin callable function here, but that would allow classes or callable objects (instances of classes that define __call__ somewhere in the chain) + if not inspect.isfunction(func): + msg = f"Could not find a callable function {func_name} in server.py for question {path.name} (found non callable object instead)" + raise ValueError(msg) + signature = inspect.signature(func) + parameters = signature.parameters + if len(parameters) != 1: + msg = f"Function {func_name} in server.py for question {path.name} does not have the correct number of arguments (expected 1, got {len(parameters)}: {signature})" + raise ValueError(msg) + [parameter] = parameters.values() + # the argument name should be named data, and we know there is only one argument here (if we wanted to be super precise we could check its the only posarg, but thats too pedantic) + if parameter.name != "data": + msg = f"Function {func_name} in server.py for question {path.name} does not have the correct argument name (expected 'data', got {parameter!r})" + raise ValueError(msg) + if parameter.kind != inspect.Parameter.POSITIONAL_OR_KEYWORD: + msg = f"Function {func_name} in server.py for question {path.name} does not have the correct argument kind (expected 'POSITIONAL_OR_KEYWORD', got {parameter})" + raise ValueError(msg) + # get the source code for the function and the line number of the first line of the function + lines, firstlineno = inspect.getsourcelines(func) + # remove "def (data):"" line, and remove unnecessary indentation to prevent the function from being indented too far in the yaml dump + functions[func_name] = textwrap.dedent("".join(lines[1:])) + # keep track of the last line number of the custom functions so we can get the custom functions at the end of the file + custom_start_line_no = max(custom_start_line_no, len(lines) + firstlineno) + + # get custom functions + func_code = inspect.getsource(server).split("\n", custom_start_line_no)[-1].strip() + if func_code: + functions["custom"] = func_code + + 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 that don't exist, since they are optional and we don't want to include them if they don't exist as that would pollute the output + if header_dict[opt_key] is None: + del header_dict[opt_key] + + ### Get assets + + def _copy_assets(source: pathlib.Path, dest: pathlib.Path, key: str): + dest.mkdir(parents=True, exist_ok=True) + if source.exists(): + files = [] + # copy the files from the source directory to the output directory + for file in source.iterdir(): + copy2(file, dest / file.name) + files.append(str(file.relative_to(source))) + + header_dict[key] = sorted(files) + else: + try: + del header_dict[key] # remove the key if it the directory doesn't exist + except KeyError: + pass # ignore if the key doesn't exist, since that means we don't need to remove it + + client_assets = path / "clientFilesQuestion" + server_assets = path / "serverFilesQuestion" + test_assets = path / "tests" + workspace_assets = path / "workspaceFiles" + + _copy_assets(client_assets, output_path, "assets") + _copy_assets(server_assets, output_path, "serverFiles") + _copy_assets(test_assets, output_path / "tests", "autogradeTestFiles") + _copy_assets(workspace_assets, output_path / "workspace", "workspaceFiles") + + ### START Yaml Dump Configuration ### + + def str_presenter(dumper, data2): # noqa: ANN001 + if len(data2.splitlines()) > 1: # check for multiline string + # data2 = re.sub('\\n[\s].*\\n','\n\n',data2) # THIS IS WRONG!!! + data2 = re.sub( + r"\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 + 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) + + # This removes explicit null values, since implicit nulls are the de-facto standard for OPB + def represent_none(self, _): # noqa: ANN001 + return self.represent_scalar("tag:yaml.org,2002:null", "") + + yaml.add_representer(type(None), represent_none) + + ### END Yaml Dump Configuration ### + + # 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", + ) + + 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 + diff --git a/src/problem_bank_scripts/problem_bank_scripts.py b/src/problem_bank_scripts/problem_bank_scripts.py index ad3c3d1f..8a7d9a75 100644 --- a/src/problem_bank_scripts/problem_bank_scripts.py +++ b/src/problem_bank_scripts/problem_bank_scripts.py @@ -86,7 +86,7 @@ def defdict_to_dict(defdict, finaldict): elif hasattr(v, "dtype"): try: - finaldict[k] = v.item() + finaldict[k] = v.item() # pyright: ignore[reportAttributeAccessIssue] except Exception: finaldict[k] = v else: @@ -397,8 +397,7 @@ def write_info_json(output_path, parsed_question, modified_time: str | None = No modified_time (str | None, optional): Last commit timestamp or modified timestamp of the file """ - # Deal with optional tags in info.json - # optional = "" + ## *** IMPORTANT: If more auto-tags or optional keys are added, make sure to update the `pl_to_md` function to take them into account properly for the roundtrip *** optional_keys = { "gradingMethod", @@ -456,8 +455,34 @@ def write_info_json(output_path, parsed_question, modified_time: str | None = No msg = f"workspaceOptions.port must be an integer, got {type(info_json['workspaceOptions']['port'])!r} instead" raise TypeError(msg) + comment_keys = ( + "author", + "source", + "template_version", + "outcomes", + "difficulty", + "randomization", + "taxonomy", + "span", + "length", + ) + + comment = {key: parsed_question["header"][key] for key in comment_keys if key in parsed_question["header"]} + + # Get keys that need to get added to the comment from the question body (Rubric, Solution, Comments) + + comment |= { + key: parsed_question["body_parts"][key].split("\n\n", 1)[-1].strip() + for key in ("Rubric", "Solution", "Comments") + if key in parsed_question["body_parts"] + } + + # Add the comment to the info_json, under a metadata key in the comment object of info_json + + info_json["comment"] = {"METADATA": comment} + if modified_time: - info_json["comment"] = {"lastModified": modified_time} + info_json["comment"]["lastModified"] = modified_time # pyright: ignore[reportArgumentType] # End add tags with pathlib.Path(output_path / "info.json").open("w") as output_file: @@ -491,9 +516,7 @@ def assemble_server_py(parsed_question, location): for function, code in server_dict.items(): indented_code = code.replace("\n", "\n ") # With the custom header, add functions to server.py as-is - if function == "custom": - server_py += f"{code}" - elif function == "imports": + if function in {"custom", "imports"}: continue else: if code: @@ -512,6 +535,9 @@ def assemble_server_py(parsed_question, location): """ + if "custom" in server_dict: + server_py += f"{server_dict['custom']}" + return server_py @@ -1061,4 +1087,3 @@ def validate_header(header_dict): if topics.get(topic := header_dict["topic"], None) is None: msg = f"topic '{topic}' is not listed in the learning outcomes" raise ValueError(msg) - diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..e6ed4226 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,41 @@ +import json +import pathlib + +import fastjsonschema +import pytest + + +@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. + """ + return { + "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/"), + "returnCompareDest": pathlib.Path("tests/test_question_templates/question_return_expected_outputs/"), + "returnOutputDest": pathlib.Path("tests/test_question_templates/question_return_generated_outputs/"), + } + + +@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: + return fastjsonschema.compile(json.load(file)) + +@pytest.fixture(scope="session", autouse=True) +def monkeypatch_prairielearn(): + """Monkeypatches the prairielearn module into sys.modules to make it accessible.""" + + import sys + + from problem_bank_scripts import prairielearn + sys.modules["prairielearn"] = prairielearn diff --git a/tests/test_md_to_pl.py b/tests/test_md_to_pl.py new file mode 100644 index 00000000..11d86783 --- /dev/null +++ b/tests/test_md_to_pl.py @@ -0,0 +1,180 @@ +from __future__ import annotations + +import filecmp +import json +import pathlib + +import pytest + +from problem_bank_scripts import process_question_md, process_question_pl + + +# 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") + +_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) + if question in {"q03_dropdown", "q05_multi-part_feedback"}: + with pytest.warns(FutureWarning, match="The 'pl-dropdown' tag is deprecated."): + process_question_pl(baseFile, outputFolder.joinpath(baseFile.name), devmode) + else: + 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}")) + for file in files + for dev in [False, True] + ], +) +def test_prairie_learn(paths: dict[str, pathlib.Path], question: str, devmode: bool, subtests): + """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 = file.is_file() + hiddenFile = not file.name.startswith(".") + assetFile = file.name == "question.html" or not file.name.endswith( + (".png", ".jpg", ".jpeg", ".gif", ".html", ".DS_Store") + ) + + infoJSON = not file.name.endswith("info.json") + + if isFile and hiddenFile and assetFile and infoJSON: + with subtests.test("Check Generated File Matches Expected", file=file.name): + 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}")) + 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, subtests): + """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.loads(output_info_json.read_bytes()) + expected_json = json.loads(compare_info_json.read_bytes()) + 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: + with subtests.test("Check Generated info.json", key=key): + 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!r} for {question} did not match with expected output." + + +@pytest.mark.parametrize("question", files) +def test_public(paths: dict[str, pathlib.Path], question: str, subtests): + """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 = file.is_file() + notHiddenFile = not file.name.startswith(".") + notImageFile = not file.name.endswith(".png") + if isFile and notHiddenFile and notImageFile: + with subtests.test("Check Generated File Matches Expected", file=file.name): + 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", files) +def test_instructor(paths: dict[str, pathlib.Path], question: str, subtests): + """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 = file.is_file() + notHiddenFile = not file.name.startswith(".") + notImageFile = not file.name.endswith(".png") + + if isFile and notHiddenFile and notImageFile: + with subtests.test("Check Generated File Matches Expected", file=file.name): + 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." diff --git a/tests/test_pl_to_md.py b/tests/test_pl_to_md.py new file mode 100644 index 00000000..4ef9a9d1 --- /dev/null +++ b/tests/test_pl_to_md.py @@ -0,0 +1,85 @@ +from __future__ import annotations + +import filecmp +import pathlib +import tempfile + +import pytest + +from problem_bank_scripts.pl_to_md import pl_to_md + + +# 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_expected_outputs/prairielearn" + ).iterdir() + if file.name != ".DS_Store" + ] +) + + +@pytest.mark.parametrize("question", files) +@pytest.mark.filterwarnings("ignore::UserWarning") +def test_pl_to_md(paths: dict[str, pathlib.Path], question: str, subtests): + """Tests the ``pl_to_md()`` function + + Args: + paths (dict): set by the fixture paths() + question (str): the name of the question to test, set by the parametrize decorator + """ + outputPath = paths["returnOutputDest"].joinpath(question) + comparePath = paths["returnCompareDest"].joinpath(question) + baseFile = paths["compareDest"].joinpath("prairielearn", f"{question}") + folder = question + pl_to_md(baseFile, outputPath, f"{question}.md") + + for file in sorted(comparePath.glob("**/*")): + isFile = file.is_file() + hiddenFile = not file.name.startswith(".") + assetFile = file.name == "question.html" or not file.name.endswith( + (".png", ".jpg", ".jpeg", ".gif", ".html", ".DS_Store") + ) + excludedFile = False # Leave this as false for now, but we may want to add a way to exclude files from the comparison + + if isFile and hiddenFile and assetFile and not excludedFile: + with subtests.test("Check Generated File Matches Expected", file=file.name): + 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." + + +def test_question_exists_validation(): + with pytest.raises(FileNotFoundError): + pl_to_md("fake", "fake", "fake.md") + + +def test_question_path_not_dir_validation(): + with pytest.raises(NotADirectoryError): + pl_to_md(__file__, "fake", "fake.md") + + +def test_output_path_not_dir_validation(): + with pytest.raises(NotADirectoryError): + pl_to_md(pathlib.Path(__file__).parent, __file__, "fake.md") + + +def test_output_path_warns_exists(): + with tempfile.TemporaryDirectory() as tmpdirname: + with pytest.warns(UserWarning), pytest.raises(FileNotFoundError): # we want to raise the error, but also check that the warning is emitted first + pl_to_md(pathlib.Path(__file__).parent, pathlib.Path(tmpdirname), "fake.md") diff --git a/tests/test_problem_bank_scripts.py b/tests/test_problem_bank_scripts.py index ba27e513..58082422 100644 --- a/tests/test_problem_bank_scripts.py +++ b/tests/test_problem_bank_scripts.py @@ -1,211 +1,6 @@ -from __future__ import annotations - -import filecmp -import json -import pathlib - -import fastjsonschema import pytest -from problem_bank_scripts import process_question_md, process_question_pl, validate_multiple_choice - - -questions_dir = pathlib.Path(__file__).parent / "test_question_templates" - -# Generate a list of all problems in the test problems directory -files = sorted(file.name for file in questions_dir.joinpath("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. - """ - return { - "inputDest": questions_dir.joinpath("question_inputs"), - "outputDest": questions_dir.joinpath("question_generated_outputs"), - "compareDest": questions_dir.joinpath("question_expected_outputs"), - } - - -@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: - return fastjsonschema.compile(json.load(file)) - -_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) - if question in {"q03_dropdown", "q05_multi-part_feedback"}: - with pytest.warns(FutureWarning, match="The 'pl-dropdown' tag is deprecated."): - process_question_pl(baseFile, outputFolder.joinpath(baseFile.name), devmode) - else: - 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}")) - for file in files - for dev in [False, True] - ], -) -def test_prairie_learn(paths: dict[str, pathlib.Path], question: str, devmode: bool, subtests): - """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 = file.is_file() - hiddenFile = not file.name.startswith(".") - assetFile = file.name == "question.html" or not file.name.endswith( - (".png", ".jpg", ".jpeg", ".gif", ".html", ".DS_Store") - ) - - infoJSON = not file.name.endswith("info.json") - - if isFile and hiddenFile and assetFile and infoJSON: - with subtests.test("Check Generated File Matches Expected", file=file.name): - 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}")) - 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, subtests): - """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.loads(output_info_json.read_bytes()) - expected_json = json.loads(compare_info_json.read_bytes()) - 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: - with subtests.test("Check Generated info.json", key=key): - 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!r} for {question} did not match with expected output." - - -@pytest.mark.parametrize("question", files) -def test_public(paths: dict[str, pathlib.Path], question: str, subtests): - """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 = file.is_file() - notHiddenFile = not file.name.startswith(".") - notImageFile = not file.name.endswith(".png") - if isFile and notHiddenFile and notImageFile: - with subtests.test("Check Generated File Matches Expected", file=file.name): - 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", files) -def test_instructor(paths: dict[str, pathlib.Path], question: str, subtests): - """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 = file.is_file() - notHiddenFile = not file.name.startswith(".") - notImageFile = not file.name.endswith(".png") - - if isFile and notHiddenFile and notImageFile: - with subtests.test("Check Generated File Matches Expected", file=file.name): - 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." +from problem_bank_scripts import validate_multiple_choice def test_validate_multiple_choice_valid_has_correct_answer(): diff --git a/tests/test_question_templates/.gitignore b/tests/test_question_templates/.gitignore index 5e640221..99b9968d 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/ diff --git a/tests/test_question_templates/question_expected_outputs/instructor/q13_file-editor-input/q13_file-editor-input.md b/tests/test_question_templates/question_expected_outputs/instructor/q13_file-editor-input/q13_file-editor-input.md index 0dbe3972..1d0f9aaf 100644 --- a/tests/test_question_templates/question_expected_outputs/instructor/q13_file-editor-input/q13_file-editor-input.md +++ b/tests/test_question_templates/question_expected_outputs/instructor/q13_file-editor-input/q13_file-editor-input.md @@ -117,19 +117,17 @@ myst: ## Question Text -

- This question requires you to define a function named {{params.fname}}.
- This function should receive a single numerical input and return the {{params.question}} of this input.
- assume all inputs to the function are valid.
-

-

- Below are some example uses of the {{params.fname}} function -

- - {{params.fname}}({{params.input0}}) # returns {{params.output0}} - {{params.fname}}({{params.input1}}) # returns {{params.output1}} - {{params.fname}}({{params.input2}}) # returns {{params.output2}} - +This question requires you to define a function named `{{params.fname}}`. +This function should receive a single numerical input and return the {{params.question}} of this input. +assume all inputs to the function are valid. + +Below are some example uses of the `{{params.fname}}` function: + +```python +{{params.fname}}({{params.input0}}) # returns {{params.output0}} +{{params.fname}}({{params.input1}}) # returns {{params.output1}} +{{params.fname}}({{params.input2}}) # returns {{params.output2}} +``` ### Answer Section diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q01_multiple-choice/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q01_multiple-choice/info.json index 0ac27642..d92e62c6 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q01_multiple-choice/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q01_multiple-choice/info.json @@ -1,5 +1,5 @@ { - "uuid": "3dd6f5c7-a767-3d46-bef2-feeffe6245c4", + "uuid": "35a28fd1-0fe7-30de-9cf6-434011e0dad5", "title": "Distance travelled", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": 5.45, + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-19T07:09:41-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q02_number-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q02_number-input/info.json index 4d75ff18..e52ea3cc 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q02_number-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q02_number-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "1f60d1d0-0051-3c2a-9b86-2b468f3869d5", + "uuid": "4df78016-988d-3a83-a9d9-8d239054f6d3", "title": "Distance travelled", "topic": "000.Template", "tags": [ @@ -9,9 +9,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q03_dropdown/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q03_dropdown/info.json index 721f1853..a94720f4 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q03_dropdown/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q03_dropdown/info.json @@ -1,5 +1,5 @@ { - "uuid": "dd206433-4c69-3629-9a35-e8c7ccaac23b", + "uuid": "b7cf278e-fd1f-34d0-9818-5526bf86ba14", "title": "Distance travelled", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2024-08-09T06:48:09-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q04_checkbox/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q04_checkbox/info.json index e27dbc8a..9fae5cc6 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q04_checkbox/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q04_checkbox/info.json @@ -1,5 +1,5 @@ { - "uuid": "699d9e25-f5c8-31f0-8c97-b2223ca7e345", + "uuid": "1b00496d-26a7-34ec-a0d5-302be077086c", "title": "Vectors and Scalars", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q05_multi-part_feedback/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q05_multi-part_feedback/info.json index 9d945d2f..3981a78c 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q05_multi-part_feedback/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q05_multi-part_feedback/info.json @@ -1,18 +1,44 @@ { - "uuid": "41f71885-4953-3293-81f5-641cb51ded1f", + "uuid": "6951ad1d-4f24-355c-a911-0738a6db8bd1", "title": "Electric Field and Direction", "topic": "000.Template", "tags": [ "multi_part", - "number-input", "dropdown", + "number-input", "DEV" ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Jake Bobowski", + "source": "2.6.67", + "template_version": 1.4, + "outcomes": [ + "undefined" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2024-06-20T16:22:06-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q06_number-input_feedback/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q06_number-input_feedback/info.json index eb67a6bf..0d39adf9 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q06_number-input_feedback/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q06_number-input_feedback/info.json @@ -1,5 +1,5 @@ { - "uuid": "6f3f8820-507c-3b7e-968e-68958ca8ad80", + "uuid": "548ef32d-08d8-3448-81ee-2775b111c643", "title": "OSUPv2p12_55", "topic": "000.Template", "tags": [ @@ -16,9 +16,40 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Jake Bobowksi", + "source": "2.12.55", + "template_version": 1.4, + "outcomes": [ + "19.2.3.0", + "19.2.3.1", + "19.3.2.0", + "19.3.2.1", + "19.6.1.0", + "19.6.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2024-06-20T16:22:06-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q07a_symbolic-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q07a_symbolic-input/info.json index b61f3bb7..e197e823 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q07a_symbolic-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q07a_symbolic-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "adecb6d1-f7b4-31aa-aba2-222cbfd871fc", + "uuid": "6c851ec9-5d0f-3547-bff4-932aca5b30d4", "title": "Centripetal Motion", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Michael Kudla", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q07b_symbolic-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q07b_symbolic-input/info.json index 7110449d..000c329e 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q07b_symbolic-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q07b_symbolic-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "ca717a26-cfb3-3e1f-8f56-6aee4b36cfc7", + "uuid": "0fae1dea-189d-3e68-8293-61f80942ad50", "title": "Symbolic Input 2 - Trig", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Michael Kudla", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q09_file-upload/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q09_file-upload/info.json index 0fd681c3..850417db 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q09_file-upload/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q09_file-upload/info.json @@ -1,5 +1,5 @@ { - "uuid": "61050c3a-569e-341e-b905-d8d9b7fff2fb", + "uuid": "cfaaaed0-bf18-3305-b15f-770848d40798", "title": "File Upload", "topic": "000.Template", "tags": [ @@ -8,10 +8,34 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, "gradingMethod": "Manual", + "singleVariant": false, "comment": { + "METADATA": { + "author": "Michael Kudla", + "source": "original", + "template_version": 1.4, + "outcomes": null, + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T19:23:57-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q10_integer-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q10_integer-input/info.json index 927a9f8a..d070ecf4 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q10_integer-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q10_integer-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "495364a5-66c9-30f7-a78e-f28ae5c55fec", + "uuid": "27a933a3-bdfa-365d-965f-779542664d44", "title": "Integer Math", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q11_multi-part/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q11_multi-part/info.json index a061dc00..4b2b4c42 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q11_multi-part/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q11_multi-part/info.json @@ -1,18 +1,45 @@ { - "uuid": "30ed9c87-e383-3eaf-9180-df65cff35b29", + "uuid": "3fd804a1-96de-3996-9547-9b5893265a9a", "title": "Multi-part Question", "topic": "000.Template", "tags": [ "multi_part", - "number-input", "multiple-choice", + "number-input", "DEV" ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q12_longtext-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q12_longtext-input/info.json index 7ac30ddc..31358c03 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q12_longtext-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q12_longtext-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "e63b6bfb-e60a-3adf-b7c6-836a6ac02712", + "uuid": "3db6e8da-de2c-3315-83be-7a49df09cefc", "title": "Describe an Experiment", "topic": "000.Template", "tags": [ @@ -8,9 +8,33 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Michael Kudla", + "source": "original", + "template_version": 1.4, + "outcomes": null, + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q13_file-editor-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q13_file-editor-input/info.json index 552fad74..290cfb76 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q13_file-editor-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q13_file-editor-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "4720cb9b-5d0d-36db-ab5c-250eb7fbfec5", + "uuid": "1fd18541-cae8-3507-97ce-b4b29d342af9", "title": "Python Powers", "topic": "000.Template", "tags": [ @@ -8,16 +8,43 @@ "DEV" ], "type": "v3", - "singleVariant": true, "externalGradingOptions": { "enabled": true, "image": "prairielearn/grader-python", "entrypoint": "/python_autograder/run.sh" }, - "gradingMethod": "External", - "partialCredit": true, "showCorrectAnswer": false, + "partialCredit": true, + "gradingMethod": "External", + "singleVariant": true, "comment": { - "lastModified": "2023-06-14T21:02:26-0700" + "METADATA": { + "author": "Aidan Murphy", + "source": "original", + "template_version": 1.0, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, + "lastModified": "2024-06-02T16:42:06-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q13_file-editor-input/question.html b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q13_file-editor-input/question.html index 2144dc56..8eb81c30 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q13_file-editor-input/question.html +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q13_file-editor-input/question.html @@ -2,19 +2,17 @@ -

- This question requires you to define a function named {{params.fname}}.
- This function should receive a single numerical input and return the {{params.question}} of this input.
- assume all inputs to the function are valid.
-

-

- Below are some example uses of the {{params.fname}} function -

- - {{params.fname}}({{params.input0}}) # returns {{params.output0}} - {{params.fname}}({{params.input1}}) # returns {{params.output1}} - {{params.fname}}({{params.input2}}) # returns {{params.output2}} - +This question requires you to define a function named `{{params.fname}}`. +This function should receive a single numerical input and return the {{params.question}} of this input. +assume all inputs to the function are valid. + +Below are some example uses of the `{{params.fname}}` function: + +```python +{{params.fname}}({{params.input0}}) # returns {{params.output0}} +{{params.fname}}({{params.input1}}) # returns {{params.output1}} +{{params.fname}}({{params.input2}}) # returns {{params.output2}} +```
diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q14_string-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q14_string-input/info.json index 334ad087..ec2495ea 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q14_string-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q14_string-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "c314920c-1a39-3cc6-bbbd-b555de72f080", + "uuid": "d0d2c517-6ed7-3801-a6e7-ea72a0b7ded9", "title": "Code Output", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Gavin Kendal-Freedman", + "source": "original", + "template_version": 1.0, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question:\n\nThis example problem is adapted from PrairieLearn's Examples: https://github.com/PrairieLearn/PrairieLearn/tree/master/exampleCourse/questions/element/stringInput" + }, "lastModified": "2023-07-10T17:16:32-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q15_matching/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q15_matching/info.json index cf2c5bc3..84ff7600 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q15_matching/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q15_matching/info.json @@ -1,5 +1,5 @@ { - "uuid": "4c99eb89-8e54-3381-adef-8091c603b0d3", + "uuid": "e7d3246e-b77d-3412-ae7e-ead17b2a353e", "title": "Distance travelled", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Christina Yang", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-07-19T19:01:42-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q16_matrix-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q16_matrix-input/info.json index 34e70d0a..163fd783 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q16_matrix-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q16_matrix-input/info.json @@ -1,18 +1,45 @@ { - "uuid": "aefff7a4-ff92-38a9-bc93-4fa7d65cbbd6", + "uuid": "1457df87-a1d3-325a-bacb-8aa8fccd3852", "title": "Matrix Input", "topic": "000.Template", "tags": [ "multi_part", - "matrix-component-input", "matrix-input", + "matrix-component-input", "DEV" ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Gavin Kendal-Freedman", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-11-21T21:38:37-0800" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q17_workspaces/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q17_workspaces/info.json index 4adde227..99026f92 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q17_workspaces/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q17_workspaces/info.json @@ -1,5 +1,5 @@ { - "uuid": "afe513ad-db86-3792-b919-1d10ebec399a", + "uuid": "abe940ee-ff06-30dc-ac09-6800e74a9aa3", "title": "Moving and copying files", "topic": "000.Template", "tags": [ @@ -8,8 +8,6 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, - "showCorrectAnswer": false, "workspaceOptions": { "image": "prairielearn/workspace-xtermjs", "port": 8080, @@ -22,7 +20,36 @@ "newdir/file2_new.txt" ] }, + "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Jonatan Schroeder; Converted by Gavin Kendal-Freedman", + "source": "original", + "template_version": 1.0, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question:\n\nThis example problem was originally created by [Jonatan Schroeder](https://www.cs.ubc.ca/people/jonatan-schroeder), and was later converted to the OER markdown layout." + }, "lastModified": "2024-06-17T12:02:32-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q18_integer-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q18_integer-input/info.json index 86836e1f..9b99600a 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q18_integer-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn-dev/q18_integer-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "fd488716-df71-3a46-8d65-e64a08d1ee07", + "uuid": "03d2fc31-cc01-3a77-9394-05da8968db50", "title": "Median", "topic": "000.Template", "tags": [ @@ -9,9 +9,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Gavin Kendal-Freedman", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "easy" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2024-08-10T12:49:01-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q01_multiple-choice/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q01_multiple-choice/info.json index 132fd917..08cf62f5 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q01_multiple-choice/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q01_multiple-choice/info.json @@ -1,5 +1,5 @@ { - "uuid": "ca2714fd-4b53-3d10-8b1a-03c9e1b95094", + "uuid": "79b58c9c-9300-31de-bdd2-a03f5bc743f8", "title": "Distance travelled", "topic": "000.Template", "tags": [ @@ -7,9 +7,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": 5.45, + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-19T07:09:41-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q02_number-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q02_number-input/info.json index a2c0a9f5..1f8c4088 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q02_number-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q02_number-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "20759455-c222-31a8-a40b-2662b9774629", + "uuid": "95962afb-5e85-3cc5-8cd3-92cac303fb49", "title": "Distance travelled", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q03_dropdown/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q03_dropdown/info.json index ed5ee564..c4d54de5 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q03_dropdown/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q03_dropdown/info.json @@ -1,5 +1,5 @@ { - "uuid": "a9e3b0bd-c9e0-3272-9f42-d2acdbcc2423", + "uuid": "778cf007-9fda-3e65-8f54-0ffc823adc28", "title": "Distance travelled", "topic": "000.Template", "tags": [ @@ -7,9 +7,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2024-08-09T06:48:09-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q04_checkbox/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q04_checkbox/info.json index 5924be08..4223033b 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q04_checkbox/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q04_checkbox/info.json @@ -1,5 +1,5 @@ { - "uuid": "58268cc4-74d5-3ab3-9251-5da15173ff01", + "uuid": "ed6e8f8d-a166-37ce-8b67-ba97a9ff44f8", "title": "Vectors and Scalars", "topic": "000.Template", "tags": [ @@ -7,9 +7,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q05_multi-part_feedback/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q05_multi-part_feedback/info.json index 18532fe8..bf29e2f0 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q05_multi-part_feedback/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q05_multi-part_feedback/info.json @@ -1,17 +1,43 @@ { - "uuid": "aae3d12f-a6ae-3389-afab-372c6539eb86", + "uuid": "c8e92321-cb6b-3591-8d82-f6dfaa1254d1", "title": "Electric Field and Direction", "topic": "000.Template", "tags": [ "multi_part", - "number-input", - "dropdown" + "dropdown", + "number-input" ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Jake Bobowski", + "source": "2.6.67", + "template_version": 1.4, + "outcomes": [ + "undefined" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2024-06-20T16:22:06-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q06_number-input_feedback/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q06_number-input_feedback/info.json index a44b1ab3..ddddd591 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q06_number-input_feedback/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q06_number-input_feedback/info.json @@ -1,5 +1,5 @@ { - "uuid": "4b03f30e-a150-32d4-aaf3-012c5a5056ad", + "uuid": "642b15af-e226-3820-8c14-b82047f7369a", "title": "OSUPv2p12_55", "topic": "000.Template", "tags": [ @@ -15,9 +15,40 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Jake Bobowksi", + "source": "2.12.55", + "template_version": 1.4, + "outcomes": [ + "19.2.3.0", + "19.2.3.1", + "19.3.2.0", + "19.3.2.1", + "19.6.1.0", + "19.6.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2024-06-20T16:22:06-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q07a_symbolic-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q07a_symbolic-input/info.json index 0068f47f..7ddb605f 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q07a_symbolic-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q07a_symbolic-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "3e3bcde1-14de-3d46-a631-948e7a009010", + "uuid": "480d9eaf-8cd7-3704-a9b9-86ed4ca4c8ce", "title": "Centripetal Motion", "topic": "000.Template", "tags": [ @@ -7,9 +7,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Michael Kudla", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q07b_symbolic-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q07b_symbolic-input/info.json index 4b039cb8..25f8de41 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q07b_symbolic-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q07b_symbolic-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "1fc33957-7767-3eff-934c-67df5f4a4021", + "uuid": "669c36c2-21f5-3986-854b-69ee8d1d0b24", "title": "Symbolic Input 2 - Trig", "topic": "000.Template", "tags": [ @@ -7,9 +7,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Michael Kudla", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q09_file-upload/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q09_file-upload/info.json index decfbf35..b4b5a697 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q09_file-upload/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q09_file-upload/info.json @@ -1,5 +1,5 @@ { - "uuid": "b1a88033-b85a-3513-8f6d-b4a93e0949b6", + "uuid": "7bbc4b5f-77d4-36c7-9811-d051565acb4f", "title": "File Upload", "topic": "000.Template", "tags": [ @@ -7,10 +7,34 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, "gradingMethod": "Manual", + "singleVariant": false, "comment": { + "METADATA": { + "author": "Michael Kudla", + "source": "original", + "template_version": 1.4, + "outcomes": null, + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T19:23:57-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q10_integer-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q10_integer-input/info.json index 18d4c242..d8add9a5 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q10_integer-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q10_integer-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "e5c004cf-2127-387e-bc00-3c044683f8d6", + "uuid": "06bd1c5c-9b82-38b7-b2b8-cbe82bcc75b0", "title": "Integer Math", "topic": "000.Template", "tags": [ @@ -7,9 +7,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q11_multi-part/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q11_multi-part/info.json index 5ed331c2..a53f4b3c 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q11_multi-part/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q11_multi-part/info.json @@ -1,17 +1,44 @@ { - "uuid": "529b4404-5008-38aa-9171-c548665911c3", + "uuid": "fffa47ba-5620-31cc-885d-93ad48c0fa9e", "title": "Multi-part Question", "topic": "000.Template", "tags": [ "multi_part", - "number-input", - "multiple-choice" + "multiple-choice", + "number-input" ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Firas Moosvi", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q12_longtext-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q12_longtext-input/info.json index 6f962969..5396b00e 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q12_longtext-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q12_longtext-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "9a727c2c-11ab-3016-b0ce-21e55850e95c", + "uuid": "10374096-5e7e-3c7a-b965-6b94ef713c9c", "title": "Describe an Experiment", "topic": "000.Template", "tags": [ @@ -7,9 +7,33 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Michael Kudla", + "source": "original", + "template_version": 1.4, + "outcomes": null, + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-06-14T21:02:26-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q13_file-editor-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q13_file-editor-input/info.json index 4879d4d2..40e10d22 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q13_file-editor-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q13_file-editor-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "9412eb19-a37a-3d92-925a-f2cbd7ab77bb", + "uuid": "6cd28d44-eb4d-319f-b494-63cc9dc5a80c", "title": "Python Powers", "topic": "000.Template", "tags": [ @@ -7,16 +7,43 @@ "nothing" ], "type": "v3", - "singleVariant": true, "externalGradingOptions": { "enabled": true, "image": "prairielearn/grader-python", "entrypoint": "/python_autograder/run.sh" }, - "gradingMethod": "External", - "partialCredit": true, "showCorrectAnswer": false, + "partialCredit": true, + "gradingMethod": "External", + "singleVariant": true, "comment": { - "lastModified": "2023-06-14T21:02:26-0700" + "METADATA": { + "author": "Aidan Murphy", + "source": "original", + "template_version": 1.0, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, + "lastModified": "2024-06-02T16:42:06-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q13_file-editor-input/question.html b/tests/test_question_templates/question_expected_outputs/prairielearn/q13_file-editor-input/question.html index 2144dc56..8eb81c30 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q13_file-editor-input/question.html +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q13_file-editor-input/question.html @@ -2,19 +2,17 @@ -

- This question requires you to define a function named {{params.fname}}.
- This function should receive a single numerical input and return the {{params.question}} of this input.
- assume all inputs to the function are valid.
-

-

- Below are some example uses of the {{params.fname}} function -

- - {{params.fname}}({{params.input0}}) # returns {{params.output0}} - {{params.fname}}({{params.input1}}) # returns {{params.output1}} - {{params.fname}}({{params.input2}}) # returns {{params.output2}} - +This question requires you to define a function named `{{params.fname}}`. +This function should receive a single numerical input and return the {{params.question}} of this input. +assume all inputs to the function are valid. + +Below are some example uses of the `{{params.fname}}` function: + +```python +{{params.fname}}({{params.input0}}) # returns {{params.output0}} +{{params.fname}}({{params.input1}}) # returns {{params.output1}} +{{params.fname}}({{params.input2}}) # returns {{params.output2}} +```
diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q14_string-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q14_string-input/info.json index 000ea7b0..3b089e58 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q14_string-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q14_string-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "47056b10-2752-3abd-8b1e-26c23e69bd92", + "uuid": "78fbabf9-e344-3cf1-a657-4c3cb4e44100", "title": "Code Output", "topic": "000.Template", "tags": [ @@ -7,9 +7,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Gavin Kendal-Freedman", + "source": "original", + "template_version": 1.0, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question:\n\nThis example problem is adapted from PrairieLearn's Examples: https://github.com/PrairieLearn/PrairieLearn/tree/master/exampleCourse/questions/element/stringInput" + }, "lastModified": "2023-07-10T17:16:32-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q15_matching/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q15_matching/info.json index 0d144d54..929c4975 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q15_matching/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q15_matching/info.json @@ -1,5 +1,5 @@ { - "uuid": "abf75f6e-a1ba-3f40-8c56-9b19c6a02358", + "uuid": "00749b3e-7e36-31dd-837c-fd925a223b2e", "title": "Distance travelled", "topic": "000.Template", "tags": [ @@ -7,9 +7,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Christina Yang", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-07-19T19:01:42-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q16_matrix-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q16_matrix-input/info.json index c2270220..5155214f 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q16_matrix-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q16_matrix-input/info.json @@ -1,17 +1,44 @@ { - "uuid": "f13f6091-a1be-3b4b-9bc1-4d0e325bac77", + "uuid": "169dbffb-f7d0-36ba-ab05-72e4270255cf", "title": "Matrix Input", "topic": "000.Template", "tags": [ "multi_part", - "matrix-component-input", - "matrix-input" + "matrix-input", + "matrix-component-input" ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Gavin Kendal-Freedman", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2023-11-21T21:38:37-0800" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q17_workspaces/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q17_workspaces/info.json index a055da91..1e3107c0 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q17_workspaces/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q17_workspaces/info.json @@ -1,5 +1,5 @@ { - "uuid": "3fb47050-956e-3855-90cd-93005bd7a723", + "uuid": "3f0d7ed3-6686-3690-8998-bed5c784e015", "title": "Moving and copying files", "topic": "000.Template", "tags": [ @@ -7,8 +7,6 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, - "showCorrectAnswer": false, "workspaceOptions": { "image": "prairielearn/workspace-xtermjs", "port": 8080, @@ -21,7 +19,36 @@ "newdir/file2_new.txt" ] }, + "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Jonatan Schroeder; Converted by Gavin Kendal-Freedman", + "source": "original", + "template_version": 1.0, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "undefined" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question:\n\nThis example problem was originally created by [Jonatan Schroeder](https://www.cs.ubc.ca/people/jonatan-schroeder), and was later converted to the OER markdown layout." + }, "lastModified": "2024-06-17T12:02:32-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/prairielearn/q18_integer-input/info.json b/tests/test_question_templates/question_expected_outputs/prairielearn/q18_integer-input/info.json index 9dc96968..2724f965 100644 --- a/tests/test_question_templates/question_expected_outputs/prairielearn/q18_integer-input/info.json +++ b/tests/test_question_templates/question_expected_outputs/prairielearn/q18_integer-input/info.json @@ -1,5 +1,5 @@ { - "uuid": "999970d4-630b-38de-a43b-dbba13af980e", + "uuid": "9880f3fb-8d29-3365-908c-d2a4eec045c7", "title": "Median", "topic": "000.Template", "tags": [ @@ -8,9 +8,36 @@ ], "type": "v3", "partialCredit": true, - "singleVariant": false, "showCorrectAnswer": false, + "singleVariant": false, "comment": { + "METADATA": { + "author": "Gavin Kendal-Freedman", + "source": "original", + "template_version": 1.4, + "outcomes": [ + "6.1.1.0", + "6.1.1.1" + ], + "difficulty": [ + "easy" + ], + "randomization": [ + "undefined" + ], + "taxonomy": [ + "undefined" + ], + "span": [ + "undefined" + ], + "length": [ + "undefined" + ], + "Rubric": "This should be hidden from students until after the deadline.", + "Solution": "This should never be revealed to students.", + "Comments": "These are random comments associated with this question." + }, "lastModified": "2024-08-10T12:49:01-0700" } } \ No newline at end of file diff --git a/tests/test_question_templates/question_expected_outputs/public/q13_file-editor-input/q13_file-editor-input.md b/tests/test_question_templates/question_expected_outputs/public/q13_file-editor-input/q13_file-editor-input.md index 3b96773b..adfdb5eb 100644 --- a/tests/test_question_templates/question_expected_outputs/public/q13_file-editor-input/q13_file-editor-input.md +++ b/tests/test_question_templates/question_expected_outputs/public/q13_file-editor-input/q13_file-editor-input.md @@ -66,19 +66,17 @@ myst: ## Question Text -

- This question requires you to define a function named {{params.fname}}.
- This function should receive a single numerical input and return the {{params.question}} of this input.
- assume all inputs to the function are valid.
-

-

- Below are some example uses of the {{params.fname}} function -

- - {{params.fname}}({{params.input0}}) # returns {{params.output0}} - {{params.fname}}({{params.input1}}) # returns {{params.output1}} - {{params.fname}}({{params.input2}}) # returns {{params.output2}} - +This question requires you to define a function named `{{params.fname}}`. +This function should receive a single numerical input and return the {{params.question}} of this input. +assume all inputs to the function are valid. + +Below are some example uses of the `{{params.fname}}` function: + +```python +{{params.fname}}({{params.input0}}) # returns {{params.output0}} +{{params.fname}}({{params.input1}}) # returns {{params.output1}} +{{params.fname}}({{params.input2}}) # returns {{params.output2}} +``` ### Answer Section diff --git a/tests/test_question_templates/question_inputs/q13_file-editor-input/q13_file-editor-input.md b/tests/test_question_templates/question_inputs/q13_file-editor-input/q13_file-editor-input.md index e06c2ba1..48a3d073 100644 --- a/tests/test_question_templates/question_inputs/q13_file-editor-input/q13_file-editor-input.md +++ b/tests/test_question_templates/question_inputs/q13_file-editor-input/q13_file-editor-input.md @@ -94,24 +94,24 @@ part1: # {{ params.vars.title }} ## Question Text -

- This question requires you to define a function named {{params.fname}}.
- This function should receive a single numerical input and return the {{params.question}} of this input.
- assume all inputs to the function are valid.
-

-

- Below are some example uses of the {{params.fname}} function -

- - {{params.fname}}({{params.input0}}) # returns {{params.output0}} - {{params.fname}}({{params.input1}}) # returns {{params.output1}} - {{params.fname}}({{params.input2}}) # returns {{params.output2}} - +This question requires you to define a function named `{{params.fname}}`. +This function should receive a single numerical input and return the {{params.question}} of this input. +assume all inputs to the function are valid. + +Below are some example uses of the `{{params.fname}}` function: + +```python +{{params.fname}}({{params.input0}}) # returns {{params.output0}} +{{params.fname}}({{params.input1}}) # returns {{params.output1}} +{{params.fname}}({{params.input2}}) # returns {{params.output2}} +``` ### Answer Section + import math ### pl-submission-panel + 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..ccfb332b --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/q01_multiple-choice.md @@ -0,0 +1,142 @@ +--- +title: Distance travelled +topic: Template +author: Firas Moosvi +source: 5.45 +template_version: 1.4 +attribution: openstax-physics-vol2 +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +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 + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +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 00000000..fdaf7b94 Binary files /dev/null and b/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/test1.png differ diff --git a/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/test2.png b/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/test2.png new file mode 100644 index 00000000..b643c415 Binary files /dev/null and b/tests/test_question_templates/question_return_expected_outputs/q01_multiple-choice/test2.png differ diff --git a/tests/test_question_templates/question_return_expected_outputs/q02_number-input/q02_number-input.md b/tests/test_question_templates/question_return_expected_outputs/q02_number-input/q02_number-input.md new file mode 100644 index 00000000..553877ac --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q02_number-input/q02_number-input.md @@ -0,0 +1,141 @@ +--- +title: Distance travelled +topic: Template +author: Firas Moosvi +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +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 + + # define correct answers + data2["correct_answers"]["part1_ans"] = v*t + data2["correct_answers"]["part2_ans"] = v*t + + # 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: | + data = pbh.automatic_feedback(data,rtol=0.03) + #pass +part1: + type: number-input + pl-customizations: + rtol: 0.05 + weight: 1 + allow-blank: true + label: $d= $ + suffix: m +part2: + type: number-input + pl-customizations: + rtol: 0.05 + weight: 1 + allow-blank: true + label: $d= $ + suffix: m +--- +# {{ 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 + +### pl-submission-panel + +{{ feedback.part1_ans }} + +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 + +How far does {{ params.vars.name }} travel in {{ params.t }} seconds, assuming they continue at the same velocity? + +### Answer Section + +### pl-submission-panel + +{{ feedback.part1_ans }} + +Everything here will get inserted directly into the pl-submission-panel element at the end of the `question.html`. + +### pl-answer-panel + +Everything here will get inserted directly into an pl-answer-panel element at the end of the `question.html`. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q03_dropdown/q03_dropdown.md b/tests/test_question_templates/question_return_expected_outputs/q03_dropdown/q03_dropdown.md new file mode 100644 index 00000000..62a465b9 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q03_dropdown/q03_dropdown.md @@ -0,0 +1,143 @@ +--- +title: Distance travelled +topic: Template +author: Firas Moosvi +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +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 + + # define possible answers + data2["params"]["part1"]["ans1"]["value"] = 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"] = pbh.roundp(v*t) + data2["params"]["part1"]["ans2"]["correct"] = True + data2["params"]["part1"]["ans2"]["feedback"] = "Great! You got it." + + data2["params"]["part1"]["ans3"]["value"] = 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"] = 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"] = 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"] = 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 + display: dropdown + allow-blank: 'true' +--- +# {{ params.vars.title }} + +## Useful Info + +This element is depreciated and `pl-multiple-choice` (or `pl-matching`) should be used instead. See https://prairielearn.readthedocs.io/en/latest/elements/#pl-dropdown-element for more information. + +## Part 1 + +{{ 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.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 + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q04_checkbox/q04_checkbox.md b/tests/test_question_templates/question_return_expected_outputs/q04_checkbox/q04_checkbox.md new file mode 100644 index 00000000..80901dfb --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q04_checkbox/q04_checkbox.md @@ -0,0 +1,147 @@ +--- +title: Vectors and Scalars +topic: Template +author: Firas Moosvi +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +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() + + # store phrases etc + data2["params"]["vars"]["title"] = 'Vectors and Scalars' + data2["params"]["vars"]["name"] = rd.choice(names) + + # define useful variables/lists + vectors = ["displacement", "velocity", "acceleration", "momentum", "force", "lift", "drag", "thrust", "weight"] + scalars = ["length", "area", "volume", "mass", "density", "pressure", "temperature", "energy", "entropy", "work", "power"] + + # Randomly select 2,3,4 scalars and shuffle the lists + total_choices = 6 + num_scalars = rd.choice([2,3,4]) + num_vectors = total_choices - num_scalars + select = rd.choice(["vectors","scalars"]) + + data2["params"]["choice"] = select + + # Create ans_choices + ans_choices = [f"ans{i+1}" for i in range(total_choices)] + + rd.shuffle(scalars) + rd.shuffle(vectors) + + # define possible answers + if select == "vectors": + for i in range(num_vectors): + choice = ans_choices.pop(0) + data2["params"]["part1"][choice]["value"] = vectors.pop() + data2["params"]["part1"][choice]["correct"] = True + data2["params"]["part1"][choice]["feedback"] = "Correct! Nice work" + + for i in range(num_scalars): + choice = ans_choices.pop(0) + data2["params"]["part1"][choice]["value"] = scalars.pop() + data2["params"]["part1"][choice]["correct"] = False + data2["params"]["part1"][choice]["feedback"] = "Not quite - Try again!" + + elif select == "scalars": + for i in range(num_scalars): + choice = ans_choices.pop(0) + data2["params"]["part1"][choice]["value"] = scalars.pop() + data2["params"]["part1"][choice]["correct"] = True + data2["params"]["part1"][choice]["feedback"] = "Correct! Nice work" + + for i in range(num_vectors): + choice = ans_choices.pop(0) + data2["params"]["part1"][choice]["value"] = vectors.pop() + data2["params"]["part1"][choice]["correct"] = False + data2["params"]["part1"][choice]["feedback"] = "Not quite - Try again!" + + # 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: checkbox + pl-customizations: + weight: 1 + partial-credit: true + partial-credit-method: EDC +--- +# {{ params.vars.title }} + +## Part 1 + +{{ params.vars.name }} is given a list of physical quantities and has to identify all of the {{ params.choice }}. Can you help? + +### Answer Section + +- {{{ params.part1.ans1.value }}} +- {{{ params.part1.ans2.value }}} +- {{{ params.part1.ans3.value }}} +- {{{ params.part1.ans4.value }}} +- {{{ params.part1.ans5.value }}} +- {{{ params.part1.ans6.value }}} + +### 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 + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q05_multi-part_feedback/q05_multi-part_feedback.md b/tests/test_question_templates/question_return_expected_outputs/q05_multi-part_feedback/q05_multi-part_feedback.md new file mode 100644 index 00000000..253cac8a --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q05_multi-part_feedback/q05_multi-part_feedback.md @@ -0,0 +1,159 @@ +--- +title: Electric Field and Direction +topic: Template +author: Jake Bobowski +source: 2.6.67 +template_version: 1.4 +attribution: openstax-physics-vol2 +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- undefined +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +server: + imports: | + import random as rd; rd.seed(111) + import numpy as np + import pandas as pd + import problem_bank_helpers as pbh + + # Feedback params + rtol = 0.03 + errorCheck = 'True' + + feedback_dict = {'vars': ['part1_ans'], + 'stringData': ['E'], + 'units': [r'$~\mathrm{N}/\mathrm{C}$'] + } + generate: | + data2 = pbh.create_data2() + + # Sample random numbers + L = rd.choice(np.linspace(7, 15, num = 9)) + q = rd.choice(np.linspace(1, 9, num = 41)) + p = rd.choice(np.linspace(-10, -6, num = 5)) + d = rd.choice(np.linspace(0.5, 2.5, num = 21)) + + # Put these numbers into data['params'] + data2["params"]["L"] = "{:.0f}".format(L) + data2["params"]["q"] = "{:.1f}".format(q) + data2["params"]["p"] = "{:.0f}".format(p) + data2["params"]["d"] = "{:.1f}".format(d) + + # Compute the solutions + e0 = 8.85e-12 # C^2/N m^2 + E = float((q*10**p/(L/100)**2)/e0) # N/C + + # Put the solutions into data['correct_answers'] + data2['correct_answers']['part1_ans'] = E + + # Write the solutions formatted using scientific notation while keeping 3 sig figs. + data2['correct_answers']['part1_ans_str'] = pbh.roundp(E, sigfigs=3, format = 'sci') + + # define possible answers + + data2["params"]["part2"]["ans1"]["value"] = 'points towards the negative plate' + data2["params"]["part2"]["ans1"]["correct"] = True + + data2["params"]["part2"]["ans2"]["value"] = 'points towards the positive plate' + data2["params"]["part2"]["ans2"]["correct"] = False + + data2["params"]["part2"]["ans3"]["value"] = 'points parallel to the plates' + data2["params"]["part2"]["ans3"]["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: | + # Call a function to check if the submitted answers should be re-expressed using scientific notation. + for i,k in enumerate(feedback_dict['vars']): + data["submitted_answers"][k + '_str'] = pbh.sigFigCheck(data["submitted_answers"][k], feedback_dict['stringData'][i], feedback_dict['units'][i]) + grade: | + # Call a function to check for easily-identifiable errors. + # The syntax is pbh.ErrorCheck(errorCheck, submittedAnswer, correctAnswer, LaTeXsyntax, relativeTolerance) + # To enable error checking, set check = 'true'. + + for i,k in enumerate(feedback_dict['vars']): + data["feedback"][k] = pbh.ErrorCheck(errorCheck, data["submitted_answers"][k], data["correct_answers"][k], feedback_dict['stringData'][i], rtol) +part1: + type: number-input + pl-customizations: + rtol: 0.05 + label: $E=$ + allow-blank: false + show-correct-answer: true + show-help-text: true + suffix: $\rm\ N/C$ + weight: 1 +part2: + type: multiple-choice + pl-customizations: + weight: 1 + display: dropdown + allow-blank: true +--- +# {{ params.vars.title }} + +Two parallel conducting plates ${{params.L}}\textrm{ cm}$ on a side are given equal and opposite charges of magnitude ${{params.q}}\times 10^{ {{params.p}} }\textrm{ C}$. +The plates are ${{params.d}} \textrm{ mm}$ apart. + +## Part 1 + +What is the magnitude of the electric field at the centre of the region between the plates? + +### Answer Section + +## Part 2 + +What is the direction of the electric field at the centre of the region between the plates? + +### Answer Section + +- {{{ params.part2.ans1.value }}} +- {{{ params.part2.ans2.value }}} +- {{{ params.part2.ans3.value }}} + +### pl-submission-panel + +{{ submitted_answers.part1_ans_str }} +{{ feedback.part1_ans }} + +### pl-answer-panel + +$E=$ {{ correct_answers.part1_ans_str }} $\mathrm{N}/\mathrm{C}$ + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q06_number-input_feedback/q06_number-input_feedback.md b/tests/test_question_templates/question_return_expected_outputs/q06_number-input_feedback/q06_number-input_feedback.md new file mode 100644 index 00000000..63c65e5e --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q06_number-input_feedback/q06_number-input_feedback.md @@ -0,0 +1,152 @@ +--- +title: OSUPv2p12_55 +topic: Template +author: Jake Bobowksi +source: 2.12.55 +template_version: 1.4 +attribution: openstax-physics-vol2 +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 19.2.3.0 +- 19.2.3.1 +- 19.3.2.0 +- 19.3.2.1 +- 19.6.1.0 +- 19.6.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- OSUP +- centripetal acceleration +- chapter 12 +- circular motion +- magnetic force +- problem 55 +- solenoid +- volume 2 +server: + imports: | + import random as rd; rd.seed(111) + import numpy as np + import pandas as pd + import problem_bank_helpers as pbh + + # Feedback params + rtol = 0.03 + errorCheck = 'True' + + feedback_dict = {'vars': ['part1_ans'], + 'stringData': ['I'], + 'units': [r'$~\mathrm{A}$'] + } + generate: | + data2 = pbh.create_data2() + + # define bounds of the variables + n = rd.choice(np.linspace(10, 35, num = 6)) # cm^-1 + r = rd.choice(np.linspace(1, 3, num = 21)) # cm + v = rd.choice(np.linspace(1, 3, num = 21)) + p = rd.choice([4, 5, 6]) + + # store the variables in the dictionary "params" + data2["params"]["n"] = "{:.0f}".format(n) + data2["params"]["r"] = "{:.2f}".format(r) + data2["params"]["v"] = "{:.2f}".format(v) + data2["params"]["p"] = "{:.0f}".format(p) + + # fix units + n = n*100 # m^-1 + r = r/100 # m + v = v*10**p # m/s + + # define some constants + mu0 = 4e-7*np.pi + m = 9.11e-31 # kg + q = 1.6e-19 # C + + # calculate the correct + I = m*v/(mu0*n*q*r) # A + + # define correct answers + data2["correct_answers"]["part1_ans"] = I + + # Write the solution formatted using scientific notation while keeping 3 sig figs. + data2["correct_answers"]["part1_ans_str"] = "{:.2e}".format(I) + + # 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: | + # Call a function to check if the submitted answers should be re-expressed using scientific notation. + for i,k in enumerate(feedback_dict['vars']): + data["submitted_answers"][k + '_str'] = pbh.sigFigCheck(data["submitted_answers"][k], feedback_dict['stringData'][i], feedback_dict['units'][i]) + grade: | + # Call a function to check for easily-identifiable errors. + # The syntax is pbh.ErrorCheck(errorCheck, submittedAnswer, correctAnswer, LaTeXsyntax, relativeTolerance) + # To enable error checking, set errorCheck = 'true'. + + for i,k in enumerate(feedback_dict['vars']): + data["feedback"][k] = pbh.ErrorCheck(errorCheck, data["submitted_answers"][k], data["correct_answers"][k], feedback_dict['stringData'][i], rtol) +part1: + type: number-input + pl-customizations: + rtol: 0.05 + weight: 1 + allow-blank: false + show-correct-answer: false + label: $I= $ + suffix: $\rm\ A$ +--- +# {{ params.vars.title }} + +## Part 1 + +A solenoid with ${{ params.n }}$ turns per centimter carries a current $I$. An electron moves within the solenoid in a circle of radius ${{ params.r}}\textrm{ cm}$. +The plane of the circular motion is perpendicular to the axis of the solenoid. The speed of the electron is ${{ params.v }}\times 10^{ {{ params.p }} }\textrm{ m/s}$. +What is the current $I$ in the solenoid? + +### Answer Section + +### pl-submission-panel + +{{ submitted_answers.part1_ans_str }} + +{{ feedback.part1_ans }} + +### pl-answer-panel + +$I=$ {{ correct_answers.part1_ans_str }} $\textrm{ A}$ + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q07a_symbolic-input/q07a_symbolic-input.md b/tests/test_question_templates/question_return_expected_outputs/q07a_symbolic-input/q07a_symbolic-input.md new file mode 100644 index 00000000..b706d819 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q07a_symbolic-input/q07a_symbolic-input.md @@ -0,0 +1,111 @@ +--- +title: Centripetal Motion +topic: Template +author: Michael Kudla +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +server: + imports: | + import random as rd; rd.seed(111) + import pandas as pd + import sympy as sp + import prairielearn as pl + import problem_bank_helpers as pbh + generate: | + data2 = pbh.create_data2() + + # store phrases etc + data2["params"]["vars"]["title"] = 'Centripetal Motion' + + # Declare math symbols to be used by sympy + m, v, r = sp.symbols('m v r') + + # Describe the solution equation + F = m*v**2/r + + # Answer to fill in the blank input stored as JSON. + data2['correct_answers']['part1_ans'] = pl.to_json(F) + + # 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: symbolic-input + pl-customizations: + label: $F_r = $ + variables: m, v, r + weight: 1 + allow-blank: false +--- +# {{ params.vars.title }} + +## Part 1 + +Write the centripetal force $F_r$ in terms of the mass $m$, velocity $v$, and radius $r$. + +Note that it may not be necessary to use every variable. Use the following table as a reference for each variable: + +| For | Use | +|----------|-------| +| $m$ | m | +| $v$ | v | +| $r$ | r | + +### 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. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q07b_symbolic-input/q07b_symbolic-input.md b/tests/test_question_templates/question_return_expected_outputs/q07b_symbolic-input/q07b_symbolic-input.md new file mode 100644 index 00000000..f3f279f8 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q07b_symbolic-input/q07b_symbolic-input.md @@ -0,0 +1,122 @@ +--- +title: Symbolic Input 2 - Trig +topic: Template +author: Michael Kudla +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +server: + imports: | + import random as rd; rd.seed(111) + import pandas as pd + import sympy as sp + import prairielearn as pl + import problem_bank_helpers as pbh + generate: | + data2 = pbh.create_data2() + + # define or load names/items/objects + names = pbh.names.copy() + vehicles = pbh.vehicles.copy() + + # store phrases etc + data2["params"]["vars"]["title"] = 'Symbolic Input 2 - Trig' + data2["params"]["vars"]["name"] = rd.choice(names) + data2["params"]["vars"]["vehicle"] = rd.choice(vehicles) + + # Declare math symbols to be used by sympy + mu_s, g , theta = sp.symbols('mu_s g theta') + + # Describe the solution equation + amax = g*(mu_s*sp.cos(theta) - sp.sin(theta)) + + # Answer to fill in the blank input -- must be stored as JSON. + data2['correct_answers']['part1_ans'] = pl.to_json(amax) + + # 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: symbolic-input + pl-customizations: + label: $F_r =$ + variables: mu_s, g , theta + weight: 1 + allow-blank: true +--- +# {{ params.vars.title }} + +## Part 1 + +{{ params.vars.name }} is driving a {{ params.vars.vehicle }} up a slope of angle $\theta$. + +There is a wooden crate in the back of the {{ params.vars.vehicle }} and the coefficients of static and kinetic friction between the crate and the {{ params.vars.vehicle }} are $\mu_s$ and $\mu_k$ respectively. + +If the {{ params.vars.vehicle }} starts moving, what is the maximum acceleration the {{ params.vars.vehicle }} can have without the crate slipping? You should provide a symbolic answer in terms of the following variables: $\mu_s$, $\mu_k$, $g$, and $\theta$. + +Note that it may not be necessary to use every variable. Use the following table as a reference for using each variable: + +| For | Use | +|----------|-------| +| $\mu_s$ | mu_s | +| $\mu_k$ | mu_k | +| $g$ | g | +| $\theta$ | theta | + +### 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. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q09_file-upload/q09_file-upload.md b/tests/test_question_templates/question_return_expected_outputs/q09_file-upload/q09_file-upload.md new file mode 100644 index 00000000..4f56c4e2 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q09_file-upload/q09_file-upload.md @@ -0,0 +1,88 @@ +--- +title: File Upload +topic: Template +author: Michael Kudla +source: original +template_version: 1.4 +attribution: standard +gradingMethod: Manual +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +server: + imports: 'import problem_bank_helpers as pbh + + ' + generate: | + data2 = pbh.create_data2() + + data2["params"]["vars"]["title"] = "File Upload" + + # 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: file-upload + pl-customizations: + file-names: file.png, file.jpg, file.pdf, filename space.png +--- +# {{ params.vars.title }} + +## Part 1 + +A block sits on an incline plane of angle 30 degrees to the horizontal. +Draw a free body diagram for the block by hand, take a picture, and upload it. +Your file must be a png, jpg, or pdf. + +### 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. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q10_integer-input/q10_integer-input.md b/tests/test_question_templates/question_return_expected_outputs/q10_integer-input/q10_integer-input.md new file mode 100644 index 00000000..f9d608a1 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q10_integer-input/q10_integer-input.md @@ -0,0 +1,106 @@ +--- +title: Integer Math +topic: Template +author: Firas Moosvi +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +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"] = "Integer Math" + data2["params"]["vars"]["units"] = "m/s" + + # define bounds of the variables + n = rd.randint(2,100) + + # store the variables in the dictionary "params" + data2["params"]["n"] = n + + # define correct answers + data2["correct_answers"]["part1_ans"] = int(n*10) + + # 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: + weight: 1 + allow-blank: true +--- +# {{ params.vars.title }} + +## Part 1 + +{{ params.vars.name }} is on a {{ params.vars.vehicle }} trying to calculate the result of 10 x {{ params.n }} {{ params.vars.units }}. + +### 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. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q11_multi-part/q11_multi-part.md b/tests/test_question_templates/question_return_expected_outputs/q11_multi-part/q11_multi-part.md new file mode 100644 index 00000000..dc5b4193 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q11_multi-part/q11_multi-part.md @@ -0,0 +1,171 @@ +--- +title: Multi-part Question +topic: Template +author: Firas Moosvi +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +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 + 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 + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q11_multi-part/test1.png b/tests/test_question_templates/question_return_expected_outputs/q11_multi-part/test1.png new file mode 100644 index 00000000..fdaf7b94 Binary files /dev/null and b/tests/test_question_templates/question_return_expected_outputs/q11_multi-part/test1.png differ diff --git a/tests/test_question_templates/question_return_expected_outputs/q11_multi-part/test2.png b/tests/test_question_templates/question_return_expected_outputs/q11_multi-part/test2.png new file mode 100644 index 00000000..b643c415 Binary files /dev/null and b/tests/test_question_templates/question_return_expected_outputs/q11_multi-part/test2.png differ diff --git a/tests/test_question_templates/question_return_expected_outputs/q12_longtext-input/q12_longtext-input.md b/tests/test_question_templates/question_return_expected_outputs/q12_longtext-input/q12_longtext-input.md new file mode 100644 index 00000000..da2e4ed2 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q12_longtext-input/q12_longtext-input.md @@ -0,0 +1,94 @@ +--- +title: Describe an Experiment +topic: Template +author: Michael Kudla +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +assets: +- sample.html +server: + imports: 'import problem_bank_helpers as pbh + + ' + generate: | + data2 = pbh.create_data2() + + data2["params"]["vars"]["title"] = "Describe an Experiment" + + # 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: longtext + pl-customizations: + placeholder: Type your answer here... + file-name: answer.html + quill-theme: snow + directory: clientFilesQuestion + source-file-name: sample.html +--- +# {{ params.vars.title }} + +## Part 1 + +You have at your disposal a measuring tape and a ball. Describe an experiment you could perform to estimate the speed of a ball as it hits the ground, when dropped from any height. +Include any formulas you might use. +Estimate the accuracy of your measurement in terms of the uncertainty in your velocity prediction. +What factors would be unaccounted for in your velocity prediction? + +### 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. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q12_longtext-input/sample.html b/tests/test_question_templates/question_return_expected_outputs/q12_longtext-input/sample.html new file mode 100644 index 00000000..8bedcf09 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q12_longtext-input/sample.html @@ -0,0 +1,11 @@ +

heading 1

+ +This is an example bolded + +

heading 2

+ +Sample comments + +

heading 3

+ +Sample code here diff --git a/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/q13_file-editor-input.md b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/q13_file-editor-input.md new file mode 100644 index 00000000..b597706c --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/q13_file-editor-input.md @@ -0,0 +1,141 @@ +--- +title: Python Powers +topic: Template +author: Aidan Murphy +source: original +template_version: 1.0 +attribution: standard +gradingMethod: External +partialCredit: true +singleVariant: true +showCorrectAnswer: false +externalGradingOptions: + enabled: true + image: prairielearn/grader-python + entrypoint: /python_autograder/run.sh +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- nothing +autogradeTestFiles: +- ans.py +- setup_code.py +- starter_code.py +- test.py +server: + imports: | + import random as rd; rd.seed(111) + import math + import problem_bank_helpers as pbh + generate: | + # randomized question + numbers = list(range(4, 11)) + rd.shuffle(numbers) + randInt = rd.choice(numbers) + question_dict = { + f"{randInt}th power": randInt, + f"{randInt}th root": 1/randInt + } + question_list = list(question_dict.keys()) + question = rd.choice(question_list) + + data["params"]["question"] = question + data["params"]["num"] = question_dict[question] + + # randomized variable names + name_list = ["giraffe", "warthog", "dog", "crab"] + function_name = rd.choice(name_list) + data["params"]["fname"] = function_name + + # create some example inputs and outputs + for i in range(3): + input = numbers.pop(0) + data["params"]["input" + str(i)] = input + data["params"]["output" + str(i)] = math.pow(input, question_dict[question]) + + # variables detected by autograder + ## list of variables provided to students + data["params"]["names_for_user"] = [ + {"name": "x", "description": "A random input number", "type": "int"} + ] + + ## list of variables/references extracted from student answer + data["params"]["names_from_user"] = [ + {"name": function_name, "description": f"receives a single numerical input, returns its {question}", "type": "function"} + ] + + # 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: file-editor + pl-customizations: + file-name: user_code.py + ace-mode: ace/mode/python + source-file-name: tests/starter_code.py +--- +# {{ params.vars.title }} + +## Part 1 + +This question requires you to define a function named `{{params.fname}}`. +This function should receive a single numerical input and return the {{params.question}} of this input. +assume all inputs to the function are valid. + +Below are some example uses of the `{{params.fname}}` function: + +```python +{{params.fname}}({{params.input0}}) # returns {{params.output0}} +{{params.fname}}({{params.input1}}) # returns {{params.output1}} +{{params.fname}}({{params.input2}}) # returns {{params.output2}} +``` + +### Answer Section + +### pl-submission-panel + + + + + + +### 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 + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/ans.py b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/ans.py new file mode 100644 index 00000000..64359acb --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/ans.py @@ -0,0 +1,4 @@ +# must define marking scheme based on setup.py variables +import math +def correct_output(x): + return math.pow(x, data["params"]["num"]) diff --git a/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/setup_code.py b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/setup_code.py new file mode 100644 index 00000000..6ff48a09 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/setup_code.py @@ -0,0 +1,2 @@ +# script is executed once, variables are then accessed in ans.py and in student answer +# this question requires a function to be created so no variables are necessary diff --git a/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/starter_code.py b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/starter_code.py new file mode 100644 index 00000000..0f43f2af --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/starter_code.py @@ -0,0 +1 @@ +import math diff --git a/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/test.py b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/test.py new file mode 100644 index 00000000..96724337 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q13_file-editor-input/tests/test.py @@ -0,0 +1,64 @@ +from code_feedback import Feedback +from pl_helpers import name, points +from pl_unit_test import PLTestCase +import random as rd +import inspect + +class Test(PLTestCase): + total_iters = 5 + def setUp(self): + self.output = eval("self.st." + self.data["params"]["fname"]) + + def test_function_args(func): + argspec = inspect.getfullargspec(func) + args = argspec.args + varargs = argspec.varargs + keywords = argspec.varkw + if varargs or keywords: + raise TypeError(f"{func.__name__}() accepts *args or **kwargs") + if len(args) != 1: + raise TypeError(f"{func.__name__}() takes 1 positional arguments, but {len(args)} were given") + self.test_function_args = test_function_args + + @points(1/total_iters) + @name("correct input parameters (only 1 parameter, no *args or **kwargs)") + def test_0(self): + try: + self.test_function_args(self.output) + Feedback.set_score(1) + except: + Feedback.set_score(0) + + @points(1) + @name("random input") + def test_1(self): + #(feedback var name, ans.py variable, student answer variable) + randint = rd.randint(10, 1000) + feedback = str(self.data["params"]["fname"]) + "(" + str(randint) + ") = " + str(self.output(randint)) + if Feedback.check_scalar(feedback, self.ref.correct_output(randint), self.output(randint)): + Feedback.set_score(1) + + else: + Feedback.set_score(0) + + @points(2/total_iters) + @name("edge case #1") + def test_2(self): + input_num = 0 + feedback = str(self.data["params"]["fname"]) + "(" + str(input_num) + ") = " + str(self.output(input_num)) + if Feedback.check_scalar(feedback, self.ref.correct_output(input_num), self.output(input_num)): + Feedback.set_score(1) + + else: + Feedback.set_score(0) + + @points(2/total_iters) + @name("edge case #2") + def test_3(self): + input_num = 1 + feedback = str(self.data["params"]["fname"]) + "(" + str(input_num) + ") = " + str(self.output(input_num)) + if Feedback.check_scalar(feedback, self.ref.correct_output(input_num), self.output(input_num)): + Feedback.set_score(1) + + else: + Feedback.set_score(0) diff --git a/tests/test_question_templates/question_return_expected_outputs/q14_string-input/q14_string-input.md b/tests/test_question_templates/question_return_expected_outputs/q14_string-input/q14_string-input.md new file mode 100644 index 00000000..5d8d9eae --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q14_string-input/q14_string-input.md @@ -0,0 +1,104 @@ +--- +title: Code Output +topic: Template +author: Gavin Kendal-Freedman +source: original +template_version: 1.0 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +server: + imports: "import random; random.seed(111) \nimport problem_bank_helpers as pbh\n" + generate: | + data2 = pbh.create_data2() + + a = random.randint(2, 4) + stringname = "love" + + data2["params"]["vars"]["title"] = "Code Output" + data2["params"]["vars"]["a"] = a + data2["params"]["vars"]["stringname"] = stringname + data2["correct_answers"]["ans"] = "" + # we can also add alternate correct answers, which will we can grade as correct + # lets say we want to accept "Love" as an correct answer as an example, we can do: + data2["params"]["part1"]["alternate_correct_ans"] = [a * stringname, a * "Love"] + + # 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: "# Since we want an alternate correct answer, we can check for it here, and\ + \ override the automatic \n# score if it is correct\nif data[\"submitted_answers\"\ + ][\"ans\"] in data[\"params\"][\"part1\"][\"alternate_correct_ans\"]:\n data[\"\ + partial_scores\"][\"ans\"] = { \"score\": 1 }\n" +part1: + type: string-input + pl-customizations: + display: block + placeholder: '...' + ignore-case: true +--- +# {{ params.vars.title }} + +## Part 1 + +For the following python code snippet, enter below the resulting string: + +```python +a = "{{ params.vars.stringname }}" * {{ params.vars.a }} +``` + +### 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. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question: + +This example problem is adapted from PrairieLearn's Examples: https://github.com/PrairieLearn/PrairieLearn/tree/master/exampleCourse/questions/element/stringInput + diff --git a/tests/test_question_templates/question_return_expected_outputs/q15_matching/q15_matching.md b/tests/test_question_templates/question_return_expected_outputs/q15_matching/q15_matching.md new file mode 100644 index 00000000..93ad2a5a --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q15_matching/q15_matching.md @@ -0,0 +1,121 @@ +--- +title: Distance travelled +topic: Template +author: Christina Yang +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +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 + + # define all options for right side of matching + data2["params"]["part1"]["option1"]["value"] = True + data2["params"]["part1"]["option1"]["name"] = "True" + data2["params"]["part1"]["option2"]["value"] = False + data2["params"]["part1"]["option2"]["name"] = "False" + + data2["params"]["part1"]["statement1"]["value"] = pbh.roundp(42) + data2["params"]["part1"]["statement1"]["matches"] = "False" + data2["params"]["part1"]["statement2"]["value"] = pbh.roundp(v*t) + data2["params"]["part1"]["statement2"]["matches"] = "True" + data2["params"]["part1"]["statement3"]["value"] = pbh.roundp(v+t) + data2["params"]["part1"]["statement3"]["matches"] = "False" + data2["params"]["part1"]["statement4"]["value"] = pbh.roundp(v/t) + data2["params"]["part1"]["statement4"]["matches"] = "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: matching + pl-customizations: + weight: 1 + blank: 'true' +--- +# {{ params.vars.title }} + +## Part 1 + +{{ 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 + +### 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 + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q16_matrix-input/q16_matrix-input.md b/tests/test_question_templates/question_return_expected_outputs/q16_matrix-input/q16_matrix-input.md new file mode 100644 index 00000000..4b1db3be --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q16_matrix-input/q16_matrix-input.md @@ -0,0 +1,124 @@ +--- +title: Matrix Input +topic: Template +author: Gavin Kendal-Freedman +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +server: + imports: | + import numpy as np; np.random.seed(111) + import problem_bank_helpers as pbh + import prairielearn as pl + generate: | + data2 = pbh.create_data2() + data2["params"]["title"] = "Matrix Input" + + matrix = np.random.random((2,2)) + inv_matrix = np.linalg.inv(matrix) + + # store phrases, info etc + data2["params"]["matrixA"] = pl.to_json(matrix) + + # store the correct answers + data2["correct_answers"]["part1_ans"] = pl.to_json(inv_matrix) + data2["correct_answers"]["part2_ans"] = pl.to_json(inv_matrix) + + 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: matrix-component-input + pl-customizations: + weight: 1 + allow-fractions: 'false' + label: $A^{-1}$ + comparison: decdig +part2: + type: matrix-input + pl-customizations: + weight: 1 + allow-complex: 'false' + label: $A^{-1}$ + comparison: decdig +--- +# {{ params.vars.title }} + +Given the following matrix, please return the inverse of the matrix. + +## Part 1 + +Please write your answer as a matrix component input. + +### 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 + +Please write your answer as a matrix input in python or matlab format. + +### 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. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/file1.txt b/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/file1.txt new file mode 100644 index 00000000..b30565ee --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/file1.txt @@ -0,0 +1,18 @@ +Gk44G5S2cov8PgPpy9n7r0v4FYY7zU/7i8UNDrRYLU1GjpVdCPIzdbUUcln3CqNlBTEKjn75+3qs +DUvteohtwFF+4BYwAyfv7yjzX9CPsyfHjBYC+b+fMHPMFns1vdlGUvwDEePE4k1EnJECUZKTkebJ +ymKhR6BY4IUnO5cVsRARExtVkYddHUcNAhgLpN9E/SNln9gJ9fN4WRat6l2QSDaH2OJ96+lDM/yR +EVttiFtCynzgguVYQy06tlpLXk9a9MwPlVGJvH/qH28pHkIac2H6UpWnDcBptsVJTVfTVv9Gp9/s +IQmeZRDIUy6163Ga9Uke6o1W7dVeohjvwY/KQHApZcK15RDkb+UiBd/9VM26N7eMoW41Sg7SKtQZ ++i8vEu2H6whEnvZCnYg+sOh9fxaDlOQhh7qhu4g2z1TORCjWzgELzZEmPJVrsf45cG0tz0xKoF/d +Uw/YoHF8RJexASnLZWj4125sNCQ6XfoEl1DLzUULxH7SeWM9owpouV5RZC3LZmCgyDUvbI0oMk+l +9GTae6lcMLOKD1R2q4NksQAt/osyWXQZw1g6pcqNSz1TdirbiQsTY6g+JZ3pYN2tK2w4WqVnLPix +lI9ktBec6XknnEEvrI7NhPLEXdxS7mUXuapCV6EfMfDPMvW523EUQPE5MWYBvHTmlIW5pemWgsAd +vuCFOIjs73L0es+88D3gCrSGSyk7KydSY3f2XCD8PLf78ZamVWi9yRpQryc33bRB2CaGhHhmbKto +4nsb+ToaG0aZE2FtIjOHTyC8jjsqgLRbHfRXJVFnngKVT+DEQnrfLRuC8+PtMrDDpZ4VarpK0aLd +BMtHPOsg+cOhwhqU021s2nq6G6XKfSDHeRR/2T/R0loeMr8/6UCVQKXitWl2f//tfnBYYMQObys3 +tYsJC46pR+Gp9ytUxc+//NKKmhn1J4Sm8anhGeePEmxroVbm5O16jk62u+L2jNJ0HOGYXNKizuKP +aVSReke4ZqdxJCCLZjLS6q4B5v5s7XK2TRFUb7BUeOVvezG698khGjCdPDOZH1gYxRoKR5VrkM1z +Mr8VPMi6io9GhaGehNz+N5ygXp6IG9VOht+j7H1y76rgooUtmtNKLuySTkf4nxK/FocuyCsDxP0r +jIZIgLEn1CD6R+ewbVZbFqwJt5RfJRpGss3Lmn3SdF4VEYQNHos6ytL0JzejC0Q7Foy5YC0cC0QC +fjpFZcbNXCJSnq6fX+KKq8MdHdivisU2Nd+5TCeqDdpuz2Plxs0o6wMlrYxIJKH+caxzvtlKdmRh +u1Ko/xz1A4VkljPJAudnrWXuvgfxVCacQ0DNJ/I8fA== diff --git a/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/file2.txt b/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/file2.txt new file mode 100644 index 00000000..492987ca --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/file2.txt @@ -0,0 +1,18 @@ +DBVUxxDUlMoztjq4PiJSvgtwoY56pePoFur5Pz64DnE3tf2d7ffUtDBqluysfK62jpBzD9Ws6sTp +HZj7GIV1UQZloqbT2jPwyi5HGs1/aDfwTJA+ISur9mSEKLGEHADFqMsC9B5OW1P6hpzWiIjTGzde +VBOE5LfCy03VEsHfu90Ouk+PjEkxCz7rdIjjmxIDTp0GVmy73UwjvPT9Qwu70i2qSA1MDpCfAFmu +daTha8axoUcTnhNFlT2jVf4e/4cITNEsi/T/mMbpAtbXQXXLfflv7btJDTnY7L05AJetLmIXhZXB +OCwkA0d4gPMjG6p5Lkq3Vs3aeO8CVgSLeKEWz8Pru1pbSe0xDtt6EGZXK4axQ/gpZQfymEdqF4x5 +V3qqlVMDYcwIHkZiLdmxZOBX6J62yHtU7VdMD8zaT2Ds+fnqc4O0kRuUl+wZb+aQ1+ScZ17mxZ4B +6//1Ped29UUHuZQcJlOfrbtoXH4ZNO01OzZbQQ9YHlHLpOKQNqPXyBBH0bTz53ta5QX0ItMZ42eo +61fMjWm4baU4UmB1s9jlQGMYoVoo8URROfuZn7kirS9J5YLOpAuny+dBZsS8ezjwFput3Hh5JyYo +qIiC7oIVjHsHoYgAELxxFzLR3RreRxbKcoNxvdBu/4RngKzahXypIVPx0ldMiWIVnoEZlJtq5WE5 +S49N+ojExqOOWPPgXxcUP8dHkhfXoDgTph4M0ZFb4H6FJuwX/R7CqNHnqHbgYiCj1tZG4LBwVO/v +kamJudzm/SBvLlUycL9JrMgedLnUmVZorUgj4IVDju8lyHcz8RRBFHCBTh4LII+W+PBQ21LBCsH8 +2BZPOh8MLXFb8G7stl/n0rMkqC+tmRw2CAjwmbz/54nwuzm8o7k7cGXhou6blkx6tBlC54muSBWd +X7vNSctuY+JwwgLXk5JfeHIF2JdaCNaGyyBFgPer2rTG9PuoHD3QRibXOJSHy+NlCLrdrZXB89HQ +WNCpeBjWjlclG/O7LL2yuvrkvM5eohPjRBIHa4lxzEecL5Y+SPUOy7vIg0DChpL5CzpbYzgM15mS +Zd/ai7rkBzfdJMlmxTXNewMVaf4drtx9Cg9HJAWCjIjaX1lqOfku2vqKetfLQytz1qnNYo8oPcKE +PmaHbGkubdHI3+dDbqva3LWgrKjUNdVaQq+ICo57Pdo1FycScSyWW58Peldh0mIZodxVt8IiDiR3 +hjVJqGkRuxT0T07Dc2fXHKtylz8L2VdAQeeqqdaLvJnNVRU/CRzjdLLnWKUzC4f3CiFVeHW1MiRn +hWLsmy+tcEvZnFh29K1Ei55NFBcQjUvBQvmZgg+SiQ== diff --git a/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/filebad.txt b/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/filebad.txt new file mode 100644 index 00000000..90505446 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/filebad.txt @@ -0,0 +1,18 @@ +a5HQSUh3ZVyvZxZvF2t+Pi3BLjHQ8MTJJ/2I7rqOQQ+mPC3AWAD5WHR5OZ+XwE6qfVjThv0rH1Lk +3N9phhpM+4Ij7g2KwPK6sb076LbD6PRVNpIVjEfEuzdi8pcZ4hDvYbPOSZ3FSpqvDGbFCBRSobSp +npEnw2DkyABjlvh5JKsv732jrZBBXHqgtBE7RgVeT+wlXo6nu8h1330fOYQ3y0F8UCWELtqfHseU +A3T/yB56wOG33k8jBvpAzAYmM+zr3xfFKhp36Ak2NvKH2oikeUi5wB1q8kaVVbHKCEoCYYW/mYnf +FFaAh2zMYOhVEeNUaee8RrSQvIXar2vgOim9W4vJxgKRUpjp09YFDw9lOgu4ddru60pR7QLNmCP5 +ht1jImO1p0TZ+A/Vwp6jKskDFqKy7ZZBTHYT99scrUWd7OEyyIbWF7OSIeq8wubAqcbAJ6NMUBRv +JqPxsbNNhkm/Xw4zvhQyhsI5P9QIjBpzL8SwxdhD5DdGfP8JGQLaLlvW8GlgBhteNY2k5lpSL2YJ +UsT4BT6fkeZnaWNfxJR69eAI98PeDiVW8KedvtE/wU4WlhmXi/bY7lenZi6sBSzqiXxaJujszLIG +c/bahugWAMXEBHGBduaYBOI6JGdFY2219qqKlY1aM2WUBTh/IF+Ig9PZDSMGW/Qo4HEo8HYge1sl +JkbcIL2zNhLpUJR8eCaZ06QI8KOa2LvtVLRBFRCdLXhdelD3uZDYWRVh+0ykASdCNURqayIxC3ys +Uwq95Qt5uB0teliY/xQ+JRvu6YnU+kStJGrEgaeS8ZjF85ogFCbNUnqvub1mvek/y23Z5SSYSKm/ +KcUpAIVfAg+W2YriERzUEsyzMjTKS1MP4mEeWUGgBIR4yGU2hivyd4P0eeIAti/zCTaKQBTRwXJX +4nar06DgLUj4HHdcd7aaLTxt4bHA646IXO+2qYxQAZxvKkgWfZ6QWFakXVROR/6lfqJDLD3QVFD0 +0d25EOhPbxe/Q7L8TR7rMsmE7cpJvA/Mjv36g6f2l0PngzPlm/EiJ0i0wn/3Al4A5+AEfxDwRMFo +rNkaJEyEkRBDo5UeVdnTVXH1z70RLSju0n4oJe3NS47nv+gP5brMCkPxEh0pY1vtSFskaLHqJZwV +NWFSdij8THFL0dlfKG5wyPwtwCuQqCz029wRjfJNFEgfqWOGGXZLLC+7n4wdSr2QO+ppZdKqB/Bl +t6i2u5iwH+XrYf4j9THtXCQ6w/FEere2q8EBkCaTSOhKC+Gyp1rAnyuuYIy/dxprJKI4EzhgVHYo +171ZFv6aNT1ETGgB8ejaU9025ozLjRHvcbuHIZsm3g== diff --git a/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/q17_workspaces.md b/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/q17_workspaces.md new file mode 100644 index 00000000..08200b13 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q17_workspaces/q17_workspaces.md @@ -0,0 +1,133 @@ +--- +title: Moving and copying files +topic: Template +author: Jonatan Schroeder; Converted by Gavin Kendal-Freedman +source: original +template_version: 1.0 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- unknown +serverFiles: +- file1.txt +- file2.txt +- filebad.txt +server: + imports: "import base64 \nimport problem_bank_helpers as pbh\n" + generate: | + data2 = pbh.create_data2() + + data2["params"]["vars"]["title"] = "Moving and copying files" + + # 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: | + if '_files' in data['format_errors']: + del data['format_errors']['_files'] + grade: | + files = { f['name']: f['contents'] for f in data['submitted_answers'].get('_files', []) } + data['feedback']['results'] = [] + data['score'] = 0 + + with open('workspace/file1.txt', 'rb') as f: + file1_content = base64.b64encode(f.read()).decode() + with open('workspace/file2.txt', 'rb') as f: + file2_content = base64.b64encode(f.read()).decode() + + if 'newdir/file1_new.txt' not in files: + data['feedback']['results'].append('newdir/file1_new.txt was not created.') + elif files['newdir/file1_new.txt'] != file1_content: + data['feedback']['results'].append('newdir/file1_new.txt was created, but it is not based on file1.txt.') + elif 'file1.txt' in files: + data['feedback']['results'].append('newdir/file1_new.txt was created properly, but the old file still exists.') + data['score'] += 0.2 + else: + data['feedback']['results'].append('file1.txt moved successfully.') + data['score'] += 0.4 + + if 'newdir/file2_new.txt' not in files: + data['feedback']['results'].append('newdir/file2_new.txt was not created.') + elif files['newdir/file2_new.txt'] != file2_content: + data['feedback']['results'].append('newdir/file2_new.txt was created, but it is not based on file2.txt.') + elif 'file2.txt' not in files: + data['feedback']['results'].append('newdir/file2_new.txt was created properly, but the old file no longer exists.') + data['score'] += 0.2 + else: + data['feedback']['results'].append('file2.txt copied successfully.') + data['score'] += 0.4 + + if files and 'filebad.txt' in files: + data['feedback']['results'].append('filebad.txt still exists.') + else: + data['feedback']['results'].append('filebad.txt deleted successfully.') + data['score'] += 0.2 +part1: + type: workspace + pl-customizations: {} +--- +# {{ params.vars.title }} + +## Part 1 + +Open the Workspace below and perform the following tasks. + +- Create a new directory called `newdir`; +- Move the file `file1.txt` to the directory `newdir`, with the new name `file1_new.txt`; +- Copy the file `file2.txt` to the directory `newdir`, with the new name `file2_new.txt`; +- Delete the file `filebad.txt`. + +Once you complete these tasks, click on "Save & Grade" below. + +### 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. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question: + +This example problem was originally created by [Jonatan Schroeder](https://www.cs.ubc.ca/people/jonatan-schroeder), and was later converted to the OER markdown layout. + diff --git a/tests/test_question_templates/question_return_expected_outputs/q18_integer-input/q18_integer-input.md b/tests/test_question_templates/question_return_expected_outputs/q18_integer-input/q18_integer-input.md new file mode 100644 index 00000000..252d7a25 --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/q18_integer-input/q18_integer-input.md @@ -0,0 +1,95 @@ +--- +title: Median +topic: Template +author: Gavin Kendal-Freedman +source: original +template_version: 1.4 +attribution: standard +partialCredit: true +singleVariant: false +showCorrectAnswer: false +outcomes: +- 6.1.1.0 +- 6.1.1.1 +difficulty: +- easy +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- easy +server: + imports: | + import random; random.seed(111) + from statistics import median + import problem_bank_helpers as pbh + generate: | + data2 = pbh.create_data2() + + numbers = sorted(random.randint(1, 100) for _ in range(9)) + # store the variables in the dictionary "params" + data2["params"]["vars"]["numbers"] = numbers + + # define correct answers + data2["correct_answers"]["part1_ans"] = median(numbers) + + # 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: integer-input + pl-customizations: + weight: 1 + allow-blank: true + label: $n= $ +--- +# {{ params.vars.title }} + +Given a list of numbers ${{ params.vars.numbers }}$, what is the `median` of the list? + +## Part 1 + +### 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. + +## Rubric + +This should be hidden from students until after the deadline. + +## Solution + +This should never be revealed to students. + +## Comments + +These are random comments associated with this question. + diff --git a/tests/test_question_templates/question_return_expected_outputs/spring_oscillations/spring_oscillations.md b/tests/test_question_templates/question_return_expected_outputs/spring_oscillations/spring_oscillations.md new file mode 100644 index 00000000..5041cb6b --- /dev/null +++ b/tests/test_question_templates/question_return_expected_outputs/spring_oscillations/spring_oscillations.md @@ -0,0 +1,126 @@ +--- +title: Simple Harmonic Spring +topic: Energy +author: Unknown +source: Unknown +template_version: Unknown +attribution: standard +outcomes: +- unknown +difficulty: undefined +randomization: +- undefined +taxonomy: +- undefined +span: +- undefined +length: +- undefined +tags: +- MP +server: + imports: | + import random + import math + import pandas as pd + import problem_bank_helpers as pbh + generate: | + data2 = pbh.create_data2() + + # store phrases etc + data2["params"]["vars"]["title"] = "Simple harmonic spring" + data2["params"]["vars"]["units1"] ="m/s" + data2["params"]["vars"]["units2"] ="N/m" + data2["params"]["vars"]["units3"] = "m" + + # define bounds of the variables + m = random.randint(315,335) + T = pbh.roundp(random.uniform(0.2,2.0), sigfigs=2) + E = pbh.roundp(random.uniform(4,7), sigfigs = 2) + + # store the variables in the dictionary "params" + data2["params"]["m"] = m + data2["params"]["T"] = T + data2["params"]["E"] = E + + # define correct answers + # m is divided by 1000 since it is given in grams + data2["correct_answers"]["part1_ans"] = pbh.roundp(math.sqrt(2*E/(m/1000)), sigfigs = 2) + data2["correct_answers"]["part2_ans"] = pbh.roundp((m/1000)*((2*math.pi/T)**2), sigfigs = 2) + data2["correct_answers"]["part3_ans"] = pbh.roundp(math.sqrt(2*E/((m/1000)*((2*math.pi/T)**2))), sigfigs = 2) + + # Update the data object with a new dict + data.update(data2) + prepare: | + pass + parse: | + pass + grade: "pass \n" +part1: + type: number-input + pl-customizations: + rtol: 0.05 + weight: 1 + allow-blank: true + label: $v= $ + suffix: m/s +part2: + type: number-input + pl-customizations: + rtol: 0.05 + weight: 1 + allow-blank: true + label: $k= $ + suffix: N/m +part3: + type: number-input + pl-customizations: + rtol: 0.05 + weight: 1 + allow-blank: true + label: $A=$ + suffix: m +--- +# {{ params.vars.title }} + +A {{params.m}} g object is attached to a spring and executes simple harmonic motion with a period of {{params.T}} s. +If the total energy of the system is {{params.E}} J, find: + +## Part 1 + +(a) the maximum speed of the object + +### Answer Section + +## Part 2 + +(b) the spring constant of the spring + +### Answer Section + +## Part 3 + +(c) the amplitude of the motion + +### Answer Section + +### pl-submission-panel + +No feedback is provided. + +### pl-answer-panel + +No feedback is provided. + +## Rubric + + + +## Solution + + + +## Comments + + +