From 8d1bd94e68c263c32dcda6580fb5c998648cf162 Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Wed, 9 Oct 2024 23:02:06 -0700 Subject: [PATCH 01/12] Add new config management server --- poetry.lock | 1114 ++++++++++++++++++++++++++++++++++------ pyproject.toml | 4 + src/config/__init__.py | 0 src/config/server.py | 83 +++ 4 files changed, 1047 insertions(+), 154 deletions(-) create mode 100644 src/config/__init__.py create mode 100644 src/config/server.py diff --git a/poetry.lock b/poetry.lock index 1a9f0dce..b1d5a557 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,16 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + [[package]] name = "anyio" version = "4.6.0" @@ -49,101 +60,116 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -171,6 +197,41 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "dnspython" +version = "2.7.0" +description = "DNS toolkit" +optional = false +python-versions = ">=3.9" +files = [ + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=43)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=1.0.0)"] +idna = ["idna (>=3.7)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + +[[package]] +name = "email-validator" +version = "2.2.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -185,6 +246,50 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "fastapi" +version = "0.115.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.115.0-py3-none-any.whl", hash = "sha256:17ea427674467486e997206a5ab25760f6b09e069f099b96f5b55a32fb6f1631"}, + {file = "fastapi-0.115.0.tar.gz", hash = "sha256:f93b4ca3529a8ebc6fc3fcf710e5efa8de3df9b41570958abf1d97d843138004"}, +] + +[package.dependencies] +email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"standard\""} +fastapi-cli = {version = ">=0.0.5", extras = ["standard"], optional = true, markers = "extra == \"standard\""} +httpx = {version = ">=0.23.0", optional = true, markers = "extra == \"standard\""} +jinja2 = {version = ">=2.11.2", optional = true, markers = "extra == \"standard\""} +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +python-multipart = {version = ">=0.0.7", optional = true, markers = "extra == \"standard\""} +starlette = ">=0.37.2,<0.39.0" +typing-extensions = ">=4.8.0" +uvicorn = {version = ">=0.12.0", extras = ["standard"], optional = true, markers = "extra == \"standard\""} + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-cli" +version = "0.0.5" +description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi_cli-0.0.5-py3-none-any.whl", hash = "sha256:e94d847524648c748a5350673546bbf9bcaeb086b33c24f2e82e021436866a46"}, + {file = "fastapi_cli-0.0.5.tar.gz", hash = "sha256:d30e1239c6f46fcb95e606f02cdda59a1e2fa778a54b64686b3ff27f6211ff9f"}, +] + +[package.dependencies] +typer = ">=0.12.3" +uvicorn = {version = ">=0.15.0", extras = ["standard"]} + +[package.extras] +standard = ["uvicorn[standard] (>=0.15.0)"] + [[package]] name = "ghp-import" version = "2.1.0" @@ -202,6 +307,92 @@ python-dateutil = ">=2.8.1" [package.extras] dev = ["flake8", "markdown", "twine", "wheel"] +[[package]] +name = "greenlet" +version = "3.1.1" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + [[package]] name = "griffe" version = "1.3.2" @@ -248,6 +439,54 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<1.0)"] +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + [[package]] name = "httpx" version = "0.27.2" @@ -382,71 +621,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.1" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b"}, + {file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"}, ] [[package]] @@ -702,6 +942,130 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pydantic" +version = "2.9.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.23.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + [[package]] name = "pygments" version = "2.18.0" @@ -770,6 +1134,31 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-multipart" +version = "0.0.12" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_multipart-0.0.12-py3-none-any.whl", hash = "sha256:43dcf96cf65888a9cd3423544dd0d75ac10f7aa0c3c28a175bbcd00c9ce1aebf"}, + {file = "python_multipart-0.0.12.tar.gz", hash = "sha256:045e1f98d719c1ce085ed7f7e1ef9d8ccc8c02ba02b5566d5f7521410ced58cb"}, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -989,6 +1378,26 @@ typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.1 [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "setuptools" +version = "75.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, + {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] + [[package]] name = "shellingham" version = "1.5.4" @@ -1022,6 +1431,143 @@ files = [ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] +[[package]] +name = "sqlalchemy" +version = "2.0.35" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, + {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, + {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "sqlmodel" +version = "0.0.22" +description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sqlmodel-0.0.22-py3-none-any.whl", hash = "sha256:a1ed13e28a1f4057cbf4ff6cdb4fc09e85702621d3259ba17b3c230bfb2f941b"}, + {file = "sqlmodel-0.0.22.tar.gz", hash = "sha256:7d37c882a30c43464d143e35e9ecaf945d88035e20117bf5ec2834a23cbe505e"}, +] + +[package.dependencies] +pydantic = ">=1.10.13,<3.0.0" +SQLAlchemy = ">=2.0.14,<2.1.0" + +[[package]] +name = "starlette" +version = "0.38.6" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.38.6-py3-none-any.whl", hash = "sha256:4517a1409e2e73ee4951214ba012052b9e16f60e90d73cfb06192c19203bbb05"}, + {file = "starlette-0.38.6.tar.gz", hash = "sha256:863a1588f5574e70a821dadefb41e4881ea451a47a3cd1b4df359d4ffefe5ead"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +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 = "supervisor" +version = "4.2.5" +description = "A system for controlling process state under UNIX" +optional = false +python-versions = "*" +files = [ + {file = "supervisor-4.2.5-py2.py3-none-any.whl", hash = "sha256:2ecaede32fc25af814696374b79e42644ecaba5c09494c51016ffda9602d0f08"}, + {file = "supervisor-4.2.5.tar.gz", hash = "sha256:34761bae1a23c58192281a5115fb07fbf22c9b0133c08166beffc70fed3ebc12"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +testing = ["pytest", "pytest-cov"] + [[package]] name = "tomli" version = "2.0.2" @@ -1078,6 +1624,76 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "uvicorn" +version = "0.31.1" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.31.1-py3-none-any.whl", hash = "sha256:adc42d9cac80cf3e51af97c1851648066841e7cfb6993a4ca8de29ac1548ed41"}, + {file = "uvicorn-0.31.1.tar.gz", hash = "sha256:f5167919867b161b7bcaf32646c6a94cdbd4c3aa2eb5c17d36bb9aa5cfd8c493"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "uvloop" +version = "0.20.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9ebafa0b96c62881d5cafa02d9da2e44c23f9f0cd829f3a32a6aff771449c996"}, + {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:35968fc697b0527a06e134999eef859b4034b37aebca537daeb598b9d45a137b"}, + {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b16696f10e59d7580979b420eedf6650010a4a9c3bd8113f24a103dfdb770b10"}, + {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b04d96188d365151d1af41fa2d23257b674e7ead68cfd61c725a422764062ae"}, + {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94707205efbe809dfa3a0d09c08bef1352f5d3d6612a506f10a319933757c006"}, + {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89e8d33bb88d7263f74dc57d69f0063e06b5a5ce50bb9a6b32f5fcbe655f9e73"}, + {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e50289c101495e0d1bb0bfcb4a60adde56e32f4449a67216a1ab2750aa84f037"}, + {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e237f9c1e8a00e7d9ddaa288e535dc337a39bcbf679f290aee9d26df9e72bce9"}, + {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:746242cd703dc2b37f9d8b9f173749c15e9a918ddb021575a0205ec29a38d31e"}, + {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82edbfd3df39fb3d108fc079ebc461330f7c2e33dbd002d146bf7c445ba6e756"}, + {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80dc1b139516be2077b3e57ce1cb65bfed09149e1d175e0478e7a987863b68f0"}, + {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f44af67bf39af25db4c1ac27e82e9665717f9c26af2369c404be865c8818dcf"}, + {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4b75f2950ddb6feed85336412b9a0c310a2edbcf4cf931aa5cfe29034829676d"}, + {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:77fbc69c287596880ecec2d4c7a62346bef08b6209749bf6ce8c22bbaca0239e"}, + {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6462c95f48e2d8d4c993a2950cd3d31ab061864d1c226bbf0ee2f1a8f36674b9"}, + {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649c33034979273fa71aa25d0fe120ad1777c551d8c4cd2c0c9851d88fcb13ab"}, + {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a609780e942d43a275a617c0839d85f95c334bad29c4c0918252085113285b5"}, + {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aea15c78e0d9ad6555ed201344ae36db5c63d428818b4b2a42842b3870127c00"}, + {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0e94b221295b5e69de57a1bd4aeb0b3a29f61be6e1b478bb8a69a73377db7ba"}, + {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fee6044b64c965c425b65a4e17719953b96e065c5b7e09b599ff332bb2744bdf"}, + {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:265a99a2ff41a0fd56c19c3838b29bf54d1d177964c300dad388b27e84fd7847"}, + {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10c2956efcecb981bf9cfb8184d27d5d64b9033f917115a960b83f11bfa0d6b"}, + {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e7d61fe8e8d9335fac1bf8d5d82820b4808dd7a43020c149b63a1ada953d48a6"}, + {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2beee18efd33fa6fdb0976e18475a4042cd31c7433c866e8a09ab604c7c22ff2"}, + {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8c36fdf3e02cec92aed2d44f63565ad1522a499c654f07935c8f9d04db69e95"}, + {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0fac7be202596c7126146660725157d4813aa29a4cc990fe51346f75ff8fde7"}, + {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0fba61846f294bce41eb44d60d58136090ea2b5b99efd21cbdf4e21927c56a"}, + {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95720bae002ac357202e0d866128eb1ac82545bcf0b549b9abe91b5178d9b541"}, + {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:36c530d8fa03bfa7085af54a48f2ca16ab74df3ec7108a46ba82fd8b411a2315"}, + {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e97152983442b499d7a71e44f29baa75b3b02e65d9c44ba53b10338e98dedb66"}, + {file = "uvloop-0.20.0.tar.gz", hash = "sha256:4603ca714a754fc8d9b197e325db25b2ea045385e8a3ad05d3463de725fdf469"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + [[package]] name = "watchdog" version = "5.0.3" @@ -1120,6 +1736,196 @@ files = [ [package.extras] watchmedo = ["PyYAML (>=3.10)"] +[[package]] +name = "watchfiles" +version = "0.24.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:083dc77dbdeef09fa44bb0f4d1df571d2e12d8a8f985dccde71ac3ac9ac067a0"}, + {file = "watchfiles-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e94e98c7cb94cfa6e071d401ea3342767f28eb5a06a58fafdc0d2a4974f4f35c"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82ae557a8c037c42a6ef26c494d0631cacca040934b101d001100ed93d43f361"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acbfa31e315a8f14fe33e3542cbcafc55703b8f5dcbb7c1eecd30f141df50db3"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74fdffce9dfcf2dc296dec8743e5b0332d15df19ae464f0e249aa871fc1c571"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:449f43f49c8ddca87c6b3980c9284cab6bd1f5c9d9a2b00012adaaccd5e7decd"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4abf4ad269856618f82dee296ac66b0cd1d71450fc3c98532d93798e73399b7a"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f895d785eb6164678ff4bb5cc60c5996b3ee6df3edb28dcdeba86a13ea0465e"}, + {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ae3e208b31be8ce7f4c2c0034f33406dd24fbce3467f77223d10cd86778471c"}, + {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2efec17819b0046dde35d13fb8ac7a3ad877af41ae4640f4109d9154ed30a188"}, + {file = "watchfiles-0.24.0-cp310-none-win32.whl", hash = "sha256:6bdcfa3cd6fdbdd1a068a52820f46a815401cbc2cb187dd006cb076675e7b735"}, + {file = "watchfiles-0.24.0-cp310-none-win_amd64.whl", hash = "sha256:54ca90a9ae6597ae6dc00e7ed0a040ef723f84ec517d3e7ce13e63e4bc82fa04"}, + {file = "watchfiles-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bdcd5538e27f188dd3c804b4a8d5f52a7fc7f87e7fd6b374b8e36a4ca03db428"}, + {file = "watchfiles-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2dadf8a8014fde6addfd3c379e6ed1a981c8f0a48292d662e27cabfe4239c83c"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6509ed3f467b79d95fc62a98229f79b1a60d1b93f101e1c61d10c95a46a84f43"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8360f7314a070c30e4c976b183d1d8d1585a4a50c5cb603f431cebcbb4f66327"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:316449aefacf40147a9efaf3bd7c9bdd35aaba9ac5d708bd1eb5763c9a02bef5"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73bde715f940bea845a95247ea3e5eb17769ba1010efdc938ffcb967c634fa61"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3770e260b18e7f4e576edca4c0a639f704088602e0bc921c5c2e721e3acb8d15"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0fd7248cf533c259e59dc593a60973a73e881162b1a2f73360547132742823"}, + {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7a2e3b7f5703ffbd500dabdefcbc9eafeff4b9444bbdd5d83d79eedf8428fab"}, + {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d831ee0a50946d24a53821819b2327d5751b0c938b12c0653ea5be7dea9c82ec"}, + {file = "watchfiles-0.24.0-cp311-none-win32.whl", hash = "sha256:49d617df841a63b4445790a254013aea2120357ccacbed00253f9c2b5dc24e2d"}, + {file = "watchfiles-0.24.0-cp311-none-win_amd64.whl", hash = "sha256:d3dcb774e3568477275cc76554b5a565024b8ba3a0322f77c246bc7111c5bb9c"}, + {file = "watchfiles-0.24.0-cp311-none-win_arm64.whl", hash = "sha256:9301c689051a4857d5b10777da23fafb8e8e921bcf3abe6448a058d27fb67633"}, + {file = "watchfiles-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7211b463695d1e995ca3feb38b69227e46dbd03947172585ecb0588f19b0d87a"}, + {file = "watchfiles-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b8693502d1967b00f2fb82fc1e744df128ba22f530e15b763c8d82baee15370"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdab9555053399318b953a1fe1f586e945bc8d635ce9d05e617fd9fe3a4687d6"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34e19e56d68b0dad5cff62273107cf5d9fbaf9d75c46277aa5d803b3ef8a9e9b"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41face41f036fee09eba33a5b53a73e9a43d5cb2c53dad8e61fa6c9f91b5a51e"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5148c2f1ea043db13ce9b0c28456e18ecc8f14f41325aa624314095b6aa2e9ea"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e4bd963a935aaf40b625c2499f3f4f6bbd0c3776f6d3bc7c853d04824ff1c9f"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c79d7719d027b7a42817c5d96461a99b6a49979c143839fc37aa5748c322f234"}, + {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:32aa53a9a63b7f01ed32e316e354e81e9da0e6267435c7243bf8ae0f10b428ef"}, + {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce72dba6a20e39a0c628258b5c308779b8697f7676c254a845715e2a1039b968"}, + {file = "watchfiles-0.24.0-cp312-none-win32.whl", hash = "sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444"}, + {file = "watchfiles-0.24.0-cp312-none-win_amd64.whl", hash = "sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896"}, + {file = "watchfiles-0.24.0-cp312-none-win_arm64.whl", hash = "sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418"}, + {file = "watchfiles-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48"}, + {file = "watchfiles-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f"}, + {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b"}, + {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18"}, + {file = "watchfiles-0.24.0-cp313-none-win32.whl", hash = "sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07"}, + {file = "watchfiles-0.24.0-cp313-none-win_amd64.whl", hash = "sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366"}, + {file = "watchfiles-0.24.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ee82c98bed9d97cd2f53bdb035e619309a098ea53ce525833e26b93f673bc318"}, + {file = "watchfiles-0.24.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd92bbaa2ecdb7864b7600dcdb6f2f1db6e0346ed425fbd01085be04c63f0b05"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f83df90191d67af5a831da3a33dd7628b02a95450e168785586ed51e6d28943c"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fca9433a45f18b7c779d2bae7beeec4f740d28b788b117a48368d95a3233ed83"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b995bfa6bf01a9e09b884077a6d37070464b529d8682d7691c2d3b540d357a0c"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9aba6e01ff6f2e8285e5aa4154e2970068fe0fc0998c4380d0e6278222269b"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5171ef898299c657685306d8e1478a45e9303ddcd8ac5fed5bd52ad4ae0b69b"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4933a508d2f78099162da473841c652ad0de892719043d3f07cc83b33dfd9d91"}, + {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95cf3b95ea665ab03f5a54765fa41abf0529dbaf372c3b83d91ad2cfa695779b"}, + {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01def80eb62bd5db99a798d5e1f5f940ca0a05986dcfae21d833af7a46f7ee22"}, + {file = "watchfiles-0.24.0-cp38-none-win32.whl", hash = "sha256:4d28cea3c976499475f5b7a2fec6b3a36208656963c1a856d328aeae056fc5c1"}, + {file = "watchfiles-0.24.0-cp38-none-win_amd64.whl", hash = "sha256:21ab23fdc1208086d99ad3f69c231ba265628014d4aed31d4e8746bd59e88cd1"}, + {file = "watchfiles-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b665caeeda58625c3946ad7308fbd88a086ee51ccb706307e5b1fa91556ac886"}, + {file = "watchfiles-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c51749f3e4e269231510da426ce4a44beb98db2dce9097225c338f815b05d4f"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b2509f08761f29a0fdad35f7e1638b8ab1adfa2666d41b794090361fb8b855"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a60e2bf9dc6afe7f743e7c9b149d1fdd6dbf35153c78fe3a14ae1a9aee3d98b"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7d9b87c4c55e3ea8881dfcbf6d61ea6775fffed1fedffaa60bd047d3c08c430"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78470906a6be5199524641f538bd2c56bb809cd4bf29a566a75051610bc982c3"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07cdef0c84c03375f4e24642ef8d8178e533596b229d32d2bbd69e5128ede02a"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d337193bbf3e45171c8025e291530fb7548a93c45253897cd764a6a71c937ed9"}, + {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ec39698c45b11d9694a1b635a70946a5bad066b593af863460a8e600f0dff1ca"}, + {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e28d91ef48eab0afb939fa446d8ebe77e2f7593f5f463fd2bb2b14132f95b6e"}, + {file = "watchfiles-0.24.0-cp39-none-win32.whl", hash = "sha256:7138eff8baa883aeaa074359daabb8b6c1e73ffe69d5accdc907d62e50b1c0da"}, + {file = "watchfiles-0.24.0-cp39-none-win_amd64.whl", hash = "sha256:b3ef2c69c655db63deb96b3c3e587084612f9b1fa983df5e0c3379d41307467f"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:632676574429bee8c26be8af52af20e0c718cc7f5f67f3fb658c71928ccd4f7f"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a2a9891723a735d3e2540651184be6fd5b96880c08ffe1a98bae5017e65b544b"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fa2bc0efef3e209a8199fd111b8969fe9db9c711acc46636686331eda7dd4"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01550ccf1d0aed6ea375ef259706af76ad009ef5b0203a3a4cce0f6024f9b68a"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:96619302d4374de5e2345b2b622dc481257a99431277662c30f606f3e22f42be"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:85d5f0c7771dcc7a26c7a27145059b6bb0ce06e4e751ed76cdf123d7039b60b5"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951088d12d339690a92cef2ec5d3cfd957692834c72ffd570ea76a6790222777"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fb58bcaa343fedc6a9e91f90195b20ccb3135447dc9e4e2570c3a39565853e"}, + {file = "watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "13.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"}, + {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"}, + {file = "websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f"}, + {file = "websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe"}, + {file = "websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"}, + {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"}, + {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"}, + {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"}, + {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"}, + {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"}, + {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708"}, + {file = "websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6"}, + {file = "websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d"}, + {file = "websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23"}, + {file = "websockets-13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96"}, + {file = "websockets-13.1-cp38-cp38-win32.whl", hash = "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf"}, + {file = "websockets-13.1-cp38-cp38-win_amd64.whl", hash = "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7"}, + {file = "websockets-13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5"}, + {file = "websockets-13.1-cp39-cp39-win32.whl", hash = "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c"}, + {file = "websockets-13.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"}, + {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"}, + {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"}, + {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"}, + {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, + {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, +] + [[package]] name = "zipp" version = "3.20.2" @@ -1142,4 +1948,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "ac32b9b53343fb7ac17ee22d1490752010b0c705fd4982bdb4f1f6c99ecc2a2a" +content-hash = "31961a8aba2a6114f330f8b5991cad23b1f480b74a8d7aa72a80621841a7b8ec" diff --git a/pyproject.toml b/pyproject.toml index 982746fe..e5f14e7b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,10 @@ pyyaml = "^6.0.2" mkdocs = "^1.6.1" mkdocs-material = "^9.5.39" ollama = "^0.3.3" +uvicorn = {extras = ["standard"], version = "^0.31.1"} +fastapi = {extras = ["standard"], version = "^0.115.0"} +supervisor = "^4.2.5" +sqlmodel = "^0.0.22" [tool.poetry.group.dev.dependencies] pytest = "^8.3.3" diff --git a/src/config/__init__.py b/src/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/config/server.py b/src/config/server.py new file mode 100644 index 00000000..9ae6e6c8 --- /dev/null +++ b/src/config/server.py @@ -0,0 +1,83 @@ +import os.path +from contextlib import asynccontextmanager +from typing import List, Annotated + +from fastapi import FastAPI, Depends +from sqlmodel import SQLModel, create_engine, Field, Session, select + +home_dir = os.path.expanduser('~') +db_path = os.path.join(home_dir, ".yoda", 'yoda.sqlite3') + +connect_args = {"check_same_thread": False} +engine = create_engine(f'sqlite:///{db_path}', connect_args=connect_args) + + +class Plugin(SQLModel, table=True): + name: str = Field(primary_key=True) + description: str + config_data: str + is_enabled: bool + + +def create_db_and_tables(): + SQLModel.metadata.create_all(engine) + + +def get_session(): + with Session(engine) as session: + yield session + + +SessionDep = Annotated[Session, Depends(get_session)] + + +@asynccontextmanager +async def lifespan(_: FastAPI): + # Create the database and tables before we start listening for requests + create_db_and_tables() + + yield + + +app = FastAPI(lifespan=lifespan) + + +@app.get("/plugins", response_model=List[Plugin]) +async def get_plugin_list(session: SessionDep): + plugins = session.exec(select(Plugin)).all() + return plugins + + +@app.post("/plugins", response_model=Plugin) +async def create_plugin(plugin: Plugin, session: SessionDep): + plugin_validated = Plugin.model_validate(plugin) + session.add(plugin_validated) + session.commit() + session.refresh(plugin_validated) + return plugin_validated + + +@app.get("/plugins/{plugin_name}", response_model=Plugin) +async def get_plugin_details(plugin_name: str, session: SessionDep): + plugin = session.get(Plugin, plugin_name) + return plugin + + +@app.put("/plugins/{plugin_name}", response_model=Plugin) +async def update_plugin(plugin_name: str, updated_plugin: Plugin, session: SessionDep): + current_plugin = session.get(Plugin, plugin_name) or Plugin(name=plugin_name) + current_plugin.description = updated_plugin.description + current_plugin.config_data = updated_plugin.config_data + current_plugin.is_enabled = updated_plugin.is_enabled + session.add(current_plugin) + session.commit() + session.refresh(current_plugin) + return current_plugin + + +@app.delete("/plugins/{plugin_name}") +async def delete_plugin(plugin_name: str, session: SessionDep): + plugin = session.get(Plugin, plugin_name) + session.delete(plugin) + session.commit() + return {"message": "Plugin deleted successfully"} From dc92b7eaa9be8db634547f28478dc6bc674127c2 Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sat, 12 Oct 2024 18:14:00 -0700 Subject: [PATCH 02/12] change plugin format --- poetry.lock | 2 +- pyproject.toml | 1 + src/config/server.py | 3 +++ src/yodapa/config.py | 1 + src/yodapa/plugin_manager/plugin.py | 30 +++++++++++------------------ src/yodapa/plugins/bye.py | 18 +++++++++++++++++ src/yodapa/plugins/bye_plugin.py | 19 ------------------ src/yodapa/plugins/hi.py | 18 +++++++++++++++++ src/yodapa/plugins/hi_plugin.py | 23 ---------------------- 9 files changed, 53 insertions(+), 62 deletions(-) create mode 100644 src/yodapa/plugins/bye.py delete mode 100644 src/yodapa/plugins/bye_plugin.py create mode 100644 src/yodapa/plugins/hi.py delete mode 100644 src/yodapa/plugins/hi_plugin.py diff --git a/poetry.lock b/poetry.lock index b1d5a557..1296b54f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1948,4 +1948,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "31961a8aba2a6114f330f8b5991cad23b1f480b74a8d7aa72a80621841a7b8ec" +content-hash = "3a68926b858c3ac2074bfc9d02e5f5eb108542dcd526f32b361d2b30ee2d2377" diff --git a/pyproject.toml b/pyproject.toml index e5f14e7b..c316c9ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ uvicorn = {extras = ["standard"], version = "^0.31.1"} fastapi = {extras = ["standard"], version = "^0.115.0"} supervisor = "^4.2.5" sqlmodel = "^0.0.22" +requests = "^2.32.3" [tool.poetry.group.dev.dependencies] pytest = "^8.3.3" diff --git a/src/config/server.py b/src/config/server.py index 9ae6e6c8..70b66b9c 100644 --- a/src/config/server.py +++ b/src/config/server.py @@ -81,3 +81,6 @@ async def delete_plugin(plugin_name: str, session: SessionDep): session.delete(plugin) session.commit() return {"message": "Plugin deleted successfully"} + +# Run server using: +# fastapi dev src/config/server.py --port 1111 diff --git a/src/yodapa/config.py b/src/yodapa/config.py index 2fa2eb0a..aa9738c9 100644 --- a/src/yodapa/config.py +++ b/src/yodapa/config.py @@ -8,6 +8,7 @@ class ConfigManager: """Configuration manager class. Manages the configuration of Yoda.""" def __init__(self): + self.base_url = "http://localhost:1111" self.config_file = self.get_default_config_file() self.config: Dict[str, Any] = dict() self.load() diff --git a/src/yodapa/plugin_manager/plugin.py b/src/yodapa/plugin_manager/plugin.py index dbb98ab6..c9adf02b 100644 --- a/src/yodapa/plugin_manager/plugin.py +++ b/src/yodapa/plugin_manager/plugin.py @@ -1,7 +1,6 @@ import importlib -import inspect import pkgutil -from typing import List +from typing import List, Tuple import typer @@ -14,7 +13,7 @@ class PluginManager: def __init__(self, app: typer.Typer, config: ConfigManager): self.app: typer.Typer = app self.config: ConfigManager = config - self.plugins: List = [] + self.plugins: List[Tuple[str, typer.Typer]] = [] def discover_plugins(self): """Discover plugins in the 'plugins' directory and the local plugins directory.""" @@ -27,11 +26,9 @@ def discover_plugins(self): # print("finder", finder, "name", name, "ispkg", ispkg) try: module = importlib.import_module(f'yodapa.plugins.{name}') - for attribute_name in dir(module): - plugin_class = getattr(module, attribute_name) - if inspect.isclass(plugin_class) and hasattr(plugin_class(), "typer_app"): - plugin_instance = plugin_class() - self.plugins.append(plugin_instance) + if hasattr(module, "app") and isinstance(module.app, typer.Typer): + plugin_app: typer.Typer = module.app + self.plugins.append((name, plugin_app)) except Exception as e: typer.echo(f"Failed to load plugin {name}: {e}", err=True) @@ -55,14 +52,9 @@ def discover_plugins(self): module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) - # typer.echo(f"Imported module: {module.__name__}") - - # Find the plugin class in the module (same as above) - for attribute_name in dir(module): - plugin_class = getattr(module, attribute_name) - if inspect.isclass(plugin_class) and hasattr(plugin_class(), "typer_app"): - plugin_instance = plugin_class() - self.plugins.append(plugin_instance) + if hasattr(module, "app") and isinstance(module.app, typer.Typer): + plugin_app: typer.Typer = module.app + self.plugins.append((name, plugin_app)) except Exception as e: typer.echo(f"Failed to load local plugin {name}: {e}", err=True) @@ -71,12 +63,12 @@ def discover_plugins(self): def load_plugins(self): """Load the plugins into the yoda typer app.""" - for plugin in self.plugins: + for name, plugin in self.plugins: try: - self.app.add_typer(plugin.typer_app, name=plugin.name, help=f"{plugin.name} plugin commands") + self.app.add_typer(plugin, name=name) # typer.echo(f"Loaded plugin: {plugin.name}") except Exception as e: - typer.echo(f"Error loading plugin {plugin.name}: {e}", err=True) + typer.echo(f"Error loading plugin {name}: {e}", err=True) def enable_plugin(self, plugin_name: str): # TODO: implement diff --git a/src/yodapa/plugins/bye.py b/src/yodapa/plugins/bye.py new file mode 100644 index 00000000..9f2de996 --- /dev/null +++ b/src/yodapa/plugins/bye.py @@ -0,0 +1,18 @@ +import typer + +app = typer.Typer(help=""" + Bye plugin. Say goodbye. + + Example: + + $ yoda bye goodbye --name MP + + $ yoda bye goodbye + """) + + +@app.command() +def goodbye(name: str = None): + """Say goodbye.""" + name = name or "Padawan" + typer.echo(f"Goodbye {name}!") diff --git a/src/yodapa/plugins/bye_plugin.py b/src/yodapa/plugins/bye_plugin.py deleted file mode 100644 index 48c7303f..00000000 --- a/src/yodapa/plugins/bye_plugin.py +++ /dev/null @@ -1,19 +0,0 @@ -import typer - -from yodapa.plugin_manager.decorator import yoda_plugin - - -@yoda_plugin(name="bye") -class ByePlugin: - """ - Bye plugin. Say goodbye. - - Example: - $ yoda bye goodbye --name MP - $ yoda bye goodbye - """ - - def goodbye(self, name: str = None): - """Say goodbye.""" - name = name or "Padawan" - typer.echo(f"Goodbye {name}!") diff --git a/src/yodapa/plugins/hi.py b/src/yodapa/plugins/hi.py new file mode 100644 index 00000000..fb38defa --- /dev/null +++ b/src/yodapa/plugins/hi.py @@ -0,0 +1,18 @@ +import typer + +app = typer.Typer(help=""" + Hi plugin. Say hello. + + Example: + + $ yoda hi hello --name MP + + $ yoda hi hello + """) + + +@app.command() +def hello(name: str = None): + """Say hello.""" + name = name or "Padawan" + typer.echo(f"Hello {name}!") diff --git a/src/yodapa/plugins/hi_plugin.py b/src/yodapa/plugins/hi_plugin.py deleted file mode 100644 index 4b127e71..00000000 --- a/src/yodapa/plugins/hi_plugin.py +++ /dev/null @@ -1,23 +0,0 @@ -import typer - -from yodapa.plugin_manager.decorator import yoda_plugin - - -@yoda_plugin(name="hi") -class HiPlugin: - """ - Hi plugin. Say hello. - - Example: - $ yoda hi hello --name MP - $ yoda hi hello - """ - - def hello(self, name: str = None): - """Say hello.""" - name = name or "Padawan" - typer.echo(f"Hello {name}!") - - def _private_method_should_not_be_added(self): - """This method should not be added as a command.""" - raise NotImplementedError() From be1ff19565d5cae53c208bae04b20ab76713ae5e Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sat, 12 Oct 2024 18:22:55 -0700 Subject: [PATCH 03/12] clean up, port ai to new format --- src/cli/yoda.py | 2 +- src/yodapa/config.py | 1 + src/yodapa/{plugin_manager => }/plugin.py | 0 src/yodapa/plugin_manager/__init__.py | 0 src/yodapa/plugin_manager/decorator.py | 31 ------ src/yodapa/plugins/ai.py | 105 ++++++++++++++++++++ src/yodapa/plugins/ai_command_generator.py | 109 --------------------- 7 files changed, 107 insertions(+), 141 deletions(-) rename src/yodapa/{plugin_manager => }/plugin.py (100%) delete mode 100644 src/yodapa/plugin_manager/__init__.py delete mode 100644 src/yodapa/plugin_manager/decorator.py create mode 100644 src/yodapa/plugins/ai.py delete mode 100644 src/yodapa/plugins/ai_command_generator.py diff --git a/src/cli/yoda.py b/src/cli/yoda.py index e23ffe37..8f77976c 100644 --- a/src/cli/yoda.py +++ b/src/cli/yoda.py @@ -3,7 +3,7 @@ import typer from yodapa.config import ConfigManager -from yodapa.plugin_manager.plugin import PluginManager +from yodapa.plugin import PluginManager class Yoda: diff --git a/src/yodapa/config.py b/src/yodapa/config.py index aa9738c9..ece37738 100644 --- a/src/yodapa/config.py +++ b/src/yodapa/config.py @@ -9,6 +9,7 @@ class ConfigManager: def __init__(self): self.base_url = "http://localhost:1111" + self.sqlite_file = Path.home() / ".yoda" / "yoda" self.config_file = self.get_default_config_file() self.config: Dict[str, Any] = dict() self.load() diff --git a/src/yodapa/plugin_manager/plugin.py b/src/yodapa/plugin.py similarity index 100% rename from src/yodapa/plugin_manager/plugin.py rename to src/yodapa/plugin.py diff --git a/src/yodapa/plugin_manager/__init__.py b/src/yodapa/plugin_manager/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/yodapa/plugin_manager/decorator.py b/src/yodapa/plugin_manager/decorator.py deleted file mode 100644 index 3e2d6dcc..00000000 --- a/src/yodapa/plugin_manager/decorator.py +++ /dev/null @@ -1,31 +0,0 @@ -import inspect -from typing import Annotated, Optional - -import typer - - -def yoda_plugin(name: Annotated[Optional[str], typer.Argument()] = None): - """ - Decorator to turn a class into a Yoda PA plugin. - All public methods of the class are added as Typer commands. - """ - - def decorator(cls): - nonlocal name - name = name or cls.__name__.lower() - - def __init__(self): - self.typer_app = typer.Typer(name=name, help=f"{name} plugin commands") - - for method_name, method in inspect.getmembers(self, predicate=inspect.ismethod): - # Skip private methods - if method_name.startswith("_"): - continue - - self.typer_app.command()(method) - - cls.__init__ = __init__ - cls.name = name - return cls - - return decorator diff --git a/src/yodapa/plugins/ai.py b/src/yodapa/plugins/ai.py new file mode 100644 index 00000000..bb48868e --- /dev/null +++ b/src/yodapa/plugins/ai.py @@ -0,0 +1,105 @@ +import ollama +import typer + +app = typer.Typer(help="AI command. Allows you to communicate with your local LLMs") + + +def _communicate_with_ollama(prompt: str): + try: + response = ollama.chat( + model="codellama", + messages=[{"role": "user", "content": prompt}], + stream=False, + ) + # typer.echo(f"Received response from Ollama: {response['message']['content'].strip()}") + return response['message']['content'].strip() + except ollama.ResponseError as e: + typer.echo(f"Error communicating with Ollama: {e}", err=True) + typer.echo(f"Failed to communicate with Ollama: {e}", err=True) + + typer.echo("If you don't have ollama installed, you can install it by going through the instructions on " + "their website: https://ollama.com/ and installing the codellama model") + raise + + +@app.command() +def chat(prompt: str): + """ + Chat with the AI model based on the provided prompt. + + Args: + prompt (str): The prompt to start the conversation. + """ + # typer.echo(f"Starting chat with prompt: {prompt}") + + try: + # Interact with the Ollama LLM + response = _communicate_with_ollama(prompt) + typer.echo(f"🤖 AI response:\n{response}") + + except Exception as e: + typer.echo(f"Error chatting with AI: {e}", err=True) + typer.echo(f"Failed to chat with AI: {e}", err=True) + + +@app.command() +def generate_command(plugin_name: str, prompt: str): + """ + Generate code for a new plugin command based on the provided prompt. + + Args: + prompt (str): The description or functionality of the desired command. + plugin_name (str): The name for the new plugin. + """ + typer.echo(f"Generating command for plugin: {plugin_name} with prompt: {prompt}") + + # Construct the prompt for the AI model + ai_prompt = f""" +Generate a Python Typer plugin class named "{plugin_name}" with a single command and multiple subcommands as required based on the following description: + +{prompt}. + +The plugin should follow the existing structure, using the 'yoda_plugin' decorator and include appropriate docstrings. An example of the expected output is provided below: +```python +import typer + +app = typer.Typer(help=\"\"\" + Hi plugin. Say hello. + + Example: + + $ yoda hi hello --name MP + + $ yoda hi hello + \"\"\") + + +@app.command() +def hello(name: str = None): + \"\"\"Say hello.\"\"\" + name = name or "Padawan" + typer.echo(f"Hello {{name}}!") +``` + +You must only return the generated code for the plugin class. All the details for the plugin class should be added in the docstring. +You must use all the python best practices to write the most efficient python code. Provide complete working code for all the subcommands. + """ + + try: + # Interact with the Ollama LLM + generated_code = _communicate_with_ollama(ai_prompt) + typer.echo(f"🤖 Generated code:\n{generated_code}") + + # Define the plugin file path + # plugin_file = self.output_dir / f"{plugin_name.lower()}_plugin.py" + # + # # Write the generated code to the plugin file + # with open(plugin_file, "w") as f: + # f.write(generated_code) + # typer.echo(f"Generated plugin saved to {plugin_file}") + # + # typer.echo(f"Plugin '{plugin_name}' has been generated and saved to {plugin_file}") + + except Exception as e: + typer.echo(f"Error generating plugin: {e}", err=True) + typer.echo(f"Failed to generate plugin: {e}", err=True) diff --git a/src/yodapa/plugins/ai_command_generator.py b/src/yodapa/plugins/ai_command_generator.py deleted file mode 100644 index 26643199..00000000 --- a/src/yodapa/plugins/ai_command_generator.py +++ /dev/null @@ -1,109 +0,0 @@ -import ollama -import typer - -from yodapa.plugin_manager.decorator import yoda_plugin - - -@yoda_plugin("ai") -class AICommandGenerator: - def _communicate_with_ollama(self, prompt: str): - try: - response = ollama.chat( - model="codellama", - messages=[{"role": "user", "content": prompt}], - stream=False, - ) - # typer.echo(f"Received response from Ollama: {response['message']['content'].strip()}") - return response['message']['content'].strip() - except ollama.ResponseError as e: - typer.echo(f"Error communicating with Ollama: {e}", err=True) - typer.echo(f"Failed to communicate with Ollama: {e}", err=True) - - typer.echo("If you don't have ollama installed, you can install it by going through the instructions on " - "their website: https://ollama.com/ and installing the codellama model") - raise - - def chat(self, prompt: str): - """ - Chat with the AI model based on the provided prompt. - - Args: - prompt (str): The prompt to start the conversation. - """ - # typer.echo(f"Starting chat with prompt: {prompt}") - - try: - # Interact with the Ollama LLM - response = self._communicate_with_ollama(prompt) - typer.echo(f"🤖 AI response:\n{response}") - - except Exception as e: - typer.echo(f"Error chatting with AI: {e}", err=True) - typer.echo(f"Failed to chat with AI: {e}", err=True) - - def generate_command(self, plugin_name: str, prompt: str): - """ - Generate code for a new plugin command based on the provided prompt. - - Args: - prompt (str): The description or functionality of the desired command. - plugin_name (str): The name for the new plugin. - """ - typer.echo(f"Generating command for plugin: {plugin_name} with prompt: {prompt}") - - # Construct the prompt for the AI model - ai_prompt = f""" - Generate a Python Typer plugin class named "{plugin_name}" with a single command and multiple subcommands as required based on the following description: - - {prompt}. - - The plugin should follow the existing structure, using the 'yoda_plugin' decorator and include appropriate docstrings. An example of the expected output is provided below: - ```python - import typer - - from yodapa.plugin_manager.decorator import yoda_plugin - - - @yoda_plugin(name="hi") - class HiPlugin: - \"\"\" - Hi plugin. Say hello. - - Example: - $ yoda hi hello --name MP - $ yoda hi hello - \"\"\" - - def hello(self, name: str = None): - \"\"\"Say hello.\"\"\" - name = name or "Padawan" - typer.echo(f"Hello {{name}}!") - - def how_are_you(self, name: str = None): - \"\"\"Respond to How are you.\"\"\" - name = name or "Padawan" - typer.echo(f"I'm good, how are you, {{name}}?") - ``` - - You must only return the generated code for the plugin class. All the details for the plugin class should be added in the docstring. - You must use all the python best practices to write the most efficient python code. Provide complete working code for all the subcommands. - """ - - try: - # Interact with the Ollama LLM - generated_code = self._communicate_with_ollama(ai_prompt) - typer.echo(f"🤖 Generated code:\n{generated_code}") - - # Define the plugin file path - # plugin_file = self.output_dir / f"{plugin_name.lower()}_plugin.py" - # - # # Write the generated code to the plugin file - # with open(plugin_file, "w") as f: - # f.write(generated_code) - # typer.echo(f"Generated plugin saved to {plugin_file}") - # - # typer.echo(f"Plugin '{plugin_name}' has been generated and saved to {plugin_file}") - - except Exception as e: - typer.echo(f"Error generating plugin: {e}", err=True) - typer.echo(f"Failed to generate plugin: {e}", err=True) From 0143c71939d16cad8f6f73cc7cec1d8440fe508c Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sat, 12 Oct 2024 19:07:31 -0700 Subject: [PATCH 04/12] Add config manager as a plugin and uses sqlite database --- src/yodapa/plugins/config.py | 130 +++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 src/yodapa/plugins/config.py diff --git a/src/yodapa/plugins/config.py b/src/yodapa/plugins/config.py new file mode 100644 index 00000000..b16e06ae --- /dev/null +++ b/src/yodapa/plugins/config.py @@ -0,0 +1,130 @@ +import sqlite3 +from pathlib import Path +from sqlite3 import Connection + +import typer +from rich import print +from rich.table import Table + +app = typer.Typer(help="Config management") +sqlite_file = Path.home() / ".yoda" / "yoda.sqlite3" + + +def get_db_connection() -> Connection: + conn = sqlite3.connect(sqlite_file) + return conn + + +@app.command(name="init") +def initialize_config(): + """Initializes a sqlite db that will store the config""" + if sqlite_file.exists(): + delete_old = typer.confirm("This file already exists. Do you want to continue?") + + if not delete_old: + return + + # delete old file + sqlite_file.unlink() + + conn = get_db_connection() + + cursor = conn.cursor() + # create tables + cursor.execute(""" + CREATE TABLE IF NOT EXISTS configurations ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ) + """) + + cursor.execute(""" + CREATE TABLE IF NOT EXISTS plugins ( + name TEXT PRIMARY KEY, + enabled BOOLEAN NOT NULL + ) + """) + conn.commit() + conn.close() + + +@app.command(name="set") +def set_config_value(key: str, value: str): + """Set a value for a key in config""" + conn = None + try: + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute(""" + INSERT INTO configurations (key, value) + VALUES (?, ?) + ON CONFLICT(key) DO UPDATE SET value=excluded.value + """, (key, value)) + conn.commit() + print(f"[green]Configuration set:[/] {key} = {value}") + except sqlite3.OperationalError as e: + if "no such table" in str(e): + print("[red]Yoda config not initialized. Use [white]`yoda config init`[red] to initialize[/]") + else: + print(f"An error occurred: {e}") + finally: + if conn: + conn.close() + + +@app.command(name="get") +def get_config_value(key: str): + """Get value of a key set in yoda config""" + conn = None + try: + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute("SELECT value FROM configurations WHERE key = ?", (key,)) + row = cursor.fetchone() + + if row: + value = row[0] + print(f"[blue]{key}[/]: {value}") + else: + print(f"[red]Configuration key [white]'{key}'[red] not found.[/]") + except sqlite3.OperationalError as e: + if "no such table" in str(e): + print("[red]Yoda config not initialized. Use [white]`yoda config init`[red] to initialize[/]") + else: + print(f"An error occurred: {e}") + finally: + if conn: + conn.close() + + +@app.command(name="list") +def list_configurations(): + """List all key-value pairs in the config""" + conn = None + try: + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute("SELECT key, value FROM configurations") + rows = cursor.fetchall() + + if not rows: + print("[yellow] No configurations found.[/]") + return + + table = Table(title="Configurations") + table.add_column("Key", style="cyan", no_wrap=True) + table.add_column("Value", style="magenta") + + for key, value in rows: + table.add_row(key, value) + + print(table) + + except sqlite3.OperationalError as e: + if "no such table" in str(e): + print("[red]Yoda config not initialized. Use [white]`yoda config init`[red] to initialize[/]") + else: + print(f"An error occurred: {e}") + finally: + if conn: + conn.close() From c3d451ed882c4da120527b35fb30c1eb222e64ff Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sat, 12 Oct 2024 22:24:00 -0700 Subject: [PATCH 05/12] Use sqlite3 to store plugin config --- poetry.lock | 44 ++++++------ pyproject.toml | 6 +- src/cli/yoda.py | 34 ++-------- src/yodapa/plugin.py | 107 +++++++++++++----------------- src/yodapa/plugins/config.py | 8 +-- src/yodapa/plugins/plugin.py | 125 +++++++++++++++++++++++++++++++++++ 6 files changed, 206 insertions(+), 118 deletions(-) create mode 100644 src/yodapa/plugins/plugin.py diff --git a/poetry.lock b/poetry.lock index 1296b54f..aa7752b7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -248,13 +248,13 @@ test = ["pytest (>=6)"] [[package]] name = "fastapi" -version = "0.115.0" +version = "0.115.2" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.115.0-py3-none-any.whl", hash = "sha256:17ea427674467486e997206a5ab25760f6b09e069f099b96f5b55a32fb6f1631"}, - {file = "fastapi-0.115.0.tar.gz", hash = "sha256:f93b4ca3529a8ebc6fc3fcf710e5efa8de3df9b41570958abf1d97d843138004"}, + {file = "fastapi-0.115.2-py3-none-any.whl", hash = "sha256:61704c71286579cc5a598763905928f24ee98bfcc07aabe84cfefb98812bbc86"}, + {file = "fastapi-0.115.2.tar.gz", hash = "sha256:3995739e0b09fa12f984bce8fa9ae197b35d433750d3d312422d846e283697ee"}, ] [package.dependencies] @@ -264,7 +264,7 @@ httpx = {version = ">=0.23.0", optional = true, markers = "extra == \"standard\" jinja2 = {version = ">=2.11.2", optional = true, markers = "extra == \"standard\""} pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" python-multipart = {version = ">=0.0.7", optional = true, markers = "extra == \"standard\""} -starlette = ">=0.37.2,<0.39.0" +starlette = ">=0.37.2,<0.41.0" typing-extensions = ">=4.8.0" uvicorn = {version = ">=0.12.0", extras = ["standard"], optional = true, markers = "extra == \"standard\""} @@ -395,13 +395,13 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "1.3.2" +version = "1.4.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "griffe-1.3.2-py3-none-any.whl", hash = "sha256:2e34b5e46507d615915c8e6288bb1a2234bd35dee44d01e40a2bc2f25bd4d10c"}, - {file = "griffe-1.3.2.tar.gz", hash = "sha256:1ec50335aa507ed2445f2dd45a15c9fa3a45f52c9527e880571dfc61912fd60c"}, + {file = "griffe-1.4.1-py3-none-any.whl", hash = "sha256:84295ee0b27743bd880aea75632830ef02ded65d16124025e4c263bb826ab645"}, + {file = "griffe-1.4.1.tar.gz", hash = "sha256:911a201b01dc92e08c0e84c38a301e9da5ec067f00e7d9f2e39bc24dbfa3c176"}, ] [package.dependencies] @@ -777,13 +777,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.5.39" +version = "9.5.40" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.39-py3-none-any.whl", hash = "sha256:0f2f68c8db89523cb4a59705cd01b4acd62b2f71218ccb67e1e004e560410d2b"}, - {file = "mkdocs_material-9.5.39.tar.gz", hash = "sha256:25faa06142afa38549d2b781d475a86fb61de93189f532b88e69bf11e5e5c3be"}, + {file = "mkdocs_material-9.5.40-py3-none-any.whl", hash = "sha256:8e7a16ada34e79a7b6459ff2602584222f522c738b6a023d1bea853d5049da6f"}, + {file = "mkdocs_material-9.5.40.tar.gz", hash = "sha256:b69d70e667ec51fc41f65e006a3184dd00d95b2439d982cb1586e4c018943156"}, ] [package.dependencies] @@ -817,13 +817,13 @@ files = [ [[package]] name = "mkdocstrings" -version = "0.26.1" +version = "0.26.2" description = "Automatic documentation from sources, for MkDocs." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "mkdocstrings-0.26.1-py3-none-any.whl", hash = "sha256:29738bfb72b4608e8e55cc50fb8a54f325dc7ebd2014e4e3881a49892d5983cf"}, - {file = "mkdocstrings-0.26.1.tar.gz", hash = "sha256:bb8b8854d6713d5348ad05b069a09f3b79edbc6a0f33a34c6821141adb03fe33"}, + {file = "mkdocstrings-0.26.2-py3-none-any.whl", hash = "sha256:1248f3228464f3b8d1a15bd91249ce1701fe3104ac517a5f167a0e01ca850ba5"}, + {file = "mkdocstrings-0.26.2.tar.gz", hash = "sha256:34a8b50f1e6cfd29546c6c09fbe02154adfb0b361bb758834bf56aa284ba876e"}, ] [package.dependencies] @@ -846,13 +846,13 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.11.1" +version = "1.12.0" description = "A Python handler for mkdocstrings." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "mkdocstrings_python-1.11.1-py3-none-any.whl", hash = "sha256:a21a1c05acef129a618517bb5aae3e33114f569b11588b1e7af3e9d4061a71af"}, - {file = "mkdocstrings_python-1.11.1.tar.gz", hash = "sha256:8824b115c5359304ab0b5378a91f6202324a849e1da907a3485b59208b797322"}, + {file = "mkdocstrings_python-1.12.0-py3-none-any.whl", hash = "sha256:1f48c9ea6d1d6cd1fefc7389f003841e9c65e50016ba40342f340ca901bc60b9"}, + {file = "mkdocstrings_python-1.12.0.tar.gz", hash = "sha256:2121671354fff208fff1278ce9c961aee2b736a1688f70064c4fa76a00241b34"}, ] [package.dependencies] @@ -1535,13 +1535,13 @@ SQLAlchemy = ">=2.0.14,<2.1.0" [[package]] name = "starlette" -version = "0.38.6" +version = "0.39.2" description = "The little ASGI library that shines." optional = false python-versions = ">=3.8" files = [ - {file = "starlette-0.38.6-py3-none-any.whl", hash = "sha256:4517a1409e2e73ee4951214ba012052b9e16f60e90d73cfb06192c19203bbb05"}, - {file = "starlette-0.38.6.tar.gz", hash = "sha256:863a1588f5574e70a821dadefb41e4881ea451a47a3cd1b4df359d4ffefe5ead"}, + {file = "starlette-0.39.2-py3-none-any.whl", hash = "sha256:134dd6deb655a9775991d352312d53f1879775e5cc8a481f966e83416a2c3f71"}, + {file = "starlette-0.39.2.tar.gz", hash = "sha256:caaa3b87ef8518ef913dac4f073dea44e85f73343ad2bdc17941931835b2a26a"}, ] [package.dependencies] diff --git a/pyproject.toml b/pyproject.toml index c316c9ad..28e192fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "yodapa" -version = "0.4.0" +version = "0.5.0" description = "Personal Assistant on the command line" authors = ["Man Parvesh Singh Randhawa "] license = "MIT" @@ -19,8 +19,8 @@ pyyaml = "^6.0.2" mkdocs = "^1.6.1" mkdocs-material = "^9.5.39" ollama = "^0.3.3" -uvicorn = {extras = ["standard"], version = "^0.31.1"} -fastapi = {extras = ["standard"], version = "^0.115.0"} +uvicorn = { extras = ["standard"], version = "^0.31.1" } +fastapi = { extras = ["standard"], version = "^0.115.0" } supervisor = "^4.2.5" sqlmodel = "^0.0.22" requests = "^2.32.3" diff --git a/src/cli/yoda.py b/src/cli/yoda.py index 8f77976c..89904166 100644 --- a/src/cli/yoda.py +++ b/src/cli/yoda.py @@ -2,43 +2,19 @@ import typer -from yodapa.config import ConfigManager -from yodapa.plugin import PluginManager +from yodapa.plugin import discover_plugins, load_plugins - -class Yoda: - """Yoda main class.""" - - def __init__(self): - self.app = typer.Typer() - self.config = ConfigManager() - self.plugin_manager = PluginManager(self.app, self.config) - - def init(self): - self.plugin_manager.discover_plugins() - self.plugin_manager.load_plugins() - - -yoda = Yoda() -yoda.init() - -# define commands -app = yoda.app +app = typer.Typer() +plugins = discover_plugins() +load_plugins(app, plugins) @app.command() def hello(name: Annotated[Optional[str], typer.Argument()] = None): """Say hello.""" - name = name or yoda.config.get("user", "Skywalker") + name = name or "Skywalker" typer.echo(f"Hello {name}!") -@app.command() -def configure(): - """Configure Yoda.""" - yoda.config.set("user", typer.prompt("What is your name?")) - typer.echo("Yoda configured!") - - if __name__ == "__main__": app() diff --git a/src/yodapa/plugin.py b/src/yodapa/plugin.py index c9adf02b..3ff7a0e0 100644 --- a/src/yodapa/plugin.py +++ b/src/yodapa/plugin.py @@ -1,79 +1,66 @@ import importlib import pkgutil +from pathlib import Path from typing import List, Tuple import typer -from yodapa.config import ConfigManager +def discover_plugins() -> List[Tuple[str, typer.Typer]]: + """Discover plugins in the 'plugins' directory and the local plugins directory.""" -class PluginManager: - """Plugin manager class. Manages the plugins in the 'plugins' directory and the local plugins directory.""" + plugins: List[Tuple[str, typer.Typer]] = list() - def __init__(self, app: typer.Typer, config: ConfigManager): - self.app: typer.Typer = app - self.config: ConfigManager = config - self.plugins: List[Tuple[str, typer.Typer]] = [] + # 1. Discover plugins within the 'plugins' directory + plugins_pkg = importlib.import_module('yodapa.plugins') + plugins_path = plugins_pkg.__path__ - def discover_plugins(self): - """Discover plugins in the 'plugins' directory and the local plugins directory.""" + for finder, name, ispkg in pkgutil.iter_modules(plugins_path): + # print("finder", finder, "name", name, "ispkg", ispkg) + try: + module = importlib.import_module(f'yodapa.plugins.{name}') + if hasattr(module, "app") and isinstance(module.app, typer.Typer): + plugin_app: typer.Typer = module.app + plugins.append((name, plugin_app)) + except Exception as e: + typer.echo(f"Failed to load plugin {name}: {e}", err=True) - # 1. Discover plugins within the 'plugins' directory - plugins_pkg = importlib.import_module('yodapa.plugins') - plugins_path = plugins_pkg.__path__ - - for finder, name, ispkg in pkgutil.iter_modules(plugins_path): + # 2. Discover plugins in the local plugins directory + local_plugins_dir = Path.home() / ".yoda" / "plugins" + if local_plugins_dir.exists() and local_plugins_dir.is_dir(): + for finder, name, ispkg in pkgutil.iter_modules([str(local_plugins_dir)]): # print("finder", finder, "name", name, "ispkg", ispkg) try: - module = importlib.import_module(f'yodapa.plugins.{name}') - if hasattr(module, "app") and isinstance(module.app, typer.Typer): - plugin_app: typer.Typer = module.app - self.plugins.append((name, plugin_app)) - except Exception as e: - typer.echo(f"Failed to load plugin {name}: {e}", err=True) - - # 2. Discover plugins in the local plugins directory - local_plugins_dir = self.config.get_yoda_plugins_dir() - if local_plugins_dir.exists() and local_plugins_dir.is_dir(): - for finder, name, ispkg in pkgutil.iter_modules([str(local_plugins_dir)]): - # print("finder", finder, "name", name, "ispkg", ispkg) - try: - module_path = local_plugins_dir / f"{name}.py" - if not module_path.exists(): - typer.echo(f"Plugin module {name} does not exist at {module_path}", err=True) - continue - - # Load the module from the file path - spec = importlib.util.spec_from_file_location(name, str(module_path)) - if spec is None: - typer.echo(f"Could not load spec for module {name}", err=True) - continue + module_path = local_plugins_dir / f"{name}.py" + if not module_path.exists(): + typer.echo(f"Plugin module {name} does not exist at {module_path}", err=True) + continue - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) + # Load the module from the file path + spec = importlib.util.spec_from_file_location(name, str(module_path)) + if spec is None: + typer.echo(f"Could not load spec for module {name}", err=True) + continue - if hasattr(module, "app") and isinstance(module.app, typer.Typer): - plugin_app: typer.Typer = module.app - self.plugins.append((name, plugin_app)) - except Exception as e: - typer.echo(f"Failed to load local plugin {name}: {e}", err=True) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) - # uncomment to debug - # print("Plugins discovered:", self.plugins) - - def load_plugins(self): - """Load the plugins into the yoda typer app.""" - for name, plugin in self.plugins: - try: - self.app.add_typer(plugin, name=name) - # typer.echo(f"Loaded plugin: {plugin.name}") + if hasattr(module, "app") and isinstance(module.app, typer.Typer): + plugin_app: typer.Typer = module.app + plugins.append((name, plugin_app)) except Exception as e: - typer.echo(f"Error loading plugin {name}: {e}", err=True) + typer.echo(f"Failed to load local plugin {name}: {e}", err=True) + + # uncomment to debug + # print("Plugins discovered:", plugins) + return plugins - def enable_plugin(self, plugin_name: str): - # TODO: implement - pass - def disable_plugin(self, plugin_name: str): - # TODO: implement - pass +def load_plugins(app: typer.Typer, plugins: List[Tuple[str, typer.Typer]]): + """Load the plugins into the yoda typer app.""" + for name, plugin in plugins: + try: + app.add_typer(plugin, name=name) + # typer.echo(f"Loaded plugin: {plugin.name}") + except Exception as e: + typer.echo(f"Error loading plugin {name}: {e}", err=True) diff --git a/src/yodapa/plugins/config.py b/src/yodapa/plugins/config.py index b16e06ae..f94aee35 100644 --- a/src/yodapa/plugins/config.py +++ b/src/yodapa/plugins/config.py @@ -7,25 +7,25 @@ from rich.table import Table app = typer.Typer(help="Config management") -sqlite_file = Path.home() / ".yoda" / "yoda.sqlite3" +config_sqlite_file = Path.home() / ".yoda" / "yoda.sqlite3" def get_db_connection() -> Connection: - conn = sqlite3.connect(sqlite_file) + conn = sqlite3.connect(config_sqlite_file) return conn @app.command(name="init") def initialize_config(): """Initializes a sqlite db that will store the config""" - if sqlite_file.exists(): + if config_sqlite_file.exists(): delete_old = typer.confirm("This file already exists. Do you want to continue?") if not delete_old: return # delete old file - sqlite_file.unlink() + config_sqlite_file.unlink() conn = get_db_connection() diff --git a/src/yodapa/plugins/plugin.py b/src/yodapa/plugins/plugin.py new file mode 100644 index 00000000..405d9b33 --- /dev/null +++ b/src/yodapa/plugins/plugin.py @@ -0,0 +1,125 @@ +import sqlite3 + +import typer +from rich import print +from rich.table import Table + +from yodapa.plugin import discover_plugins +from yodapa.plugins.config import get_db_connection + +PROTECTED_PLUGINS = ["config", "plugin"] + +app = typer.Typer(help="Commands to manage plugins") + + +@app.command(name="list") +def list_plugins(): + conn = None + try: + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute("SELECT name, enabled FROM plugins") + rows = cursor.fetchall() + + if not rows: + print("[yellow] No plugins found.[/]") + return + + table = Table(title="Yoda Plugins") + table.add_column("Name", style="cyan", no_wrap=True) + table.add_column("Enabled") + + for key, value in rows: + table.add_row(key, "[green]Yes[/]" if value == 1 else "[red]No[/]") + + print(table) + + except sqlite3.OperationalError as e: + if "no such table" in str(e): + print("[red]Yoda config not initialized. Use [white]`yoda config init`[red] to initialize[/]") + else: + print(f"An error occurred: {e}") + finally: + if conn: + conn.close() + + +@app.command(name="enable") +def enable_plugin(name: str): + conn = None + try: + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute("SELECT name, enabled FROM plugins WHERE name = ?", (name,)) + rows = cursor.fetchone() + + if not rows: + print(f"[red] Plugin {name} not found.[/]") + return + + cursor.execute("UPDATE plugins SET enabled=TRUE WHERE name = ?", (name,)) + conn.commit() + print(f"[green] Enabled plugin {name}.[/]") + + except sqlite3.OperationalError as e: + if "no such table" in str(e): + print("[red]Yoda config not initialized. Use [white]`yoda config init`[red] to initialize[/]") + else: + print(f"An error occurred: {e}") + finally: + if conn: + conn.close() + + +@app.command(name="disable") +def disable_plugin(name: str): + conn = None + try: + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute("SELECT name, enabled FROM plugins WHERE name = ?", (name,)) + rows = cursor.fetchone() + + if not rows: + print(f"[red] Plugin {name} not found.[/]") + return + + cursor.execute("UPDATE plugins SET enabled=FALSE WHERE name = ?", (name,)) + conn.commit() + print(f"[green]Disabled plugin {name}.[/]") + + except sqlite3.OperationalError as e: + if "no such table" in str(e): + print("[red]Yoda config not initialized. Use [white]`yoda config init`[red] to initialize[/]") + else: + print(f"An error occurred: {e}") + finally: + if conn: + conn.close() + + +@app.command(name="refresh") +def refresh_plugins(): + conn = None + try: + conn = get_db_connection() + cursor = conn.cursor() + + # delete all existing plugins + cursor.execute("DELETE FROM plugins") + + plugins = discover_plugins() + for plugin_name, _ in plugins: + cursor.execute("INSERT INTO plugins VALUES (?, TRUE)", (plugin_name,)) + + conn.commit() + print(f"[green] Plugins refreshed.[/]") + + except sqlite3.OperationalError as e: + if "no such table" in str(e): + print("[red]Yoda config not initialized. Use [white]`yoda config init`[red] to initialize[/]") + else: + print(f"An error occurred: {e}") + finally: + if conn: + conn.close() From f5ab779b334c3091142a5df7d43ed3b64e9c613a Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sat, 12 Oct 2024 22:41:27 -0700 Subject: [PATCH 06/12] only show plugins that are enabled and ready to use --- src/cli/yoda.py | 6 ++++- src/yodapa/plugins/plugin.py | 44 ++++++++++++++++++++++++------------ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/cli/yoda.py b/src/cli/yoda.py index 89904166..99be2363 100644 --- a/src/cli/yoda.py +++ b/src/cli/yoda.py @@ -3,10 +3,14 @@ import typer from yodapa.plugin import discover_plugins, load_plugins +from yodapa.plugins.plugin import get_enabled_plugins app = typer.Typer() plugins = discover_plugins() -load_plugins(app, plugins) + +enabled_plugins = get_enabled_plugins() + +load_plugins(app, [(plugin_name, typer_app) for plugin_name, typer_app in plugins if plugin_name in enabled_plugins]) @app.command() diff --git a/src/yodapa/plugins/plugin.py b/src/yodapa/plugins/plugin.py index 405d9b33..0589909b 100644 --- a/src/yodapa/plugins/plugin.py +++ b/src/yodapa/plugins/plugin.py @@ -12,8 +12,8 @@ app = typer.Typer(help="Commands to manage plugins") -@app.command(name="list") -def list_plugins(): +def get_plugin_list(): + """Get plugin list from sqlite3""" conn = None try: conn = get_db_connection() @@ -21,18 +21,7 @@ def list_plugins(): cursor.execute("SELECT name, enabled FROM plugins") rows = cursor.fetchall() - if not rows: - print("[yellow] No plugins found.[/]") - return - - table = Table(title="Yoda Plugins") - table.add_column("Name", style="cyan", no_wrap=True) - table.add_column("Enabled") - - for key, value in rows: - table.add_row(key, "[green]Yes[/]" if value == 1 else "[red]No[/]") - - print(table) + return rows except sqlite3.OperationalError as e: if "no such table" in str(e): @@ -44,6 +33,29 @@ def list_plugins(): conn.close() +def get_enabled_plugins(): + """Get plugin list from sqlite3""" + return set(name for name, enabled in get_plugin_list() if enabled) + + +@app.command(name="list") +def list_plugins(): + rows = get_plugin_list() + + if not rows: + print("[yellow] No plugins found.[/]") + return + + table = Table(title="Yoda Plugins") + table.add_column("Name", style="cyan", no_wrap=True) + table.add_column("Enabled") + + for key, value in rows: + table.add_row(key, "[green]Yes[/]" if value == 1 else "[red]No[/]") + + print(table) + + @app.command(name="enable") def enable_plugin(name: str): conn = None @@ -73,6 +85,10 @@ def enable_plugin(name: str): @app.command(name="disable") def disable_plugin(name: str): + if name in PROTECTED_PLUGINS: + print(f"[italic]{name}[/] [red]is an internal plugin that cannot be disabled[/]") + return + conn = None try: conn = get_db_connection() From a1352a2c77f89a933e2af13881fef51a52cadaf6 Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sat, 12 Oct 2024 23:06:30 -0700 Subject: [PATCH 07/12] clean up and refactoring. no change in logic --- src/cli/yoda.py | 9 +-- src/yodapa/config.py | 53 ------------- src/yodapa/core/__init__.py | 0 src/yodapa/{plugins => core}/config.py | 0 src/yodapa/{plugins => core}/plugin.py | 100 ++++++++++++++++++++++++- src/yodapa/plugin.py | 66 ---------------- tests/test_config.py | 46 ------------ 7 files changed, 100 insertions(+), 174 deletions(-) delete mode 100644 src/yodapa/config.py create mode 100644 src/yodapa/core/__init__.py rename src/yodapa/{plugins => core}/config.py (100%) rename src/yodapa/{plugins => core}/plugin.py (50%) delete mode 100644 src/yodapa/plugin.py delete mode 100644 tests/test_config.py diff --git a/src/cli/yoda.py b/src/cli/yoda.py index 99be2363..e0605131 100644 --- a/src/cli/yoda.py +++ b/src/cli/yoda.py @@ -2,15 +2,10 @@ import typer -from yodapa.plugin import discover_plugins, load_plugins -from yodapa.plugins.plugin import get_enabled_plugins +from yodapa.core.plugin import init_plugins app = typer.Typer() -plugins = discover_plugins() - -enabled_plugins = get_enabled_plugins() - -load_plugins(app, [(plugin_name, typer_app) for plugin_name, typer_app in plugins if plugin_name in enabled_plugins]) +init_plugins(app) @app.command() diff --git a/src/yodapa/config.py b/src/yodapa/config.py deleted file mode 100644 index ece37738..00000000 --- a/src/yodapa/config.py +++ /dev/null @@ -1,53 +0,0 @@ -from pathlib import Path -from typing import Any, Dict - -import yaml - - -class ConfigManager: - """Configuration manager class. Manages the configuration of Yoda.""" - - def __init__(self): - self.base_url = "http://localhost:1111" - self.sqlite_file = Path.home() / ".yoda" / "yoda" - self.config_file = self.get_default_config_file() - self.config: Dict[str, Any] = dict() - self.load() - - def load(self): - """Load the configuration from the configuration file.""" - if self.config_file.exists(): - with open(self.config_file) as f: - self.config = yaml.safe_load(f) - else: - self.config = self.get_default_config() - - def save(self): - """Save the configuration to the configuration file.""" - self.config_file.parent.mkdir(parents=True, exist_ok=True) - with open(self.config_file, "w") as f: - yaml.safe_dump(self.config, f) - - def get(self, key: str, default: Any = None) -> Any: - """Get a configuration value by key.""" - return self.config.get(key, default) - - def set(self, key: str, value: Any): - """Set a configuration value by key.""" - self.config[key] = value - self.save() - - def get_yoda_config_dir(self) -> Path: - return Path.home() / ".yoda" - - def get_yoda_plugins_dir(self) -> Path: - return self.get_yoda_config_dir() / "plugins" - - def get_default_config_file(self) -> Path: - return self.get_yoda_config_dir() / "config.yaml" - - def get_default_config(self) -> Dict[str, Any]: - return { - "user": "Skywalker", - "plugins": {}, - } diff --git a/src/yodapa/core/__init__.py b/src/yodapa/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/yodapa/plugins/config.py b/src/yodapa/core/config.py similarity index 100% rename from src/yodapa/plugins/config.py rename to src/yodapa/core/config.py diff --git a/src/yodapa/plugins/plugin.py b/src/yodapa/core/plugin.py similarity index 50% rename from src/yodapa/plugins/plugin.py rename to src/yodapa/core/plugin.py index 0589909b..8eb28fa7 100644 --- a/src/yodapa/plugins/plugin.py +++ b/src/yodapa/core/plugin.py @@ -1,17 +1,105 @@ +import importlib +import pkgutil import sqlite3 +from pathlib import Path +from typing import List, Tuple import typer from rich import print from rich.table import Table -from yodapa.plugin import discover_plugins -from yodapa.plugins.config import get_db_connection +from yodapa.core.config import get_db_connection PROTECTED_PLUGINS = ["config", "plugin"] app = typer.Typer(help="Commands to manage plugins") +def _discover_yoda_modules(): + plugins = list() + for package in ["core", "plugins"]: + plugins_pkg = importlib.import_module(f'yodapa.{package}') + plugins_path = plugins_pkg.__path__ + + for finder, name, ispkg in pkgutil.iter_modules(plugins_path): + # print("finder", finder, "name", name, "ispkg", ispkg) + try: + module = importlib.import_module(f'yodapa.{package}.{name}') + if hasattr(module, "app") and isinstance(module.app, typer.Typer): + plugin_app: typer.Typer = module.app + plugins.append((name, plugin_app)) + except Exception as e: + typer.echo(f"Failed to load plugin {name}: {e}", err=True) + return plugins + + +def _discover_plugins_from_config_dir(): + plugins = list() + local_plugins_dir = Path.home() / ".yoda" / "plugins" + if local_plugins_dir.exists() and local_plugins_dir.is_dir(): + for finder, name, ispkg in pkgutil.iter_modules([str(local_plugins_dir)]): + # print("finder", finder, "name", name, "ispkg", ispkg) + try: + module_path = local_plugins_dir / f"{name}.py" + if not module_path.exists(): + typer.echo(f"Plugin module {name} does not exist at {module_path}", err=True) + continue + + # Load the module from the file path + spec = importlib.util.spec_from_file_location(name, str(module_path)) + if spec is None: + typer.echo(f"Could not load spec for module {name}", err=True) + continue + + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + if hasattr(module, "app") and isinstance(module.app, typer.Typer): + plugin_app: typer.Typer = module.app + plugins.append((name, plugin_app)) + except Exception as e: + typer.echo(f"Failed to load local plugin {name}: {e}", err=True) + return plugins + + +def discover_plugins() -> List[Tuple[str, typer.Typer]]: + """Discover plugins in the 'plugins' directory and the local plugins directory.""" + + plugins: List[Tuple[str, typer.Typer]] = list() + + # 1. Discover plugins within the 'plugins' directory + plugins += _discover_yoda_modules() + + # 2. Discover plugins in the local plugins directory + plugins += _discover_plugins_from_config_dir() + + # print("Plugins discovered:", plugins) + return plugins + + +def load_plugins(app: typer.Typer, plugins: List[Tuple[str, typer.Typer]]): + """Load the plugins into the yoda typer app.""" + for name, plugin in plugins: + try: + app.add_typer(plugin, name=name) + # typer.echo(f"Loaded plugin: {plugin.name}") + except Exception as e: + typer.echo(f"Error loading plugin {name}: {e}", err=True) + + +def init_plugins(app: typer.Typer): + """Get plugins from both the disk and sqlite and only show the ones that are enabled + TODO: Currently a very inefficient implementation, optimize in the future + """ + + plugins = discover_plugins() + + enabled_plugins = get_enabled_plugins() + + load_plugins(app, + [(plugin_name, typer_app) for plugin_name, typer_app in plugins if plugin_name in enabled_plugins]) + + def get_plugin_list(): """Get plugin list from sqlite3""" conn = None @@ -38,8 +126,13 @@ def get_enabled_plugins(): return set(name for name, enabled in get_plugin_list() if enabled) +############################################ +############### Commands ################### +############################################ + @app.command(name="list") def list_plugins(): + """List all available plugins""" rows = get_plugin_list() if not rows: @@ -58,6 +151,7 @@ def list_plugins(): @app.command(name="enable") def enable_plugin(name: str): + """Enable a plugin""" conn = None try: conn = get_db_connection() @@ -85,6 +179,7 @@ def enable_plugin(name: str): @app.command(name="disable") def disable_plugin(name: str): + """Disable a plugin""" if name in PROTECTED_PLUGINS: print(f"[italic]{name}[/] [red]is an internal plugin that cannot be disabled[/]") return @@ -116,6 +211,7 @@ def disable_plugin(name: str): @app.command(name="refresh") def refresh_plugins(): + """Re-discovers all available plugins and enables them""" conn = None try: conn = get_db_connection() diff --git a/src/yodapa/plugin.py b/src/yodapa/plugin.py deleted file mode 100644 index 3ff7a0e0..00000000 --- a/src/yodapa/plugin.py +++ /dev/null @@ -1,66 +0,0 @@ -import importlib -import pkgutil -from pathlib import Path -from typing import List, Tuple - -import typer - - -def discover_plugins() -> List[Tuple[str, typer.Typer]]: - """Discover plugins in the 'plugins' directory and the local plugins directory.""" - - plugins: List[Tuple[str, typer.Typer]] = list() - - # 1. Discover plugins within the 'plugins' directory - plugins_pkg = importlib.import_module('yodapa.plugins') - plugins_path = plugins_pkg.__path__ - - for finder, name, ispkg in pkgutil.iter_modules(plugins_path): - # print("finder", finder, "name", name, "ispkg", ispkg) - try: - module = importlib.import_module(f'yodapa.plugins.{name}') - if hasattr(module, "app") and isinstance(module.app, typer.Typer): - plugin_app: typer.Typer = module.app - plugins.append((name, plugin_app)) - except Exception as e: - typer.echo(f"Failed to load plugin {name}: {e}", err=True) - - # 2. Discover plugins in the local plugins directory - local_plugins_dir = Path.home() / ".yoda" / "plugins" - if local_plugins_dir.exists() and local_plugins_dir.is_dir(): - for finder, name, ispkg in pkgutil.iter_modules([str(local_plugins_dir)]): - # print("finder", finder, "name", name, "ispkg", ispkg) - try: - module_path = local_plugins_dir / f"{name}.py" - if not module_path.exists(): - typer.echo(f"Plugin module {name} does not exist at {module_path}", err=True) - continue - - # Load the module from the file path - spec = importlib.util.spec_from_file_location(name, str(module_path)) - if spec is None: - typer.echo(f"Could not load spec for module {name}", err=True) - continue - - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - - if hasattr(module, "app") and isinstance(module.app, typer.Typer): - plugin_app: typer.Typer = module.app - plugins.append((name, plugin_app)) - except Exception as e: - typer.echo(f"Failed to load local plugin {name}: {e}", err=True) - - # uncomment to debug - # print("Plugins discovered:", plugins) - return plugins - - -def load_plugins(app: typer.Typer, plugins: List[Tuple[str, typer.Typer]]): - """Load the plugins into the yoda typer app.""" - for name, plugin in plugins: - try: - app.add_typer(plugin, name=name) - # typer.echo(f"Loaded plugin: {plugin.name}") - except Exception as e: - typer.echo(f"Error loading plugin {name}: {e}", err=True) diff --git a/tests/test_config.py b/tests/test_config.py deleted file mode 100644 index 7dbcf851..00000000 --- a/tests/test_config.py +++ /dev/null @@ -1,46 +0,0 @@ -from pathlib import Path - -from yodapa.config import ConfigManager - -config = ConfigManager() - - -def test_default_config(): - default_config = config.get_default_config() - assert default_config.get("user") == "Skywalker" - assert default_config.get("plugins") == {} - - -def test_get_yoda_config_dir(): - yoda_config_dir = config.get_yoda_config_dir() - assert yoda_config_dir == Path.home() / ".yoda" - - -def test_get_yoda_plugins_dir(): - yoda_plugins_dir = config.get_yoda_plugins_dir() - assert yoda_plugins_dir == Path.home() / ".yoda" / "plugins" - - -def test_get_default_config_file(): - default_config_file = config.get_default_config_file() - assert default_config_file == Path.home() / ".yoda" / "config.yaml" - - -def test_load(): - config.load() - assert config.config.get("user") == "Skywalker" - assert config.config.get("plugins") == {} - - -def test_save(): - config.set("user", "Yoda") - config.save() - config.load() - assert config.get("user") == "Yoda" - config.set("user", "Padawan") - config.save() - config.load() - assert config.get("user") == "Padawan" - - # assert that the config file is created - assert config.config_file.exists() From 8d7f444a59ce62f44c9328d55e8dcf6958ee6d2e Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sat, 12 Oct 2024 23:34:53 -0700 Subject: [PATCH 08/12] update docs --- docs/docs/img.png | Bin 0 -> 54255 bytes docs/docs/img_1.png | Bin 0 -> 41744 bytes docs/docs/img_2.png | Bin 0 -> 41599 bytes docs/docs/img_3.png | Bin 0 -> 41237 bytes docs/docs/img_5.png | Bin 0 -> 25274 bytes docs/docs/index.md | 102 +++++++++++++++------------------------ src/yodapa/plugins/ai.py | 46 +++++++++--------- 7 files changed, 61 insertions(+), 87 deletions(-) create mode 100644 docs/docs/img.png create mode 100644 docs/docs/img_1.png create mode 100644 docs/docs/img_2.png create mode 100644 docs/docs/img_3.png create mode 100644 docs/docs/img_5.png diff --git a/docs/docs/img.png b/docs/docs/img.png new file mode 100644 index 0000000000000000000000000000000000000000..58e0fa387a4a4bfd965425014560a14b79982cdc GIT binary patch literal 54255 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 literal 0 HcmV?d00001 diff --git a/docs/docs/img_1.png b/docs/docs/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cc26ba1f253bdae8ec92557b9addc860319f564e GIT binary patch literal 41744 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%0D!yxd##Gn@(Taa=I^5DdpHC2EoKmdyY`22_ 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 literal 0 HcmV?d00001 diff --git a/docs/docs/img_2.png b/docs/docs/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ea7642a87b9d82ce44661ea076de2fdec32c9ad6 GIT binary patch literal 41599 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

5^cdH#x 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 v-*u|d@q-zX|9r0hvzisYTOYr7O= len(self.todos): - raise ValueError("Todo ID out of range") - self.active_todos.remove(self.todos[id]) - typer.echo(f"Marked todo {id} as done") - - def delete(self, id: int): - """Delete a todo.""" - if id < 0 or id >= len(self.todos): - raise ValueError("Todo ID out of range") - self.todos.remove(self.todos[id]) - typer.echo(f"Deleted todo {id}") - - def __init__(self): - self.todos = [] - self.active_todos = [] - -if __name__ == "__main__": - typer.run(TodoPlugin()) +The code uses a try-except block to catch any errors that may occur when retrieving the weather data, such as invalid +locations. In this case, it prints an error message to the console indicating that the location is invalid. ``` +.. or chat with Yoda: +![img_5.png](img_5.png) + ## Development setup ```bash diff --git a/src/yodapa/plugins/ai.py b/src/yodapa/plugins/ai.py index bb48868e..df86f48f 100644 --- a/src/yodapa/plugins/ai.py +++ b/src/yodapa/plugins/ai.py @@ -8,7 +8,8 @@ def _communicate_with_ollama(prompt: str): try: response = ollama.chat( model="codellama", - messages=[{"role": "user", "content": prompt}], + messages=[{"role": "system", "content": "You should talk like Yoda from star wars"}, + {"role": "user", "content": prompt}], stream=False, ) # typer.echo(f"Received response from Ollama: {response['message']['content'].strip()}") @@ -55,11 +56,15 @@ def generate_command(plugin_name: str, prompt: str): # Construct the prompt for the AI model ai_prompt = f""" -Generate a Python Typer plugin class named "{plugin_name}" with a single command and multiple subcommands as required based on the following description: +Generate a Python Typer app named "{plugin_name}" with multiple commands as required based on the following description: {prompt}. - -The plugin should follow the existing structure, using the 'yoda_plugin' decorator and include appropriate docstrings. An example of the expected output is provided below: + """ + try: + response = ollama.chat( + model="codellama", + messages=[{"role": "system", "content": """You are an expert python programmer. You must use all the python best practices to write the most efficient python code. Provide complete working code for all the subcommands. Provide full working code. If the plugin requires storage, use local storage like files or sqlite, whichever is easier to use. +You need to generate a typer command line app. An example app can be found below: ```python import typer @@ -80,26 +85,19 @@ def hello(name: str = None): name = name or "Padawan" typer.echo(f"Hello {{name}}!") ``` - -You must only return the generated code for the plugin class. All the details for the plugin class should be added in the docstring. -You must use all the python best practices to write the most efficient python code. Provide complete working code for all the subcommands. - """ - try: - # Interact with the Ollama LLM - generated_code = _communicate_with_ollama(ai_prompt) +You must only return the generated code for the plugin class. All the details for the plugin class should be added in the docstring. +When the user provides a description for their requirement, you must use all the best practices required to implement what they need. + """}, + {"role": "user", "content": prompt}], + stream=False, + ) + # typer.echo(f"Received response from Ollama: {response['message']['content'].strip()}") + generated_code = response['message']['content'].strip() typer.echo(f"🤖 Generated code:\n{generated_code}") + except ollama.ResponseError as e: + typer.echo(f"Error communicating with Ollama: {e}", err=True) + typer.echo(f"Failed to communicate with Ollama: {e}", err=True) - # Define the plugin file path - # plugin_file = self.output_dir / f"{plugin_name.lower()}_plugin.py" - # - # # Write the generated code to the plugin file - # with open(plugin_file, "w") as f: - # f.write(generated_code) - # typer.echo(f"Generated plugin saved to {plugin_file}") - # - # typer.echo(f"Plugin '{plugin_name}' has been generated and saved to {plugin_file}") - - except Exception as e: - typer.echo(f"Error generating plugin: {e}", err=True) - typer.echo(f"Failed to generate plugin: {e}", err=True) + typer.echo("If you don't have ollama installed, you can install it by going through the instructions on " + "their website: https://ollama.com/ and installing the codellama model") From f021eafb01cb3dfc4b617b496b74caf7a95479b1 Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sun, 13 Oct 2024 00:34:26 -0700 Subject: [PATCH 09/12] add status spinner, update docs --- README.md | 126 +++++++++++++++++++-------------------- docs/docs/index.md | 60 ++++++++++++------- src/yodapa/plugins/ai.py | 69 +++++++++++---------- 3 files changed, 135 insertions(+), 120 deletions(-) diff --git a/README.md b/README.md index 8b10f53b..454b89ca 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,16 @@ The help command will list all the available plugins. $ yoda --help ``` +![img.png](docs/docs/img.png) + +You can find the details for each plugin with the `--help` flag. Some examples: + +![img_1.png](docs/docs/img_1.png) + +![img_2.png](docs/docs/img_2.png) + +![img_3.png](docs/docs/img_3.png) + ### Write your own plugin for Yoda Simply create a class with the `@yoda_plugin(name="plugin-name")` decorator and add methods to it. The non-private @@ -41,94 +51,78 @@ decorator. ```python import typer -from yodapa.plugin_manager.decorator import yoda_plugin - -@yoda_plugin(name="hi") -class HiPlugin: - """ +app = typer.Typer(help=""" Hi plugin. Say hello. Example: + $ yoda hi hello --name MP + $ yoda hi hello - """ + """) - def hello(self, name: str = None): - """Say hello.""" - name = name or "Padawan" - typer.echo(f"Hello {name}!") - def _private_method_should_not_be_added(self): - """This method should not be added as a command.""" - raise NotImplementedError() +@app.command() +def hello(name: str = None): + """Say hello.""" + name = name or "Padawan" + typer.echo(f"Hello {name}!") ``` ### Use AI to generate your own plugin ```bash -$ yoda ai generate-command todo "todo list that keeps track of your todos" +$ yoda ai generate-command weather "show weather for the provided location" 🤖 Generated code: -import typer - -from yodapa.plugin_manager.decorator import yoda_plugin - +import requests +from typing import Optional -@yoda_plugin(name="todo") -class TodoPlugin: - """ - Todo plugin. Keeps track of your todos. +app = typer.Typer(help=""" + Show weather for a given location. Example: - $ yoda todo list --all - $ yoda todo add "Finish assignment" - $ yoda todo done 1 - $ yoda todo delete 2 - """ - - def list(self, all: bool = False): - """List all todos.""" - if all: - typer.echo("All todos:") - for todo in self.todos: - typer.echo(f"- {todo}") - else: - typer.echo("Active todos:") - for todo in self.active_todos: - typer.echo(f"- {todo}") - - def add(self, name: str): - """Add a new todo.""" - if name == "": - raise ValueError("Todo name cannot be empty") - self.todos.append(name) - typer.echo(f"Added todo '{name}'") - - def done(self, id: int): - """Mark a todo as done.""" - if id < 0 or id >= len(self.todos): - raise ValueError("Todo ID out of range") - self.active_todos.remove(self.todos[id]) - typer.echo(f"Marked todo {id} as done") - - def delete(self, id: int): - """Delete a todo.""" - if id < 0 or id >= len(self.todos): - raise ValueError("Todo ID out of range") - self.todos.remove(self.todos[id]) - typer.echo(f"Deleted todo {id}") - - def __init__(self): - self.todos = [] - self.active_todos = [] - -if __name__ == "__main__": - typer.run(TodoPlugin()) + $ yoda weather London + + $ yoda weather -l London + """) + +@app.command() +def weather(location: str, units: Optional[str] = None): + """Show the current weather for a given location.""" + # Set up your API key or database connection here + api_key = "YOUR_API_KEY" + db_conn = None # Initialize your DB connection here + + # Use the requests library to make an HTTP request to the API + url = f"https://api.openweathermap.org/data/2.5/weather?q={location}&appid={api_key}" + response = requests.get(url) + + # If the response is successful, parse the JSON data and return it in a format that typer can display + if response.status_code == 200: + data = response.json() + temperature = data["main"]["temp"] + humidity = data["main"]["humidity"] + wind = data["wind"]["speed"] + pressure = data["main"]["pressure"] + + typer.echo(f"Weather for {location}:") + typer.echo(f"\tTemperature: {temperature}°C") + typer.echo(f"\tHumidity: {humidity}%") + typer.echo(f"\tWind speed: {wind} m/s") + typer.echo(f"\tPressure: {pressure} hPa") + + # If the response is not successful, print an error message + else: + typer.echo(f"Error: {response.status_code}") ``` +.. or chat with Yoda: +![img_5.png](docs/docs/img_5.png) + ## Development setup ```bash diff --git a/docs/docs/index.md b/docs/docs/index.md index aaf905bc..8ba733be 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -73,33 +73,51 @@ def hello(name: str = None): ### Use AI to generate your own plugin ```bash -$ yoda ai generate-command todo "todo list that keeps track of your todos" +$ yoda ai generate-command weather "show weather for the provided location" 🤖 Generated code: -import typer -from weather import Weather +import requests +from typing import Optional -app = typer.Typer(help="Show weather for a given location") +app = typer.Typer(help=""" + Show weather for a given location. -@app.command() -def weather(location: str): - """Show weather for a given location.""" - try: - weather_data = Weather(location).get_weather() - print(f"Weather for {location}:") - print(f"Temperature: {weather_data['temperature']}") - print(f"Description: {weather_data['description']}") - except KeyError as error: - print("Invalid location") - -This code uses the `Weather` class from the `weather` library to retrieve weather data for a given location. The -`location` argument is passed as a command-line argument, and the `get_weather()` method of the `Weather` object returns -a dictionary containing the current temperature and description of the weather in the given location. - -The code uses a try-except block to catch any errors that may occur when retrieving the weather data, such as invalid -locations. In this case, it prints an error message to the console indicating that the location is invalid. + Example: + $ yoda weather London + + $ yoda weather -l London + """) + +@app.command() +def weather(location: str, units: Optional[str] = None): + """Show the current weather for a given location.""" + # Set up your API key or database connection here + api_key = "YOUR_API_KEY" + db_conn = None # Initialize your DB connection here + + # Use the requests library to make an HTTP request to the API + url = f"https://api.openweathermap.org/data/2.5/weather?q={location}&appid={api_key}" + response = requests.get(url) + + # If the response is successful, parse the JSON data and return it in a format that typer can display + if response.status_code == 200: + data = response.json() + temperature = data["main"]["temp"] + humidity = data["main"]["humidity"] + wind = data["wind"]["speed"] + pressure = data["main"]["pressure"] + + typer.echo(f"Weather for {location}:") + typer.echo(f"\tTemperature: {temperature}°C") + typer.echo(f"\tHumidity: {humidity}%") + typer.echo(f"\tWind speed: {wind} m/s") + typer.echo(f"\tPressure: {pressure} hPa") + + # If the response is not successful, print an error message + else: + typer.echo(f"Error: {response.status_code}") ``` .. or chat with Yoda: diff --git a/src/yodapa/plugins/ai.py b/src/yodapa/plugins/ai.py index df86f48f..ca893712 100644 --- a/src/yodapa/plugins/ai.py +++ b/src/yodapa/plugins/ai.py @@ -1,5 +1,6 @@ import ollama import typer +from rich.console import Console app = typer.Typer(help="AI command. Allows you to communicate with your local LLMs") @@ -61,39 +62,41 @@ def generate_command(plugin_name: str, prompt: str): {prompt}. """ try: - response = ollama.chat( - model="codellama", - messages=[{"role": "system", "content": """You are an expert python programmer. You must use all the python best practices to write the most efficient python code. Provide complete working code for all the subcommands. Provide full working code. If the plugin requires storage, use local storage like files or sqlite, whichever is easier to use. -You need to generate a typer command line app. An example app can be found below: -```python -import typer - -app = typer.Typer(help=\"\"\" - Hi plugin. Say hello. - - Example: - - $ yoda hi hello --name MP - - $ yoda hi hello - \"\"\") - - -@app.command() -def hello(name: str = None): - \"\"\"Say hello.\"\"\" - name = name or "Padawan" - typer.echo(f"Hello {{name}}!") -``` - -You must only return the generated code for the plugin class. All the details for the plugin class should be added in the docstring. -When the user provides a description for their requirement, you must use all the best practices required to implement what they need. - """}, - {"role": "user", "content": prompt}], - stream=False, - ) - # typer.echo(f"Received response from Ollama: {response['message']['content'].strip()}") - generated_code = response['message']['content'].strip() + console = Console() + with console.status("[bold green]Waiting for AI response..."): + response = ollama.chat( + model="codellama", + messages=[{"role": "system", "content": """You are an expert python programmer. You must use all the python best practices to write the most efficient python code. Provide complete working code for all the subcommands. Provide full working code. If the plugin requires storage, use local storage like files or sqlite, whichever is easier to use. + You need to generate a typer command line app. An example app can be found below: + ```python + import typer + + app = typer.Typer(help=\"\"\" + Hi plugin. Say hello. + + Example: + + $ yoda hi hello --name MP + + $ yoda hi hello + \"\"\") + + + @app.command() + def hello(name: str = None): + \"\"\"Say hello.\"\"\" + name = name or "Padawan" + typer.echo(f"Hello {{name}}!") + ``` + + You must only return the generated code for the plugin class. All the details for the plugin class should be added in the docstring. + When the user provides a description for their requirement, you must use all the best practices required to implement what they need. + """}, + {"role": "user", "content": ai_prompt}], + stream=False, + ) + # typer.echo(f"Received response from Ollama: {response['message']['content'].strip()}") + generated_code = response['message']['content'].strip() typer.echo(f"🤖 Generated code:\n{generated_code}") except ollama.ResponseError as e: typer.echo(f"Error communicating with Ollama: {e}", err=True) From 0c42b0f06e0df163a3369f738a37134f4498003b Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sun, 13 Oct 2024 00:40:19 -0700 Subject: [PATCH 10/12] move yoda.py from cli to yodapa --- pyproject.toml | 4 ++-- src/cli/__init__.py | 0 src/{cli => yodapa}/yoda.py | 0 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 src/cli/__init__.py rename src/{cli => yodapa}/yoda.py (100%) diff --git a/pyproject.toml b/pyproject.toml index 28e192fa..6615170f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ packages = [ { include = "yodapa", from = "src" } ] repository = "https://github.com/yoda-pa/yoda/tree/v2" -homepage = "https://yoda-pa.github.io/" +homepage = "https://yoda-pa.github.io/yoda" [tool.poetry.dependencies] python = "^3.9" @@ -37,4 +37,4 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] -yoda = "cli.yoda:app" +yoda = "yodapa.yoda:app" diff --git a/src/cli/__init__.py b/src/cli/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/cli/yoda.py b/src/yodapa/yoda.py similarity index 100% rename from src/cli/yoda.py rename to src/yodapa/yoda.py From f94646b98159cae71f4de7cab69b089f2c8945b9 Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sun, 13 Oct 2024 00:46:38 -0700 Subject: [PATCH 11/12] add basic test --- tests/test_simple.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tests/test_simple.py diff --git a/tests/test_simple.py b/tests/test_simple.py new file mode 100644 index 00000000..d1594a61 --- /dev/null +++ b/tests/test_simple.py @@ -0,0 +1,7 @@ +from yodapa.yoda import hello + + +def test_hello(capsys): + hello("Yoda") + actual_response = capsys.readouterr() + assert "Hello Yoda!\n" == actual_response.out From 0760ea02d4965ed83f1716b05602cefc942abd79 Mon Sep 17 00:00:00 2001 From: Man Parvesh Singh Randhawa Date: Sun, 13 Oct 2024 00:49:35 -0700 Subject: [PATCH 12/12] return empty list if no plugins found in sqlite --- src/yodapa/core/plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yodapa/core/plugin.py b/src/yodapa/core/plugin.py index 8eb28fa7..8cf56519 100644 --- a/src/yodapa/core/plugin.py +++ b/src/yodapa/core/plugin.py @@ -116,6 +116,7 @@ def get_plugin_list(): print("[red]Yoda config not initialized. Use [white]`yoda config init`[red] to initialize[/]") else: print(f"An error occurred: {e}") + return list() finally: if conn: conn.close()