diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e5855bdd9..8af55f303 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,8 @@ Changelog Development *********** +- Migrate explorer to streamlit + 0.79.0 (21.03.2024) ******************* diff --git a/README.rst b/README.rst index 7db75d313..c91f0f206 100644 --- a/README.rst +++ b/README.rst @@ -122,14 +122,12 @@ Features - Define general settings in Settings context - Command line interface - Web-API via FastAPI -- Rich UI features like wetterdienst explorer and `streamlit app`_ +- Rich UI features like `wetterdienst explorer `_ - Run SQL queries on the results - Export results to databases and other data sinks - Public Docker image - Interpolation and Summary of station values -.. _streamlit app: https://wetterdienst.streamlit.app - Setup ***** diff --git a/docs/img/wetterdienst_explorer.png b/docs/img/wetterdienst_explorer.png index d56315403..f1cd41071 100644 Binary files a/docs/img/wetterdienst_explorer.png and b/docs/img/wetterdienst_explorer.png differ diff --git a/docs/usage/explorer.rst b/docs/usage/explorer.rst index fc62f30bf..9a8de5399 100644 --- a/docs/usage/explorer.rst +++ b/docs/usage/explorer.rst @@ -9,13 +9,8 @@ Navigator for wetterdienst provided open data. Introduction ************ -Welcome to Wetterdienst Explorer, your friendly web-based GUI for the -Wetterdienst weather service library for Python. This web UI can easily be -self-hosted. - -The implementation is still in its infancy, so we are happy about further -contributions. - +Welcome to Wetterdienst Explorer, your friendly web-based GUI for the Wetterdienst library for Python. This web UI can +easily be self-hosted. A hosted version is available `here `_. Screenshot ********** @@ -31,10 +26,7 @@ Features Coverage ======== -Wetterdienst Explorer currently covers access to: - -- Weather observation data from all providers that are implemented. Historical, recent and near real time. - +Wetterdienst Explorer currently covers access to the entire Wetterdienst API. High resolution data may be slow to load. Usage ***** @@ -51,7 +43,7 @@ Install Wetterdienst and invoke the user interface:: wetterdienst explorer # Navigate to web UI - open http://localhost:7891 + open http://localhost:8501 Invoke using Docker @@ -59,25 +51,5 @@ Invoke using Docker Run the Wetterdienst user interface using Docker:: - docker run -it --rm --publish=7891:7891 ghcr.io/earthobservations/wetterdienst wetterdienst explorer --listen 0.0.0.0:7891 - - -Serve Wetterdienst Explorer at non-root URL -=========================================== - -If you are wrapping up Wetterdienst behind a reverse HTTP proxy, use the -``DASH_URL_BASE_PATHNAME`` environment variable to configure the HTTP base URL -the service is mounted on:: - - export DASH_URL_BASE_PATHNAME=/explorer/ - wetterdienst explorer --listen=localhost:8891 - -The gist of a corresponding Nginx configuration snippet is:: + docker run -it --rm --publish=7891:7891 ghcr.io/earthobservations/wetterdienst wetterdienst explorer --listen 0.0.0.0:8501 - server { - server_name wetterdienst.example.org; - location ~ ^/explorer { - proxy_set_header Host $host; - proxy_pass http://localhost:8891; - } - } diff --git a/docs/usage/index.rst b/docs/usage/index.rst index f959bed94..92f8eb5dd 100644 --- a/docs/usage/index.rst +++ b/docs/usage/index.rst @@ -10,5 +10,4 @@ Usage restapi explorer docker - streamlit settings diff --git a/docs/usage/streamlit.rst b/docs/usage/streamlit.rst deleted file mode 100644 index 7f7e573cc..000000000 --- a/docs/usage/streamlit.rst +++ /dev/null @@ -1,5 +0,0 @@ -Streamlit -######### - -We recently made a `Streamlit `_ app that allows you to interactively explore the data we provide -with the wetterdienst package. You can find it `here `_. \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 427867e20..ee65fbde5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -607,7 +607,7 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] name = "blinker" version = "1.7.0" description = "Fast, simple object-to-object and broadcast signaling" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "blinker-1.7.0-py3-none-any.whl", hash = "sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9"}, @@ -918,13 +918,13 @@ files = [ [[package]] name = "comm" -version = "0.2.1" +version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" files = [ - {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, - {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] @@ -998,63 +998,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.4.3" +version = "7.4.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6"}, - {file = "coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4"}, - {file = "coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524"}, - {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d"}, - {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb"}, - {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0"}, - {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc"}, - {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2"}, - {file = "coverage-7.4.3-cp310-cp310-win32.whl", hash = "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94"}, - {file = "coverage-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0"}, - {file = "coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47"}, - {file = "coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113"}, - {file = "coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe"}, - {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc"}, - {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3"}, - {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba"}, - {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079"}, - {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840"}, - {file = "coverage-7.4.3-cp311-cp311-win32.whl", hash = "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3"}, - {file = "coverage-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e"}, - {file = "coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10"}, - {file = "coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328"}, - {file = "coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30"}, - {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7"}, - {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e"}, - {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003"}, - {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d"}, - {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a"}, - {file = "coverage-7.4.3-cp312-cp312-win32.whl", hash = "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352"}, - {file = "coverage-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914"}, - {file = "coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454"}, - {file = "coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e"}, - {file = "coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2"}, - {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e"}, - {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6"}, - {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c"}, - {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0"}, - {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1"}, - {file = "coverage-7.4.3-cp38-cp38-win32.whl", hash = "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f"}, - {file = "coverage-7.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9"}, - {file = "coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f"}, - {file = "coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c"}, - {file = "coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e"}, - {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765"}, - {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee"}, - {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501"}, - {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f"}, - {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45"}, - {file = "coverage-7.4.3-cp39-cp39-win32.whl", hash = "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9"}, - {file = "coverage-7.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa"}, - {file = "coverage-7.4.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51"}, - {file = "coverage-7.4.3.tar.gz", hash = "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.dependencies] @@ -1083,60 +1083,6 @@ doc = ["crate-docs-theme (>=0.26.5)", "sphinx (>=3.5,<8)"] sqlalchemy = ["backports.zoneinfo (<1)", "geojson (>=2.5.0,<4)", "sqlalchemy (>=1.0,<2.1)"] test = ["certifi", "createcoverage (>=1,<2)", "dask", "flake8 (>=4,<8)", "pandas (<2.2)", "pytz", "stopit (>=1.1.2,<2)", "tox (>=3,<5)", "zc.customdoctests (>=1.0.1,<2)", "zope.testing (>=4,<6)", "zope.testrunner (>=5,<7)"] -[[package]] -name = "cryptography" -version = "42.0.5" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, -] - -[package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] -test-randomorder = ["pytest-randomly"] - [[package]] name = "cycler" version = "0.12.1" @@ -1152,147 +1098,22 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] -[[package]] -name = "dash" -version = "2.15.0" -description = "A Python framework for building reactive web-apps. Developed by Plotly." -optional = false -python-versions = ">=3.6" -files = [ - {file = "dash-2.15.0-py3-none-any.whl", hash = "sha256:df1882bbf613e4ca4372281c8facbeb68e97d76720336b051bf84c75d2de8588"}, - {file = "dash-2.15.0.tar.gz", hash = "sha256:d38891337fc855d5673f75e5346354daa063c4ff45a8a6a21f25e858fcae41c2"}, -] - -[package.dependencies] -beautifulsoup4 = {version = ">=4.8.2", optional = true, markers = "extra == \"testing\""} -dash-core-components = "2.0.0" -dash-html-components = "2.0.0" -dash-table = "5.0.0" -dash-testing-stub = {version = ">=0.0.2", optional = true, markers = "extra == \"testing\""} -Flask = ">=1.0.4,<3.1" -importlib-metadata = {version = "*", markers = "python_version >= \"3.7\""} -lxml = {version = ">=4.6.2", optional = true, markers = "extra == \"testing\""} -multiprocess = {version = ">=0.70.12", optional = true, markers = "extra == \"testing\""} -nest-asyncio = "*" -percy = {version = ">=2.0.2", optional = true, markers = "extra == \"testing\""} -plotly = ">=5.0.0" -psutil = {version = ">=5.8.0", optional = true, markers = "extra == \"testing\""} -pytest = {version = ">=6.0.2", optional = true, markers = "extra == \"testing\""} -requests = [ - {version = "*"}, - {version = ">=2.21.0", extras = ["security"], optional = true, markers = "extra == \"testing\""}, -] -retrying = "*" -selenium = {version = ">=3.141.0,<=4.2.0", optional = true, markers = "extra == \"testing\""} -setuptools = "*" -typing-extensions = ">=4.1.1" -waitress = {version = ">=1.4.4", optional = true, markers = "extra == \"testing\""} -Werkzeug = "<3.1" - -[package.extras] -celery = ["celery[redis] (>=5.1.2)", "importlib-metadata (<5)", "redis (>=3.5.3)"] -ci = ["black (==21.6b0)", "black (==22.3.0)", "dash-dangerously-set-inner-html", "dash-flow-example (==0.0.5)", "flake8 (==3.9.2)", "flaky (==3.7.0)", "flask-talisman (==1.0.0)", "isort (==4.3.21)", "jupyterlab (<4.0.0)", "mimesis (<=11.1.0)", "mock (==4.0.3)", "numpy (<=1.25.2)", "openpyxl", "orjson (==3.5.4)", "orjson (==3.6.7)", "pandas (==1.1.5)", "pandas (>=1.4.0)", "preconditions", "pyarrow", "pyarrow (<3)", "pylint (==2.13.5)", "pytest-mock", "pytest-rerunfailures", "pytest-sugar (==0.9.6)", "xlrd (<2)", "xlrd (>=2.0.1)"] -compress = ["flask-compress"] -dev = ["PyYAML (>=5.4.1)", "coloredlogs (>=15.0.1)", "fire (>=0.4.0)"] -diskcache = ["diskcache (>=5.2.1)", "multiprocess (>=0.70.12)", "psutil (>=5.8.0)"] -testing = ["beautifulsoup4 (>=4.8.2)", "cryptography (<3.4)", "dash-testing-stub (>=0.0.2)", "lxml (>=4.6.2)", "multiprocess (>=0.70.12)", "percy (>=2.0.2)", "psutil (>=5.8.0)", "pytest (>=6.0.2)", "requests[security] (>=2.21.0)", "selenium (>=3.141.0,<=4.2.0)", "waitress (>=1.4.4)"] - -[[package]] -name = "dash-bootstrap-components" -version = "1.5.0" -description = "Bootstrap themed components for use in Plotly Dash" -optional = true -python-versions = ">=3.7, <4" -files = [ - {file = "dash-bootstrap-components-1.5.0.tar.gz", hash = "sha256:083158c07434b9965e2d6c3e8ca72dbbe47dab23e676258cef9bf0ad47d2e250"}, - {file = "dash_bootstrap_components-1.5.0-py3-none-any.whl", hash = "sha256:b487fec1a85e3d6a8564fe04c0a9cd9e846f75ea9e563456ed3879592889c591"}, -] - -[package.dependencies] -dash = ">=2.0.0" - -[package.extras] -pandas = ["numpy", "pandas"] - -[[package]] -name = "dash-core-components" -version = "2.0.0" -description = "Core component suite for Dash" -optional = false -python-versions = "*" -files = [ - {file = "dash_core_components-2.0.0-py3-none-any.whl", hash = "sha256:52b8e8cce13b18d0802ee3acbc5e888cb1248a04968f962d63d070400af2e346"}, - {file = "dash_core_components-2.0.0.tar.gz", hash = "sha256:c6733874af975e552f95a1398a16c2ee7df14ce43fa60bb3718a3c6e0b63ffee"}, -] - -[[package]] -name = "dash-html-components" -version = "2.0.0" -description = "Vanilla HTML components for Dash" -optional = false -python-versions = "*" -files = [ - {file = "dash_html_components-2.0.0-py3-none-any.whl", hash = "sha256:b42cc903713c9706af03b3f2548bda4be7307a7cf89b7d6eae3da872717d1b63"}, - {file = "dash_html_components-2.0.0.tar.gz", hash = "sha256:8703a601080f02619a6390998e0b3da4a5daabe97a1fd7a9cebc09d015f26e50"}, -] - -[[package]] -name = "dash-leaflet" -version = "1.0.15" -description = "Dash Leaflet is a light wrapper around React-Leaflet. The syntax is similar to other Dash components, with naming conventions following the React-Leaflet API." -optional = true -python-versions = "*" -files = [ - {file = "dash_leaflet-1.0.15-py3-none-any.whl", hash = "sha256:d7d06228a868bcf11120e1f7cb95db64c29c412b743686a9a8e1b30ac54a794e"}, - {file = "dash_leaflet-1.0.15.tar.gz", hash = "sha256:79a3e19b0be9a5cf23873a0cd73153de224cbd756ddb30e2ffcee9ba23875e40"}, -] - -[package.dependencies] -dash = ">=2.13.0" - -[package.extras] -all = ["dash-extensions (>=1.0.3)", "dash-svg", "geobuf (==1.1.1)", "protobuf (==3.20.0)"] -geobuf = ["geobuf (==1.1.1)", "protobuf (==3.20.0)"] -svg = ["dash-svg"] - -[[package]] -name = "dash-table" -version = "5.0.0" -description = "Dash table" -optional = false -python-versions = "*" -files = [ - {file = "dash_table-5.0.0-py3-none-any.whl", hash = "sha256:19036fa352bb1c11baf38068ec62d172f0515f73ca3276c79dee49b95ddc16c9"}, - {file = "dash_table-5.0.0.tar.gz", hash = "sha256:18624d693d4c8ef2ddec99a6f167593437a7ea0bf153aa20f318c170c5bc7308"}, -] - -[[package]] -name = "dash-testing-stub" -version = "0.0.2" -description = "Package installed with dash[testing] for optional loading of pytest dash plugin." -optional = false -python-versions = "*" -files = [ - {file = "dash-testing-stub-0.0.2.tar.gz", hash = "sha256:0a98f7da9fe41dd3a37d781bc1d5672319448fdf98e47fd867aff2123171a357"}, - {file = "dash_testing_stub-0.0.2-py3-none-any.whl", hash = "sha256:a44d530a77e1ede9c6528be4b5951f34c6109b419a09f2691422375ffa7d09de"}, -] - [[package]] name = "dask" -version = "2024.2.1" +version = "2024.3.1" description = "Parallel PyData with Task Scheduling" optional = true python-versions = ">=3.9" files = [ - {file = "dask-2024.2.1-py3-none-any.whl", hash = "sha256:a13fcdeead3bab3576495023f83097adcffe2f03c371c241b5a1f0b232b35b38"}, - {file = "dask-2024.2.1.tar.gz", hash = "sha256:9504a1e9f5d8e5403fae931f9f1660d41f510f48895ccefce856ec6a4c2198d8"}, + {file = "dask-2024.3.1-py3-none-any.whl", hash = "sha256:1ac260b8716b1a9fc144c0d7f958336812cfc3ef542a3742c9ae02387189b32b"}, + {file = "dask-2024.3.1.tar.gz", hash = "sha256:78bee2ffd735514e572adaa669fc2a437ec256aecb6bec036a1f5b8dd36b2e60"}, ] [package.dependencies] click = ">=8.1" cloudpickle = ">=1.5.0" fsspec = ">=2021.09.0" -importlib-metadata = ">=4.13.0" +importlib-metadata = {version = ">=4.13.0", markers = "python_version < \"3.12\""} packaging = ">=20.0" partd = ">=1.2.0" pyyaml = ">=5.3.1" @@ -1301,9 +1122,9 @@ toolz = ">=0.10.0" [package.extras] array = ["numpy (>=1.21)"] complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=7.0)", "pyarrow-hotfix"] -dataframe = ["dask[array]", "pandas (>=1.3)"] +dataframe = ["dask-expr (>=1.0,<1.1)", "dask[array]", "pandas (>=1.3)"] diagnostics = ["bokeh (>=2.4.2)", "jinja2 (>=2.10.3)"] -distributed = ["distributed (==2024.2.1)"] +distributed = ["distributed (==2024.3.1)"] test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] [[package]] @@ -1407,21 +1228,6 @@ docs = ["Sphinx (>=3)", "sphinx-rtd-theme (>=0.2)"] numpy = ["numpy (>=1.13.0)", "numpy (>=1.15.0)", "numpy (>=1.18.0)", "numpy (>=1.20.0)"] tests = ["check-manifest (>=0.42)", "mock (>=1.3.0)", "pytest (==5.4.3)", "pytest (>=6)", "pytest-cov (>=2.10.1)", "pytest-isort (>=1.2.0)", "pytest-pycodestyle (>=2)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2)", "pytest-pydocstyle (>=2.2.0)", "sphinx (>=3)", "tox (>=3.7.0)"] -[[package]] -name = "dill" -version = "0.3.8" -description = "serialize all of Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, -] - -[package.extras] -graph = ["objgraph (>=1.7.2)"] -profile = ["gprof2dot (>=2022.7.29)"] - [[package]] name = "dirty-equals" version = "0.7.1.post0" @@ -1481,58 +1287,58 @@ files = [ [[package]] name = "duckdb" -version = "0.10.0" +version = "0.10.1" description = "DuckDB in-process database" optional = true python-versions = ">=3.7.0" files = [ - {file = "duckdb-0.10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bd0ffb3fddef0f72a150e4d76e10942a84a1a0447d10907df1621b90d6668060"}, - {file = "duckdb-0.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f3d709d5c7c1a12b5e10d0b05fa916c670cd2b50178e3696faa0cc16048a1745"}, - {file = "duckdb-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9114aa22ec5d591a20ce5184be90f49d8e5b5348ceaab21e102c54560d07a5f8"}, - {file = "duckdb-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a37877efadf39caf7cadde0f430fedf762751b9c54750c821e2f1316705a21"}, - {file = "duckdb-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87cbc9e1d9c3fc9f14307bea757f99f15f46843c0ab13a6061354410824ed41f"}, - {file = "duckdb-0.10.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f0bfec79fed387201550517d325dff4fad2705020bc139d936cab08b9e845662"}, - {file = "duckdb-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c5622134d2d9796b15e09de810e450859d4beb46d9b861357ec9ae40a61b775c"}, - {file = "duckdb-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:089ee8e831ccaef1b73fc89c43b661567175eed0115454880bafed5e35cda702"}, - {file = "duckdb-0.10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a05af63747f1d7021995f0811c333dee7316cec3b06c0d3e4741b9bdb678dd21"}, - {file = "duckdb-0.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:072d6eba5d8a59e0069a8b5b4252fed8a21f9fe3f85a9129d186a39b3d0aea03"}, - {file = "duckdb-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a77b85668f59b919042832e4659538337f1c7f197123076c5311f1c9cf077df7"}, - {file = "duckdb-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96a666f1d2da65d03199a977aec246920920a5ea1da76b70ae02bd4fb1ffc48c"}, - {file = "duckdb-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ec76a4262b783628d26612d184834852d9c92fb203e91af789100c17e3d7173"}, - {file = "duckdb-0.10.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:009dd9d2cdbd3b061a9efbdfc79f2d1a8377bcf49f1e5f430138621f8c083a6c"}, - {file = "duckdb-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:878f06766088090dad4a2e5ee0081555242b2e8dcb29415ecc97e388cf0cf8d8"}, - {file = "duckdb-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:713ff0a1fb63a6d60f454acf67f31656549fb5d63f21ac68314e4f522daa1a89"}, - {file = "duckdb-0.10.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9c0ee450dfedfb52dd4957244e31820feef17228da31af6d052979450a80fd19"}, - {file = "duckdb-0.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ff79b2ea9994398b545c0d10601cd73565fbd09f8951b3d8003c7c5c0cebc7cb"}, - {file = "duckdb-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6bdf1aa71b924ef651062e6b8ff9981ad85bec89598294af8a072062c5717340"}, - {file = "duckdb-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0265bbc8216be3ced7b377ba8847128a3fc0ef99798a3c4557c1b88e3a01c23"}, - {file = "duckdb-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d418a315a07707a693bd985274c0f8c4dd77015d9ef5d8d3da4cc1942fd82e0"}, - {file = "duckdb-0.10.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2828475a292e68c71855190b818aded6bce7328f79e38c04a0c75f8f1c0ceef0"}, - {file = "duckdb-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c3aaeaae2eba97035c65f31ffdb18202c951337bf2b3d53d77ce1da8ae2ecf51"}, - {file = "duckdb-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:c51790aaaea97d8e4a58a114c371ed8d2c4e1ca7cbf29e3bdab6d8ccfc5afc1e"}, - {file = "duckdb-0.10.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8af1ae7cc77a12206b6c47ade191882cc8f49f750bb3e72bb86ac1d4fa89926a"}, - {file = "duckdb-0.10.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa4f7e8e8dc0e376aeb280b83f2584d0e25ec38985c27d19f3107b2edc4f4a97"}, - {file = "duckdb-0.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28ae942a79fad913defa912b56483cd7827a4e7721f4ce4bc9025b746ecb3c89"}, - {file = "duckdb-0.10.0-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01b57802898091455ca2a32c1335aac1e398da77c99e8a96a1e5de09f6a0add9"}, - {file = "duckdb-0.10.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:52e1ad4a55fa153d320c367046b9500578192e01c6d04308ba8b540441736f2c"}, - {file = "duckdb-0.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:904c47d04095af745e989c853f0bfc0776913dfc40dfbd2da7afdbbb5f67fed0"}, - {file = "duckdb-0.10.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:184ae7ea5874f3b8fa51ab0f1519bdd088a0b78c32080ee272b1d137e2c8fd9c"}, - {file = "duckdb-0.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd33982ecc9bac727a032d6cedced9f19033cbad56647147408891eb51a6cb37"}, - {file = "duckdb-0.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f59bf0949899105dd5f8864cb48139bfb78454a8c017b8258ba2b5e90acf7afc"}, - {file = "duckdb-0.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:395f3b18948001e35dceb48a4423d574e38656606d033eef375408b539e7b076"}, - {file = "duckdb-0.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b8eb2b803be7ee1df70435c33b03a4598cdaf676cd67ad782b288dcff65d781"}, - {file = "duckdb-0.10.0-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:31b2ddd331801064326c8e3587a4db8a31d02aef11332c168f45b3bd92effb41"}, - {file = "duckdb-0.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c8b89e76a041424b8c2026c5dc1f74b53fbbc6c6f650d563259885ab2e7d093d"}, - {file = "duckdb-0.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:79084a82f16c0a54f6bfb7ded5600400c2daa90eb0d83337d81a56924eaee5d4"}, - {file = "duckdb-0.10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:79799b3a270dcd9070f677ba510f1e66b112df3068425691bac97c5e278929c7"}, - {file = "duckdb-0.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8fc394bfe3434920cdbcfbdd0ac3ba40902faa1dbda088db0ba44003a45318a"}, - {file = "duckdb-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c116605551b4abf5786243a59bcef02bd69cc51837d0c57cafaa68cdc428aa0c"}, - {file = "duckdb-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3191170c3b0a43b0c12644800326f5afdea00d5a4621d59dbbd0c1059139e140"}, - {file = "duckdb-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fee69a50eb93c72dc77e7ab1fabe0c38d21a52c5da44a86aa217081e38f9f1bd"}, - {file = "duckdb-0.10.0-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5f449e87dacb16b0d145dbe65fa6fdb5a55b2b6911a46d74876e445dd395bac"}, - {file = "duckdb-0.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4487d0df221b17ea4177ad08131bc606b35f25cfadf890987833055b9d10cdf6"}, - {file = "duckdb-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:c099ae2ff8fe939fda62da81704f91e2f92ac45e48dc0e37c679c9d243d01e65"}, - {file = "duckdb-0.10.0.tar.gz", hash = "sha256:c02bcc128002aa79e3c9d89b9de25e062d1096a8793bc0d7932317b7977f6845"}, + {file = "duckdb-0.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0ac172788e3d8e410e009e3699016a4d7f17b4c7cde20f98856fca1fea79d247"}, + {file = "duckdb-0.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f754c20d3b963574da58b0d22029681b79c63f2e32060f10b687f41b7bba54d7"}, + {file = "duckdb-0.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c68b1ef88b8cce185381ec69f437d20059c30623375bab41ac07a1104acdb57"}, + {file = "duckdb-0.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f566f615278844ea240c9a3497c0ef201331628f78e0f9f4d64f72f82210e750"}, + {file = "duckdb-0.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67d2996c3372a0f7d8f41f1c49e00ecdb26f83cdd9132b76730224ad68b1f1e3"}, + {file = "duckdb-0.10.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c3b3a18a58eebabb426beafc2f7da01d59805d660fc909e5e143b6db04d881a"}, + {file = "duckdb-0.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:343795d13ec3d8cd06c250225a05fd3c348c3ed49cccdde01addd46cb50f3559"}, + {file = "duckdb-0.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:33f99c2e9e4060464673912312b4ec91060d66638756592c9484c62824ff4e85"}, + {file = "duckdb-0.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdbe4173729043b2fd949be83135b035820bb2faf64648500563b16f3f6f02ee"}, + {file = "duckdb-0.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f90738310a76bd1618acbc7345175582d36b6907cb0ed07841a3d800dea189d6"}, + {file = "duckdb-0.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d14d00560832592cbac2817847b649bd1d573f125d064518afb6eec5b02e15a"}, + {file = "duckdb-0.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11c0bf253c96079c6139e8a0880300d80f4dc9f21a8c5c239d2ebc060b227d46"}, + {file = "duckdb-0.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcc60833bb1a1fb2c33b052cf793fef48f681c565d982acff6ac7a86369794da"}, + {file = "duckdb-0.10.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88cdc0c2501dd7a65b1df2a76d7624b93d9b6d27febd2ee80b7e5643a0b40bcb"}, + {file = "duckdb-0.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:698a8d1d48b150d344d8aa6dbc30a22ea30fb14ff2b15c90004fc9fcb0b3a3e9"}, + {file = "duckdb-0.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:b450aa2b3e0eb1fc0f7ad276bd1e4a5a03b1a4def6c45366af17557de2cafbdf"}, + {file = "duckdb-0.10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:40dd55ea9c31abc69e5a8299f16c877e0b1950fd9a311c117efb4dd3c0dc8458"}, + {file = "duckdb-0.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7c1b3538bb9c2b49f48b26f092444525b22186efa4e77ba070603ed4a348a66"}, + {file = "duckdb-0.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bce024b69bae426b0739c470803f7b44261bdc0c0700ea7c41dff5f2d70ca4f3"}, + {file = "duckdb-0.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52af2a078340b2e1b57958477ebc1be07786d3ad5796777e87d4f453e0477b4c"}, + {file = "duckdb-0.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c52b08c773e52484542300339ebf295e3c9b12d5d7d49b2567e252c16205a7"}, + {file = "duckdb-0.10.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:097aa9b6d5c9f5d3ed8c35b16020a67731d04befc35f6b89ccb5db9d5f1489c4"}, + {file = "duckdb-0.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b5a14a80ad09d65c270d16761b04ea6b074811cdfde6b5e4db1a8b0184125d1b"}, + {file = "duckdb-0.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fb98dbbdbf8048b07223dc6e7401333bb4e83681dde4cded2d239051ea102b5"}, + {file = "duckdb-0.10.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28857b0d595c229827cc3631ae9b74ff52d11614435aa715e09d8629d2e1b609"}, + {file = "duckdb-0.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d85645136fc25026978b5db81869e8a120cfb60e1645a29a0f6dd155be9e59e"}, + {file = "duckdb-0.10.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e2e10582db74b99051e718279c1be204c98a63a5b6aa4e09226b7249e414146"}, + {file = "duckdb-0.10.1-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6a88358d86a8ce689fdd4136514aebedf958e910361156a0bb0e53dc3c55f7d"}, + {file = "duckdb-0.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b025afa30fcdcede094386e7c519e6964d26de5ad95f4e04a2a0a713676d4465"}, + {file = "duckdb-0.10.1-cp37-cp37m-win_amd64.whl", hash = "sha256:910be5005de7427c5231a7200027e0adb951e048c612b895340effcd3e660d5a"}, + {file = "duckdb-0.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:13d81752763f14203a53981f32bd09731900eb6fda4048fbc532eae5e7bf30e5"}, + {file = "duckdb-0.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:21858225b8a5c5dead128f62e4e88facdcbfdce098e18cbcd86a6cd8f48fb2b3"}, + {file = "duckdb-0.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8bf46d55685906729998eca70ee751934e0425d86863148e658277526c54282e"}, + {file = "duckdb-0.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f786b4402b9c31461ea0520d919e2166df4f9e6e21fd3c7bb0035fa985b5dfe"}, + {file = "duckdb-0.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32e52c6e939a4bada220803e6bde6fc0ce870da5662a33cabdd3be14824183a6"}, + {file = "duckdb-0.10.1-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c563b565ea68cfebe9c4078646503b3d38930218f9c3c278277d58952873771"}, + {file = "duckdb-0.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:af8382280f24273a535e08b80e9383ad739c66e22855ce68716dfbaeaf8910b9"}, + {file = "duckdb-0.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:2e6e01e2499e07873b09316bf4d6808f712c57034fa24c255565c4f92386e8e3"}, + {file = "duckdb-0.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7791a0aa2cea972a612d31d4a289c81c5d00181328ed4f7642907f68f8b1fb9f"}, + {file = "duckdb-0.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1ace20383fb0ba06229e060a6bb0bcfd48a4582a02e43f05991720504508eb59"}, + {file = "duckdb-0.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5aad3e085c33253c689205b5ea3c5d9d54117c1249276c90d495cb85d9adce76"}, + {file = "duckdb-0.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa08173f68e678793dfe6aab6490ac753204ca7935beb8dbde778dbe593552d8"}, + {file = "duckdb-0.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:525efad4e6caff80d0f6a51d466470839146e3880da36d4544fee7ff842e7e20"}, + {file = "duckdb-0.10.1-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48d84577216010ee407913bad9dc47af4cbc65e479c91e130f7bd909a32caefe"}, + {file = "duckdb-0.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6e65f00294c3b8576ae651e91e732ea1cefc4aada89c307fb02f49231fd11e1f"}, + {file = "duckdb-0.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:30aa9dbbfc1f9607249fc148af9e6d6fd253fdc2f4c9924d4957d6a535558b4f"}, + {file = "duckdb-0.10.1.tar.gz", hash = "sha256:0d5b6daa9bb54a635e371798994caa08f26d2f145ebcbc989e16b0a0104e84fb"}, ] [[package]] @@ -1682,78 +1488,55 @@ files = [ {file = "findlibs-0.0.5.tar.gz", hash = "sha256:7a801571e999d0ee83f9b92cbb598c21f861ee26ca9dba74cea8958ba4335e7e"}, ] -[[package]] -name = "flask" -version = "3.0.2" -description = "A simple framework for building complex web applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "flask-3.0.2-py3-none-any.whl", hash = "sha256:3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e"}, - {file = "flask-3.0.2.tar.gz", hash = "sha256:822c03f4b799204250a7ee84b1eddc40665395333973dfb9deebfe425fefcb7d"}, -] - -[package.dependencies] -blinker = ">=1.6.2" -click = ">=8.1.3" -importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} -itsdangerous = ">=2.1.2" -Jinja2 = ">=3.1.2" -Werkzeug = ">=3.0.0" - -[package.extras] -async = ["asgiref (>=3.2)"] -dotenv = ["python-dotenv"] - [[package]] name = "fonttools" -version = "4.49.0" +version = "4.50.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d970ecca0aac90d399e458f0b7a8a597e08f95de021f17785fb68e2dc0b99717"}, - {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac9a745b7609f489faa65e1dc842168c18530874a5f5b742ac3dd79e26bca8bc"}, - {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba0e00620ca28d4ca11fc700806fd69144b463aa3275e1b36e56c7c09915559"}, - {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdee3ab220283057e7840d5fb768ad4c2ebe65bdba6f75d5d7bf47f4e0ed7d29"}, - {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ce7033cb61f2bb65d8849658d3786188afd80f53dad8366a7232654804529532"}, - {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:07bc5ea02bb7bc3aa40a1eb0481ce20e8d9b9642a9536cde0218290dd6085828"}, - {file = "fonttools-4.49.0-cp310-cp310-win32.whl", hash = "sha256:86eef6aab7fd7c6c8545f3ebd00fd1d6729ca1f63b0cb4d621bccb7d1d1c852b"}, - {file = "fonttools-4.49.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fac1b7eebfce75ea663e860e7c5b4a8831b858c17acd68263bc156125201abf"}, - {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e"}, - {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83a0d9336de2cba86d886507dd6e0153df333ac787377325a39a2797ec529814"}, - {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36c8865bdb5cfeec88f5028e7e592370a0657b676c6f1d84a2108e0564f90e22"}, - {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942"}, - {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8fb022d799b96df3eaa27263e9eea306bd3d437cc9aa981820850281a02b6c9a"}, - {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33c584c0ef7dc54f5dd4f84082eabd8d09d1871a3d8ca2986b0c0c98165f8e86"}, - {file = "fonttools-4.49.0-cp311-cp311-win32.whl", hash = "sha256:cbe61b158deb09cffdd8540dc4a948d6e8f4d5b4f3bf5cd7db09bd6a61fee64e"}, - {file = "fonttools-4.49.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6"}, - {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d647a0e697e5daa98c87993726da8281c7233d9d4ffe410812a4896c7c57c075"}, - {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f3bbe672df03563d1f3a691ae531f2e31f84061724c319652039e5a70927167e"}, - {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bebd91041dda0d511b0d303180ed36e31f4f54b106b1259b69fade68413aa7ff"}, - {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4145f91531fd43c50f9eb893faa08399816bb0b13c425667c48475c9f3a2b9b5"}, - {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea329dafb9670ffbdf4dbc3b0e5c264104abcd8441d56de77f06967f032943cb"}, - {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c076a9e548521ecc13d944b1d261ff3d7825048c338722a4bd126d22316087b7"}, - {file = "fonttools-4.49.0-cp312-cp312-win32.whl", hash = "sha256:b607ea1e96768d13be26d2b400d10d3ebd1456343eb5eaddd2f47d1c4bd00880"}, - {file = "fonttools-4.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:a974c49a981e187381b9cc2c07c6b902d0079b88ff01aed34695ec5360767034"}, - {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b85ec0bdd7bdaa5c1946398cbb541e90a6dfc51df76dfa88e0aaa41b335940cb"}, - {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af20acbe198a8a790618ee42db192eb128afcdcc4e96d99993aca0b60d1faeb4"}, - {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d418b1fee41a1d14931f7ab4b92dc0bc323b490e41d7a333eec82c9f1780c75"}, - {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44a52b8e6244b6548851b03b2b377a9702b88ddc21dcaf56a15a0393d425cb9"}, - {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7c7125068e04a70739dad11857a4d47626f2b0bd54de39e8622e89701836eabd"}, - {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29e89d0e1a7f18bc30f197cfadcbef5a13d99806447c7e245f5667579a808036"}, - {file = "fonttools-4.49.0-cp38-cp38-win32.whl", hash = "sha256:9d95fa0d22bf4f12d2fb7b07a46070cdfc19ef5a7b1c98bc172bfab5bf0d6844"}, - {file = "fonttools-4.49.0-cp38-cp38-win_amd64.whl", hash = "sha256:768947008b4dc552d02772e5ebd49e71430a466e2373008ce905f953afea755a"}, - {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:08877e355d3dde1c11973bb58d4acad1981e6d1140711230a4bfb40b2b937ccc"}, - {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fdb54b076f25d6b0f0298dc706acee5052de20c83530fa165b60d1f2e9cbe3cb"}, - {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0af65c720520710cc01c293f9c70bd69684365c6015cc3671db2b7d807fe51f2"}, - {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f255ce8ed7556658f6d23f6afd22a6d9bbc3edb9b96c96682124dc487e1bf42"}, - {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d00af0884c0e65f60dfaf9340e26658836b935052fdd0439952ae42e44fdd2be"}, - {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:263832fae27481d48dfafcc43174644b6706639661e242902ceb30553557e16c"}, - {file = "fonttools-4.49.0-cp39-cp39-win32.whl", hash = "sha256:0404faea044577a01bb82d47a8fa4bc7a54067fa7e324785dd65d200d6dd1133"}, - {file = "fonttools-4.49.0-cp39-cp39-win_amd64.whl", hash = "sha256:b050d362df50fc6e38ae3954d8c29bf2da52be384649ee8245fdb5186b620836"}, - {file = "fonttools-4.49.0-py3-none-any.whl", hash = "sha256:af281525e5dd7fa0b39fb1667b8d5ca0e2a9079967e14c4bfe90fd1cd13e0f18"}, - {file = "fonttools-4.49.0.tar.gz", hash = "sha256:ebf46e7f01b7af7861310417d7c49591a85d99146fc23a5ba82fdb28af156321"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effd303fb422f8ce06543a36ca69148471144c534cc25f30e5be752bc4f46736"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7913992ab836f621d06aabac118fc258b9947a775a607e1a737eb3a91c360335"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0a1c5bd2f63da4043b63888534b52c5a1fd7ae187c8ffc64cbb7ae475b9dab"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40fc98540fa5360e7ecf2c56ddf3c6e7dd04929543618fd7b5cc76e66390562"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fff65fbb7afe137bac3113827855e0204482727bddd00a806034ab0d3951d0d"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1aeae3dd2ee719074a9372c89ad94f7c581903306d76befdaca2a559f802472"}, + {file = "fonttools-4.50.0-cp310-cp310-win32.whl", hash = "sha256:e9623afa319405da33b43c85cceb0585a6f5d3a1d7c604daf4f7e1dd55c03d1f"}, + {file = "fonttools-4.50.0-cp310-cp310-win_amd64.whl", hash = "sha256:778c5f43e7e654ef7fe0605e80894930bc3a7772e2f496238e57218610140f54"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3dfb102e7f63b78c832e4539969167ffcc0375b013080e6472350965a5fe8048"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e58fe34cb379ba3d01d5d319d67dd3ce7ca9a47ad044ea2b22635cd2d1247fc"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c673ab40d15a442a4e6eb09bf007c1dda47c84ac1e2eecbdf359adacb799c24"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b3ac35cdcd1a4c90c23a5200212c1bb74fa05833cc7c14291d7043a52ca2aaa"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8844e7a2c5f7ecf977e82eb6b3014f025c8b454e046d941ece05b768be5847ae"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f849bd3c5c2249b49c98eca5aaebb920d2bfd92b3c69e84ca9bddf133e9f83f0"}, + {file = "fonttools-4.50.0-cp311-cp311-win32.whl", hash = "sha256:39293ff231b36b035575e81c14626dfc14407a20de5262f9596c2cbb199c3625"}, + {file = "fonttools-4.50.0-cp311-cp311-win_amd64.whl", hash = "sha256:c33d5023523b44d3481624f840c8646656a1def7630ca562f222eb3ead16c438"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b4a886a6dbe60100ba1cd24de962f8cd18139bd32808da80de1fa9f9f27bf1dc"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b2ca1837bfbe5eafa11313dbc7edada79052709a1fffa10cea691210af4aa1fa"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0493dd97ac8977e48ffc1476b932b37c847cbb87fd68673dee5182004906828"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77844e2f1b0889120b6c222fc49b2b75c3d88b930615e98893b899b9352a27ea"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3566bfb8c55ed9100afe1ba6f0f12265cd63a1387b9661eb6031a1578a28bad1"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:35e10ddbc129cf61775d58a14f2d44121178d89874d32cae1eac722e687d9019"}, + {file = "fonttools-4.50.0-cp312-cp312-win32.whl", hash = "sha256:cc8140baf9fa8f9b903f2b393a6c413a220fa990264b215bf48484f3d0bf8710"}, + {file = "fonttools-4.50.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ccc85fd96373ab73c59833b824d7a73846670a0cb1f3afbaee2b2c426a8f931"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e270a406219af37581d96c810172001ec536e29e5593aa40d4c01cca3e145aa6"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac2463de667233372e9e1c7e9de3d914b708437ef52a3199fdbf5a60184f190c"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47abd6669195abe87c22750dbcd366dc3a0648f1b7c93c2baa97429c4dc1506e"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:074841375e2e3d559aecc86e1224caf78e8b8417bb391e7d2506412538f21adc"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0743fd2191ad7ab43d78cd747215b12033ddee24fa1e088605a3efe80d6984de"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3d7080cce7be5ed65bee3496f09f79a82865a514863197ff4d4d177389e981b0"}, + {file = "fonttools-4.50.0-cp38-cp38-win32.whl", hash = "sha256:a467ba4e2eadc1d5cc1a11d355abb945f680473fbe30d15617e104c81f483045"}, + {file = "fonttools-4.50.0-cp38-cp38-win_amd64.whl", hash = "sha256:f77e048f805e00870659d6318fd89ef28ca4ee16a22b4c5e1905b735495fc422"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b6245eafd553c4e9a0708e93be51392bd2288c773523892fbd616d33fd2fda59"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a4062cc7e8de26f1603323ef3ae2171c9d29c8a9f5e067d555a2813cd5c7a7e0"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34692850dfd64ba06af61e5791a441f664cb7d21e7b544e8f385718430e8f8e4"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678dd95f26a67e02c50dcb5bf250f95231d455642afbc65a3b0bcdacd4e4dd38"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f2ce7b0b295fe64ac0a85aef46a0f2614995774bd7bc643b85679c0283287f9"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d346f4dc2221bfb7ab652d1e37d327578434ce559baf7113b0f55768437fe6a0"}, + {file = "fonttools-4.50.0-cp39-cp39-win32.whl", hash = "sha256:a51eeaf52ba3afd70bf489be20e52fdfafe6c03d652b02477c6ce23c995222f4"}, + {file = "fonttools-4.50.0-cp39-cp39-win_amd64.whl", hash = "sha256:8639be40d583e5d9da67795aa3eeeda0488fb577a1d42ae11a5036f18fb16d93"}, + {file = "fonttools-4.50.0-py3-none-any.whl", hash = "sha256:48fa36da06247aa8282766cfd63efff1bb24e55f020f29a335939ed3844d20d3"}, + {file = "fonttools-4.50.0.tar.gz", hash = "sha256:fa5cf61058c7dbb104c2ac4e782bf1b2016a8cf2f69de6e4dd6a865d2c969bb5"}, ] [package.extras] @@ -1944,17 +1727,6 @@ files = [ {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, ] -[[package]] -name = "geojson" -version = "3.1.0" -description = "Python bindings and utilities for GeoJSON" -optional = true -python-versions = ">=3.7" -files = [ - {file = "geojson-3.1.0-py3-none-any.whl", hash = "sha256:68a9771827237adb8c0c71f8527509c8f5bef61733aa434cefc9c9d4f0ebe8f3"}, - {file = "geojson-3.1.0.tar.gz", hash = "sha256:58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac"}, -] - [[package]] name = "gitdb" version = "4.0.11" @@ -2211,13 +1983,13 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.1.3" +version = "6.4.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.1.3-py3-none-any.whl", hash = "sha256:4c0269e3580fe2634d364b39b38b961540a7738c02cb984e98add8b4221d793d"}, - {file = "importlib_resources-6.1.3.tar.gz", hash = "sha256:56fb4525197b78544a3354ea27793952ab93f935bb4bf746b846bb1015020f2b"}, + {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, + {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, ] [package.dependencies] @@ -2225,7 +1997,7 @@ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.collections", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "influxdb" @@ -2412,17 +2184,6 @@ files = [ [package.dependencies] arrow = ">=0.15.0" -[[package]] -name = "itsdangerous" -version = "2.1.2" -description = "Safely pass data to untrusted environments and back." -optional = false -python-versions = ">=3.7" -files = [ - {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, - {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, -] - [[package]] name = "jedi" version = "0.19.1" @@ -2472,18 +2233,15 @@ files = [ [[package]] name = "json5" -version = "0.9.22" +version = "0.9.24" description = "A Python implementation of the JSON5 data format." optional = false python-versions = ">=3.8" files = [ - {file = "json5-0.9.22-py3-none-any.whl", hash = "sha256:6621007c70897652f8b5d03885f732771c48d1925591ad989aa80c7e0e5ad32f"}, - {file = "json5-0.9.22.tar.gz", hash = "sha256:b729bde7650b2196a35903a597d2b704b8fdf8648bfb67368cfb79f1174a17bd"}, + {file = "json5-0.9.24-py3-none-any.whl", hash = "sha256:4ca101fd5c7cb47960c055ef8f4d0e31e15a7c6c48c3b6f1473fc83b6c462a13"}, + {file = "json5-0.9.24.tar.gz", hash = "sha256:0c638399421da959a20952782800e5c1a78c14e08e1dc9738fa10d8ec14d58c8"}, ] -[package.extras] -dev = ["hypothesis"] - [[package]] name = "jsonpointer" version = "2.4" @@ -2492,7 +2250,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] @@ -2560,13 +2317,13 @@ qtconsole = "*" [[package]] name = "jupyter-client" -version = "8.6.0" +version = "8.6.1" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, - {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, + {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, + {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, ] [package.dependencies] @@ -2607,13 +2364,13 @@ test = ["flaky", "pexpect", "pytest"] [[package]] name = "jupyter-core" -version = "5.7.1" +version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, - {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] [package.dependencies] @@ -2623,17 +2380,17 @@ traitlets = ">=5.3" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" -version = "0.9.0" +version = "0.10.0" description = "Jupyter Event System library" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, - {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"}, + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, ] [package.dependencies] @@ -2720,13 +2477,13 @@ test = ["jupyter-server[test]", "pytest"] [[package]] name = "jupyter-server-terminals" -version = "0.5.2" +version = "0.5.3" description = "A Jupyter Server Extension Providing Terminals." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server_terminals-0.5.2-py3-none-any.whl", hash = "sha256:1b80c12765da979513c42c90215481bbc39bd8ae7c0350b4f85bc3eb58d0fa80"}, - {file = "jupyter_server_terminals-0.5.2.tar.gz", hash = "sha256:396b5ccc0881e550bf0ee7012c6ef1b53edbde69e67cab1d56e89711b46052e8"}, + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, ] [package.dependencies] @@ -2739,13 +2496,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.1.4" +version = "4.1.5" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.1.4-py3-none-any.whl", hash = "sha256:f92c3f2b12b88efcf767205f49be9b2f86b85544f9c4f342bb5e9904a16cf931"}, - {file = "jupyterlab-4.1.4.tar.gz", hash = "sha256:e03c82c124ad8a0892e498b9dde79c50868b2c267819aca3f55ce47c57ebeb1d"}, + {file = "jupyterlab-4.1.5-py3-none-any.whl", hash = "sha256:3bc843382a25e1ab7bc31d9e39295a9f0463626692b7995597709c0ab236ab2c"}, + {file = "jupyterlab-4.1.5.tar.gz", hash = "sha256:c9ad75290cb10bfaff3624bf3fbb852319b4cce4c456613f8ebbaa98d03524db"}, ] [package.dependencies] @@ -3378,6 +3135,7 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] @@ -3480,30 +3238,6 @@ files = [ {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] -[[package]] -name = "multiprocess" -version = "0.70.16" -description = "better multiprocessing and multithreading in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, - {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, - {file = "multiprocess-0.70.16-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37b55f71c07e2d741374998c043b9520b626a8dddc8b3129222ca4f1a06ef67a"}, - {file = "multiprocess-0.70.16-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba8c31889abf4511c7308a8c52bb4a30b9d590e7f58523302ba00237702ca054"}, - {file = "multiprocess-0.70.16-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:0dfd078c306e08d46d7a8d06fb120313d87aa43af60d66da43ffff40b44d2f41"}, - {file = "multiprocess-0.70.16-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e7b9d0f307cd9bd50851afaac0dba2cb6c44449efff697df7c7645f7d3f2be3a"}, - {file = "multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02"}, - {file = "multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a"}, - {file = "multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e"}, - {file = "multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435"}, - {file = "multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3"}, - {file = "multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1"}, -] - -[package.dependencies] -dill = ">=0.3.8" - [[package]] name = "mysqlclient" version = "2.2.4" @@ -3560,13 +3294,13 @@ test = ["black", "check-manifest", "flake8", "ipykernel", "ipython (<8.0.0)", "i [[package]] name = "nbconvert" -version = "7.16.2" +version = "7.16.3" description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.16.2-py3-none-any.whl", hash = "sha256:0c01c23981a8de0220255706822c40b751438e32467d6a686e26be08ba784382"}, - {file = "nbconvert-7.16.2.tar.gz", hash = "sha256:8310edd41e1c43947e4ecf16614c61469ebc024898eb808cce0999860fc9fb16"}, + {file = "nbconvert-7.16.3-py3-none-any.whl", hash = "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b"}, + {file = "nbconvert-7.16.3.tar.gz", hash = "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142"}, ] [package.dependencies] @@ -3593,7 +3327,7 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] webpdf = ["playwright"] [[package]] @@ -3624,13 +3358,13 @@ test = ["jsonschema", "jupyter-server[test]", "mock", "notebook", "pytest (>=6.0 [[package]] name = "nbformat" -version = "5.9.2" +version = "5.10.3" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, - {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, + {file = "nbformat-5.10.3-py3-none-any.whl", hash = "sha256:d9476ca28676799af85385f409b49d95e199951477a159a576ef2a675151e5e8"}, + {file = "nbformat-5.10.3.tar.gz", hash = "sha256:60ed5e910ef7c6264b87d644f276b1b49e24011930deef54605188ddeb211685"}, ] [package.dependencies] @@ -3700,13 +3434,13 @@ tests = ["Cython", "packaging", "pytest"] [[package]] name = "notebook" -version = "7.1.1" +version = "7.1.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.1.1-py3-none-any.whl", hash = "sha256:197d8e0595acabf4005851c8716e952a81b405f7aefb648067a761fbde267ce7"}, - {file = "notebook-7.1.1.tar.gz", hash = "sha256:818e7420fa21f402e726afb9f02df7f3c10f294c02e383ed19852866c316108b"}, + {file = "notebook-7.1.2-py3-none-any.whl", hash = "sha256:fc6c24b9aef18d0cd57157c9c47e95833b9b0bdc599652639acf0bdb61dc7d5f"}, + {file = "notebook-7.1.2.tar.gz", hash = "sha256:efc2c80043909e0faa17fce9e9b37c059c03af0ec99a4d4db84cb21d9d2e936a"}, ] [package.dependencies] @@ -3820,23 +3554,8 @@ files = [ {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, -] - -[[package]] -name = "outcome" -version = "1.3.0.post0" -description = "Capture the outcome of Python function calls." -optional = false -python-versions = ">=3.7" -files = [ - {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, - {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, ] -[package.dependencies] -attrs = ">=19.2.0" - [[package]] name = "overrides" version = "7.7.0" @@ -3987,6 +3706,24 @@ files = [ {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, ] +[[package]] +name = "patsy" +version = "0.5.6" +description = "A Python package for describing statistical models and for building design matrices." +optional = true +python-versions = "*" +files = [ + {file = "patsy-0.5.6-py2.py3-none-any.whl", hash = "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6"}, + {file = "patsy-0.5.6.tar.gz", hash = "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb"}, +] + +[package.dependencies] +numpy = ">=1.4" +six = "*" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] + [[package]] name = "pdbufr" version = "0.11.0" @@ -4005,20 +3742,6 @@ pandas = "*" [package.extras] tests = ["flake8", "pytest", "pytest-cov", "requests"] -[[package]] -name = "percy" -version = "2.0.2" -description = "Python client library for visual regression testing with Percy (https://percy.io)." -optional = false -python-versions = "*" -files = [ - {file = "percy-2.0.2-py2.py3-none-any.whl", hash = "sha256:c1647b768810e9453220a7721a5d52cec560dee913d13c1e29b713703f4f223e"}, - {file = "percy-2.0.2.tar.gz", hash = "sha256:6238612dc401fa5c221c0ad7738f7ea43e48fe2695f6423e785ee2bc940f021d"}, -] - -[package.dependencies] -requests = ">=2.14.0" - [[package]] name = "pexpect" version = "4.9.0" @@ -4161,13 +3884,13 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest- [[package]] name = "plotly" -version = "5.19.0" +version = "5.20.0" description = "An open-source, interactive data visualization library for Python" -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "plotly-5.19.0-py3-none-any.whl", hash = "sha256:906abcc5f15945765328c5d47edaa884bc99f5985fbc61e8cd4dc361f4ff8f5a"}, - {file = "plotly-5.19.0.tar.gz", hash = "sha256:5ea91a56571292ade3e3bc9bf712eba0b95a1fb0a941375d978cc79432e055f4"}, + {file = "plotly-5.20.0-py3-none-any.whl", hash = "sha256:837a9c8aa90f2c0a2f0d747b82544d014dc2a2bdde967b5bb1da25b53932d1a9"}, + {file = "plotly-5.20.0.tar.gz", hash = "sha256:bf901c805d22032cfa534b2ff7c5aa6b0659e037f19ec1e0cca7f585918b5c89"}, ] [package.dependencies] @@ -4209,17 +3932,17 @@ poetry-plugin = ["poetry (>=1.0,<2.0)"] [[package]] name = "polars" -version = "0.20.15" +version = "0.20.16" description = "Blazingly fast DataFrame library" optional = false python-versions = ">=3.8" files = [ - {file = "polars-0.20.15-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:d528acc0b0900cb8363f065cbf65325571eeb4b245e4b68679beae75287451c9"}, - {file = "polars-0.20.15-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:3adc68bd1400c651da826e66ad735c07dafd5f1811f369f394f8d8fb71f1178b"}, - {file = "polars-0.20.15-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be613e4640a607040e3361622a254f88ac99bd92b212d6f580a3f4b74b6617ed"}, - {file = "polars-0.20.15-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:a1936ec8de4262ce68dd5c4f43b74c996184a36012bdd0ff9454c33132bd4d28"}, - {file = "polars-0.20.15-cp38-abi3-win_amd64.whl", hash = "sha256:00b5687d1fdcb09f7c2babdf88f63b3238284bf9f6cddd2ea60aea07b711172e"}, - {file = "polars-0.20.15.tar.gz", hash = "sha256:88ad0c3e1f92185b86041d68783f9862ec21adc92a33001818697644dd0794ee"}, + {file = "polars-0.20.16-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7530148621b541221b8a36cfad27cc576d77c0739e82d8383ee3a699935a5f63"}, + {file = "polars-0.20.16-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:92241d9aeb29de7c503d3b4f9191181f0831dd546ee6770e5c6fae3cead98edb"}, + {file = "polars-0.20.16-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b48593c44a20f09f1eb1449ea43e2e5a4adf3c82faf1fba797fb7364cfa2ca4"}, + {file = "polars-0.20.16-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:0c504cfdc88f3e4262d5ecf637c10ae154565b94250ee4263a9f5f346397cf98"}, + {file = "polars-0.20.16-cp38-abi3-win_amd64.whl", hash = "sha256:a1fa24ea374ff05766e43fe2f079d62edd682ade19e3e2d68526e9c7a3e23ddf"}, + {file = "polars-0.20.16.tar.gz", hash = "sha256:7a9ebb85bfc9dd964490612b6fee2afbde91eee6bfaa590b731c7868d225210b"}, ] [package.extras] @@ -4371,7 +4094,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -4380,8 +4102,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -4446,47 +4166,47 @@ tests = ["pytest"] [[package]] name = "pyarrow" -version = "15.0.1" +version = "15.0.2" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.8" files = [ - {file = "pyarrow-15.0.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:c2ddb3be5ea938c329a84171694fc230b241ce1b6b0ff1a0280509af51c375fa"}, - {file = "pyarrow-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7543ea88a0ff72f8e6baaf9bfdbec2c62aeabdbede9e4a571c71cc3bc43b6302"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1519e218a6941fc074e4501088d891afcb2adf77c236e03c34babcf3d6a0d1c7"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28cafa86e1944761970d3b3fc0411b14ff9b5c2b73cd22aaf470d7a3976335f5"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:be5c3d463e33d03eab496e1af7916b1d44001c08f0f458ad27dc16093a020638"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:47b1eda15d3aa3f49a07b1808648e1397e5dc6a80a30bf87faa8e2d02dad7ac3"}, - {file = "pyarrow-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e524a31be7db22deebbbcf242b189063ab9a7652c62471d296b31bc6e3cae77b"}, - {file = "pyarrow-15.0.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:a476fefe8bdd56122fb0d4881b785413e025858803cc1302d0d788d3522b374d"}, - {file = "pyarrow-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:309e6191be385f2e220586bfdb643f9bb21d7e1bc6dd0a6963dc538e347b2431"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83bc586903dbeb4365cbc72b602f99f70b96c5882e5dfac5278813c7d624ca3c"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e652daac6d8b05280cd2af31c0fb61a4490ec6a53dc01588014d9fa3fdbee9"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:abad2e08652df153a72177ce20c897d083b0c4ebeec051239e2654ddf4d3c996"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cde663352bc83ad75ba7b3206e049ca1a69809223942362a8649e37bd22f9e3b"}, - {file = "pyarrow-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1b6e237dd7a08482a8b8f3f6512d258d2460f182931832a8c6ef3953203d31e1"}, - {file = "pyarrow-15.0.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd167536ee23192760b8c731d39b7cfd37914c27fd4582335ffd08450ff799d"}, - {file = "pyarrow-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c08bb31eb2984ba5c3747d375bb522e7e536b8b25b149c9cb5e1c49b0ccb736"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0f9c1d630ed2524bd1ddf28ec92780a7b599fd54704cd653519f7ff5aec177a"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5186048493395220550bca7b524420471aac2d77af831f584ce132680f55c3df"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:31dc30c7ec8958da3a3d9f31d6c3630429b2091ede0ecd0d989fd6bec129f0e4"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3f111a014fb8ac2297b43a74bf4495cc479a332908f7ee49cb7cbd50714cb0c1"}, - {file = "pyarrow-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a6d1f7c15d7f68f08490d0cb34611497c74285b8a6bbeab4ef3fc20117310983"}, - {file = "pyarrow-15.0.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:9ad931b996f51c2f978ed517b55cb3c6078272fb4ec579e3da5a8c14873b698d"}, - {file = "pyarrow-15.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:738f6b53ab1c2f66b2bde8a1d77e186aeaab702d849e0dfa1158c9e2c030add3"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c1c3fc16bc74e33bf8f1e5a212938ed8d88e902f372c4dac6b5bad328567d2f"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1fa92512128f6c1b8dde0468c1454dd70f3bff623970e370d52efd4d24fd0be"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b4157f307c202cbbdac147d9b07447a281fa8e63494f7fc85081da351ec6ace9"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:b75e7da26f383787f80ad76143b44844ffa28648fcc7099a83df1538c078d2f2"}, - {file = "pyarrow-15.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:3a99eac76ae14096c209850935057b9e8ce97a78397c5cde8724674774f34e5d"}, - {file = "pyarrow-15.0.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:dd532d3177e031e9b2d2df19fd003d0cc0520d1747659fcabbd4d9bb87de508c"}, - {file = "pyarrow-15.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce8c89848fd37e5313fc2ce601483038ee5566db96ba0808d5883b2e2e55dc53"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:862eac5e5f3b6477f7a92b2f27e560e1f4e5e9edfca9ea9da8a7478bb4abd5ce"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f0ea3a29cd5cb99bf14c1c4533eceaa00ea8fb580950fb5a89a5c771a994a4e"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:bb902f780cfd624b2e8fd8501fadab17618fdb548532620ef3d91312aaf0888a"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:4f87757f02735a6bb4ad2e1b98279ac45d53b748d5baf52401516413007c6999"}, - {file = "pyarrow-15.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:efd3816c7fbfcbd406ac0f69873cebb052effd7cdc153ae5836d1b00845845d7"}, - {file = "pyarrow-15.0.1.tar.gz", hash = "sha256:21d812548d39d490e0c6928a7c663f37b96bf764034123d4b4ab4530ecc757a9"}, + {file = "pyarrow-15.0.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:88b340f0a1d05b5ccc3d2d986279045655b1fe8e41aba6ca44ea28da0d1455d8"}, + {file = "pyarrow-15.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eaa8f96cecf32da508e6c7f69bb8401f03745c050c1dd42ec2596f2e98deecac"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23c6753ed4f6adb8461e7c383e418391b8d8453c5d67e17f416c3a5d5709afbd"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f639c059035011db8c0497e541a8a45d98a58dbe34dc8fadd0ef128f2cee46e5"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:290e36a59a0993e9a5224ed2fb3e53375770f07379a0ea03ee2fce2e6d30b423"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06c2bb2a98bc792f040bef31ad3e9be6a63d0cb39189227c08a7d955db96816e"}, + {file = "pyarrow-15.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:f7a197f3670606a960ddc12adbe8075cea5f707ad7bf0dffa09637fdbb89f76c"}, + {file = "pyarrow-15.0.2-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5f8bc839ea36b1f99984c78e06e7a06054693dc2af8920f6fb416b5bca9944e4"}, + {file = "pyarrow-15.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5e81dfb4e519baa6b4c80410421528c214427e77ca0ea9461eb4097c328fa33"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4f240852b302a7af4646c8bfe9950c4691a419847001178662a98915fd7ee7"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e7d9cfb5a1e648e172428c7a42b744610956f3b70f524aa3a6c02a448ba853e"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2d4f905209de70c0eb5b2de6763104d5a9a37430f137678edfb9a675bac9cd98"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90adb99e8ce5f36fbecbbc422e7dcbcbed07d985eed6062e459e23f9e71fd197"}, + {file = "pyarrow-15.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:b116e7fd7889294cbd24eb90cd9bdd3850be3738d61297855a71ac3b8124ee38"}, + {file = "pyarrow-15.0.2-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:25335e6f1f07fdaa026a61c758ee7d19ce824a866b27bba744348fa73bb5a440"}, + {file = "pyarrow-15.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90f19e976d9c3d8e73c80be84ddbe2f830b6304e4c576349d9360e335cd627fc"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a22366249bf5fd40ddacc4f03cd3160f2d7c247692945afb1899bab8a140ddfb"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2a335198f886b07e4b5ea16d08ee06557e07db54a8400cc0d03c7f6a22f785f"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e6d459c0c22f0b9c810a3917a1de3ee704b021a5fb8b3bacf968eece6df098f"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:033b7cad32198754d93465dcfb71d0ba7cb7cd5c9afd7052cab7214676eec38b"}, + {file = "pyarrow-15.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:29850d050379d6e8b5a693098f4de7fd6a2bea4365bfd073d7c57c57b95041ee"}, + {file = "pyarrow-15.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7167107d7fb6dcadb375b4b691b7e316f4368f39f6f45405a05535d7ad5e5058"}, + {file = "pyarrow-15.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e85241b44cc3d365ef950432a1b3bd44ac54626f37b2e3a0cc89c20e45dfd8bf"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:248723e4ed3255fcd73edcecc209744d58a9ca852e4cf3d2577811b6d4b59818"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ff3bdfe6f1b81ca5b73b70a8d482d37a766433823e0c21e22d1d7dde76ca33f"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f3d77463dee7e9f284ef42d341689b459a63ff2e75cee2b9302058d0d98fe142"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:8c1faf2482fb89766e79745670cbca04e7018497d85be9242d5350cba21357e1"}, + {file = "pyarrow-15.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:28f3016958a8e45a1069303a4a4f6a7d4910643fc08adb1e2e4a7ff056272ad3"}, + {file = "pyarrow-15.0.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:89722cb64286ab3d4daf168386f6968c126057b8c7ec3ef96302e81d8cdb8ae4"}, + {file = "pyarrow-15.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0ba387705044b3ac77b1b317165c0498299b08261d8122c96051024f953cd5"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad2459bf1f22b6a5cdcc27ebfd99307d5526b62d217b984b9f5c974651398832"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58922e4bfece8b02abf7159f1f53a8f4d9f8e08f2d988109126c17c3bb261f22"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:adccc81d3dc0478ea0b498807b39a8d41628fa9210729b2f718b78cb997c7c91"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:8bd2baa5fe531571847983f36a30ddbf65261ef23e496862ece83bdceb70420d"}, + {file = "pyarrow-15.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6669799a1d4ca9da9c7e06ef48368320f5856f36f9a4dd31a11839dda3f6cc8c"}, + {file = "pyarrow-15.0.2.tar.gz", hash = "sha256:9c9bc803cb3b7bfacc1e96ffbfd923601065d9d3f911179d81e72d99fd74a3d9"}, ] [package.dependencies] @@ -4519,13 +4239,13 @@ files = [ [[package]] name = "pydantic" -version = "2.6.3" +version = "2.6.4" description = "Data validation using Python type hints" optional = true python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.3-py3-none-any.whl", hash = "sha256:72c6034df47f46ccdf81869fddb81aade68056003900a8724a4f160700016a2a"}, - {file = "pydantic-2.6.3.tar.gz", hash = "sha256:e07805c4c7f5c6826e33a1d4c9d47950d7eaf34868e2690f8594d2e30241f11f"}, + {file = "pydantic-2.6.4-py3-none-any.whl", hash = "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5"}, + {file = "pydantic-2.6.4.tar.gz", hash = "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6"}, ] [package.dependencies] @@ -4661,24 +4381,6 @@ files = [ plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] -[[package]] -name = "pyopenssl" -version = "24.1.0" -description = "Python wrapper module around the OpenSSL library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyOpenSSL-24.1.0-py3-none-any.whl", hash = "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad"}, - {file = "pyOpenSSL-24.1.0.tar.gz", hash = "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f"}, -] - -[package.dependencies] -cryptography = ">=41.0.5,<43" - -[package.extras] -docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] -test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] - [[package]] name = "pyparsing" version = "3.1.2" @@ -4773,18 +4475,6 @@ tomlkit = ">=0.12.3" docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-argparse-cli (>=1.11.1)", "sphinx-autodoc-typehints (>=1.25.2)", "sphinx-copybutton (>=0.5.2)"] test = ["covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -[[package]] -name = "pysocks" -version = "1.7.1" -description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, - {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, - {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, -] - [[package]] name = "pytest" version = "8.1.1" @@ -4999,7 +4689,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -5007,16 +4696,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -5033,7 +4714,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -5041,7 +4721,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -5312,13 +4991,13 @@ typing-extensions = ">=4.1.1,<5.0.0" [[package]] name = "referencing" -version = "0.33.0" +version = "0.34.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, - {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, + {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, + {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, ] [package.dependencies] @@ -5346,20 +5025,6 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "retrying" -version = "1.3.4" -description = "Retrying" -optional = false -python-versions = "*" -files = [ - {file = "retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35"}, - {file = "retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e"}, -] - -[package.dependencies] -six = ">=1.7.0" - [[package]] name = "rfc3339-validator" version = "0.1.4" @@ -5621,21 +5286,6 @@ dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyl doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] -[[package]] -name = "selenium" -version = "4.2.0" -description = "" -optional = false -python-versions = "~=3.7" -files = [ - {file = "selenium-4.2.0-py3-none-any.whl", hash = "sha256:ba5b2633f43cf6fe9d308fa4a6996e00a101ab9cb1aad6fd91ae1f3dbe57f56f"}, -] - -[package.dependencies] -trio = ">=0.17,<1.0" -trio-websocket = ">=0.9,<1.0" -urllib3 = {version = ">=1.26,<2.0", extras = ["secure", "socks"]} - [[package]] name = "send2trash" version = "1.8.2" @@ -5654,18 +5304,18 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "69.1.1" +version = "69.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, - {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, + {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, + {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -6017,60 +5667,60 @@ cairosvg = ["cairosvg (>=1.0)"] [[package]] name = "sqlalchemy" -version = "2.0.28" +version = "2.0.29" description = "Database Abstraction Library" optional = true python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-win32.whl", hash = "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-win_amd64.whl", hash = "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-win32.whl", hash = "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-win_amd64.whl", hash = "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-win32.whl", hash = "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-win_amd64.whl", hash = "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-win32.whl", hash = "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-win_amd64.whl", hash = "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-win32.whl", hash = "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-win_amd64.whl", hash = "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-win32.whl", hash = "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-win_amd64.whl", hash = "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b"}, - {file = "SQLAlchemy-2.0.28-py3-none-any.whl", hash = "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986"}, - {file = "SQLAlchemy-2.0.28.tar.gz", hash = "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c142852ae192e9fe5aad5c350ea6befe9db14370b34047e1f0f7cf99e63c63b"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a1e69d4e26f71e750e9ad6fdc8614fbddb67cfe2173a3628a2566034e223c7"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef3fbccb4058355053c51b82fd3501a6e13dd808c8d8cd2561e610c5456013c"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d6753305936eddc8ed190e006b7bb33a8f50b9854823485eed3a886857ab8d1"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0f3ca96af060a5250a8ad5a63699180bc780c2edf8abf96c58af175921df847a"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4520047006b1d3f0d89e0532978c0688219857eb2fee7c48052560ae76aca1e"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-win32.whl", hash = "sha256:b2a0e3cf0caac2085ff172c3faacd1e00c376e6884b5bc4dd5b6b84623e29e4f"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-win_amd64.whl", hash = "sha256:01d10638a37460616708062a40c7b55f73e4d35eaa146781c683e0fa7f6c43fb"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:308ef9cb41d099099fffc9d35781638986870b29f744382904bf9c7dadd08513"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:296195df68326a48385e7a96e877bc19aa210e485fa381c5246bc0234c36c78e"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a13b917b4ffe5a0a31b83d051d60477819ddf18276852ea68037a144a506efb9"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f6d971255d9ddbd3189e2e79d743ff4845c07f0633adfd1de3f63d930dbe673"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:61405ea2d563407d316c63a7b5271ae5d274a2a9fbcd01b0aa5503635699fa1e"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de7202ffe4d4a8c1e3cde1c03e01c1a3772c92858837e8f3879b497158e4cb44"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-win32.whl", hash = "sha256:b5d7ed79df55a731749ce65ec20d666d82b185fa4898430b17cb90c892741520"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-win_amd64.whl", hash = "sha256:205f5a2b39d7c380cbc3b5dcc8f2762fb5bcb716838e2d26ccbc54330775b003"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d96710d834a6fb31e21381c6d7b76ec729bd08c75a25a5184b1089141356171f"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52de4736404e53c5c6a91ef2698c01e52333988ebdc218f14c833237a0804f1b"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c7b02525ede2a164c5fa5014915ba3591730f2cc831f5be9ff3b7fd3e30958e"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dfefdb3e54cd15f5d56fd5ae32f1da2d95d78319c1f6dfb9bcd0eb15d603d5d"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a88913000da9205b13f6f195f0813b6ffd8a0c0c2bd58d499e00a30eb508870c"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-win32.whl", hash = "sha256:8197d6f7a3d2b468861ebb4c9f998b9df9e358d6e1cf9c2a01061cb9b6cf4e41"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-win_amd64.whl", hash = "sha256:9b19836ccca0d321e237560e475fd99c3d8655d03da80c845c4da20dda31b6e1"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87a1d53a5382cdbbf4b7619f107cc862c1b0a4feb29000922db72e5a66a5ffc0"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0732dffe32333211801b28339d2a0babc1971bc90a983e3035e7b0d6f06b93"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90453597a753322d6aa770c5935887ab1fc49cc4c4fdd436901308383d698b4b"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5f20cb0a63a3e0ec4e169aa8890e32b949c8145983afa13a708bc4b0a1f30e03"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-win32.whl", hash = "sha256:e5bbe55e8552019c6463709b39634a5fc55e080d0827e2a3a11e18eb73f5cdbd"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-win_amd64.whl", hash = "sha256:c2f9c762a2735600654c654bf48dad388b888f8ce387b095806480e6e4ff6907"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e614d7a25a43a9f54fcce4675c12761b248547f3d41b195e8010ca7297c369c"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:471fcb39c6adf37f820350c28aac4a7df9d3940c6548b624a642852e727ea586"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:988569c8732f54ad3234cf9c561364221a9e943b78dc7a4aaf35ccc2265f1930"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dddaae9b81c88083e6437de95c41e86823d150f4ee94bf24e158a4526cbead01"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:334184d1ab8f4c87f9652b048af3f7abea1c809dfe526fb0435348a6fef3d380"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:38b624e5cf02a69b113c8047cf7f66b5dfe4a2ca07ff8b8716da4f1b3ae81567"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-win32.whl", hash = "sha256:bab41acf151cd68bc2b466deae5deeb9e8ae9c50ad113444151ad965d5bf685b"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-win_amd64.whl", hash = "sha256:52c8011088305476691b8750c60e03b87910a123cfd9ad48576d6414b6ec2a1d"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3071ad498896907a5ef756206b9dc750f8e57352113c19272bdfdc429c7bd7de"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dba622396a3170974f81bad49aacebd243455ec3cc70615aeaef9e9613b5bca5"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b184e3de58009cc0bf32e20f137f1ec75a32470f5fede06c58f6c355ed42a72"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c37f1050feb91f3d6c32f864d8e114ff5545a4a7afe56778d76a9aec62638ba"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bda7ce59b06d0f09afe22c56714c65c957b1068dee3d5e74d743edec7daba552"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:25664e18bef6dc45015b08f99c63952a53a0a61f61f2e48a9e70cec27e55f699"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-win32.whl", hash = "sha256:77d29cb6c34b14af8a484e831ab530c0f7188f8efed1c6a833a2c674bf3c26ec"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-win_amd64.whl", hash = "sha256:04c487305ab035a9548f573763915189fc0fe0824d9ba28433196f8436f1449c"}, + {file = "SQLAlchemy-2.0.29-py3-none-any.whl", hash = "sha256:dc4ee2d4ee43251905f88637d5281a8d52e916a021384ec10758826f5cbae305"}, + {file = "SQLAlchemy-2.0.29.tar.gz", hash = "sha256:bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0"}, ] [package.dependencies] @@ -6160,15 +5810,68 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\"" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] +[[package]] +name = "statsmodels" +version = "0.14.1" +description = "Statistical computations and models for Python" +optional = true +python-versions = ">=3.8" +files = [ + {file = "statsmodels-0.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43af9c0b07c9d72f275cf14ea54a481a3f20911f0b443181be4769def258fdeb"}, + {file = "statsmodels-0.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a16975ab6ad505d837ba9aee11f92a8c5b49c4fa1ff45b60fe23780b19e5705e"}, + {file = "statsmodels-0.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e278fe74da5ed5e06c11a30851eda1af08ef5af6be8507c2c45d2e08f7550dde"}, + {file = "statsmodels-0.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0564d92cb05b219b4538ed09e77d96658a924a691255e1f7dd23ee338df441b"}, + {file = "statsmodels-0.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5385e22e72159a09c099c4fb975f350a9f3afeb57c1efce273b89dcf1fe44c0f"}, + {file = "statsmodels-0.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:0a8aae75a2e08ebd990e5fa394f8e32738b55785cb70798449a3f4207085e667"}, + {file = "statsmodels-0.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b69a63ad6c979a6e4cde11870ffa727c76a318c225a7e509f031fbbdfb4e416a"}, + {file = "statsmodels-0.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7562cb18a90a114f39fab6f1c25b9c7b39d9cd5f433d0044b430ca9d44a8b52c"}, + {file = "statsmodels-0.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3abaca4b963259a2bf349c7609cfbb0ce64ad5fb3d92d6f08e21453e4890248"}, + {file = "statsmodels-0.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0f727fe697f6406d5f677b67211abe5a55101896abdfacdb3f38410405f6ad8"}, + {file = "statsmodels-0.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6838ac6bdb286daabb5e91af90fd4258f09d0cec9aace78cc441cb2b17df428"}, + {file = "statsmodels-0.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:709bfcef2dbe66f705b17e56d1021abad02243ee1a5d1efdb90f9bad8b06a329"}, + {file = "statsmodels-0.14.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f32a7cd424cf33304a54daee39d32cccf1d0265e652c920adeaeedff6d576457"}, + {file = "statsmodels-0.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f8c30181c084173d662aaf0531867667be2ff1bee103b84feb64f149f792dbd2"}, + {file = "statsmodels-0.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de2b97413913d52ad6342dece2d653e77f78620013b7705fad291d4e4266ccb"}, + {file = "statsmodels-0.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3420f88289c593ba2bca33619023059c476674c160733bd7d858564787c83d3"}, + {file = "statsmodels-0.14.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c008e16096f24f0514e53907890ccac6589a16ad6c81c218f2ee6752fdada555"}, + {file = "statsmodels-0.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:bc0351d279c4e080f0ce638a3d886d312aa29eade96042e3ba0a73771b1abdfb"}, + {file = "statsmodels-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf293ada63b2859d95210165ad1dfcd97bd7b994a5266d6fbeb23659d8f0bf68"}, + {file = "statsmodels-0.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44ca8cb88fa3d3a4ffaff1fb8eb0e98bbf83fc936fcd9b9eedee258ecc76696a"}, + {file = "statsmodels-0.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5373d176239993c095b00d06036690a50309a4e00c2da553b65b840f956ae6"}, + {file = "statsmodels-0.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a532dfe899f8b6632cd8caa0b089b403415618f51e840d1817a1e4b97e200c73"}, + {file = "statsmodels-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:4fe0a60695952b82139ae8750952786a700292f9e0551d572d7685070944487b"}, + {file = "statsmodels-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04293890f153ffe577e60a227bd43babd5f6c1fc50ea56a3ab1862ae85247a95"}, + {file = "statsmodels-0.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e70a2e93d54d40b2cb6426072acbc04f35501b1ea2569f6786964adde6ca572"}, + {file = "statsmodels-0.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab3a73d16c0569adbba181ebb967e5baaa74935f6d2efe86ac6fc5857449b07d"}, + {file = "statsmodels-0.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eefa5bcff335440ee93e28745eab63559a20cd34eea0375c66d96b016de909b3"}, + {file = "statsmodels-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:bc43765710099ca6a942b5ffa1bac7668965052542ba793dd072d26c83453572"}, + {file = "statsmodels-0.14.1.tar.gz", hash = "sha256:2260efdc1ef89f39c670a0bd8151b1d0843567781bcafec6cda0534eb47a94f6"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.3,<2", markers = "python_version == \"3.10\" and platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""}, + {version = ">=1.18,<2", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""}, +] +packaging = ">=21.3" +pandas = ">=1.0,<2.1.0 || >2.1.0" +patsy = ">=0.5.4" +scipy = ">=1.4,<1.9.2 || >1.9.2" + +[package.extras] +build = ["cython (>=0.29.33)"] +develop = ["colorama", "cython (>=0.29.33)", "cython (>=0.29.33,<4.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.3.0)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=8.0,<9.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + [[package]] name = "streamlit" -version = "1.32.0" +version = "1.32.2" description = "A faster way to build and share data apps" optional = true python-versions = ">=3.8, !=3.9.7" files = [ - {file = "streamlit-1.32.0-py2.py3-none-any.whl", hash = "sha256:d8458d6d00fd9d7e965e8125ec97d0ef7ed3d82844bf5663e71231fdb623ebb1"}, - {file = "streamlit-1.32.0.tar.gz", hash = "sha256:65bf22e190de973b910c0b127b33d80d31c5275ed891c6fde740de46e5e05323"}, + {file = "streamlit-1.32.2-py2.py3-none-any.whl", hash = "sha256:a0b8044e76fec364b07be145f8b40dbd8d083e20ebbb189ceb1fa9423f3dedea"}, + {file = "streamlit-1.32.2.tar.gz", hash = "sha256:1258b9cbc3ff957bf7d09b1bfc85cedc308f1065b30748545295a9af8d5577ab"}, ] [package.dependencies] @@ -6249,13 +5952,13 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "terminado" -version = "0.18.0" +version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false python-versions = ">=3.8" files = [ - {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, - {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"}, + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, ] [package.dependencies] @@ -6270,13 +5973,13 @@ typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "threadpoolctl" -version = "3.3.0" +version = "3.4.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.3.0-py3-none-any.whl", hash = "sha256:6155be1f4a39f31a18ea70f94a77e0ccd57dced08122ea61109e7da89883781e"}, - {file = "threadpoolctl-3.3.0.tar.gz", hash = "sha256:5dac632b4fa2d43f42130267929af3ba01399ef4bd1882918e92dbc30365d30c"}, + {file = "threadpoolctl-3.4.0-py3-none-any.whl", hash = "sha256:8f4c689a65b23e5ed825c8436a92b818aac005e0f3715f6a1664d7c7ee29d262"}, + {file = "threadpoolctl-3.4.0.tar.gz", hash = "sha256:f11b491a03661d6dd7ef692dd422ab34185d982466c49c8f98c8f716b5c93196"}, ] [[package]] @@ -6383,64 +6086,28 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.14.1" +version = "5.14.2" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, - {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, + {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, + {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] - -[[package]] -name = "trio" -version = "0.24.0" -description = "A friendly Python library for async concurrency and I/O" -optional = false -python-versions = ">=3.8" -files = [ - {file = "trio-0.24.0-py3-none-any.whl", hash = "sha256:c3bd3a4e3e3025cd9a2241eae75637c43fe0b9e88b4c97b9161a55b9e54cd72c"}, - {file = "trio-0.24.0.tar.gz", hash = "sha256:ffa09a74a6bf81b84f8613909fb0beaee84757450183a7a2e0b47b455c0cac5d"}, -] - -[package.dependencies] -attrs = ">=20.1.0" -cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -idna = "*" -outcome = "*" -sniffio = ">=1.3.0" -sortedcontainers = "*" - -[[package]] -name = "trio-websocket" -version = "0.11.1" -description = "WebSocket library for Trio" -optional = false -python-versions = ">=3.7" -files = [ - {file = "trio-websocket-0.11.1.tar.gz", hash = "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f"}, - {file = "trio_websocket-0.11.1-py3-none-any.whl", hash = "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638"}, -] - -[package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -trio = ">=0.11" -wsproto = ">=0.14" +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "types-python-dateutil" -version = "2.8.19.20240311" +version = "2.9.0.20240316" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.8.19.20240311.tar.gz", hash = "sha256:51178227bbd4cbec35dc9adffbf59d832f20e09842d7dcb8c73b169b8780b7cb"}, - {file = "types_python_dateutil-2.8.19.20240311-py3-none-any.whl", hash = "sha256:ef813da0809aca76472ca88807addbeea98b19339aebe56159ae2f4b4f70857a"}, + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, ] [[package]] @@ -6467,63 +6134,47 @@ files = [ [[package]] name = "tzfpy" -version = "0.15.3" +version = "0.15.4" description = "Probably the fastest Python package to convert longitude/latitude to timezone name" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tzfpy-0.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47984db8e0aabfec7daeac92fe506fd8a6916cffb0f256df1ad02079f9c73e66"}, - {file = "tzfpy-0.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f0d11279613edd1ce81d36770ec9523f7536624a82a57ccff2a6a1b5c3c1f"}, - {file = "tzfpy-0.15.3-cp310-cp310-manylinux_2_24_armv7l.whl", hash = "sha256:f930330b1637206157e04f126b7fdd4da7b2d31908f94b13ceeae103f75ce398"}, - {file = "tzfpy-0.15.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4e5fd1304bebec3d98946415d2535095bfdf19c7b4e80e9e8aecea88a79ed28a"}, - {file = "tzfpy-0.15.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c1efe8a8979d81a765734b1bf23dbb1eda0555cbabc31353da00f1c2a0a4e15"}, - {file = "tzfpy-0.15.3-cp310-none-win_amd64.whl", hash = "sha256:ffe161a1a4dde284c43e8ff3498fa95a44c221906f22529948a78170c4912d75"}, - {file = "tzfpy-0.15.3-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0db63c1f901b822ae9c41d532dc0cc87107fd2c742f9856569200a726f918bfd"}, - {file = "tzfpy-0.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18652ab4f05431f6ab831848997fc61a82bf006f20772358bbf5988d1ca8e63"}, - {file = "tzfpy-0.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbe3e4a449520f2964c69fe3e546431fdbaa9963be236007828c8eae3867e55b"}, - {file = "tzfpy-0.15.3-cp311-cp311-manylinux_2_24_armv7l.whl", hash = "sha256:7d5da6f2c84f8928a1576a0286bc5f65801332fc604afdf18297f90fd3c73e36"}, - {file = "tzfpy-0.15.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bf06c86d9127c04b30785215db8fae5d193d03c248ac10539639aa2e7d634141"}, - {file = "tzfpy-0.15.3-cp311-none-win_amd64.whl", hash = "sha256:145270585589e734d8c179361f448a30fe7c83f307829298ccb4380d825541fa"}, - {file = "tzfpy-0.15.3-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:397a6f962ebb554ebf6c5ac340f4ad3c57cd05be03bda7e9302a3fd1e7b47251"}, - {file = "tzfpy-0.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00543c911018788680e4c4170d032f6b19da292092186e303672912e78bd78ad"}, - {file = "tzfpy-0.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:888e7cdc1d184cbbeeadcacc1b4e607c851696ee1ece04b2b5088e85b28b2661"}, - {file = "tzfpy-0.15.3-cp312-cp312-manylinux_2_24_armv7l.whl", hash = "sha256:123d4cb25568c2b86fe2bf0cfaa3000a1a9a78f9ca2773bc20dc013b773d25b1"}, - {file = "tzfpy-0.15.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:404ddba93938c98428da6796621e847abcbc63772b2ecb08cc6001a815a9aba5"}, - {file = "tzfpy-0.15.3-cp312-none-win_amd64.whl", hash = "sha256:20177c809690270524e206b5d02a935a856a28ade7d8eda090657233d023241f"}, - {file = "tzfpy-0.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8465ef1c1f0326e5b364ba39bdda62ab8fe9102e87d41920f48a038980980dcd"}, - {file = "tzfpy-0.15.3-cp313-cp313-manylinux_2_24_armv7l.whl", hash = "sha256:f9ba0244172cefca286422af30c46994cb8dcf30861391eaf22904f6b7fa797c"}, - {file = "tzfpy-0.15.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:503e8f5a538a43c07700973dbd4e4825b8222679aa14d3ca7f8974526ed777c8"}, - {file = "tzfpy-0.15.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c9282fb9b0a203d62b15172a3a5e3dca79b7e5d20fe7c88caf72ca10e97631"}, - {file = "tzfpy-0.15.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e097b5a934d04215b8f6754ef3073e2390b57c4320103c78afbae78e9b5addf8"}, - {file = "tzfpy-0.15.3-cp37-cp37m-manylinux_2_24_armv7l.whl", hash = "sha256:8bd57b82153a6e4efbfdb9bac81cc2cd4492b59779bdd119b72e2696f0c496bd"}, - {file = "tzfpy-0.15.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:34551ca5df5fbb4d8350078a7cd6a8bd264b19e3c996e9531e764cc829f8f288"}, - {file = "tzfpy-0.15.3-cp37-none-win_amd64.whl", hash = "sha256:209dfd0b82acabc4e977f0869177d022dcba65616d02113bd26070f8882c98d1"}, - {file = "tzfpy-0.15.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad9c2e8a370e12308464193e2ad87c6a158f869635c64ff0baffbc1463828fac"}, - {file = "tzfpy-0.15.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6929ed91a15ad4dbe3594d3a2adbed2f129702d2c624deac510a88d5d5913a8"}, - {file = "tzfpy-0.15.3-cp38-cp38-manylinux_2_24_armv7l.whl", hash = "sha256:948084425396422d900906222836dd99d499b797eb4ad092804c0383df5700f0"}, - {file = "tzfpy-0.15.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5e7610ccd669623fd28564b05ae4213c29e07fd1f4e220c549dc3ba8774679d9"}, - {file = "tzfpy-0.15.3-cp38-none-win_amd64.whl", hash = "sha256:df2e2dc4ed1909bb4cdaf3883951ffa1db48fa86d551ebc12b7e16065d9d8195"}, - {file = "tzfpy-0.15.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6a52e3d9c7e662a18e87dd2aa95dafc2e41ac2a93776c4a13df99d4f697f0bf"}, - {file = "tzfpy-0.15.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c584f8d816cf1722c8dd780f76e1a8e24cd60ba877ca371a03f418f82b635b3b"}, - {file = "tzfpy-0.15.3-cp39-cp39-manylinux_2_24_armv7l.whl", hash = "sha256:1a35da73bbb303e2596ae5e2dde6f5e1ca8a334eff5a175c6ee72dae29828009"}, - {file = "tzfpy-0.15.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ece8f1828cfc4f9f580154bb87a8777f03902b9cfadf2b4fbc964efce62d13d5"}, - {file = "tzfpy-0.15.3-cp39-none-win_amd64.whl", hash = "sha256:3ec90ffcee4a5246617d1e07d1a5c9dec53357dcfbe910c31c8fddc143d01895"}, - {file = "tzfpy-0.15.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d46f9fa330d78d0bf91524ef22adf1b1fbb9c9d48db20e51e7d58912e1a0307"}, - {file = "tzfpy-0.15.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7ae2f7a2cb7cb27d11f491e89f6b9a7b26ee631220a65831cf0802394935e6d"}, - {file = "tzfpy-0.15.3-pp310-pypy310_pp73-manylinux_2_24_armv7l.whl", hash = "sha256:c79c1c105ebddc4446eb18698d7427b5b46b4bc5b312affb9c785f9398523bca"}, - {file = "tzfpy-0.15.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e39dd484406b9560637c7a3fd537ca80ddd6017e7bd576568674fc577c0583fd"}, - {file = "tzfpy-0.15.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a360e2ee1e5866ee684f31512d7f4e202d68fb67d1ea50480649c645a5f46ab3"}, - {file = "tzfpy-0.15.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:700503a390ea1deadfa6dcab445dbdbabb021e94f291091611bb02ca36522677"}, - {file = "tzfpy-0.15.3-pp37-pypy37_pp73-manylinux_2_24_armv7l.whl", hash = "sha256:09b3de6648f899a1b39a4ae1df55195714550c08d949f4eb708ab59f39a00325"}, - {file = "tzfpy-0.15.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ceeb9384bfbf744b31a400c51d237d08c1ffc612be30326a92fb648ebe4268ac"}, - {file = "tzfpy-0.15.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d8ece4474fdff3e643ed4500c09fafdb6685b96245dd0800fd20a074526c42"}, - {file = "tzfpy-0.15.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915e5d7911d08009f147a82580eaff1660a9e4493767f036459d66c4eb6f59b"}, - {file = "tzfpy-0.15.3-pp38-pypy38_pp73-manylinux_2_24_armv7l.whl", hash = "sha256:8ac3fdf808c36b5a26935d4609025f9c6ee46554447efa6f4085d96457134081"}, - {file = "tzfpy-0.15.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:8e0c6abc9e7553285daff41eecc89eff36bb0d423564b65ea2207cf7255f7310"}, - {file = "tzfpy-0.15.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e07fc29cf2772a9529d8e0fc751ce8510a777f9be296e7eb120319d3bd9347"}, - {file = "tzfpy-0.15.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd62c862607e80c7e1d8d8026894888e86b986e3d5bed1d038e83cc7d47e8aad"}, - {file = "tzfpy-0.15.3-pp39-pypy39_pp73-manylinux_2_24_armv7l.whl", hash = "sha256:e37172732501e8d278c9906e679dfef7809708a672710a4f9c71de38c108fa35"}, - {file = "tzfpy-0.15.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3300630ebc378606ff3e0e3fa627a390a87a13898245f14c2faafdfbf3974b57"}, + {file = "tzfpy-0.15.4-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:699fdd7c136ad5f4395e262d643cedba55f15ba415870284daccd06d0b43afc7"}, + {file = "tzfpy-0.15.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85addde75ef67e7360747943c789ee5b40171372c654014195c493d70eb275d6"}, + {file = "tzfpy-0.15.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8e0b2096ee075674b6f3938339c1f224db99e85526446e61298f0578e18e41"}, + {file = "tzfpy-0.15.4-cp310-cp310-manylinux_2_24_armv7l.whl", hash = "sha256:c4915a8802c1a1eeb48e98b4f01c57afb0430cb2049171a1ba87ab24885d910d"}, + {file = "tzfpy-0.15.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c2d4af2a0c9a3b7fbcfa87c2f71a6ea9519dbc10806a813af9dca6dd2d919961"}, + {file = "tzfpy-0.15.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1254d3350e22f53e626faa5c8bf8b0b494c1038d7e16122840c6bf73dca9dd4"}, + {file = "tzfpy-0.15.4-cp310-none-win_amd64.whl", hash = "sha256:04286bd080210d5a8700344387cc4596f522a1957befaf657aee6063f2b832ad"}, + {file = "tzfpy-0.15.4-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cdb820af771fdf593d7dc761f47d4276a02a175ac2d01a9946c91056f8fe6a38"}, + {file = "tzfpy-0.15.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f477c1b50a8a890d4ce86cc55dcef3c5805bb83966690ff507c9e8f15806f8de"}, + {file = "tzfpy-0.15.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b35de2447b36545ad78e5b7093120fca27690486dbf6a589ad292db9b419f951"}, + {file = "tzfpy-0.15.4-cp311-cp311-manylinux_2_24_armv7l.whl", hash = "sha256:87e2c85c55a310449f7bf870b7c214f830b7550f814b2301207f58403a6862c3"}, + {file = "tzfpy-0.15.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2f135b20f5e7e214c247df20a0c1c1dbf62155c70d0bfc1ebbb788a954ab8e3"}, + {file = "tzfpy-0.15.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2712be3893868e47f11b20aa0b05cb193a8523c93aac182816b7a48c394179ea"}, + {file = "tzfpy-0.15.4-cp311-none-win_amd64.whl", hash = "sha256:253b10fd77630e111de4efae4d9f83b2bf84d754083101e4aa38f63cdd902530"}, + {file = "tzfpy-0.15.4-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:01cb5928806ca0fe0da5d345c91d2a607ae8b1b91e41135c903c678f45820ab0"}, + {file = "tzfpy-0.15.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c3106dc01bb73837f0928d040a1458584cab4543e7bf8dce7f0d12a4bbae9d5"}, + {file = "tzfpy-0.15.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a55dbaee78299e569ac3b524afe9f82576096c90cb11315b27c14b410bd943"}, + {file = "tzfpy-0.15.4-cp312-cp312-manylinux_2_24_armv7l.whl", hash = "sha256:22b5a0845a4bebf2a257cfb7648ab7e32d5bc7e3255e459e0aa55ca78a3a63d4"}, + {file = "tzfpy-0.15.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8e7000cf710bb7193f3f2ce57d2a9bc0623ef5799551f2541244ac8c9ac6a9ea"}, + {file = "tzfpy-0.15.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eca50f905b622f557027a3c2b67cd5b1d7cb70a45f5ea36ebf26bbba2b2017f6"}, + {file = "tzfpy-0.15.4-cp312-none-win_amd64.whl", hash = "sha256:3d5e122705f7924dec6e019d21c2646a6cfb12dba5544ccb3ef6cbfe58bb7e94"}, + {file = "tzfpy-0.15.4-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:160bb4fc29f36e0eed534ed56b9ad3eba8ff58b50416b4d3a654cd59931216e1"}, + {file = "tzfpy-0.15.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f5cfaa27209256d1fa16213536bdc57899ea17d4d5bc3da5c52ea5601078f4a"}, + {file = "tzfpy-0.15.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cb17837ab15d06d76252bfdc82682bf16acd22f87f4ff16f3a7142b932d7c26"}, + {file = "tzfpy-0.15.4-cp38-cp38-manylinux_2_24_armv7l.whl", hash = "sha256:71ff302bc823ef9a57c23826eeaba3e5d5c5f3814401096c2c784daffdf805ba"}, + {file = "tzfpy-0.15.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:89059e1506fdd462ba4703c0dfe3b5e43cf2352956de7668ee1febb74517c5b9"}, + {file = "tzfpy-0.15.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ee901f1ff40dd3e7df38f5e96192e70c489a6c845b379942718a80c30c4c85d9"}, + {file = "tzfpy-0.15.4-cp38-none-win_amd64.whl", hash = "sha256:950d47b5c83e1d4718233c28b2ef0960b8f23c4a33efc94eadedf10aaf5077fc"}, + {file = "tzfpy-0.15.4-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4ca74d183eb317de6a9c322b6c4a03b4bc73311ccf22b78a7d46bde739f2a127"}, + {file = "tzfpy-0.15.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80cfe48ff795ddcb64e3e07b9ab7007260a3efe0cfd89b4446be6da5ab721b21"}, + {file = "tzfpy-0.15.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b5e19e41b0463d4906763ab4645085986ef94fabb42cc3fa66c3d39491c76b"}, + {file = "tzfpy-0.15.4-cp39-cp39-manylinux_2_24_armv7l.whl", hash = "sha256:47870c5a4a49b6482a0d12596782a8afac4024fe1b9932b074200ecd533376ab"}, + {file = "tzfpy-0.15.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:70267ce01fc503aa804bb8e07c3b4041cdc5c86a4091fe77c930cd82cd5407f5"}, + {file = "tzfpy-0.15.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c95f4a42f5419c73a9ca6a5376193f1625c02fa7d3a4fc57c7f4dbc08669393d"}, + {file = "tzfpy-0.15.4-cp39-none-win_amd64.whl", hash = "sha256:dc67d5a1910cf1318d57bd4dddd8c7ce71349862128e73e71e7aa21b17b03b0f"}, + {file = "tzfpy-0.15.4.tar.gz", hash = "sha256:e64123e1886ec24f85338a97eee7f29d335608475ccc05d576b0c11de1b4f382"}, ] [package.extras] @@ -6575,38 +6226,19 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "1.26.18" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] -[package.dependencies] -certifi = {version = "*", optional = true, markers = "extra == \"secure\""} -cryptography = {version = ">=1.3.4", optional = true, markers = "extra == \"secure\""} -idna = {version = ">=2.0.0", optional = true, markers = "extra == \"secure\""} -pyOpenSSL = {version = ">=0.14", optional = true, markers = "extra == \"secure\""} -PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} -urllib3-secure-extra = {version = "*", optional = true, markers = "extra == \"secure\""} - [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "urllib3-secure-extra" -version = "0.1.0" -description = "Marker library to detect whether urllib3 was installed with the deprecated [secure] extra" -optional = false -python-versions = "*" -files = [ - {file = "urllib3-secure-extra-0.1.0.tar.gz", hash = "sha256:ee9409cbfeb4b8609047be4c32fb4317870c602767e53fd8a41005ebe6a41dff"}, - {file = "urllib3_secure_extra-0.1.0-py2.py3-none-any.whl", hash = "sha256:f7adcb108b4d12a4b26b99eb60e265d087f435052a76aefa396b6ee85e9a6ef9"}, -] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "utm" @@ -6620,13 +6252,13 @@ files = [ [[package]] name = "uvicorn" -version = "0.28.0" +version = "0.29.0" description = "The lightning-fast ASGI server." optional = true python-versions = ">=3.8" files = [ - {file = "uvicorn-0.28.0-py3-none-any.whl", hash = "sha256:6623abbbe6176204a4226e67607b4d52cc60ff62cda0ff177613645cefa2ece1"}, - {file = "uvicorn-0.28.0.tar.gz", hash = "sha256:cab4473b5d1eaeb5a0f6375ac4bc85007ffc75c3cc1768816d9e5d589857b067"}, + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, ] [package.dependencies] @@ -6675,21 +6307,6 @@ develop = ["black (<23)", "mypy (==1.6.0)", "poethepoet (<1)", "pyproject-fmt (< release = ["build (<2)", "twine (<5)"] test = ["pretend (<2)", "pytest (<8)", "pytest-cov (<5)"] -[[package]] -name = "waitress" -version = "3.0.0" -description = "Waitress WSGI server" -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "waitress-3.0.0-py3-none-any.whl", hash = "sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669"}, - {file = "waitress-3.0.0.tar.gz", hash = "sha256:005da479b04134cdd9dd602d1ee7c49d79de0537610d653674cc6cbde222b8a1"}, -] - -[package.extras] -docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] -testing = ["coverage (>=5.0)", "pytest", "pytest-cov"] - [[package]] name = "watchdog" version = "4.0.0" @@ -6757,22 +6374,6 @@ files = [ docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] tests = ["pytest", "pytest-cov"] -[[package]] -name = "webdriver-manager" -version = "4.0.1" -description = "Library provides the way to automatically manage drivers for different browsers" -optional = false -python-versions = ">=3.7" -files = [ - {file = "webdriver_manager-4.0.1-py2.py3-none-any.whl", hash = "sha256:d7970052295bb9cda2c1a24cf0b872dd2c41ababcc78f7b6b8dc37a41e979a7e"}, - {file = "webdriver_manager-4.0.1.tar.gz", hash = "sha256:25ec177c6a2ce9c02fb8046f1b2732701a9418d6a977967bb065d840a3175d87"}, -] - -[package.dependencies] -packaging = "*" -python-dotenv = "*" -requests = "*" - [[package]] name = "webencodings" version = "0.5.1" @@ -6800,23 +6401,6 @@ docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] -[[package]] -name = "werkzeug" -version = "3.0.1" -description = "The comprehensive WSGI web application library." -optional = false -python-versions = ">=3.8" -files = [ - {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, - {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, -] - -[package.dependencies] -MarkupSafe = ">=2.1.1" - -[package.extras] -watchdog = ["watchdog (>=2.3)"] - [[package]] name = "widgetsnbextension" version = "4.0.10" @@ -6931,20 +6515,6 @@ files = [ {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] -[[package]] -name = "wsproto" -version = "1.2.0" -description = "WebSockets state-machine based protocol implementation" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, - {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, -] - -[package.dependencies] -h11 = ">=0.9.0,<1" - [[package]] name = "xarray" version = "2024.2.0" @@ -7170,18 +6740,18 @@ jupyter = ["ipytree (>=0.2.2)", "ipywidgets (>=8.0.0)", "notebook"] [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] bufr = ["pdbufr"] @@ -7189,7 +6759,7 @@ cratedb = ["crate", "pandas"] duckdb = ["duckdb", "pandas"] eccodes = ["eccodes"] excel = ["xlsxwriter"] -explorer = ["dash", "dash-bootstrap-components", "dash-leaflet", "geojson", "plotly"] +explorer = ["duckdb", "plotly", "statsmodels", "streamlit"] export = ["pandas", "sqlalchemy", "xarray", "xlsxwriter", "zarr"] import = ["xlsx2csv"] influxdb = ["influxdb", "influxdb-client", "influxdb3-python"] @@ -7202,9 +6772,8 @@ radar = ["h5py"] radarplus = ["wradlib", "xradar"] restapi = ["fastapi", "httpx", "uvicorn"] sql = ["duckdb"] -streamlit = ["streamlit"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "56551f736a956ee6de5c71f667a831b4f140a65657ba79ec8a6003c5763bca9f" +content-hash = "0a4d2eb7054412323f5446cfd24ed116e33a1ef563160fcb81c74c5bced31e46" diff --git a/pyproject.toml b/pyproject.toml index f94d35f5e..1ffc32116 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -127,13 +127,9 @@ tqdm = ">=4,<5" tzfpy = ">=0.15.2,<1" crate = { version = ">=0.30.1,<1", optional = true } # Export feature. -dash = { version = ">=2.10,<2.16", optional = true } # Explorer UI feature. -dash-bootstrap-components = { version = ">=1.4,<2", optional = true } # Explorer UI feature. -dash-leaflet = { version = ">=1.0.8,<2", optional = true } # Explorer UI feature. -duckdb = { version = ">=0.9", optional = true } # Export feature. +duckdb = { version = ">=0.9", optional = true } # Export feature, Explorer UI feature. eccodes = { version = ">=1.5.2,<1.7", optional = true } fastapi = { version = ">=0.95.1,<0.111", optional = true } # HTTP REST API feature. -geojson = { version = ">=3,<4", optional = true } # Explorer UI feature. httpx = { version = ">=0.24,<0.28", optional = true} h5py = { version = ">=3.1,<4", optional = true } # Radar feature. influxdb = { version = ">=5.3,<6", optional = true } # Export feature. @@ -148,7 +144,8 @@ psycopg2-binary = { version = ">=2.8,<3", optional = true } # E scipy = { version = ">=1.9,<1.13", optional = true } # Interpolation feature. shapely = { version = ">=2,<3", optional = true } # Interpolation feature. sqlalchemy = { version = ">=2,<2.1", optional = true } # Export feature. -streamlit = { version = ">=1.27,<2", optional = true, markers = "python_version != '3.9.7'" } # Streamlit app +statsmodels = { version = ">=0.14.1", optional = true } # Explorer UI feature. +streamlit = { version = ">=1.27,<2", optional = true, markers = "python_version != '3.9.7'" } # Explorer UI feature. utm = { version = ">=0.7,<1", optional = true } # Interpolation feature. uvicorn = { version = ">=0.14,<1", optional = true } # HTTP REST API feature. wradlib = { version = ">=2.0.1,<3", optional = true } # Radar feature. @@ -173,7 +170,6 @@ optional = true [tool.poetry.group.test.dependencies] coverage = { version = ">=7.3,<8", extras = ["toml"] } -dash = { version = ">=2.10,<2.16", extras = ["testing"] } dirty-equals = ">=0.5.0,<1" freezegun = ">=1.2,<2" h5py = { version = ">=3.1,<3.11", optional = true} @@ -188,9 +184,7 @@ pytest-dictsdiff = ">=0.5,<0.6" pytest-notebook = ">=0.10" pytest-rerunfailures = "<14" pytest-xdist = ">=3,<4" -selenium = ">=4,<5" surrogate = "==0.1" -webdriver-manager = ">=4,<5" [tool.poetry.group.docs] optional = true @@ -213,7 +207,7 @@ cratedb = ["pandas", "crate"] duckdb = ["pandas", "duckdb"] eccodes = ["eccodes"] excel = ["xlsxwriter"] -explorer = ["dash", "dash-bootstrap-components", "dash-leaflet", "geojson", "plotly"] +explorer = ["duckdb", "statsmodels", "streamlit", "plotly"] export = ["pandas", "sqlalchemy", "xarray", "xlsxwriter", "zarr"] import = ["xlsx2csv"] influxdb = ["influxdb", "influxdb-client", "influxdb3-python"] @@ -226,7 +220,6 @@ radar = ["h5py"] radarplus = ["pybufrkit", "wradlib", "xradar"] restapi = ["fastapi", "httpx", "uvicorn"] sql = ["duckdb"] -streamlit = ["streamlit"] [tool.poetry.scripts] wetterdienst = 'wetterdienst.ui.cli:cli' @@ -290,7 +283,7 @@ unfixable = ["ERA", "F401", "F841", "T20", "ERA001"] "wetterdienst/ui/restapi.py" = ["B008", "UP007"] [tool.pytest.ini_options] -addopts = "-rsfEX -p pytester --strict-markers --verbosity=3 --webdriver=Firefox --headless" +addopts = "-rsfEX -p pytester --strict-markers --verbosity=3" #log_cli = true #log_cli_level = "DEBUG" log_date_format = "%Y-%m-%dT%H:%M:%S" @@ -350,7 +343,6 @@ coverage = "pytest --cov=wetterdienst" coverage-parallel = "pytest --cov=wetterdienst --numprocesses=auto -m 'not (explorer or cflake)'" update = "poetry update" citation = "python -m tools.citation" -streamlit = "streamlit run ./wetterdienst/ui/streamlit/app.py" [build-system] build-backend = "poetry.core.masonry.api" diff --git a/tests/ui/explorer/__init__.py b/tests/ui/explorer/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/ui/explorer/conftest.py b/tests/ui/explorer/conftest.py deleted file mode 100644 index be6503a1c..000000000 --- a/tests/ui/explorer/conftest.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) 2018-2022, earthobservations developers. -# Distributed under the MIT License. See LICENSE for more info. -import pytest -from dash.testing.application_runners import import_app -from dash.testing.composite import DashComposite -from selenium.webdriver.common.by import By -from selenium.webdriver.support import expected_conditions as EC - - -@pytest.fixture -def dash_tre(request, dash_thread_server, tmpdir): - with DashCompositePlus( - dash_thread_server, - browser=request.config.getoption("webdriver"), - remote=request.config.getoption("remote"), - remote_url=request.config.getoption("remote_url"), - headless=request.config.getoption("headless"), - options=request.config.hook.pytest_setup_options(), - download_path=tmpdir.mkdir("download").strpath, - percy_assets_root=request.config.getoption("percy_assets"), - percy_finalize=request.config.getoption("nopercyfinalize"), - pause=request.config.getoption("pause"), - wait_timeout=30, - ) as dc: - yield dc - - -class DashCompositePlus(DashComposite): - """ - Improve vanilla library with some convenience event handlers. - """ - - def wait_for_element_by_id_clickable(self, element_id, timeout=None): - """ - Explicit wait until the element is clickable. - - Derived from `dash.testing.browser::wait_for_element_by_id()` and - https://stackoverflow.com/q/56085152. - """ - return self._wait_for( - EC.element_to_be_clickable, - ((By.ID, element_id),), - timeout, - f"timeout {timeout if timeout else self._wait_timeout}s => waiting for element id {element_id}", - ) - - -@pytest.fixture(scope="function") -def wetterdienst_ui(dash_tre): - # Import Dash application in testing mode. - app = import_app("wetterdienst.ui.explorer.app") - # Start testing server and wait until page is loaded. - dash_tre.start_server(app) - dash_tre.wait_for_page(timeout=10) diff --git a/tests/ui/explorer/test_explorer.py b/tests/ui/explorer/test_explorer.py deleted file mode 100644 index b18ecfdf4..000000000 --- a/tests/ui/explorer/test_explorer.py +++ /dev/null @@ -1,286 +0,0 @@ -# Copyright (C) 2018-2021, earthobservations developers. -# Distributed under the MIT License. See LICENSE for more info. -""" -Setup:: - - brew install geckodriver - -Run tests:: - - pytest -vvvv --webdriver Firefox -k test_ui --capture=no - -Documentation: - -- https://dash.plotly.com/testing#browser-apis -- https://dash.plotly.com/testing#dash-apis - -""" - -import json -import platform -import time -from typing import TYPE_CHECKING - -import pytest - -from tests.conftest import IS_CI - -if TYPE_CHECKING: - from bs4 import BeautifulSoup - - -@pytest.mark.skipif(platform.system() == "Darwin" and platform.machine() == "arm64", reason="problem with geckodriver") -@pytest.mark.slow -@pytest.mark.cflake -@pytest.mark.explorer -def test_app_layout( - wetterdienst_ui, # noqa: ARG001 - dash_tre, -): - # Sanity check if we are on the right page. - assert dash_tre.find_element("h1").text == "Wetterdienst Explorer" - # Roughly verify the application elements. - assert dash_tre.find_element("#navigation") - assert dash_tre.find_element("#map") - assert dash_tre.find_element("#graph") - - -@pytest.mark.xfail -@pytest.mark.slow -@pytest.mark.cflake -@pytest.mark.explorer -def test_app_data_stations_success( - wetterdienst_ui, # noqa: ARG001 - dash_tre, -): - """ - Verify if data for "stations_result" has been correctly propagated. - """ - # Select provider. - dash_tre.wait_for_element_by_id("select-provider") - dash_tre.select_dcc_dropdown("#select-provider", value="DWD") - time.sleep(0.5) - # Select network. - dash_tre.wait_for_element_by_id("select-network") - dash_tre.select_dcc_dropdown("#select-network", value="OBSERVATION") - time.sleep(0.5) - # Select resolution. - dash_tre.wait_for_element_by_id("select-resolution") - dash_tre.select_dcc_dropdown("#select-resolution", value="DAILY") - time.sleep(0.5) - # Select dataset. - dash_tre.wait_for_element_by_id("select-dataset") - dash_tre.select_dcc_dropdown("#select-dataset", value="CLIMATE_SUMMARY") - time.sleep(0.5) - # Select parameter. - dash_tre.wait_for_element_by_id("select-parameter") - dash_tre.select_dcc_dropdown("#select-parameter", value="PRECIPITATION_HEIGHT") - time.sleep(0.5) - # Select period. - dash_tre.wait_for_element_by_id("select-period") - dash_tre.select_dcc_dropdown("#select-period", value="ALL") - time.sleep(0.5) - # Wait for data element. - dash_tre.wait_for_element_by_id("dataframe-stations_result", timeout=5) - time.sleep(1) - # Read payload from data element. - dom: BeautifulSoup = dash_tre.dash_innerhtml_dom - data_element = dom.find(attrs={"id": "dataframe-stations_result"}) - data = json.loads(data_element.text) - # Verify data. - assert data["columns"] == [ - "station_id", - "start_date", - "end_date", - "latitude", - "longitude", - "height", - "name", - "state", - ] - assert len(data["data"]) >= 511 - - -@pytest.mark.xfail -@pytest.mark.slow -@pytest.mark.cflake -@pytest.mark.explorer -def test_app_data_stations_failed( - wetterdienst_ui, # noqa: ARG001 - dash_tre, -): - """ - Verify if data for "stations_result" has been correctly propagated. - """ - # Select provider. - dash_tre.wait_for_element_by_id("select-provider") - dash_tre.select_dcc_dropdown("#select-provider", value="DWD") - time.sleep(0.5) - # Select network. - dash_tre.wait_for_element_by_id("select-network") - dash_tre.select_dcc_dropdown("#select-network", value="OBSERVATION") - time.sleep(0.5) - # Select resolution. - dash_tre.wait_for_element_by_id("select-resolution") - dash_tre.select_dcc_dropdown("#select-resolution", value="DAILY") - time.sleep(0.5) - # Select dataset. - dash_tre.wait_for_element_by_id("select-dataset") - dash_tre.select_dcc_dropdown("#select-dataset", value="CLIMATE_SUMMARY") - time.sleep(0.5) - # Select parameter. - dash_tre.wait_for_element_by_id("select-parameter") - dash_tre.select_dcc_dropdown("#select-parameter", value="PRECIPITATION_HEIGHT") - time.sleep(0.5) - # Select period. - dash_tre.wait_for_element_by_id("select-period") - dash_tre.select_dcc_dropdown("#select-period", value="NOW") - time.sleep(0.5) - # Wait for data element. - dash_tre.wait_for_element_by_id("dataframe-stations_result", timeout=5) - # Wait for status element. - dash_tre.wait_for_contains_text("#status-response-stations_result", "No data", timeout=2) - dash_tre.wait_for_contains_text("#status-response-values", "No data", timeout=2) - - -@pytest.mark.xfail -@pytest.mark.slow -@pytest.mark.cflake -@pytest.mark.explorer -def test_options_reset( - wetterdienst_ui, # noqa: ARG001 - dash_tre, -): - """ - Verify if data for "stations_result" has been correctly propagated. - """ - # Select provider. - dash_tre.wait_for_element_by_id("select-provider") - dash_tre.select_dcc_dropdown("#select-provider", value="DWD") - time.sleep(0.5) - # Select network. - dash_tre.wait_for_element_by_id("select-network") - dash_tre.select_dcc_dropdown("#select-network", value="OBSERVATION") - time.sleep(0.5) - # Select resolution. - dash_tre.wait_for_element_by_id("select-resolution") - dash_tre.select_dcc_dropdown("#select-resolution", value="DAILY") - time.sleep(0.5) - # Select dataset. - dash_tre.wait_for_element_by_id("select-dataset") - dash_tre.select_dcc_dropdown("#select-dataset", value="CLIMATE_SUMMARY") - time.sleep(0.5) - # Select parameter. - dash_tre.wait_for_element_by_id("select-parameter") - dash_tre.select_dcc_dropdown("#select-parameter", value="PRECIPITATION_HEIGHT") - time.sleep(0.5) - # Select period. - dash_tre.wait_for_element_by_id("select-period") - dash_tre.select_dcc_dropdown("#select-period", value="HISTORICAL") - time.sleep(0.5) - # Set another provider - dash_tre.wait_for_element_by_id("select-provider") - dash_tre.select_dcc_dropdown("#select-provider", value="ECCC") - time.sleep(0.5) - # Check other options for reset - dash_tre.wait_for_contains_text("#select-network", "") - dash_tre.wait_for_contains_text("#select-resolution", "") - dash_tre.wait_for_contains_text("#select-dataset", "") - dash_tre.wait_for_contains_text("#select-parameter", "") - dash_tre.wait_for_contains_text("#select-period", "") - - -@pytest.mark.skipif(IS_CI, reason="times out") -@pytest.mark.xfail -@pytest.mark.slow -@pytest.mark.cflake -@pytest.mark.explorer -def test_app_data_values( - wetterdienst_ui, # noqa: ARG001 - dash_tre, -): - """ - Verify if data for "values" has been correctly propagated. - """ - # Select provider. - dash_tre.wait_for_element_by_id("select-provider") - dash_tre.select_dcc_dropdown("#select-provider", value="DWD") - time.sleep(0.5) - # Select network. - dash_tre.wait_for_element_by_id("select-network") - dash_tre.select_dcc_dropdown("#select-network", value="OBSERVATION") - time.sleep(0.5) - # Select resolution. - dash_tre.wait_for_element_by_id("select-resolution") - dash_tre.select_dcc_dropdown("#select-resolution", value="HOURLY") - time.sleep(0.5) - # Select dataset. - dash_tre.wait_for_element_by_id("select-dataset") - dash_tre.select_dcc_dropdown("#select-dataset", value="TEMPERATURE_AIR") - time.sleep(0.5) - # Select parameter. - dash_tre.wait_for_element_by_id("select-parameter") - dash_tre.select_dcc_dropdown("#select-parameter", value="TEMPERATURE_AIR_MEAN_200") - time.sleep(0.5) - # Select period. - dash_tre.wait_for_element_by_id("select-period") - dash_tre.select_dcc_dropdown("#select-period", value="RECENT") - time.sleep(0.5) - # Select weather station. - dash_tre.wait_for_element_by_id("select-station") - dash_tre.select_dcc_dropdown("#select-station", value="Anklam") - time.sleep(0.5) - # Wait for data element. - dash_tre.wait_for_element_by_id("dataframe-values") - time.sleep(0.5) - # Wait for status element. - dash_tre.wait_for_contains_text("#status-response", "Records") - dash_tre.wait_for_contains_text("#status-response", "Begin date") - time.sleep(0.5) - # Read payload from data element. - dom: BeautifulSoup = dash_tre.dash_innerhtml_dom - data_element = dom.find(attrs={"id": "dataframe-values"}) - data = json.loads(data_element.text) - # Verify data. - assert data["values"]["columns"] == ["station_id", "dataset", "parameter", "date", "value", "quality"] - assert len(data["values"]["data"]) > 13000 - - -@pytest.mark.xfail -@pytest.mark.slow -@pytest.mark.cflake -@pytest.mark.explorer -def test_dwd_mosmix_options( - wetterdienst_ui, # noqa: ARG001 - dash_tre, - is_ci, -): - """ - Verify if data for "values" has been correctly propagated. - """ - if is_ci: - pytest.skip(reason="times out") - # Select provider. - dash_tre.wait_for_element_by_id("select-provider") - dash_tre.select_dcc_dropdown("#select-provider", value="DWD") - time.sleep(0.5) - # Select network. - dash_tre.wait_for_element_by_id("select-network") - dash_tre.select_dcc_dropdown("#select-network", value="MOSMIX") - time.sleep(0.5) - # Select resolution. - dash_tre.wait_for_element_by_id("select-resolution") - dash_tre.select_dcc_dropdown("#select-resolution", value="SMALL") - time.sleep(0.5) - # Select dataset. - dash_tre.wait_for_element_by_id("select-dataset") - dash_tre.select_dcc_dropdown("#select-dataset", value="SMALL") - time.sleep(0.5) - # Select parameter. - dash_tre.wait_for_element_by_id("select-parameter") - dash_tre.select_dcc_dropdown("#select-parameter", value="TEMPERATURE_AIR_MEAN_200") - time.sleep(0.5) - # Select period. - dash_tre.wait_for_element_by_id("select-period") - dash_tre.select_dcc_dropdown("#select-period", value="FUTURE") - time.sleep(0.5) diff --git a/wetterdienst/core/timeseries/request.py b/wetterdienst/core/timeseries/request.py index 5aa235a0d..ea4d9a117 100644 --- a/wetterdienst/core/timeseries/request.py +++ b/wetterdienst/core/timeseries/request.py @@ -541,11 +541,16 @@ def discover(cls, resolution=None, dataset=None, flatten: bool = True, with_unit return parameters - datasets_filter = ( - [parse_enumeration_from_template(ds, intermediate=cls._dataset_base) for ds in to_list(dataset)] - if dataset - else cls._dataset_base - ) + has_datasets = cls._has_datasets + + if dataset: + datasets_filter = [ + parse_enumeration_from_template(ds, intermediate=cls._dataset_base) for ds in to_list(dataset) + ] + elif has_datasets: + datasets_filter = cls._dataset_base + else: + datasets_filter = cls._resolution_base datasets_filter = [ds.name for ds in datasets_filter] diff --git a/wetterdienst/ui/cli.py b/wetterdienst/ui/cli.py index f7f4cf81e..d645a8885 100644 --- a/wetterdienst/ui/cli.py +++ b/wetterdienst/ui/cli.py @@ -5,6 +5,7 @@ import functools import json import logging +import subprocess import sys from collections import OrderedDict from pprint import pformat @@ -594,18 +595,30 @@ def restapi(listen: str, reload: bool, debug: bool): @cli.command("explorer", section=advanced_section) -@cloup.option("--listen", type=click.STRING, default=None, help="HTTP server listen address") -@cloup.option("--reload", is_flag=True, help="Dynamically reload changed files") @debug_opt -def explorer(listen: str, reload: bool, debug: bool): +def explorer(debug: bool): set_logging_level(debug) + try: + from wetterdienst.ui import explorer # noqa: F401 + except ImportError: + log.error("Please install the explorer extras with 'pip install wetterdienst[explorer]'") + sys.exit(1) + log.info(f"Starting {appname}") - log.info(f"Starting Explorer web service on http://{listen}") - from wetterdienst.ui.explorer.app import start_service + log.info("Starting Explorer web service on http://localhost:8501") - start_service(listen, reload=reload) - return + process = None + try: + process = subprocess.Popen(["streamlit", "run", "wetterdienst/ui/explorer.py"]) # noqa: S603, S607 + process.wait() + except KeyboardInterrupt: + log.info("Stopping Explorer web service") + except Exception as e: + log.error(f"An error occurred: {str(e)}") + finally: + if process is not None: + process.terminate() @cli.group(section=data_section) diff --git a/wetterdienst/ui/explorer.py b/wetterdienst/ui/explorer.py new file mode 100644 index 000000000..c3fe9999e --- /dev/null +++ b/wetterdienst/ui/explorer.py @@ -0,0 +1,281 @@ +# Copyright (C) 2018-2023, earthobservations developers. +# Distributed under the MIT License. See LICENSE for more info. +from __future__ import annotations + +import json + +import duckdb +import plotly.express as px +import polars as pl +import streamlit as st + +from wetterdienst import Settings, Wetterdienst, __version__ +from wetterdienst.api import RequestRegistry +from wetterdienst.metadata.period import PeriodType + +SQL_DEFAULT = """ +SELECT * +FROM df +WHERE value IS NOT NULL +""".strip() + + +@st.cache_data +def get_stations(provider: str, network: str, request_kwargs: dict): + request_kwargs = request_kwargs.copy() + request_kwargs["settings"] = Settings(**request_kwargs["settings"]) + return Wetterdienst(provider, network)(**request_kwargs).all() + + +@st.cache_data +def get_station(provider: str, network: str, request_kwargs: dict, station_id: str): + request_kwargs = request_kwargs.copy() + request_kwargs["settings"] = Settings(**request_kwargs["settings"]) + return Wetterdienst(provider, network)(**request_kwargs).filter_by_station_id(station_id) + + +@st.cache_data +def get_values(provider: str, network: str, request_kwargs: dict, station_id: str): + request_kwargs = request_kwargs.copy() + settings = Settings(**request_kwargs["settings"]) + request_kwargs["settings"] = settings + request_station = get_station(provider, network, request_kwargs, station_id) + units = request_station.discover("daily", "climate_summary")["daily"] + units = {parameter: (unit["si"] if settings.ts_si_units else unit["origin"]) for parameter, unit in units.items()} + values = request_station.values.all().df + return values.with_columns(pl.col("parameter").replace(units).alias("unit")) + + +def create_plotly_fig( + df: pl.DataFrame, + variable_column: str, + variable_filter: list[str], + x: str, + y: str, + facet: bool, + lm: str | None, + settings: dict, +): + if "unit" in df.columns: + df = df.with_columns( + pl.struct(["parameter", "unit"]) + .map_elements(lambda s: f"{s['parameter']} ({s['unit']})") + .alias("parameter"), + ) + fig = px.scatter( + x=df.get_column(x).to_list(), + y=df.get_column(y).to_list(), + color=df.get_column(variable_column).to_list(), + facet_row=df.get_column(variable_column).to_list() if facet else None, + trendline=lm, + ) + fig.update_traces( + marker={"opacity": settings["opacity"], "symbol": settings["symbol"], "size": settings["size"]}, + ) + fig.update_layout( + legend={"x": 0, "y": 1.08}, + height=400 * len(variable_filter), # plot height times parameters + xaxis_title="date", + yaxis_title="value", + ) + fig.update_yaxes(matches=None) + # Update y-axis titles to use facet labels and remove subplot titles + for i, annotation in enumerate(fig.layout.annotations): + axis_name = f"yaxis{i + 1}" + if axis_name in fig.layout: + fig.layout[axis_name].title.text = annotation.text + annotation.text = "" + return fig + + +title = f"Wetterdienst Explorer v{__version__}" +st.set_page_config(page_title=title) +st.title(title) + +with st.sidebar: + st.header("Settings") + + st.subheader("General") + ts_humanize = st.checkbox("humanize", value=True) + ts_si_units = st.checkbox("si_units", value=True) + settings = {"ts_humanize": ts_humanize, "ts_si_units": ts_si_units} + + st.subheader("Plotting") + + marker_size = st.slider("marker size", min_value=1, max_value=8, value=2) + opacity = st.slider("opacity", min_value=0.0, max_value=1.0, value=1.0) + marker_symbol = st.selectbox("marker symbol", options=["circle", "square", "diamond", "cross", "x"]) + plotting_settings = {"opacity": opacity, "symbol": marker_symbol, "size": marker_size} + +st.subheader("Introduction") +st.markdown( + """ + This is a streamlit app based on the [wetterdienst](https://github.com/earthobservations/wetterdienst) + library that enables the user to analyze meteorological and hydrological data by the + [Deutscher Wetterdienst](https://www.dwd.de/) and others. You can select any of the stations (by station id or + name), download its data (as CSV or JSON) and get visualizations of it. Enjoy! + """, +) + +st.subheader("Request") +provider_options = [provider.name for provider in RequestRegistry] +provider = st.selectbox("Select provider", options=provider_options, index=provider_options.index("DWD")) +network_options = RequestRegistry.get_network_names(provider) +network = st.selectbox( + "Select network", + options=network_options, + index=network_options.index("OBSERVATION") if "OBSERVATION" in network_options else 0, +) + +api = Wetterdienst(provider, network) + +resolution_options = list(api.discover().keys()) +resolution = st.selectbox( + "Select resolution", + options=resolution_options, + index=resolution_options.index("daily") if "daily" in resolution_options else 0, +) +dataset_options = list(api.discover(flatten=False)[resolution].keys()) +dataset = st.selectbox( + "Select dataset", + options=dataset_options, + index=dataset_options.index("climate_summary") if "climate_summary" in dataset_options else 0, +) +parameter_options = list(api.discover(flatten=False)[resolution][dataset].keys()) +parameter_options = [dataset] + parameter_options +parameter = st.selectbox("Select parameter", options=parameter_options, index=0) + +if api._period_type == PeriodType.FIXED: + period = list(api._period_base)[0] + period_options = [period.name] +else: + period_options = [] + for period in api._period_base: + period_options.append(period.name) +period = st.multiselect( + "Select period", options=period_options, default=period_options, disabled=len(period_options) == 1 +) + +request_kwargs = { + "parameter": (parameter, dataset), + "resolution": resolution, + "settings": settings, +} +if api._period_type != PeriodType.FIXED: + request_kwargs["period"] = period + +df_stations = get_stations(provider, network, request_kwargs).df +with st.expander("Map of all stations", expanded=False): + st.map(df_stations, latitude="latitude", longitude="longitude") + +st.subheader("Station") +station = st.selectbox( + "Select climate station", + options=df_stations.sort("name").rows(named=True), + format_func=lambda s: f"{s['name']} [{s['station_id']}]", +) +df = pl.DataFrame() +if station: + request_station = get_station(provider, network, request_kwargs, station["station_id"]) + df = request_station.values.all().df + station["start_date"] = station["start_date"].isoformat() if station["start_date"] else None + station["end_date"] = station["end_date"].isoformat() if station["end_date"] else None + with st.expander("Station JSON", expanded=False): + st.json(json.dumps(station, indent=4, ensure_ascii=False)) + with st.expander("Map of selected station", expanded=False): + st.map(request_station.df, latitude="latitude", longitude="longitude") + +st.subheader("Values") +df_stats = ( + df.drop_nulls(["value"]) + .group_by(["parameter"]) + .agg(pl.count("value").alias("count"), pl.min("date").alias("min_date"), pl.max("date").alias("max_date")) +) +df_stats = df_stats.sort("parameter") +df_stats = df_stats.with_columns( + pl.col("min_date").map_elements(lambda d: d.isoformat()).alias("min_date"), + pl.col("max_date").map_elements(lambda d: d.isoformat()).alias("max_date"), +) +values_summary = df_stats.to_dicts() +with st.expander("Stats JSON", expanded=False): + st.json(json.dumps(values_summary, indent=4, ensure_ascii=False)) + +st.info( + """ + Use [duckdb](https://duckdb.org/docs/sql/introduction.html) sql queries to transform the data. + Important: + - use **FROM df** + - use single quotes for strings e.g. 'a_string' + """, +) +sql_query = st.text_area( + "sql query", + value=SQL_DEFAULT, +) +if station: + if sql_query: + df = duckdb.query(sql_query).pl() + st.dataframe(df, hide_index=True, use_container_width=True) + st.download_button("Download CSV", df.write_csv(), "data.csv", "text/csv") + st.download_button( + "Download JSON", + df.with_columns(pl.col("date").map_elements(lambda d: d.isoformat())).write_json( + pretty=True, + row_oriented=True, + ), + "data.json", + "text/json", + ) + +st.subheader("Plot") +plot_enable = not df.is_empty() + +with st.expander("settings", expanded=True): + columns = sorted(df.columns) + column_x = st.selectbox("Column X", options=columns, index="date" in columns and columns.index("date")) + columns = columns.copy() + columns.remove(column_x) + column_y = st.selectbox("Column Y", options=columns, index="value" in columns and columns.index("value")) + columns = columns.copy() + columns.remove(column_y) + variable_column = st.selectbox( + "Column Variable", + options=columns, + index="parameter" in columns and columns.index("parameter"), + ) + variable_options = df.get_column(variable_column).unique().sort().to_list() + variable_filter = st.multiselect("Variable Filter", options=variable_options) + df = df.filter(pl.col(variable_column).is_in(variable_filter)) + facet = st.toggle("facet") + lm = st.selectbox("linear model", options=["none", "lowess", "ols", "expanding"]) + lm = lm if lm != "none" else None + +if not plot_enable: + st.warning("No plot. Reason: empty DataFrame") +elif not variable_filter: + st.warning("No plot. Reason: empty variable filter") +else: + fig = create_plotly_fig(df, variable_column, variable_filter, column_x, column_y, facet, lm, plotting_settings) + st.plotly_chart(fig) + +st.subheader("Credits") +st.markdown( + """ + This app is powered by [wetterdienst](https://github.com/earthobservations/wetterdienst) from + [earthobservations](https://github.com/earthobservations) developers. + + Credits for the data go to + [Deutscher Wetterdienst](https://www.dwd.de) - Germany's national meteorological service - and + [others](https://wetterdienst.readthedocs.io/en/latest/data/coverage.html) for publishing their data as + **open data**. + + Credits also go to [streamlit](https://streamlit.io/) for hosting this + app. + + Special credits go to [Daniel Lassahn](https://github.com/meteoDaniel) who had originally started the idea of + creating an interactive dashboard on top of the wetterdienst library. + + If you have any issues or ideas regarding this app, please let us know in the + [issues](https://github.com/earthobservations/wetterdienst/issues) on Github. + """, +) diff --git a/wetterdienst/ui/explorer/__init__.py b/wetterdienst/ui/explorer/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/wetterdienst/ui/explorer/app.py b/wetterdienst/ui/explorer/app.py deleted file mode 100644 index e1a804192..000000000 --- a/wetterdienst/ui/explorer/app.py +++ /dev/null @@ -1,607 +0,0 @@ -# Copyright (C) 2018-2021, earthobservations developers. -# Distributed under the MIT License. See LICENSE for more info. -""" -Wetterdienst Explorer UI Dash application. -""" - -from __future__ import annotations - -import json -import logging - -import dash -import dash_bootstrap_components as dbc -import dash_leaflet as dl -import plotly.graph_objects as go -import polars as pl -from dash import Input, Output, State, dcc, html -from geojson import Feature, FeatureCollection, Point - -from wetterdienst.api import RequestRegistry -from wetterdienst.metadata.columns import Columns -from wetterdienst.metadata.period import PeriodType -from wetterdienst.provider.dwd.mosmix import DwdMosmixRequest, DwdMosmixType -from wetterdienst.ui.core import get_stations, get_values -from wetterdienst.ui.explorer.layout.main import get_app_layout -from wetterdienst.ui.explorer.library import default_figure -from wetterdienst.ui.explorer.util import frame_summary -from wetterdienst.util.cli import setup_logging - -log = logging.getLogger(__name__) - -# Create and configure Dash application object. -app = dash.Dash( - __name__, - meta_tags=[{"name": "viewport", "content": "width=device-width"}], - external_stylesheets=[dbc.themes.BOOTSTRAP, dbc.themes.SANDSTONE], - suppress_callback_exceptions=True, -) -app.title = "Wetterdienst Explorer" -app.layout = get_app_layout() - -empty_frame = pl.DataFrame().write_json(row_oriented=True) - - -@app.callback( - Output("modal-about", "is_open"), - [Input("open-about", "n_clicks"), Input("close-about", "n_clicks")], - [State("modal-about", "is_open")], -) -def toggle_about(n1, n2, is_open): - if n1 or n2: - return not is_open - return is_open - - -@app.callback( - Output("dataframe-stations_result", "children"), - [ - Input("select-provider", "value"), - Input("select-network", "value"), - Input("select-resolution", "value"), - Input("select-dataset", "value"), - Input("select-parameter", "value"), - Input("select-period", "value"), - ], -) -def fetch_stations(provider: str, network: str, resolution: str, dataset: str, parameter: str, period: str): - """ - Fetch "stations_result" data. - - This will be used to populate the navigation chooser and to render the map. - - The data will be stored on a hidden within the browser DOM. - """ - if not (provider and network and resolution and dataset and parameter and period): - return empty_frame - - api = RequestRegistry.resolve(provider, network) - - if period == "ALL": - period = [*api._period_base] - - log.info(f"Requesting stations for parameter={parameter}, resolution={resolution}, period={period}") - - try: - stations = get_stations( - api=api, - parameter=parameter, - resolution=resolution, - period=period, - lead_time="short", - date=None, - issue="latest", - all_=True, - station_id=None, - name=None, - coordinates=None, - rank=None, - distance=None, - bbox=None, - sql=None, - si_units=True, - shape="long", - humanize=True, - skip_empty=False, - skip_threshold=0.95, - skip_criteria="min", - dropna=False, - ) - except Exception as e: - log.warning(e) - log.error("Unable to connect to data source") - return empty_frame - - df = stations.df - - df = df.with_columns( - pl.col(Columns.START_DATE.value).map_elements( - lambda date: date and date.isoformat() or None, - return_dtype=pl.Utf8, - ), - pl.col(Columns.END_DATE.value).map_elements( - lambda date: date and date.isoformat() or None, - return_dtype=pl.Utf8, - ), - ) - - log.info(f"Propagating stations data frame with {frame_summary(df)}") - - return df.write_json(row_oriented=True) - - -@app.callback( - Output("dataframe-values", "children"), - [ - Input("select-provider", "value"), - Input("select-network", "value"), - Input("select-resolution", "value"), - Input("select-dataset", "value"), - Input("select-parameter", "value"), - Input("select-period", "value"), - Input("select-station", "value"), - ], -) -def fetch_values( - provider: str, - network: str, - resolution: str, - dataset: str, - parameter: str, - period: str, - station_id: int, -): - """ - Fetch "values" data. - - This will be used to populate the navigation chooser and to render the graph. - - The data will be stored on a hidden within the browser DOM. - """ - if not (provider and network and resolution and dataset and parameter and period): - return empty_frame - - # Sanity checks. - if station_id is None: - log.warning("Querying without station_id is rejected") - return empty_frame - - api = RequestRegistry.resolve(provider, network) - - if period == "ALL": - period = [*api._period_base] - - log.info( - f"Requesting values for station_id={station_id}, parameter={parameter}, resolution={resolution}, " - f"period={period}", - ) - - try: - values = get_values( - api=api, - parameter=parameter, - resolution=resolution, - period=period, - date=None, - issue="latest", - all_=None, - station_id=station_id, - name=None, - coordinates=None, - rank=None, - distance=None, - bbox=None, - sql=None, - sql_values=None, - si_units=True, - shape="long", - skip_empty=False, - skip_threshold=0.95, - skip_criteria="min", - dropna=False, - humanize=True, - ) - except ValueError: - log.exception("No data received") - return empty_frame - - df = values.df - df = df.drop("quality").drop_nulls() - df = df.with_columns(pl.col("date").map_elements(lambda date: date.isoformat())) - - log.info(f"Propagating values data frame with {frame_summary(df)}") - - return json.dumps({"values": df.to_dicts(), "unit_dict": values.stations.stations.discover()}) - - -@app.callback( - Output("select-station", "options"), - [Input("dataframe-stations_result", "children")], -) -def render_navigation_stations(payload): - """ - Compute list of items from "stations_result" data for populating the "stations_result" - chooser element. - """ - data = json.loads(payload) - - if not data: - return [] - - try: - stations_data = pl.from_dicts(data, infer_schema_length=0) - except ValueError: - stations_data = pl.DataFrame() - - log.info(f"Rendering stations_result dropdown from {frame_summary(stations_data)}") - return [ - {"label": name, "value": station_id} - for name, station_id in stations_data.select("name", "station_id").iter_rows() - ] - - -@app.callback( - Output("status-response-stations_result", "children"), - [ - Input("select-provider", "value"), - Input("select-network", "value"), - Input("select-resolution", "value"), - Input("select-dataset", "value"), - Input("select-parameter", "value"), - Input("select-period", "value"), - Input("dataframe-stations_result", "children"), - ], -) -def render_status_response_stations( - provider: str, - network: str, - resolution: str, - dataset: str, - parameter: str, - period: str, - payload: str, -): - """ - Report about the status of the query. - """ - - title = [dcc.Markdown("#### Stations")] - - if not (provider and network and resolution and dataset and parameter and period): - empty_message = [dcc.Markdown("Choose from provider, network, resolution, dataset, parameter and period.")] - - return title + empty_message - - empty_message = [ - dcc.Markdown( - f""" - No data. Maybe the combination of "{resolution}", "{dataset}", "{parameter}" and "{period}" - is invalid for provider "{provider}" and network "{network}". - """, - ), - ] - - data = json.loads(payload) - - if not data: - return title + empty_message - - stations_data = pl.from_dicts(data) - - return title + [ - html.Div( - [ - html.Div(f"Columns: {len(stations_data.columns)}"), - html.Div(f"Records: {len(stations_data)}"), - ], - ), - ] - - -@app.callback( - Output("status-response-values", "children"), - [ - Input("dataframe-values", "children"), - State("select-provider", "value"), - State("select-network", "value"), - State("select-resolution", "value"), - State("select-dataset", "value"), - State("select-parameter", "value"), - State("select-period", "value"), - State("select-station", "value"), - ], -) -def render_status_response_values( - payload: str, - provider: str, - network: str, - resolution: str, - dataset: str, - parameter: str, - period: str, - station: str, -): - """ - Report about the status of the query. - """ - try: - climate_data = pl.from_dicts(payload["values"]) - except (KeyError, ValueError, TypeError): - climate_data = pl.DataFrame() - - messages = [dcc.Markdown("#### Values")] - - if climate_data.is_empty(): - # Main message. - empty_message = [html.Span("No data. ")] - candidates = ["provider", "network", "resolution", "dataset", "parameter", "period", "station"] - missing = [] - for candidate in candidates: - if locals().get(candidate) is None: - missing.append(candidate) - if missing: - empty_message.append(html.Span(f"Please select all of the missing options {missing}.")) - messages += [html.Div(empty_message), html.Br()] - - messages += [ - html.Div(f"Columns: {len(climate_data.columns)}"), - html.Div(f"Records: {len(climate_data)}"), - html.Br(), - ] - if "date" in climate_data: - messages += [ - html.Div(f"Station: {station}"), - html.Div(f"Begin date: {climate_data.get_column('date').min()}"), - html.Div(f"End date: {climate_data.get_column('date').max()}"), - ] - - return html.Div(messages) - - -@app.callback( - Output("map-stations_result", "children"), - [Input("dataframe-stations_result", "children")], -) -def render_map(payload): - """ - Create a "map" Figure element from "stations_result" data. - """ - data = json.loads(payload) - if not data: - return [] - stations_data = pl.from_dicts(data, infer_schema_length=0) - stations_data = stations_data.with_columns( - pl.col("station_id").cast(pl.Utf8), - pl.col("latitude").cast(pl.Float64), - pl.col("longitude").cast(pl.Float64), - ) - log.info(f"Rendering stations_result map from {frame_summary(stations_data)}") - # columns used for constructing geojson object - features = [ - Feature( - geometry=Point((longitude, latitude)), - properties={"station_id": station_id}, - ) - for station_id, latitude, longitude in stations_data.select("station_id", "latitude", "longitude").iter_rows() - ] - # all the other columns used as properties - properties = stations_data.drop("latitude", "longitude").to_dicts() - # whole geojson object - feature_collection = FeatureCollection(features=features, properties=properties) - return dl.GeoJSON(id="markers", data=feature_collection, cluster=True, zoomToBounds=True, zoomToBoundsOnClick=True) - - -@app.callback( - Output("select-station", "value"), - [ - Input("markers", "click_feature"), - ], -) -def map_click(click_feature): - if click_feature is not None: - return click_feature.get("properties", {}).get("station_id") - return None - - -def _get_station_text(row): - return f"Name: {row['name']}\nId: {row['station_id']}\nHeight: {row['height']}m" - - -@app.callback( - Output("graph-values", "figure"), - [Input("select-parameter", "value"), Input("select-resolution", "value"), Input("dataframe-values", "children")], -) -def render_graph(parameter, resolution, payload: str): - """ - Create a "graph" Figure element from "values" data. - """ - data = json.loads(payload) - - try: - climate_data = pl.from_dicts(data["values"]) - unit_dict = data["unit_dict"] - except (KeyError, ValueError, TypeError): - climate_data = pl.DataFrame() - unit_dict = {} - - log.info(f"Rendering graph for parameter={parameter} from {frame_summary(climate_data)}") - - fig = default_figure(climate_data, parameter, resolution, unit_dict) - - fig.update_layout( - margin=go.layout.Margin( - l=0, # left margin - r=0, # right margin - b=0, # bottom margin - t=0, # top margin - ), - ) - - return fig - - -@app.callback(Output("select-network", "options"), Input("select-provider", "value")) -def set_network_options(provider): - """Set network options based on provider""" - if not provider: - return [] - - return [{"label": network, "value": network} for network in RequestRegistry.get_network_names(provider)] - - -@app.callback( - Output("select-resolution", "options"), - [ - Input("select-provider", "value"), - Input("select-network", "value"), - ], -) -def set_resolution_options(provider, network): - """Set resolution options based on provider and network""" - if not (provider and network): - return [] - - api = RequestRegistry.resolve(provider, network) - - if issubclass(api, DwdMosmixRequest): - return [{"label": resolution.name, "value": resolution.name} for resolution in DwdMosmixType] - else: - return [{"label": resolution.name, "value": resolution.name} for resolution in api._resolution_base] - - -@app.callback( - Output("select-dataset", "options"), - [ - Input("select-provider", "value"), - Input("select-network", "value"), - Input("select-resolution", "value"), - ], -) -def set_dataset_options(provider, network, resolution): - """Set dataset options based on provider network and resolution""" - if not (provider and network and resolution): - return [] - - api = RequestRegistry.resolve(provider, network) - - datasets = [{"label": resolution, "value": resolution}] - for dataset in api._parameter_base[resolution]: - if not hasattr(dataset, "name"): - ds_dict = {"label": dataset.__name__, "value": dataset.__name__} - if ds_dict not in datasets: - datasets.append(ds_dict) - return datasets - - -@app.callback( - [ - Output("select-parameter", "options"), - Output("select-period", "options"), - ], - [ - Input("select-provider", "value"), - Input("select-network", "value"), - Input("select-resolution", "value"), - Input("select-dataset", "value"), - ], -) -def set_parameter_options(provider, network, resolution, dataset): - """Set parameter options based on provider, network, resolution and dataset""" - if not (provider and network and resolution and dataset): - return [], [] - - api = RequestRegistry.resolve(provider, network) - - if dataset == resolution: - # Return long shape parameters e.g. parameters grouped under one resolution - parameters = [ - {"label": parameter.name, "value": parameter.name} - for parameter in api._parameter_base[resolution] - if hasattr(parameter, "name") - ] - else: - # return individual parameters of one dataset e.g. climate_summary - parameters = [ - {"label": parameter.name, "value": parameter.name} for parameter in api._parameter_base[resolution][dataset] - ] - - if api._period_type == PeriodType.FIXED: - period = list(api._period_base)[0] - periods = [{"label": period.name, "value": period.name}] - else: - # Periods ALL placeholder, may use click options for multiple periods - periods = [{"label": "ALL", "value": "ALL"}] - for period in api._period_base: - periods.append({"label": period.name, "value": period.name}) - - return parameters, periods - - -@app.callback( - [ - Output("select-network", "value"), - Output("select-resolution", "value"), - Output("select-dataset", "value"), - Output("select-parameter", "value"), - Output("select-period", "value"), - ], - [ - Input("select-provider", "value"), - Input("select-network", "value"), - Input("select-resolution", "value"), - Input("select-dataset", "value"), - Input("select-parameter", "value"), - Input("select-period", "value"), - ], -) -def reset_values( - provider, # noqa: ARG001 - network, - resolution, - dataset, - parameter, - period, -): - """Reset settings values if any previous parameter has been changed e.g. - when a new provider is selected, reset network, resolution, etc""" - last_triggered = dash.callback_context.triggered[0]["prop_id"].split(".")[0] - - previous = ("select-provider", "select-network", "select-resolution", "select-dataset") - - if last_triggered in previous[:1]: - network = None - - if last_triggered in previous[:2]: - resolution = None - - if last_triggered in previous[:3]: - dataset = None - - if last_triggered in previous: - parameter = None - period = None - - return network, resolution, dataset, parameter, period - - -def start_service(listen_address: str | None = None, reload: bool | None = False): # pragma: no cover - """ - This entrypoint will be used by `wetterdienst.cli`. - """ - - setup_logging() - - if listen_address is None: - listen_address = "127.0.0.1:7891" - - host, port = listen_address.split(":") - port = int(port) - - app.run_server(host=host, port=port, debug=reload) - - -if __name__ == "__main__": - """ - This entrypoint will be used by `dash.testing`. - """ - app.run_server(debug=True) diff --git a/wetterdienst/ui/explorer/assets/styles.css b/wetterdienst/ui/explorer/assets/styles.css deleted file mode 100644 index 0d85f3559..000000000 --- a/wetterdienst/ui/explorer/assets/styles.css +++ /dev/null @@ -1,48 +0,0 @@ -body { - margin: 2%; -} - -#mainContainer { - display: flex; - flex-direction: column; -} - -.map-panel { - border-radius: 5px; - background-color: #f9f9f9; - margin: 10px; - padding: 15px; - position: relative; - box-shadow: 2px 2px 2px lightgrey; -} - -.bare_container { - margin: 0 0 0 0; - padding: 0 0 0 0; -} - -.mini_container { - border-radius: 5px; - background-color: #f9f9f9; - margin: 10px; - padding: 15px; - position: relative; - box-shadow: 2px 2px 2px lightgrey; -} - -.dcc_control { - margin: 0; - padding: 5px; - width: calc(100% - 40px); -} - -.control_label { - padding: 10px 10px 0px; - margin: 0 0 0px; - width: calc(100% - 40px); -} - -.rc-slider { - margin-left: 0px; - padding-left: 0px; -} diff --git a/wetterdienst/ui/explorer/layout/__init__.py b/wetterdienst/ui/explorer/layout/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/wetterdienst/ui/explorer/layout/main.py b/wetterdienst/ui/explorer/layout/main.py deleted file mode 100644 index 0f12248e3..000000000 --- a/wetterdienst/ui/explorer/layout/main.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (C) 2018-2021, earthobservations developers. -# Distributed under the MIT License. See LICENSE for more info. -""" -Wetterdienst Explorer UI layout. -""" - -import dash_bootstrap_components as dbc -from dash import dcc, html - -from wetterdienst.ui.explorer.layout.observations_germany import dashboard_layout - - -def get_about_modal(): - return dbc.Modal( - [ - dbc.ModalHeader(html.P("About Wetterdienst Explorer")), - dbc.ModalBody( - dcc.Markdown( - """ - Wetterdienst Explorer is a Dash user interface on top of Wetterdienst. - - **Resources**: - - https://wetterdienst.readthedocs.io/en/latest/overview.html - - https://github.com/earthobservations/wetterdienst - """, - ), - ), - dbc.ModalFooter(dbc.Button("Close", id="close-about", className="ml-auto")), - ], - id="modal-about", - is_open=False, - centered=True, - autoFocus=True, - size="lg", - keyboard=True, - fade=True, - backdrop=True, - ) - - -def get_app_layout(): - return html.Div( - [ - dcc.Location(id="url", refresh=False), - html.Div( - [ - html.H1("Wetterdienst Explorer"), - dbc.Navbar( - [dbc.NavLink("About", id="open-about")], - id="navbar", - ), - get_about_modal(), - ], - className="d-flex flex-row", - style={"justify-content": "space-between"}, - ), - dashboard_layout(), - ], - id="mainContainer", - style={"display": "flex", "flex-direction": "column"}, - ) diff --git a/wetterdienst/ui/explorer/layout/observations_germany.py b/wetterdienst/ui/explorer/layout/observations_germany.py deleted file mode 100644 index 68a73d7f8..000000000 --- a/wetterdienst/ui/explorer/layout/observations_germany.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright (C) 2018-2021, earthobservations developers. -# Distributed under the MIT License. See LICENSE for more info. -import dash_leaflet as dl -from dash import dcc, html - -from wetterdienst.api import RequestRegistry - - -def get_providers(): - return [{"label": provider, "value": provider} for provider in RequestRegistry.get_provider_names()] - - -def dashboard_layout() -> html: - """ - Dashboard layout for observations in Germany. - """ - return html.Div( - [ - html.Div( - [ - html.Div( - [ - dcc.Dropdown( - id="select-provider", - options=get_providers(), - value=None, - multi=False, - className="dcc_control", - placeholder="Select provider...", - ), - dcc.Dropdown( - id="select-network", - value=None, - multi=False, - className="dcc_control", - placeholder="Select network...", - ), - dcc.Dropdown( - id="select-resolution", - value=None, - multi=False, - className="dcc_control", - placeholder="Select resolution...", - ), - dcc.Dropdown( - id="select-dataset", - value=None, - multi=False, - className="dcc_control", - placeholder="Select dataset...", - ), - dcc.Dropdown( - id="select-parameter", - value=None, - multi=False, - className="dcc_control", - placeholder="Select parameter...", - ), - dcc.Dropdown( - id="select-period", - value=None, - multi=False, - className="dcc_control", - placeholder="Select period...", - ), - dcc.Loading( - id="loading-1", - children=[ - dcc.Dropdown( - id="select-station", - multi=False, - className="dcc_control", - placeholder="Select station...", - ), - html.Div( - [], - id="dataframe-values", - style={"display": "None"}, - ), - ], - ), - ], - id="navigation", - className="col map-panel d-flex flex-column", - ), - html.Div( - [ - dl.Map( - [ - dl.LayersControl( - [ - dl.BaseLayer( - dl.TileLayer(), - name="OpenStreetMaps", - checked=True, - ), - dl.LayerGroup(id="map-stations_result"), - ], - ), - ], - id="map", - ), - ], - id="map-div", - className="col map-panel", - ), - html.Div( - [ - html.Div( - id="status-response-stations_result", - ), - html.Hr(), - html.Div( - id="status-response-values", - ), - ], - id="status-response", - className="col map-panel flex-column", - ), - ], - id="header", - className="d-flex flex-row", - ), - html.Div( - [ - html.Div( - [ - dcc.Graph(id="graph-values"), - ], - id="graph", - className="col wd-panel", - ), - ], - className="d-flex flex-row", - ), - html.Div([], id="dataframe-stations_result", style={"display": "None"}), - ], - ) diff --git a/wetterdienst/ui/explorer/library.py b/wetterdienst/ui/explorer/library.py deleted file mode 100644 index fa3182fc6..000000000 --- a/wetterdienst/ui/explorer/library.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (C) 2018-2021, earthobservations developers. -# Distributed under the MIT License. See LICENSE for more info. -""" -Library of generic components. - -Examples: -- Different figures for different data types. -""" - -import plotly.graph_objs as go -import polars as pl - - -def default_figure(climate_data: pl.DataFrame, parameter, resolution, unit_dict) -> go.Figure: - """ - Default figure generation - Args: - climate_data: DataFrame with - column: Which column of the data should be displayed - Returns: - plotly Figure object - """ - if climate_data.is_empty(): - fig = go.Figure() - add_annotation_no_data(fig) - return fig - - ytitle = f"{parameter.lower()} [{unit_dict[resolution.lower()][parameter.lower()]['si']}]" - - fig = go.Figure( - data=[ - go.Scatter( - x=climate_data.get_column("date").to_list(), - y=climate_data.get_column("value").to_list(), - hoverinfo="x+y", - ), - ], - ) - fig.update_layout(yaxis={"title": ytitle}, xaxis={"title": "Date"}, showlegend=False) - return fig - - -def add_annotation_no_data(fig: go.Figure): - fig.add_annotation( - text="No data to display", - xref="paper", - yref="paper", - showarrow=False, - font={"size": 28}, - ) diff --git a/wetterdienst/ui/explorer/util.py b/wetterdienst/ui/explorer/util.py deleted file mode 100644 index 3424ebb1d..000000000 --- a/wetterdienst/ui/explorer/util.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (C) 2018-2021, earthobservations developers. -# Distributed under the MIT License. See LICENSE for more info. -import polars as pl - - -def frame_summary(frame: pl.DataFrame): - return f"{len(frame)} records and columns={list(frame.columns)}" diff --git a/wetterdienst/ui/streamlit/requirements.txt b/wetterdienst/ui/requirements.txt similarity index 100% rename from wetterdienst/ui/streamlit/requirements.txt rename to wetterdienst/ui/requirements.txt diff --git a/wetterdienst/ui/streamlit/__init__.py b/wetterdienst/ui/streamlit/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/wetterdienst/ui/streamlit/app.py b/wetterdienst/ui/streamlit/app.py deleted file mode 100644 index c3cb7738e..000000000 --- a/wetterdienst/ui/streamlit/app.py +++ /dev/null @@ -1,214 +0,0 @@ -# Copyright (C) 2018-2023, earthobservations developers. -# Distributed under the MIT License. See LICENSE for more info. -from __future__ import annotations - -import json - -import duckdb -import plotly.express as px -import polars as pl -import streamlit -import streamlit as st - -from wetterdienst import Settings, __version__ -from wetterdienst.provider.dwd.observation import DwdObservationRequest - -SQL_DEFAULT = """ -SELECT * -FROM df -WHERE value IS NOT NULL -""".strip() - - -def get_dwd_observation_request(settings=None): - if settings: - settings = Settings(**settings) - return DwdObservationRequest("climate_summary", "daily", settings=settings) - - -@streamlit.cache_data -def get_dwd_observation_stations(settings): - return get_dwd_observation_request(settings=settings).all().df - - -@streamlit.cache_data -def get_dwd_observation_station(station_id, settings): - return get_dwd_observation_request(settings=settings).filter_by_station_id(station_id) - - -@streamlit.cache_data -def get_dwd_observation_station_values_df(station_id, settings): - request = get_dwd_observation_request() - units = request.discover("daily", "climate_summary")["daily"] - units = { - parameter: (unit["si"] if settings["ts_si_units"] else unit["origin"]) for parameter, unit in units.items() - } - values = get_dwd_observation_station(station_id, settings).values.all().df - return values.with_columns(pl.col("parameter").replace(units).alias("unit")) - - -def create_plotly_fig( - df: pl.DataFrame, - variable_column: str, - variable_filter: list[str], - x: str, - y: str, - facet: bool, - lm: str | None, - settings: dict, -): - if "unit" in df.columns: - df = df.with_columns( - pl.struct(["parameter", "unit"]) - .map_elements(lambda s: f"{s['parameter']} ({s['unit']})") - .alias("parameter"), - ) - fig = px.scatter( - x=df.get_column(x).to_list(), - y=df.get_column(y).to_list(), - color=df.get_column(variable_column).to_list(), - facet_row=df.get_column(variable_column).to_list() if facet else None, - trendline=lm, - ) - fig.update_traces( - marker={"opacity": settings["opacity"], "symbol": settings["symbol"], "size": settings["size"]}, - ) - fig.update_layout( - legend={"x": 0, "y": 1.08}, - height=400 * len(variable_filter), # plot height times parameters - xaxis_title="date", - yaxis_title="value", - ) - fig.update_yaxes(matches=None) - # Update y-axis titles to use facet labels and remove subplot titles - for i, annotation in enumerate(fig.layout.annotations): - axis_name = f"yaxis{i + 1}" - if axis_name in fig.layout: - fig.layout[axis_name].title.text = annotation.text - annotation.text = "" - return fig - - -def main(): - """Small streamlit app for accessing German climate stations by DWD""" - title = f"Wetterdienst Data Tool v{__version__}" - st.set_page_config(page_title=title) - st.title(title) - - with st.sidebar: - st.header("Settings") - - st.subheader("General") - ts_humanize = st.checkbox("humanize", value=True) - ts_si_units = st.checkbox("si_units", value=True) - settings = {"ts_humanize": ts_humanize, "ts_si_units": ts_si_units} - - st.subheader("Plotting") - - marker_size = st.slider("marker size", min_value=1, max_value=8, value=2) - opacity = st.slider("opacity", min_value=0.0, max_value=1.0, value=1.0) - marker_symbol = st.selectbox("marker symbol", options=["circle", "square", "diamond", "cross", "x"]) - plotting_settings = {"opacity": opacity, "symbol": marker_symbol, "size": marker_size} - - st.subheader("Introduction") - st.markdown( - """ - This is a streamlit app based on the [wetterdienst](https://github.com/earthobservations/wetterdienst) - library that allows analysis of German climate stations (internally phrased "climate summary") by - the [Deutscher Wetterdienst](https://www.dwd.de/). There are over 1_500 climate stations in Germany and - all of the data can be accessed freely thanks to the open data initiative. The app enables you to select any - of the stations (by station id or name), download its data (as CSV) and get visualizations of it. - """, - ) - st.markdown("Here's a map of all stations:") - stations = get_dwd_observation_stations(settings) - st.map(stations, latitude="latitude", longitude="longitude") - - st.subheader("Select") - station = st.selectbox( - "Select climate station", - options=stations.sort("name").rows(named=True), - format_func=lambda s: f"{s['name']} [{s['station_id']}]", - ) - if station: - station["start_date"] = station["start_date"].isoformat() - station["end_date"] = station["end_date"].isoformat() - st.code(json.dumps(station, indent=4), language="json") - st.map(get_dwd_observation_station(station["station_id"], settings).df) - - st.subheader("DataFrame") - st.info( - """ - Use [duckdb](https://duckdb.org/docs/sql/introduction.html) sql queries to transform the data. - Important: - - use **FROM df** - - use single quotes for strings e.g. 'a_string' - """, - ) - sql_query = st.text_area( - "sql query", - value=SQL_DEFAULT, - ) - df = pl.DataFrame() - if station: - df = get_dwd_observation_station_values_df(station["station_id"], settings) - if sql_query: - df = duckdb.query(sql_query).pl() - st.dataframe(df, hide_index=True, use_container_width=True) - st.download_button("Download CSV", df.write_csv(), "data.csv", "text/csv") - st.download_button( - "Download JSON", - df.with_columns(pl.col("date").map_elements(lambda d: d.isoformat())).write_json( - pretty=True, - row_oriented=True, - ), - "data.json", - "text/json", - ) - - st.subheader("Plot") - plot_enable = not df.is_empty() - - with st.expander("settings", expanded=True): - columns = sorted(df.columns) - column_x = st.selectbox("Column X", options=columns, index="date" in columns and columns.index("date")) - columns = columns.copy() - columns.remove(column_x) - column_y = st.selectbox("Column Y", options=columns, index="value" in columns and columns.index("value")) - columns = columns.copy() - columns.remove(column_y) - variable_column = st.selectbox( - "Column Variable", - options=columns, - index="parameter" in columns and columns.index("parameter"), - ) - variable_options = df.get_column(variable_column).unique().sort().to_list() - variable_filter = st.multiselect("Variable Filter", options=variable_options) - df = df.filter(pl.col(variable_column).is_in(variable_filter)) - facet = st.toggle("facet") - lm = st.selectbox("linear model", options=["none", "lowess", "ols", "expanding"]) - lm = lm if lm != "none" else None - - if not plot_enable: - st.warning("No plot. Reason: empty DataFrame") - elif not variable_filter: - st.warning("No plot. Reason: empty variable filter") - else: - fig = create_plotly_fig(df, variable_column, variable_filter, column_x, column_y, facet, lm, plotting_settings) - st.plotly_chart(fig) - - st.subheader("Credits") - st.markdown( - """ - This app is powered by [wetterdienst](https://github.com/earthobservations/wetterdienst) from - [earthobservations](https://github.com/earthobservations). Credits for the data go to - [Deutscher Wetterdienst](https://www.dwd.de) - Germany's national meteorological service - for - publishing their data as **open data**. Credits also go to [streamlit](https://streamlit.io/) for hosting this - app. If you have any issues or ideas regarding this app, please let us know in the - [issues](https://github.com/earthobservations/wetterdienst/issues). - """, - ) - - -if __name__ == "__main__": - main()