From 311fee5aac9dfb03149779d803c32dca1e5f3e92 Mon Sep 17 00:00:00 2001 From: Fabio Zadrozny <117621+fabioz@users.noreply.github.com> Date: Wed, 28 Aug 2024 15:07:43 -0300 Subject: [PATCH] Hover, code analysis for v2 - update environments to add tree-sitter dependency - update robocorp-trustore version - add hover - code analysis using new spec format for v2 - remove any trace of requests usage - make downloads with resume - use uv instead of pip in conda environments --- sema4ai-python-ls-core/poetry.lock | 404 +++----- sema4ai-python-ls-core/pyproject.toml | 4 +- .../dap/__main__gen_debug_adapter_protocol.py | 10 +- .../src/sema4ai_ls_core/http.py | 178 ++++ .../src/sema4ai_ls_core/protocols.py | 59 +- .../src/sema4ai_ls_core/workspace.py | 53 +- sema4ai/bin/create_env/conda.yaml | 7 +- .../create_env/conda_vscode_darwin_amd64.yaml | 7 +- .../create_env/conda_vscode_linux_amd64.yaml | 7 +- .../conda_vscode_windows_amd64.yaml | 7 +- sema4ai/poetry.lock | 944 +++++++++--------- sema4ai/pyproject.toml | 10 +- sema4ai/src/sema4ai_code/agents/agent_spec.py | 207 ++++ .../sema4ai_code/agents/agent_spec_handler.py | 636 ++++++++++++ .../agents/collect_agent_spec_diagnostics.py | 79 +- .../sema4ai_code/agents/hover_agent_spec.py | 95 ++ .../agents/tree_sitter_ast_utils.py | 74 ++ .../sema4ai_code/robocorp_language_server.py | 32 +- sema4ai/src/sema4ai_code/tools.py | 35 +- .../action_package1/package.yaml | 12 +- .../agents/test_agent_spec_analysis.py | 39 + .../control-room-test/0.0.1/.gitignore | 13 + .../MyActions/control-room-test/0.0.1/LICENSE | 201 ++++ .../control-room-test/0.0.1/README.md | 1 + .../control-room-test/0.0.1/actions.py | 14 + .../control-room-test/0.0.1/package.png | Bin 0 -> 130470 bytes .../control-room-test/0.0.1/package.yaml | 31 + .../agent2/agent-spec.yaml | 31 + .../agent2/knowledge/molkky-game-rules.pdf | Bin 0 -> 116947 bytes .../agent2/runbook.md | 1 + .../test_agent_spec_analysis_v2_ok_.yml | 1 + ..._spec_analysis_v2_v2_bad_architecture_.yml | 11 + .../agents/test_hover_on_agent_spec.py | 52 + .../test_hover_on_agent_spec_v1.yml | 10 + .../test_hover_on_agent_spec_v2.yml | 10 + .../tests/sema4ai_code_tests/test_oauth2.py | 13 +- .../test_prebuilt_environments.py | 5 +- .../sema4ai_code_tests/test_tree_sitter.py | 70 ++ .../test_vscode_integration.py | 84 +- .../test_hover_agent_spec.yml | 10 + .../test_package_metadata.yml | 3 +- sema4ai/vscode-client/src/rcc.ts | 6 +- 42 files changed, 2580 insertions(+), 886 deletions(-) create mode 100644 sema4ai-python-ls-core/src/sema4ai_ls_core/http.py create mode 100644 sema4ai/src/sema4ai_code/agents/agent_spec.py create mode 100644 sema4ai/src/sema4ai_code/agents/agent_spec_handler.py create mode 100644 sema4ai/src/sema4ai_code/agents/hover_agent_spec.py create mode 100644 sema4ai/src/sema4ai_code/agents/tree_sitter_ast_utils.py create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/.gitignore create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/LICENSE create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/README.md create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/actions.py create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/package.png create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/package.yaml create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/agent-spec.yaml create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/knowledge/molkky-game-rules.pdf create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/runbook.md create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/test_agent_spec_analysis_v2_ok_.yml create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/test_agent_spec_analysis_v2_v2_bad_architecture_.yml create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_hover_on_agent_spec.py create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_hover_on_agent_spec/test_hover_on_agent_spec_v1.yml create mode 100644 sema4ai/tests/sema4ai_code_tests/agents/test_hover_on_agent_spec/test_hover_on_agent_spec_v2.yml create mode 100644 sema4ai/tests/sema4ai_code_tests/test_tree_sitter.py create mode 100644 sema4ai/tests/sema4ai_code_tests/test_vscode_integration/test_hover_agent_spec.yml diff --git a/sema4ai-python-ls-core/poetry.lock b/sema4ai-python-ls-core/poetry.lock index 81bb5902d..aa60f6865 100644 --- a/sema4ai-python-ls-core/poetry.lock +++ b/sema4ai-python-ls-core/poetry.lock @@ -1,115 +1,5 @@ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. -[[package]] -name = "certifi" -version = "2024.2.2" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -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"}, -] - [[package]] name = "colorama" version = "0.4.6" @@ -123,13 +13,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -163,17 +53,6 @@ files = [ six = "*" termcolor = "*" -[[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - [[package]] name = "iniconfig" version = "2.0.0" @@ -228,44 +107,44 @@ test = ["pytest", "pytest-cov"] [[package]] name = "mypy" -version = "1.10.0" +version = "1.11.2" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, + {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, + {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, + {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, + {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, + {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, + {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, + {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, + {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, + {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, + {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, + {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, + {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, + {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, + {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, + {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, + {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, + {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, + {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, + {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -286,13 +165,13 @@ files = [ [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -340,13 +219,13 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "pytest" -version = "8.2.0" +version = "8.3.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, - {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [package.dependencies] @@ -354,7 +233,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] @@ -430,74 +309,66 @@ testing = ["filelock"] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - [[package]] name = "robocorp-log" version = "2.9.2" @@ -528,6 +399,17 @@ files = [ pytest = ">=7" robocorp-log = ">=2.5,<3" +[[package]] +name = "robocorp-truststore" +version = "0.9.1" +description = "Verify certificates using native system trust stores" +optional = false +python-versions = ">=3.10" +files = [ + {file = "robocorp_truststore-0.9.1-py3-none-any.whl", hash = "sha256:dfdd4812dffce8a91134e8b69a3c55072fc9785dbdd583d4047f323779ac2f39"}, + {file = "robocorp_truststore-0.9.1.tar.gz", hash = "sha256:a1abfd9c5b7fe22152a8eeb9510812800dca741851c720742c598c0f78ee4f3f"}, +] + [[package]] name = "ruff" version = "0.1.15" @@ -612,26 +494,15 @@ files = [ {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, ] -[[package]] -name = "truststore" -version = "0.8.0" -description = "Verify certificates using native system trust stores" -optional = false -python-versions = ">= 3.10" -files = [ - {file = "truststore-0.8.0-py3-none-any.whl", hash = "sha256:e37a5642ae9fc48caa8f120b6283d77225d600d224965a672c9e8ef49ce4bb4c"}, - {file = "truststore-0.8.0.tar.gz", hash = "sha256:dc70da89634944a579bfeec70a7a4523c53ffdb3cf52d1bb4a431fda278ddb96"}, -] - [[package]] name = "types-docutils" -version = "0.21.0.20240423" +version = "0.21.0.20240724" description = "Typing stubs for docutils" optional = false python-versions = ">=3.8" files = [ - {file = "types-docutils-0.21.0.20240423.tar.gz", hash = "sha256:7716ec6c68b5179b7ba1738cace2f1326e64df9f44b7ab08d9904d32c23fc15f"}, - {file = "types_docutils-0.21.0.20240423-py3-none-any.whl", hash = "sha256:7f6e84ba8fcd2454c5b8bb8d77384d091a901929cc2b31079316e10eb346580a"}, + {file = "types-docutils-0.21.0.20240724.tar.gz", hash = "sha256:29ff7e27660f4fe76ea61d7e54d05ca3ce3b733ca9e8e8721e0fa587dbc10489"}, + {file = "types_docutils-0.21.0.20240724-py3-none-any.whl", hash = "sha256:bf51c6c488d23c0412f9b3ba10686fb1a6cb0b957ef04b45128d8a55c79ebb00"}, ] [[package]] @@ -658,24 +529,24 @@ files = [ [[package]] name = "types-pillow" -version = "10.2.0.20240511" +version = "10.2.0.20240822" description = "Typing stubs for Pillow" optional = false python-versions = ">=3.8" files = [ - {file = "types-Pillow-10.2.0.20240511.tar.gz", hash = "sha256:b2fcc27b8e15ae3741941e43b4f39eba6fce6bcb152af90bbb07b387d2585783"}, - {file = "types_Pillow-10.2.0.20240511-py3-none-any.whl", hash = "sha256:ef87a19ea0a02a89c784cbc1b99dfff6c00dd0d5796a8ac868cf7ec69c5f88ff"}, + {file = "types-Pillow-10.2.0.20240822.tar.gz", hash = "sha256:559fb52a2ef991c326e4a0d20accb3bb63a7ba8d40eb493e0ecb0310ba52f0d3"}, + {file = "types_Pillow-10.2.0.20240822-py3-none-any.whl", hash = "sha256:d9dab025aba07aeb12fd50a6799d4eac52a9603488eca09d7662543983f16c5d"}, ] [[package]] name = "types-psutil" -version = "5.9.5.20240511" +version = "5.9.5.20240516" description = "Typing stubs for psutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-psutil-5.9.5.20240511.tar.gz", hash = "sha256:2c0b22edab6c8775f4a8688e3f14cefda8793e26ddf99d61b654a0d600179087"}, - {file = "types_psutil-5.9.5.20240511-py3-none-any.whl", hash = "sha256:7b4a12ace894c087f684ea3b4fb81964d6b941aabbae8437959616cbd9d48346"}, + {file = "types-psutil-5.9.5.20240516.tar.gz", hash = "sha256:bb296f59fc56458891d0feb1994717e548a1bcf89936a2877df8792b822b4696"}, + {file = "types_psutil-5.9.5.20240516-py3-none-any.whl", hash = "sha256:83146ded949a10167d9895e567b3b71e53ebc5e23fd8363eab62b3c76cce7b89"}, ] [[package]] @@ -691,58 +562,27 @@ files = [ [[package]] name = "types-pyyaml" -version = "6.0.12.20240311" +version = "6.0.12.20240808" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.8" files = [ - {file = "types-PyYAML-6.0.12.20240311.tar.gz", hash = "sha256:a9e0f0f88dc835739b0c1ca51ee90d04ca2a897a71af79de9aec5f38cb0a5342"}, - {file = "types_PyYAML-6.0.12.20240311-py3-none-any.whl", hash = "sha256:b845b06a1c7e54b8e5b4c683043de0d9caf205e7434b3edc678ff2411979b8f6"}, + {file = "types-PyYAML-6.0.12.20240808.tar.gz", hash = "sha256:b8f76ddbd7f65440a8bda5526a9607e4c7a322dc2f8e1a8c405644f9a6f4b9af"}, + {file = "types_PyYAML-6.0.12.20240808-py3-none-any.whl", hash = "sha256:deda34c5c655265fc517b546c902aa6eed2ef8d3e921e4765fe606fe2afe8d35"}, ] -[[package]] -name = "types-requests" -version = "2.31.0.20240406" -description = "Typing stubs for requests" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-requests-2.31.0.20240406.tar.gz", hash = "sha256:4428df33c5503945c74b3f42e82b181e86ec7b724620419a2966e2de604ce1a1"}, - {file = "types_requests-2.31.0.20240406-py3-none-any.whl", hash = "sha256:6216cdac377c6b9a040ac1c0404f7284bd13199c0e1bb235f4324627e8898cf5"}, -] - -[package.dependencies] -urllib3 = ">=2" - [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, -] - -[[package]] -name = "urllib3" -version = "2.2.1" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.11" -content-hash = "3453a146d5fc7acfdf4eef5595ba55c3087b74aaead4237456e71e25d0ec1dbe" +content-hash = "4b015d2c3b9c80ba4fedd5de81b685d4943b8b693717da9c1c96b9a7a4a0ebf4" diff --git a/sema4ai-python-ls-core/pyproject.toml b/sema4ai-python-ls-core/pyproject.toml index 0e46f5e05..b526e77ad 100644 --- a/sema4ai-python-ls-core/pyproject.toml +++ b/sema4ai-python-ls-core/pyproject.toml @@ -43,8 +43,7 @@ isort = { version = "^5.12.0", python = "^3.8" } invoke = "^2.0" tomlkit = "^0.11.8" semver = "^3.0.0" -requests = "*" -truststore = "0.8.0" +robocorp-truststore = "0.9.1" mock = "*" pytest = "*" @@ -52,7 +51,6 @@ pytest-regressions = "1.0.6" pytest-xdist = "*" pytest-timeout = "*" -types-requests = "*" types-invoke = "^2.0" types-psutil = "^5.9" types-mock = "*" diff --git a/sema4ai-python-ls-core/src/sema4ai_ls_core/debug_adapter_core/dap/__main__gen_debug_adapter_protocol.py b/sema4ai-python-ls-core/src/sema4ai_ls_core/debug_adapter_core/dap/__main__gen_debug_adapter_protocol.py index dbf11311d..79499824b 100644 --- a/sema4ai-python-ls-core/src/sema4ai_ls_core/debug_adapter_core/dap/__main__gen_debug_adapter_protocol.py +++ b/sema4ai-python-ls-core/src/sema4ai_ls_core/debug_adapter_core/dap/__main__gen_debug_adapter_protocol.py @@ -102,17 +102,17 @@ def __str__(self): def load_schema_data(): - import os.path import json + import os.path json_file = os.path.join(os.path.dirname(__file__), "debugProtocol.json") if not os.path.exists(json_file): - import requests + from sema4ai_ls_core import http - req = requests.get( + req = http.get( "https://raw.githubusercontent.com/microsoft/debug-adapter-protocol/gh-pages/debugAdapterProtocol.json" ) - assert req.status_code == 200 + req.raise_for_status() with open(json_file, "wb") as stream: stream.write(req.content) @@ -122,8 +122,8 @@ def load_schema_data(): def load_custom_schema_data(): - import os.path import json + import os.path json_file = os.path.join(os.path.dirname(__file__), "debugProtocolCustom.json") diff --git a/sema4ai-python-ls-core/src/sema4ai_ls_core/http.py b/sema4ai-python-ls-core/src/sema4ai_ls_core/http.py new file mode 100644 index 000000000..1addd4e92 --- /dev/null +++ b/sema4ai-python-ls-core/src/sema4ai_ls_core/http.py @@ -0,0 +1,178 @@ +import os +import urllib.parse +import urllib.request +from pathlib import Path + +from sema4ai_ls_core.core_log import get_logger + +log = get_logger(__name__) + + +def download_with_resume(url: str, target: Path, make_executable: bool) -> Path: + """ + Downloads a file from a URL to a target path with resume support. + """ + import stat + + log.info(f"Downloading '{url}' to '{target}'") + + try: + os.makedirs(os.path.dirname(target), exist_ok=True) + except Exception: + pass + + chunk_size = 1024 * 5 + with _open_urllib(url) as response: + content_size = int(response.getheader("Content-Length") or -1) + try: + with open(url, "wb") as stream: + while True: + chunk = response.read(chunk_size) + if not chunk: + # Note: in a bad connection it can return an empty chunk + # even before finishing (so, we resume it afterward if + # that was the case). + break + stream.write(chunk) + except Exception: + # Non-resumable case, just raise. + if content_size <= 0: + raise + # Otherwise, keep on going to resume the download if it still + # hasn't finished. + + MAX_TRIES = 10 + for i in range(MAX_TRIES): + curr_file_size = _get_file_size(target) + + if content_size > 0: + # It can be resumed. + if content_size > curr_file_size: + log.info( + f"Resuming download of '{url}' to '{target}' (downloaded {curr_file_size} of {content_size} (bytes))" + ) + try: + _resume_download(url, target, chunk_size) + except Exception: + if i == MAX_TRIES - 1: + raise + else: + break + else: + # It cannot be resumed: raise if everything wasn't downloaded. + if content_size > curr_file_size: + raise RuntimeError( + f"Unable to download {url} to {target}. Please retry later." + ) + + if make_executable: + st = os.stat(target) + os.chmod(target, st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) + + return target + + +def _open_urllib(url: str, headers=None): + # Cloudflare seems to be blocking "User-Agent: Python-urllib/3.9". + # Use a different one as that must be sorted out. + use_headers = {"User-Agent": "Mozilla"} + if headers: + use_headers.update(headers) + return urllib.request.urlopen( + urllib.request.Request(url, headers=use_headers), timeout=20 + ) + + +def _get_file_size(filename: str | Path) -> int: + # Check if file already exists and get downloaded size (if any) + file_size = 0 + if os.path.exists(filename): + with open(filename, "rb") as f: + file_size = os.fstat(f.fileno()).st_size + return file_size + + +def _resume_download(url: str, filename: str | Path, chunk_size: int = 1024): + """Downloads a file in chunks with resume support. + + Args: + url: The URL of the file to download. + filename: The filename to save the downloaded file. + chunk_size: The size of each chunk to download (in bytes). + """ + downloaded_size = _get_file_size(filename) + # Set headers for resume download + headers = {} + if downloaded_size > 0: + headers["Range"] = f"bytes={downloaded_size}-" + + with _open_urllib(url, headers) as response, open(filename, "ab") as stream: + content_size = response.getheader("Content-Length") + + if not content_size: + raise RuntimeError("Resuming downloads is not supported.") + + while True: + chunk = response.read(chunk_size) + if not chunk: + break + stream.write(chunk) + + +class HTTPError(Exception): + """Custom HTTPError exception to mimic requests' HTTPError.""" + + +class Response: + def __init__(self, response): + self._response = response + self.status_code = response.status + self.headers = response.headers + self.url = response.url + self.reason = response.reason + self.content = response.read() + + @property + def text(self): + return self.content.decode("utf-8") + + def json(self): + import json + + return json.loads(self.text) + + def raise_for_status(self): + if self.status_code != 200: + raise HTTPError(f"{self.status_code} {self.reason}, accessing: {self.url}") + + +def _request(method, url, **kwargs): + data = kwargs.pop("data", None) + headers = kwargs.pop("headers", {}) + timeout = kwargs.pop("timeout", None) + assert kwargs == {}, f"Unexpected kwargs: {kwargs}" + + if data: + if isinstance(data, dict): + data = urllib.parse.urlencode(data).encode() + + req = urllib.request.Request(url, data=data, headers=headers, method=method.upper()) + + with urllib.request.urlopen(req, timeout=timeout) as response: + return Response(response) + + +def get(url, **kwargs): + return _request("GET", url, **kwargs) + + +def post(url, **kwargs): + return _request("POST", url, **kwargs) + + +def put(url, **kwargs): + return _request("PUT", url, **kwargs) + + +def delete(url, **kwargs): + return _request("DELETE", url, **kwargs) diff --git a/sema4ai-python-ls-core/src/sema4ai_ls_core/protocols.py b/sema4ai-python-ls-core/src/sema4ai_ls_core/protocols.py index c8d19deb3..bb3bf9364 100644 --- a/sema4ai-python-ls-core/src/sema4ai_ls_core/protocols.py +++ b/sema4ai-python-ls-core/src/sema4ai_ls_core/protocols.py @@ -1,41 +1,41 @@ import sys import threading +import typing +from enum import Enum from typing import ( - Dict, - Union, Any, - Generic, Callable, + Dict, + Generic, + Iterable, + List, Mapping, Optional, - List, - Type, - Iterable, Tuple, + Type, + TypeVar, + Union, ) -from typing import TypeVar -import typing - -from enum import Enum - if typing.TYPE_CHECKING: # This would lead to a circular import, so, do it only when type-checking. from sema4ai_ls_core.callbacks import Callback - from sema4ai_ls_core.lsp import TextDocumentContentChangeEvent - from sema4ai_ls_core.lsp import HoverResponseTypedDict - from sema4ai_ls_core.lsp import ReferencesResponseTypedDict - from sema4ai_ls_core.lsp import TextDocumentTypedDict - from sema4ai_ls_core.lsp import ResponseTypedDict - from sema4ai_ls_core.lsp import CodeLensTypedDict - from sema4ai_ls_core.lsp import RangeTypedDict - from sema4ai_ls_core.lsp import DocumentHighlightResponseTypedDict - from sema4ai_ls_core.lsp import PositionTypedDict - from sema4ai_ls_core.lsp import CompletionItemTypedDict - from sema4ai_ls_core.lsp import CompletionsResponseTypedDict - from sema4ai_ls_core.lsp import CompletionResolveResponseTypedDict - from sema4ai_ls_core.lsp import TextDocumentItem - from sema4ai_ls_core.lsp import TextEditTypedDict + from sema4ai_ls_core.lsp import ( + CodeLensTypedDict, + CompletionItemTypedDict, + CompletionResolveResponseTypedDict, + CompletionsResponseTypedDict, + DocumentHighlightResponseTypedDict, + HoverResponseTypedDict, + PositionTypedDict, + RangeTypedDict, + ReferencesResponseTypedDict, + ResponseTypedDict, + TextDocumentContentChangeEvent, + TextDocumentItem, + TextDocumentTypedDict, + TextEditTypedDict, + ) # Hack so that we don't break the runtime on versions prior to Python 3.8. if sys.version_info[:2] < (3, 8): @@ -48,8 +48,7 @@ def __init_subclass__(self, *args, **kwargs): pass else: - from typing import Protocol - from typing import TypedDict + from typing import Protocol, TypedDict T = TypeVar("T") @@ -838,6 +837,12 @@ def is_source_in_sync(self) -> bool: def find_line_with_contents(self, contents: str) -> int: pass + def set_custom_data(self, key: str, value: Any) -> None: + pass + + def get_custom_data(self, key: str) -> Any: + pass + class IWorkspaceFolder(Protocol): uri: str diff --git a/sema4ai-python-ls-core/src/sema4ai_ls_core/workspace.py b/sema4ai-python-ls-core/src/sema4ai_ls_core/workspace.py index eead99f19..c19cb9915 100644 --- a/sema4ai-python-ls-core/src/sema4ai_ls_core/workspace.py +++ b/sema4ai-python-ls-core/src/sema4ai_ls_core/workspace.py @@ -17,33 +17,33 @@ # limitations under the License. import io import os -from typing import Optional, Dict, List, Iterable, Tuple, Set, Union, Any +import threading +import time +import weakref +from collections import namedtuple +from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Union from sema4ai_ls_core import uris from sema4ai_ls_core.basic import implements -from sema4ai_ls_core.protocols import ( - IWorkspace, - IDocument, - IDocumentSelection, - IWorkspaceFolder, - IConfig, -) +from sema4ai_ls_core.callbacks import Callback +from sema4ai_ls_core.code_units import convert_utf16_code_unit_to_python from sema4ai_ls_core.core_log import get_logger -from sema4ai_ls_core.uris import uri_scheme, to_fs_path, normalize_drive, normalize_uri -import threading from sema4ai_ls_core.lsp import ( - TextDocumentItem, - TextDocumentContentChangeEvent, RangeTypedDict, - TextEditTypedDict, + TextDocumentContentChangeEvent, + TextDocumentItem, TextEdit, + TextEditTypedDict, ) -import weakref -from collections import namedtuple -import time +from sema4ai_ls_core.protocols import ( + IConfig, + IDocument, + IDocumentSelection, + IWorkspace, + IWorkspaceFolder, +) +from sema4ai_ls_core.uris import normalize_drive, normalize_uri, to_fs_path, uri_scheme from sema4ai_ls_core.watchdog_wrapper import IFSObserver -from sema4ai_ls_core.code_units import convert_utf16_code_unit_to_python -from sema4ai_ls_core.callbacks import Callback log = get_logger(__name__) @@ -68,9 +68,9 @@ class _VirtualFSThread(threading.Thread): on_created = Callback() def __init__(self, virtual_fs): - from sema4ai_ls_core.watchdog_wrapper import IFSWatch from sema4ai_ls_core import load_ignored_dirs from sema4ai_ls_core.callbacks import Callback + from sema4ai_ls_core.watchdog_wrapper import IFSWatch threading.Thread.__init__(self) self.daemon = True @@ -332,9 +332,9 @@ def __init__( workspace_folders: Optional[List[IWorkspaceFolder]] = None, track_file_extensions=(".robot", ".resource", ".py", ".yml", ".yaml"), ) -> None: - from sema4ai_ls_core.lsp import WorkspaceFolder - from sema4ai_ls_core.callbacks import Callback from sema4ai_ls_core.cache import LRUCache + from sema4ai_ls_core.callbacks import Callback + from sema4ai_ls_core.lsp import WorkspaceFolder self._main_thread = threading.current_thread() @@ -605,6 +605,7 @@ def __init__( self.uri = uri self.version = version self.path = uris.to_fs_path(uri) # Note: may be None. + self.__custom_data: dict[str, Any] = {} self._source = source self.__line_start_offsets = None @@ -663,6 +664,16 @@ def _clear_caches(self): self._check_in_mutate_thread() self.__lines = None self.__line_start_offsets = None + self.__custom_data.clear() + + def set_custom_data(self, key: str, value: Any): + """ + Can be used to store custom data in the document (cleared if the source is changed). + """ + self.__custom_data[key] = value + + def get_custom_data(self, key: str) -> Any: + return self.__custom_data.get(key) @property def _lines(self): diff --git a/sema4ai/bin/create_env/conda.yaml b/sema4ai/bin/create_env/conda.yaml index 279723eb9..3d3b50a36 100644 --- a/sema4ai/bin/create_env/conda.yaml +++ b/sema4ai/bin/create_env/conda.yaml @@ -5,11 +5,12 @@ channels: dependencies: - python=3.10.12 # https://pyreadiness.org/3.10/ - - pip=23.3.2 # https://pip.pypa.io/en/stable/news/ + - uv=0.2.37 # https://github.com/astral-sh/uv/blob/main/CHANGELOG.md - pyyaml=6.0.1 - msgspec=0.18.2 - - robocorp-truststore=0.8.0 # https://github.com/sethmlarson/truststore/blob/main/CHANGELOG.md - pip: - - --use-feature=truststore + - robocorp-truststore==0.9.1 # https://github.com/sethmlarson/truststore/blob/main/CHANGELOG.md - robocorp-inspector==0.10.2 # https://github.com/robocorp/inspector/blob/master/CHANGELOG.md - playwright==1.37.0 + - tree-sitter==0.22.3 + - tree-sitter-yaml==0.6.0 diff --git a/sema4ai/bin/create_env/conda_vscode_darwin_amd64.yaml b/sema4ai/bin/create_env/conda_vscode_darwin_amd64.yaml index 1755af4a4..ba7a74146 100644 --- a/sema4ai/bin/create_env/conda_vscode_darwin_amd64.yaml +++ b/sema4ai/bin/create_env/conda_vscode_darwin_amd64.yaml @@ -5,13 +5,14 @@ channels: dependencies: - python=3.10.12 # https://pyreadiness.org/3.10/ - - pip=23.3.2 # https://pip.pypa.io/en/stable/news/ + - uv=0.2.37 # https://github.com/astral-sh/uv/blob/main/CHANGELOG.md - pyyaml=6.0.1 - msgspec=0.18.2 - - robocorp-truststore=0.8.0 # https://github.com/sethmlarson/truststore/blob/main/CHANGELOG.md - python.app=1.3 # https://anaconda.org/conda-forge/python.app/files - pyscreeze==0.1.30 # VSCode Image Inspector dependency - python-mss==9.0.1 # VSCode Image Inspector dependency - pip: - - --use-feature=truststore + - robocorp-truststore==0.9.1 # https://github.com/sethmlarson/truststore/blob/main/CHANGELOG.md - playwright==1.37.0 + - tree-sitter==0.22.3 + - tree-sitter-yaml==0.6.0 diff --git a/sema4ai/bin/create_env/conda_vscode_linux_amd64.yaml b/sema4ai/bin/create_env/conda_vscode_linux_amd64.yaml index 77434780d..901278f10 100644 --- a/sema4ai/bin/create_env/conda_vscode_linux_amd64.yaml +++ b/sema4ai/bin/create_env/conda_vscode_linux_amd64.yaml @@ -5,12 +5,13 @@ channels: dependencies: - python=3.10.12 # https://pyreadiness.org/3.10/ - - pip=23.3.2 # https://pip.pypa.io/en/stable/news/ + - uv=0.2.37 # https://github.com/astral-sh/uv/blob/main/CHANGELOG.md - pyyaml=6.0.1 - msgspec=0.18.2 - - robocorp-truststore=0.8.0 # https://github.com/sethmlarson/truststore/blob/main/CHANGELOG.md - pyscreeze==0.1.30 # VSCode Image Inspector dependency - python-mss==9.0.1 # VSCode Image Inspector dependency - pip: - - --use-feature=truststore + - robocorp-truststore==0.9.1 # https://github.com/sethmlarson/truststore/blob/main/CHANGELOG.md - playwright==1.37.0 + - tree-sitter==0.22.3 + - tree-sitter-yaml==0.6.0 diff --git a/sema4ai/bin/create_env/conda_vscode_windows_amd64.yaml b/sema4ai/bin/create_env/conda_vscode_windows_amd64.yaml index 24c1e9264..ae453da97 100644 --- a/sema4ai/bin/create_env/conda_vscode_windows_amd64.yaml +++ b/sema4ai/bin/create_env/conda_vscode_windows_amd64.yaml @@ -5,10 +5,9 @@ channels: dependencies: - python=3.10.12 # https://pyreadiness.org/3.10/ - - pip=23.3.2 # https://pip.pypa.io/en/stable/news/ + - uv=0.2.37 # https://github.com/astral-sh/uv/blob/main/CHANGELOG.md - pyyaml=6.0.1 - msgspec=0.18.2 - - robocorp-truststore=0.8.0 # https://github.com/sethmlarson/truststore/blob/main/CHANGELOG.md - pywin32=303 # https://github.com/mhammond/pywin32/blob/main/CHANGES.txt - pyscreeze==0.1.30 # VSCode Image Inspector dependency - python-mss==9.0.1 # VSCode Image Inspector dependency @@ -16,5 +15,7 @@ dependencies: - psutil==5.9.8 # VSCode Windows Inspector dependency - java-access-bridge-wrapper==1.2.0 # VSCode Java Inspector dependency - pip: - - --use-feature=truststore + - robocorp-truststore==0.9.1 # https://github.com/sethmlarson/truststore/blob/main/CHANGELOG.md - playwright==1.37.0 + - tree-sitter==0.22.3 + - tree-sitter-yaml==0.6.0 diff --git a/sema4ai/poetry.lock b/sema4ai/poetry.lock index 0ed96ac60..4612fd8d7 100644 --- a/sema4ai/poetry.lock +++ b/sema4ai/poetry.lock @@ -1,179 +1,95 @@ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] -name = "certifi" -version = "2024.2.2" -description = "Python package for providing Mozilla's CA Bundle." +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {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 = "cffi" -version = "1.16.0" +version = "1.17.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, ] [package.dependencies] pycparser = "*" -[[package]] -name = "charset-normalizer" -version = "3.3.2" -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"}, -] - [[package]] name = "colorama" version = "0.4.6" @@ -187,54 +103,54 @@ files = [ [[package]] name = "comtypes" -version = "1.4.2" +version = "1.4.6" description = "Pure Python COM package" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "comtypes-1.4.2-py3-none-any.whl", hash = "sha256:ce5f9ae2ca9e02b38d790cfd04271c234e12ed44056d0f979e7b7f587c963fe0"}, - {file = "comtypes-1.4.2.zip", hash = "sha256:eb72473b0dea9495e84c79e340c239012e8572f51dedf726a9dfd7aeaf2a1ffb"}, + {file = "comtypes-1.4.6-py3-none-any.whl", hash = "sha256:51e7e43f45ec5e7bb2fd532c0e8b7564a7adb8c0b1c1d9c15b64963b4b103e3a"}, + {file = "comtypes-1.4.6.zip", hash = "sha256:613cb6799a1a5e2e7cd44fa433a4a71a637f4bab9d5a4d770d5357ff7ac6bc36"}, ] [[package]] name = "cryptography" -version = "42.0.7" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] @@ -263,13 +179,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -374,17 +290,6 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] -[[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - [[package]] name = "iniconfig" version = "2.0.0" @@ -516,44 +421,44 @@ files = [ [[package]] name = "mypy" -version = "1.10.0" +version = "1.11.2" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, + {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, + {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, + {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, + {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, + {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, + {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, + {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, + {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, + {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, + {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, + {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, + {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, + {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, + {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, + {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, + {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, + {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, + {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, + {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -619,95 +524,106 @@ files = [ [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -716,18 +632,18 @@ xmp = ["defusedxml"] [[package]] name = "playwright" -version = "1.43.0" +version = "1.46.0" description = "A high-level API to automate web browsers" optional = false python-versions = ">=3.8" files = [ - {file = "playwright-1.43.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:b03b12bd4da9c2cfb78dff820deac8b52892fe3c2f89a4d95d6f08c59e41deb9"}, - {file = "playwright-1.43.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e9ec21b141727392f630761c7f4dec46d80c98243614257cc501b64ff636d337"}, - {file = "playwright-1.43.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:e05a8d8fb2040c630429cca07e843c8fa33059717837c8f50c01b7d1fc651ce1"}, - {file = "playwright-1.43.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:50d9a5c07c76456945a2296d63f78fdf6eb11aed3e8d39bb5ccbda760a8d6d41"}, - {file = "playwright-1.43.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87191272c40b4c282cf2c9449ca3acaf705f38ac6e2372270f1617ce16b661b8"}, - {file = "playwright-1.43.0-py3-none-win32.whl", hash = "sha256:bd8b818904b17e2914be23e7bc2a340b203f57fe81678520b10f908485b056ea"}, - {file = "playwright-1.43.0-py3-none-win_amd64.whl", hash = "sha256:9b7bd707eeeaebee47f656b2de90aa9bd85e9ca2c6af7a08efd73896299e4d50"}, + {file = "playwright-1.46.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:fa60b95c16f6ce954636229a6c9dd885485326bca52d5ba20d02c0bc731a2bbb"}, + {file = "playwright-1.46.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:73dcfc24834f4d004bc862ed0d74b4c1406793a8164734238ad035356fddc8ac"}, + {file = "playwright-1.46.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:f5acfec1dbdc84d02dc696a17a344227e66c91413eab2036428dab405f195b82"}, + {file = "playwright-1.46.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:3b418509f45879f1403d070858657a39bd0b333b23d92c37355682b671726df9"}, + {file = "playwright-1.46.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23580f6a3f99757bb9779d29be37144cb9328cd9bafa178e6db5b3ab4b7faf4c"}, + {file = "playwright-1.46.0-py3-none-win32.whl", hash = "sha256:85f44dd32a23d02850f0ff4dafe51580e5199531fff5121a62489d9838707782"}, + {file = "playwright-1.46.0-py3-none-win_amd64.whl", hash = "sha256:f14a7fd7e24e954eec6ce61d787d499e41937ade811a0818e9a088aabe28ebb6"}, ] [package.dependencies] @@ -788,6 +704,126 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +[[package]] +name = "pydantic" +version = "2.8.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.20.1" +typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.20.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + [[package]] name = "pyee" version = "11.1.0" @@ -820,13 +856,13 @@ Pillow = {version = ">=9.2.0", markers = "python_version == \"3.10\""} [[package]] name = "pytest" -version = "8.2.0" +version = "8.3.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, - {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [package.dependencies] @@ -834,7 +870,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] @@ -931,74 +967,66 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - [[package]] name = "robocorp-actions" version = "0.2.1" @@ -1063,13 +1091,13 @@ robocorp-log = ">=2.4,<3" [[package]] name = "robocorp-truststore" -version = "0.8.0" +version = "0.9.1" description = "Verify certificates using native system trust stores" optional = false -python-versions = ">= 3.10" +python-versions = ">=3.10" files = [ - {file = "robocorp_truststore-0.8.0-py3-none-any.whl", hash = "sha256:f298f733c997f024393c93526f8d9eac893aa56809e92edfd109ea31f622231f"}, - {file = "robocorp_truststore-0.8.0.tar.gz", hash = "sha256:92d8f3d6dc10b9b7825683ae8dc1e134a0c3ade81c99554e3ddd4eafa59a8acf"}, + {file = "robocorp_truststore-0.9.1-py3-none-any.whl", hash = "sha256:dfdd4812dffce8a91134e8b69a3c55072fc9785dbdd583d4047f323779ac2f39"}, + {file = "robocorp_truststore-0.9.1.tar.gz", hash = "sha256:a1abfd9c5b7fe22152a8eeb9510812800dca741851c720742c598c0f78ee4f3f"}, ] [[package]] @@ -1100,19 +1128,20 @@ files = [ [[package]] name = "sema4ai-actions" -version = "0.3.1" +version = "0.10.0" description = "Sema4AI Actions" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "sema4ai_actions-0.3.1-py3-none-any.whl", hash = "sha256:2365e1822b34a2f3708fa36958f3172c50aea385ef56aaf4e7fbcf309fca30da"}, - {file = "sema4ai_actions-0.3.1.tar.gz", hash = "sha256:c0a30d03fa654428ba2f119d30e23d7795855177a0fada3a3c2b1836a3e0f66e"}, + {file = "sema4ai_actions-0.10.0-py3-none-any.whl", hash = "sha256:3f16b3304b25831f50ffee78cedcdc5e0d74086f624f932ccc8c3514b2726ab1"}, + {file = "sema4ai_actions-0.10.0.tar.gz", hash = "sha256:d08cb22887f099f8a7e47cf1072c731ccac72afd389181b44c5e13091b188c40"}, ] [package.dependencies] cryptography = ">=42.0.5,<43.0.0" docstring_parser_fork = ">=0.0.5,<0.0.6" psutil = ">=5.0,<6.0" +pydantic = ">=2.0,<3.0" robocorp-log = ">=2.4,<3" robocorp-truststore = ">=0.8.0" @@ -1191,25 +1220,75 @@ files = [ ] [[package]] -name = "truststore" -version = "0.8.0" -description = "Verify certificates using native system trust stores" +name = "tree-sitter" +version = "0.22.3" +description = "Python bindings to the Tree-sitter parsing library" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tree-sitter-0.22.3.tar.gz", hash = "sha256:6516bcef5d36e0365670b97c91a169c8b1aa82ea4b60946b879020820718ce3d"}, + {file = "tree_sitter-0.22.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d9a26dd80cf10763527483b02ba35a0b8d9168f324dbbce3f07860256c29bf15"}, + {file = "tree_sitter-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bcbe0a7358628629d9ec8e5687477e12f7c6aae6943b0872afb7170db039b86"}, + {file = "tree_sitter-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfa45e6bf2542862ce987482fe212ef3153bd331d5bba5873b9f485f8923f65a"}, + {file = "tree_sitter-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4545b142da82f9668007180e0081583054682d0154cd6349796ac77dc8520d63"}, + {file = "tree_sitter-0.22.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4978d22fe2868ab9a91125f49bd576ce5f954cc887c19471e0c33e104f37ba71"}, + {file = "tree_sitter-0.22.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0ec593a69f8c4f1c81494147814d11b7fc6c903e5299e084ae7b89caf95cef84"}, + {file = "tree_sitter-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:0f66b88b8e9993630613d594e845f3cf2695fef87d0ca1475437cb17eeb72dc5"}, + {file = "tree_sitter-0.22.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e627eb129421f63378e936b5d0e13b8befa6e7c5267a8a7621a397a84e8f1f7"}, + {file = "tree_sitter-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cfa2a9860bfb0404ae28a9cf056dab8f2eb7f1673d8cc9b3f7e21452daad0e0"}, + {file = "tree_sitter-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a66cc5f19635119a9d8325bcb00a58ed48427e3c3d307caf7c00d745ac83a5"}, + {file = "tree_sitter-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de16468ea22c910e67caa91c99be9d6eb73e97e5164480a890f678b22d32faca"}, + {file = "tree_sitter-0.22.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:98c697427f82abab6b39cfe2ade6547d844dd419fa8cfc89031bcdf7c10579b6"}, + {file = "tree_sitter-0.22.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:548aa34f15a29aef1fc8e85507f13e0678a54f1de16461f844d86179b19bb5f6"}, + {file = "tree_sitter-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:2fc0e1097fb86623b340141e80a0f2b7668b09d953501d91adc715a577e32c61"}, + {file = "tree_sitter-0.22.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7cb5c145fbd4bcc0cd4851dc4d0a6079a8e2f61257f8c0effc92434f6fb19b14"}, + {file = "tree_sitter-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d4a592080db6b9472a886f4593b4705d02630721fdbe4a700085fe775fcab20e"}, + {file = "tree_sitter-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f36bf523763f05edf924126583ea997f905162046c0f184d6fd040cc1ccbf2c5"}, + {file = "tree_sitter-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e1193f27c25aab299f4fc154664122c7bfe80633b726bb457356d371479a5b"}, + {file = "tree_sitter-0.22.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:156df7e71a6c6b542ff29526cad6886a41115e42dc768c55101398d68325db54"}, + {file = "tree_sitter-0.22.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:82e1d467ce23dd2ecc37d4fb83965e891fc37b943639c517cd5acf54a2df0ff7"}, + {file = "tree_sitter-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:e541a0c08a04f229ba9479a8c441dd267fdaa3e5842ae70a744c178bcaf53fa3"}, + {file = "tree_sitter-0.22.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a85a1d0fdff21cc524a959b3277c311941a9b5b91a862e462c1b55470893884a"}, + {file = "tree_sitter-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f96c6acd2799bafa28543a267937eec6a3d9ccbdeb6e1d05858114d4cd882da9"}, + {file = "tree_sitter-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed2708aecd3a4c8d20a89350d3c89ac2f964985ee9117c39357cee3098a9498a"}, + {file = "tree_sitter-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2f99535aa4195b20fef18559defaabd9e12fe8ed8806c101d51820f240ca64"}, + {file = "tree_sitter-0.22.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:459a0f3bf8d6dbb9e9f651d67cee3a60f0b799fefd4a33f49a7e9501ada98e35"}, + {file = "tree_sitter-0.22.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4a51bfe99dcd8bbfb0fe95113f0197e6e540db3077abce77a058235beec747a3"}, + {file = "tree_sitter-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:8d54ef562492493bf091cb3fd605cb7e60bf1d56634a94ab48075741d823e3a5"}, +] + +[package.extras] +docs = ["sphinx (>=7.3,<8.0)", "sphinx-book-theme"] +tests = ["tree-sitter-html", "tree-sitter-javascript", "tree-sitter-json", "tree-sitter-python", "tree-sitter-rust"] + +[[package]] +name = "tree-sitter-yaml" +version = "0.6.0" +description = "YAML grammar for tree-sitter" optional = false -python-versions = ">= 3.10" +python-versions = ">=3.8" files = [ - {file = "truststore-0.8.0-py3-none-any.whl", hash = "sha256:e37a5642ae9fc48caa8f120b6283d77225d600d224965a672c9e8ef49ce4bb4c"}, - {file = "truststore-0.8.0.tar.gz", hash = "sha256:dc70da89634944a579bfeec70a7a4523c53ffdb3cf52d1bb4a431fda278ddb96"}, + {file = "tree_sitter_yaml-0.6.0-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:62d53ef380d6f0ae731818be4e236d3006abede6331d1b727fe6a5476601cff9"}, + {file = "tree_sitter_yaml-0.6.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:7e7ccc5666336dabf3bfbffd6333c3df7ab8c8b6564fd550fe443d4a09609f57"}, + {file = "tree_sitter_yaml-0.6.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0b5c0a4db1834e8066fe011f6a9e9a7dbd03eb70321a59c74b079dd6ca8389e"}, + {file = "tree_sitter_yaml-0.6.0-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ea2cc2857982c4e2102032fadf186d9c8d5b53706f5963c5470234eac39fc4"}, + {file = "tree_sitter_yaml-0.6.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:c07c297e515af4c11912d32ad8115261c1999570f6cee0af96850ed9daacda6d"}, + {file = "tree_sitter_yaml-0.6.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f20b99ee3b11c7307d80698ac71a3c9b1284760cd205d6575e796e0285a172a7"}, + {file = "tree_sitter_yaml-0.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:5cd6a603303c3c3a8f1e79245d202fb1156baff48000c7a01de085767eba9253"}, ] +[package.extras] +core = ["tree-sitter (>=0.21,<1.0)"] + [[package]] name = "types-docutils" -version = "0.21.0.20240423" +version = "0.21.0.20240724" description = "Typing stubs for docutils" optional = false python-versions = ">=3.8" files = [ - {file = "types-docutils-0.21.0.20240423.tar.gz", hash = "sha256:7716ec6c68b5179b7ba1738cace2f1326e64df9f44b7ab08d9904d32c23fc15f"}, - {file = "types_docutils-0.21.0.20240423-py3-none-any.whl", hash = "sha256:7f6e84ba8fcd2454c5b8bb8d77384d091a901929cc2b31079316e10eb346580a"}, + {file = "types-docutils-0.21.0.20240724.tar.gz", hash = "sha256:29ff7e27660f4fe76ea61d7e54d05ca3ce3b733ca9e8e8721e0fa587dbc10489"}, + {file = "types_docutils-0.21.0.20240724-py3-none-any.whl", hash = "sha256:bf51c6c488d23c0412f9b3ba10686fb1a6cb0b957ef04b45128d8a55c79ebb00"}, ] [[package]] @@ -1236,24 +1315,24 @@ files = [ [[package]] name = "types-pillow" -version = "10.2.0.20240511" +version = "10.2.0.20240822" description = "Typing stubs for Pillow" optional = false python-versions = ">=3.8" files = [ - {file = "types-Pillow-10.2.0.20240511.tar.gz", hash = "sha256:b2fcc27b8e15ae3741941e43b4f39eba6fce6bcb152af90bbb07b387d2585783"}, - {file = "types_Pillow-10.2.0.20240511-py3-none-any.whl", hash = "sha256:ef87a19ea0a02a89c784cbc1b99dfff6c00dd0d5796a8ac868cf7ec69c5f88ff"}, + {file = "types-Pillow-10.2.0.20240822.tar.gz", hash = "sha256:559fb52a2ef991c326e4a0d20accb3bb63a7ba8d40eb493e0ecb0310ba52f0d3"}, + {file = "types_Pillow-10.2.0.20240822-py3-none-any.whl", hash = "sha256:d9dab025aba07aeb12fd50a6799d4eac52a9603488eca09d7662543983f16c5d"}, ] [[package]] name = "types-psutil" -version = "5.9.5.20240511" +version = "5.9.5.20240516" description = "Typing stubs for psutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-psutil-5.9.5.20240511.tar.gz", hash = "sha256:2c0b22edab6c8775f4a8688e3f14cefda8793e26ddf99d61b654a0d600179087"}, - {file = "types_psutil-5.9.5.20240511-py3-none-any.whl", hash = "sha256:7b4a12ace894c087f684ea3b4fb81964d6b941aabbae8437959616cbd9d48346"}, + {file = "types-psutil-5.9.5.20240516.tar.gz", hash = "sha256:bb296f59fc56458891d0feb1994717e548a1bcf89936a2877df8792b822b4696"}, + {file = "types_psutil-5.9.5.20240516-py3-none-any.whl", hash = "sha256:83146ded949a10167d9895e567b3b71e53ebc5e23fd8363eab62b3c76cce7b89"}, ] [[package]] @@ -1269,58 +1348,27 @@ files = [ [[package]] name = "types-pyyaml" -version = "6.0.12.20240311" +version = "6.0.12.20240808" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.8" files = [ - {file = "types-PyYAML-6.0.12.20240311.tar.gz", hash = "sha256:a9e0f0f88dc835739b0c1ca51ee90d04ca2a897a71af79de9aec5f38cb0a5342"}, - {file = "types_PyYAML-6.0.12.20240311-py3-none-any.whl", hash = "sha256:b845b06a1c7e54b8e5b4c683043de0d9caf205e7434b3edc678ff2411979b8f6"}, + {file = "types-PyYAML-6.0.12.20240808.tar.gz", hash = "sha256:b8f76ddbd7f65440a8bda5526a9607e4c7a322dc2f8e1a8c405644f9a6f4b9af"}, + {file = "types_PyYAML-6.0.12.20240808-py3-none-any.whl", hash = "sha256:deda34c5c655265fc517b546c902aa6eed2ef8d3e921e4765fe606fe2afe8d35"}, ] -[[package]] -name = "types-requests" -version = "2.31.0.20240406" -description = "Typing stubs for requests" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-requests-2.31.0.20240406.tar.gz", hash = "sha256:4428df33c5503945c74b3f42e82b181e86ec7b724620419a2966e2de604ce1a1"}, - {file = "types_requests-2.31.0.20240406-py3-none-any.whl", hash = "sha256:6216cdac377c6b9a040ac1c0404f7284bd13199c0e1bb235f4324627e8898cf5"}, -] - -[package.dependencies] -urllib3 = ">=2" - [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] -[[package]] -name = "urllib3" -version = "2.2.1" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.11" -content-hash = "2a5327628460ffdb3a559c25e3e7b24846a783266ed53fd4c7f06b158c3d2c67" +content-hash = "54788bd1dea640205b332b3635790dbb9726cc3a0b5a5d91d25c9dc8f2ecbead" diff --git a/sema4ai/pyproject.toml b/sema4ai/pyproject.toml index fc916e0b2..4d2f09b44 100644 --- a/sema4ai/pyproject.toml +++ b/sema4ai/pyproject.toml @@ -43,14 +43,16 @@ mss = "^9.0.1" java-access-bridge-wrapper = "^1.2.0" ruff = "^0.1.14" +tree-sitter = "^0.22.3" +tree-sitter-yaml = "^0.6.0" [tool.poetry.group.dev.dependencies] sema4ai-python-ls-core = {path = "../sema4ai-python-ls-core/", develop = true} fire = "*" -robocorp-actions = "^0.2.0" # Just needed for testing. -sema4ai-actions = "^0.3.1" # Just needed for testing. +robocorp-actions = "^0.2.1" # Just needed for testing. +sema4ai-actions = "^0.10.0" # Just needed for testing. numpy = "<2" ruff = "^0.1.14" @@ -59,8 +61,7 @@ isort = { version = "^5.12.0", python = "^3.8" } invoke = "^2.0" tomlkit = "^0.11.8" semver = "^3.0.0" -requests = "*" -truststore = "0.8.0" +robocorp-truststore = "0.9.1" mock = "*" pytest = "*" @@ -68,7 +69,6 @@ pytest-regressions = "1.0.6" pytest-xdist = "*" pytest-timeout = "*" -types-requests = "*" types-invoke = "^2.0" types-psutil = "^5.9" types-mock = "*" diff --git a/sema4ai/src/sema4ai_code/agents/agent_spec.py b/sema4ai/src/sema4ai_code/agents/agent_spec.py new file mode 100644 index 000000000..8883bb06e --- /dev/null +++ b/sema4ai/src/sema4ai_code/agents/agent_spec.py @@ -0,0 +1,207 @@ +import json + +from .agent_spec_handler import Entry, load_spec + +AGENT_SPEC_V2: dict[str, Entry] = load_spec( + json.loads( + r"""{ + "agent-package": { + "description": "Root element for the agent spec", + "required": true, + "expected-type": "object" + }, + "agent-package/spec-version": { + "description": "The version of the spec being used. Example: \"v2\"", + "required": true, + "expected-type": "string" + }, + "agent-package/agents": { + "description": "Defines the agents in the package (note: only a single agent is expected to be defined)", + "required": true, + "expected-type": "list" + }, + "agent-package/agents/name": { + "description": "The name of the agent. Example: \"My Agent\"", + "required": true, + "expected-type": "string" + }, + "agent-package/agents/description": { + "description": "Description for the agent. Example: \"My smart agent that does what I want\"", + "required": true, + "expected-type": "string" + }, + "agent-package/agents/model": { + "description": "Section to describe the LLM used by the agent", + "required": true, + "expected-type": "object" + }, + "agent-package/agents/model/provider": { + "description": "The LLM Provider.", + "required": true, + "expected-type": { + "type": "string", + "recommended-values": [ + "OpenAI", + "Azure", + "Anthropic", + "Google", + "Amazon", + "Ollama" + ] + } + }, + "agent-package/agents/model/name": { + "description": "The LLM model name to be used.", + "required": true, + "expected-type": { + "type": "string", + "recommended-values": [ + "gpt-3.5-turbo", + "gpt-4-turbo", + "gpt-4o", + "gpt-4", + "llama3" + ] + } + }, + "agent-package/agents/version": { + "description": "Version of the Agent Package. Example: \"1.3.0\"", + "required": true, + "expected-type": "string" + }, + "agent-package/agents/architecture": { + "description": "The agent type. Accepted values are: \"agent\", \"plan_execute\". \"agent\" means using chat + RAG + tools, \"plan_execute\" means chat + RAG + Tools with the ability to plan/replan its approach to coming up with an answer to a user's question/prompt.", + "required": true, + "expected-type": { + "type": "enum", + "values": ["agent", "plan_execute"] + } + }, + "agent-package/agents/reasoning": { + "description": "The reasoning level for the agent. Accepted values: \"disabled\", \"enabled\", \"verbose\"", + "required": true, + "expected-type": { + "type": "enum", + "values": ["disabled", "enabled", "verbose"] + } + }, + "agent-package/agents/runbook": { + "description": "The runbook is used to build the prompt passed to the agent to define its behavior. Relative path (right next to the `agent-spec.yaml`) for the file to be used for the runbook. A markdown formatted file is expected.", + "required": true, + "expected-type": { + "type": "file", + "relative-to": "./" + } + }, + "agent-package/agents/action-packages": { + "description": "Section with the action packages that the agent can use.", + "required": true, + "expected-type": "list" + }, + "agent-package/agents/action-packages/name": { + "description": "The name of the action package. Example: \"my-action-package\"", + "required": true, + "expected-type": "string" + }, + "agent-package/agents/action-packages/organization": { + "description": "The organization that provided the action. Example: \"MyActions\"", + "required": true, + "expected-type": "string" + }, + "agent-package/agents/action-packages/type": { + "description": "The type of the action package distribution. Accepted values are \"zip\" and \"folder\"", + "required": true, + "expected-type": { + "type": "enum", + "values": ["zip", "folder"] + } + }, + "agent-package/agents/action-packages/version": { + "description": "Version of the action package. Example: \"1.3.0\"", + "required": true, + "expected-type": "string" + }, + "agent-package/agents/action-packages/whitelist": { + "description": "Whitelist of actions (comma-separated string) accepted in the action package. An empty string value for whitelist implies usage of all actions. Example: action1, action2", + "required": true, + "expected-type": "string" + }, + "agent-package/agents/action-packages/path": { + "description": "Relative path under \"actions\" to access the action package folder or zip. Example: \"MyActions/my-action-package\" or \"Sema4.ai/free-web-search/1.0.0.zip\"", + "required": true, + "expected-type": { + "type": "file", + "relative-to": "/actions" + } + }, + "agent-package/agents/knowledge": { + "description": "Section to indicate additional knowledge files for the agent or actions.", + "required": false, + "expected-type": "list" + }, + "agent-package/agents/knowledge/name": { + "description": "Relative path under \"knowledge\" for the related knowledge file.", + "required": true, + "expected-type": { + "type": "file", + "relative-to": "./knowledge" + } + }, + "agent-package/agents/knowledge/embedded": { + "description": "Setting embedded to true means that the file is vectorized and embedded into the context. False means that the file is not used in the context, but can be uploaded for use in actions.", + "required": true, + "expected-type": "bool" + }, + "agent-package/agents/knowledge/digest": { + "description": "SHA-256 hex string for the knowledge file content. Should not be specified while developing, but when a package is built for distribution, tooling should generate this.", + "required": false, + "expected-type": "string" + }, + "agent-package/agents/metadata": { + "description": "Metadata on how to run the agent", + "required": true, + "expected-type": "object" + }, + "agent-package/agents/metadata/mode": { + "description": "Mode of worker allowed values: \"conversational\" | \"worker\"", + "required": true, + "expected-type": { + "type": "enum", + "values": ["conversational", "worker"] + } + }, + "agent-package/agents/metadata/worker-config": { + "description": "Configuration for the worker (only required if 'mode' is worker)", + "required": false, + "expected-type": "object" + }, + "agent-package/agents/metadata/worker-config/type": { + "description": "Worker type (required if 'worker-config' is specified)", + "required": true, + "expected-type": "string" + }, + "agent-package/agents/metadata/worker-config/document-type": { + "description": "Document type (required if 'worker-config' is specified)", + "required": true, + "expected-type": "string" + }, + "agent-package/agents/resources": { + "description": "Please use 'knowledge' instead", + "deprecated": true + }, + "agent-package/agents/type": { + "description": "Please use 'architecture' instead", + "deprecated": true + }, + "agent-package/agents/reasoningLevel": { + "description": "Please use 'reasoning' instead", + "deprecated": true + }, + "agent-package/agents/runbooks": { + "description": "Please use 'runbook' instead", + "deprecated": true + } +} +""" + ) +) diff --git a/sema4ai/src/sema4ai_code/agents/agent_spec_handler.py b/sema4ai/src/sema4ai_code/agents/agent_spec_handler.py new file mode 100644 index 000000000..a145e79f2 --- /dev/null +++ b/sema4ai/src/sema4ai_code/agents/agent_spec_handler.py @@ -0,0 +1,636 @@ +import typing +import weakref +from dataclasses import dataclass +from enum import Enum +from pathlib import Path +from typing import Any, Generic, Iterator, Optional, TypeVar + +if typing.TYPE_CHECKING: + from tree_sitter import Node, Tree + + +class _ExpectedTypeEnum(Enum): + object = "object" + string = "string" + enum = "enum" + file = "file" + list = "list" + bool = "bool" + int = "int" + float = "float" + NOT_SET = "NOT_SET" # Should be set only when deprecated is true. + + +class _YamlNodeKind(Enum): + # 'unhandled' is the default (when we find the actual type afterwards it's set + # -- if not there it's probably an object or something we didn't expect, and that's ok, + # but it may also signal we need some additional heuristic to determin the actual type). + unhandled = "unhandled" + + list = "list" + list_item = "list-item" + bool = "bool" + int = "int" + float = "float" + string = "string" + + +@dataclass +class _ExpectedType: + expected_type: _ExpectedTypeEnum # May be "object", "string", "enum", "file", "list" (implies "list[object]"), or "bool". + + # If a "string" type, the recommended values may be provided + # (this means that any string value is accepted, but the recommended values can be used to help the user). + recommended_values: Optional[list[str]] = None + + # If an "enum" type, the accepted values should be provided. + enum_values: Optional[list[str]] = None + + # If a "file" type, the relative path to the file (based on the agent root dir) should be provided. + relative_to: Optional[str] = None + + def __post_init__(self) -> None: + if self.expected_type == "file": + assert ( + self.relative_to is not None + ), "relative_to must be provided for file type." + + if self.expected_type == "enum": + assert ( + self.enum_values is not None + ), "enum_values must be provided for enum type." + + +@dataclass +class Entry: + # The path to the key in the YAML spec (i.e.: "agent-package/agents/name") + path: str + + # The description of the key in the YAML spec. + description: str + + # The expected type of the key in the YAML spec. + expected_type: _ExpectedType + + # Whether the key is required (default is true). + required: bool = True + + # Whether the key is deprecated. + deprecated: bool = False + + +class RootHasNoDataError(Exception): + pass + + +def load_spec(json_spec: dict[str, Any]) -> dict[str, Entry]: + ret: dict[str, Entry] = {} + + for path, value in json_spec.items(): + try: + expected_type = "" + assert isinstance( + value, dict + ), f"Invalid spec: {path}. Expected a dictionary. Found {type(value)}" + + value = value.copy() + deprecated = value.pop("deprecated", False) + required = value.pop("required", False) + expected_type = value.pop("expected-type", None) + description = value.pop("description", None) + if not description: + raise Exception(f"Invalid spec: {path}. Expected a description.") + + if isinstance(expected_type, dict): + recommended_values = expected_type.get("recommended-values", None) + enum_values = expected_type.get("values", None) + relative_to = expected_type.get("relative-to", None) + expected_type = expected_type.get("type", None) + else: + recommended_values = None + enum_values = None + relative_to = None + + if value: + raise Exception(f"Invalid spec: {path}. Unexpected keys: {value}") + + if expected_type is None: + expected_type_enum = _ExpectedTypeEnum.NOT_SET + else: + expected_type_enum = _ExpectedTypeEnum(expected_type) + + ret[path] = Entry( + path=path, + description=description, + expected_type=_ExpectedType( + expected_type=expected_type_enum, + recommended_values=recommended_values, + enum_values=enum_values, + relative_to=relative_to, + ), + required=required, + deprecated=deprecated, + ) + except Exception: + raise Exception( + f"Invalid spec: {path}. Expected type {expected_type} is not a valid expected type." + ) + return ret + + +T = TypeVar("T") + + +@dataclass +class Error: + message: str + node: Optional["Node"] = None + + +class TreeNode(Generic[T]): + _parent: Optional[weakref.ref["TreeNode[T]"]] = None + + def __init__(self, name: str, parent: Optional["TreeNode[T]"] = None): + self.name = name + self._children: dict[str, "TreeNode[T]"] = {} + self._data: Optional[T] = None + if parent: + self._parent = weakref.ref(parent) + else: + self._parent = None + + def pretty(self, level: int = 0) -> str: + level_str = " " * level + ret = f"{level_str}{self.name}{self._pretty_data()}\n" + for child in self._children.values(): + ret += child.pretty(level + 1) + return ret + + def _pretty_data(self) -> str: + return "" + + @property + def data(self) -> T: + if self._data is None: + raise RootHasNoDataError(f"Data not set for {self.name}.") + return self._data + + @property + def parent(self) -> Optional["TreeNode[T]"]: + if self._parent: + return self._parent() + return None + + def obtain(self, name: str, data: T) -> "TreeNode[T]": + assert "/" not in name, f"Did not expect / to be in {name}." + child = self._children.get(name) + if child is None: + child = self.__class__(name, self) + self._children[name] = child + child._data = data + return child + + def __str__(self) -> str: + cls = self.__class__.__name__ + return f"{cls}({self.name})" + + __repr__ = __str__ + + +class _SpecTreeNode(TreeNode[Entry]): # Subclass is just for typing + def obtain(self, name: str, data: Entry) -> "_SpecTreeNode": + return typing.cast("_SpecTreeNode", super().obtain(name, data)) + + @property + def parent(self) -> Optional["_SpecTreeNode"]: + if self._parent: + return typing.cast("_SpecTreeNode", self._parent()) + return None + + @property + def children(self) -> dict[str, "_SpecTreeNode"]: + return typing.cast(dict[str, "_SpecTreeNode"], self._children) + + def _pretty_data(self) -> str: + if self._data is None: + return " (no data)" + + ret = "" + if self._data.required: + ret += " (required)" + if self._data.deprecated: + ret += " (deprecated)" + return ret + + +class YamlNodeData: + def __init__( + self, + node: "Node", + kind: _YamlNodeKind, + ) -> None: + self.node = node + self.kind = kind + + +class _YamlTreeNode(TreeNode[YamlNodeData]): # Subclass is just for typing + def obtain(self, name: str, data: YamlNodeData) -> "_YamlTreeNode": + return typing.cast("_YamlTreeNode", super().obtain(name, data)) + + @property + def parent(self) -> Optional["_YamlTreeNode"]: + if self._parent: + return typing.cast("_YamlTreeNode", self._parent()) + return None + + @property + def children(self) -> dict[str, "_YamlTreeNode"]: + return typing.cast(dict[str, "_YamlTreeNode"], self._children) + + def _pretty_data(self) -> str: + if self._data is None: + return " (no data)" + return f" ({self._data.kind.value})" + + +def _convert_flattened_to_nested(flattened: dict[str, Entry]) -> _SpecTreeNode: + """ + Converts a flattened dictionary of entries into a nested tree of _SpecTreeNode objects + (the idea is that we convert the flattened structure of the spec into a tree which + will be traversed to validate the yaml contents). + """ + root = _SpecTreeNode("root") + for path, entry in flattened.items(): + curr = root + parts = path.split("/") + for part in parts: + curr = curr.obtain(part, entry) + return root + + +class InvalidSpec(Exception): + pass + + +def validate_from_spec( + spec_entries: dict[str, Entry], + yaml_spec_contents: str, + agent_root_dir: Path, + raise_on_error: bool = True, +) -> tuple[Error, ...]: + """ + Validate the YAML agent spec against the JSON agent spec. + + Note: the yaml should've been already pre-loaded with yaml.safe_load + and the parsing should be correct. At this point the validation will + be done with tree-sitter (which may not catch syntax errors). + + Params: + spec_entries: The spec entries as a dictionary (previously loaded from load_spec with the correct version). + yaml_spec_contents: The YAML agent spec contents as a string. + agent_root_dir: The root directory of the agent package (contains the agent-spec.yaml file). + + Raises: + InvalidSpec: If the YAML agent spec is invalid. + """ + + validator = Validator(spec_entries, agent_root_dir) + tree = tree_sitter_parse_yaml(yaml_spec_contents) + errors: tuple[Error, ...] = tuple(validator.validate(tree.root_node)) + if errors and raise_on_error: + msg = "\n".join(e.message for e in errors) + raise InvalidSpec(msg) + return errors + + +def tree_sitter_parse_yaml(yaml_spec_contents: str) -> "Tree": + import tree_sitter_yaml + from tree_sitter import Language, Parser + + language = tree_sitter_yaml.language() + parser = Parser(Language(language)) + contents = yaml_spec_contents.encode("utf8", errors="replace") + tree = parser.parse(contents, encoding="utf8") + return tree + + +class Validator: + PRINT_YAML_TREE = False + + def __init__(self, spec_entries: dict[str, Entry], agent_root_dir: Path) -> None: + """ + Params: + spec_entries: The spec entries as a dictionary. Keys are the paths to the keys in the json spec. + i.e.: "agent-package/agents/name". + agent_root_dir: The root directory of the agent package (contains the agent-spec.yaml file). + """ + self._spec_entries = spec_entries + self._stack: list[str] = [] + self._current_stack_as_str = "" + self._agent_root_dir = agent_root_dir + + # During the validation, the yaml parse will be used to create a tree with the actual + # yaml content to be validated (the first pass is doing a validation of the nodes that exist + # in the yaml, while also creating the tree with the actual contents and the second pass is + # doing the actual validation from the spec checking that the nodes exist and have the correct info). + self._yaml_info_loaded = _YamlTreeNode("root") + self._yaml_cursor_node: _YamlTreeNode = self._yaml_info_loaded + + def _validate_key_pair( + self, key_node: "Node", value_node: Optional["Node"] + ) -> Iterator[Error]: + entry = self._spec_entries.get(self._current_stack_as_str) + if not entry or not value_node: + parent_as_str = "" + curr = "" + + if self._stack: + parent, curr = self._stack[:-1], self._stack[-1] + if parent: + parent_as_str = "/".join(parent) + else: + parent_as_str = "root" + + if not entry: + yield Error( + message=f"Unexpected entry: {curr} (in {parent_as_str}).", + node=key_node, + ) + else: + yield Error( + message=f"Expected value for {self._current_stack_as_str}.", + node=key_node, + ) + + return + + # Ok, it's an expected key. + + def _is_scalar_node(self, node: Optional["Node"]) -> bool: + if node is None: + return False + if node.type == "flow_node": + children = node.children + if len(children) == 1: + c1 = children[0] + if c1.type == "plain_scalar": + if len(c1.children) == 1: + c2 = c1.children[0] + if c2.type == "string_scalar": + return True + return False + + def _validate_nodes_exist_and_build_yaml_info( + self, node: "Node" + ) -> Iterator[Error]: + # level = len(self._stack) + # print(" " * level, node.type, node.start_point.row) + added_to_stack = False + changed_yaml_cursor = False + default_visit_children = True + + if node.type in ("block_sequence_item", "flow_node"): + changed_yaml_cursor = True + use_key_name = f"list-item-{len(self._yaml_cursor_node.children)}" + self._yaml_cursor_node = self._yaml_cursor_node.obtain( + use_key_name, YamlNodeData(node, kind=_YamlNodeKind.list_item) + ) + + elif node.type in ("flow_sequence", "block_sequence"): + self._yaml_cursor_node.data.kind = _YamlNodeKind.list + + elif node.type in ( + "string_scalar", + "double_quote_scalar", + "single_quote_scalar", + ): + self._yaml_cursor_node.data.kind = _YamlNodeKind.string + + elif node.type == "boolean_scalar": + self._yaml_cursor_node.data.kind = _YamlNodeKind.bool + + elif node.type == "integer_scalar": + self._yaml_cursor_node.data.kind = _YamlNodeKind.int + + elif node.type == "float_scalar": + self._yaml_cursor_node.data.kind = _YamlNodeKind.float + + elif node.type == "block_mapping_pair": + key = node.child_by_field_name("key") + value = node.child_by_field_name("value") + if self._is_scalar_node(key): + assert key is not None, "Expected key from tree sitter." + assert key.text, "Expected key text from tree sitter." + key_name = key.text.decode("utf8") + self._stack.append(key_name) + self._current_stack_as_str = "/".join(self._stack) + + changed_yaml_cursor = True + self._yaml_cursor_node = self._yaml_cursor_node.obtain( + key_name, YamlNodeData(node, kind=_YamlNodeKind.unhandled) + ) + + yield from self._validate_key_pair(key, value) + added_to_stack = True + default_visit_children = False + + if value: + for child in value.children: + yield from self._validate_nodes_exist_and_build_yaml_info(child) + + if default_visit_children: + for child in node.children: + yield from self._validate_nodes_exist_and_build_yaml_info(child) + + if added_to_stack: + self._stack.pop() + self._current_stack_as_str = "/".join(self._stack) + + if changed_yaml_cursor: + parent = self._yaml_cursor_node.parent + assert parent is not None, "Expected parent to be loaded." + self._yaml_cursor_node = parent + + def _verify_yaml_matches_spec( + self, + spec_node: _SpecTreeNode, + yaml_node: Optional[_YamlTreeNode], + parent_node: Optional[_YamlTreeNode], + ) -> Iterator[Error]: + if spec_node.parent is None: + assert yaml_node is not None, "Expected yaml node to be provided for root." + for child in spec_node.children.values(): + yield from self._verify_yaml_matches_spec( + child, yaml_node.children.get(child.name), yaml_node + ) + return + + assert ( + spec_node.data is not None + ), f"Expected data to be loaded. Name: {spec_node.name}. Parent: {spec_node.parent}" + + if spec_node.data.required: + if yaml_node is None: + try: + data = parent_node.data if parent_node else None + except RootHasNoDataError: + data = None + yield Error( + message=f"Missing required entry: {spec_node.data.path}.", + node=data.node if data else None, + ) + + if yaml_node is None: + # Unable to proceed the validation for this node as the yaml info was not found. + return + else: + # print( + # f"--- {spec_node.data.path} {spec_node.data.expected_type.expected_type} ---" + # ) + # Ok, the node exists. Let's validate it. + if spec_node.data.deprecated: + yield Error( + message=f"Deprecated: {spec_node.data.path!r}. {spec_node.data.description}.", + node=yaml_node.data.node, + ) + + elif spec_node.data.expected_type.expected_type == _ExpectedTypeEnum.object: + for child in spec_node.children.values(): + yield from self._verify_yaml_matches_spec( + child, yaml_node.children.get(child.name), yaml_node + ) + elif spec_node.data.expected_type.expected_type == _ExpectedTypeEnum.list: + if yaml_node.data.kind != _YamlNodeKind.list: + yield Error( + message=f"Expected {spec_node.data.path} to be a list.", + node=yaml_node.data.node, + ) + else: + for list_item_node in yaml_node.children.values(): + for spec_child in spec_node.children.values(): + child_node = list_item_node.children.get(spec_child.name) + yield from self._verify_yaml_matches_spec( + spec_child, child_node, yaml_node + ) + elif spec_node.data.expected_type.expected_type == _ExpectedTypeEnum.string: + if yaml_node.data.kind != _YamlNodeKind.string: + yield Error( + message=f"Expected {spec_node.data.path} to be a string (found {yaml_node.data.kind.value}).", + node=yaml_node.data.node, + ) + elif spec_node.data.expected_type.expected_type == _ExpectedTypeEnum.int: + if yaml_node.data.kind != _YamlNodeKind.int: + yield Error( + message=f"Expected {spec_node.data.path} to be an int (found {yaml_node.data.kind.value}).", + node=yaml_node.data.node, + ) + elif spec_node.data.expected_type.expected_type == _ExpectedTypeEnum.float: + if yaml_node.data.kind not in (_YamlNodeKind.int, _YamlNodeKind.float): + yield Error( + message=f"Expected {spec_node.data.path} to be a float (found {yaml_node.data.kind.value}).", + node=yaml_node.data.node, + ) + elif spec_node.data.expected_type.expected_type == _ExpectedTypeEnum.bool: + if yaml_node.data.kind != _YamlNodeKind.bool: + yield Error( + message=f"Expected {spec_node.data.path} to be a bool (found {yaml_node.data.kind.value}).", + node=yaml_node.data.node, + ) + elif spec_node.data.expected_type.expected_type == _ExpectedTypeEnum.enum: + if yaml_node.data.kind != _YamlNodeKind.string: + yield Error( + message=f"Expected {spec_node.data.path} to be a string (found {yaml_node.data.kind.value}).", + node=yaml_node.data.node, + ) + value_node = yaml_node.data.node.child_by_field_name("value") + if value_node is None: + yield Error( + message=f"Error while handling: {spec_node.data.path} .", + node=yaml_node.data.node, + ) + else: + yaml_node_text = ( + value_node.text.decode("utf8") + if value_node.text is not None + else "" + ) + enum_values = spec_node.data.expected_type.enum_values or [ + "No enum values specified" + ] + if yaml_node_text not in enum_values: + yield Error( + message=f"Expected {spec_node.data.path} to be one of {enum_values} (found {yaml_node_text!r}).", + node=yaml_node.data.node, + ) + elif spec_node.data.expected_type.expected_type == _ExpectedTypeEnum.file: + if yaml_node.data.kind != _YamlNodeKind.string: + yield Error( + message=f"Expected {spec_node.data.path} to be a string (found {yaml_node.data.kind.value}).", + node=yaml_node.data.node, + ) + else: + value_text = self._get_value_text(yaml_node) + if value_text is None: + yield Error( + message=f"Error while handling: {spec_node.data.path} .", + node=yaml_node.data.node, + ) + else: + if "\\" in value_text: + yield Error( + message=f"{spec_node.data.path} may not contain `\\` characters.", + node=yaml_node.data.node, + ) + else: + relative_to = spec_node.data.expected_type.relative_to + assert relative_to, f"Expected relative_to to be set in {spec_node.data.path}" + + if not relative_to.startswith("."): + relative_to = "./" + relative_to + + p = self._agent_root_dir / relative_to / value_text + if not p.exists(): + if relative_to.startswith("./"): + relative_to = relative_to[2:] + if relative_to == "./": + relative_to = "dir('agent-spec.yaml')" + else: + relative_to = ( + f"dir('agent-spec.yaml')/{relative_to}" + ) + + yield Error( + message=f"Expected {spec_node.data.path} to map to a file named {value_text!r} relative to {relative_to!r}.", + node=yaml_node.data.node, + ) + + else: + raise Exception( + f"Unexpected expected type: {spec_node.data.expected_type.expected_type}" + ) + + def _get_value_text(self, node: _YamlTreeNode) -> Optional[str]: + value_node = node.data.node.child_by_field_name("value") + if value_node is None: + return None + else: + yaml_node_text = ( + value_node.text.decode("utf8") if value_node.text is not None else "" + ) + return yaml_node_text + + def _validate_yaml_from_spec(self) -> Iterator[Error]: + root = _convert_flattened_to_nested(self._spec_entries) + + # print("--- root ---") + # print(root.pretty()) + if self.PRINT_YAML_TREE: + print("--- yaml ---") + print(self._yaml_info_loaded.pretty()) + print("-----------") + + yield from self._verify_yaml_matches_spec(root, self._yaml_info_loaded, None) + + def validate(self, node: "Node") -> Iterator[Error]: + yield from self._validate_nodes_exist_and_build_yaml_info(node) + yield from self._validate_yaml_from_spec() diff --git a/sema4ai/src/sema4ai_code/agents/collect_agent_spec_diagnostics.py b/sema4ai/src/sema4ai_code/agents/collect_agent_spec_diagnostics.py index f8e13cf25..85b296d5a 100644 --- a/sema4ai/src/sema4ai_code/agents/collect_agent_spec_diagnostics.py +++ b/sema4ai/src/sema4ai_code/agents/collect_agent_spec_diagnostics.py @@ -169,10 +169,11 @@ def iter_issues(self) -> Iterator[DiagnosticsTypedDict]: ) is_v1 = version_value == "v1" + is_v2 = version_value == "v2" yield from validate( - is_v1, + is_v1 or is_v2, spec_version, - "Unexpected spec-version (only `v1` is currently supported).", + "Unexpected spec-version (only `v1` and `v2` are currently supported).", required=True, ) @@ -206,27 +207,77 @@ def iter_issues(self) -> Iterator[DiagnosticsTypedDict]: # isinstance to make type-checker happy (we validated that already). assert isinstance(agents_node.value, list) for agent in agents_node.value: - yield from validate_agent(agent, _Version(is_v1=is_v1)) + yield from validate_agent( + self.doc, agent, _Version(is_v1=is_v1, is_v2=is_v2) + ) @dataclass class _Version: is_v1: bool + is_v2: bool -def validate_agent(agent_node: _EntryNode, version: _Version): - yield from validate_sections( - agent_node, - { - "name": str, - "description": str, - "type": ("agent", "chat_plan_execute"), - "reasoningLevel": (0, 1, 2, 3), - }, - ) +def validate_agent( + doc: IDocument, agent_node: _EntryNode, version: _Version +) -> Iterator[DiagnosticsTypedDict]: + from typing import Sequence + + from sema4ai_code.agents.agent_spec import AGENT_SPEC_V2 + from sema4ai_code.agents.agent_spec_handler import Error, validate_from_spec + from sema4ai_code.vendored_deps.yaml_with_location import create_range_from_location + + if version.is_v1: + yield from validate_sections_v1( + agent_node, + { + "name": str, + "description": str, + "type": ("agent", "chat_plan_execute"), + "reasoningLevel": (0, 1, 2, 3), + }, + ) + elif version.is_v2: + error: Error + for error in validate_from_spec( + AGENT_SPEC_V2, + doc.source, + pathlib.Path(doc.path).parent, + raise_on_error=False, + ): + use_location: Sequence[int] + if not error.node: + use_location = (0, 0, 1, 0) + if agent_node.key.location: + use_location = agent_node.key.location + else: + start_line, start_col = ( + error.node.start_point.row, + error.node.start_point.column, + ) + end_line, end_col = ( + error.node.end_point.row, + error.node.end_point.column, + ) + use_location = start_line, start_col, end_line, end_col + + use_range = create_range_from_location(*use_location) + + diagnostic: DiagnosticsTypedDict + + diagnostic = { + "range": use_range, + "severity": DiagnosticSeverity.Error, + "source": "sema4ai", + "message": error.message, + } + yield diagnostic + + else: + raise AssertionError(f"Unexpected version: {version}") -def validate_sections( +def validate_sections_v1( node: _EntryNode, spec: dict[str, type[str] | tuple] ) -> Iterator[DiagnosticsTypedDict]: for k, v in spec.items(): diff --git a/sema4ai/src/sema4ai_code/agents/hover_agent_spec.py b/sema4ai/src/sema4ai_code/agents/hover_agent_spec.py new file mode 100644 index 000000000..bf7129c48 --- /dev/null +++ b/sema4ai/src/sema4ai_code/agents/hover_agent_spec.py @@ -0,0 +1,95 @@ +import typing +from typing import Optional + +from sema4ai_ls_core.lsp import HoverTypedDict +from sema4ai_ls_core.protocols import IDocument, IMonitor + +if typing.TYPE_CHECKING: + from tree_sitter import Node + + +def yield_all_nodes(node: "Node"): + for child in node.children: + yield child + yield from yield_all_nodes(child) + + +def _find_version(node: "Node") -> Optional[str]: + """ + In this function we must search for the version node and return its value. + """ + for node in yield_all_nodes(node): + if node.type == "block_mapping_pair": + key = node.child_by_field_name("key") + if key and key.text and key.text.decode("utf8") == "spec-version": + value = node.child_by_field_name("value") + if value and value.text: + return value.text.decode("utf8") + return None + + +def hover_on_agent_spec_yaml( + doc: IDocument, line: int, col: int, monitor: IMonitor +) -> Optional[HoverTypedDict]: + import tree_sitter_yaml + from tree_sitter import Language, Parser, Point + + language = tree_sitter_yaml.language() + parser = Parser(Language(language)) + contents = doc.source.encode("utf8", errors="replace") + tree = parser.parse(contents, encoding="utf8") + + pos = Point(line, col) + descendant = tree.root_node.named_descendant_for_point_range(pos, pos) + if not descendant: + return None + + version = _find_version(tree.root_node) + + def get_full_path(node) -> str: + path: list[str] = [] + current = node + while current.parent: + if current.type == "block_mapping_pair": + key = current.child_by_field_name("key") + if key: + path.insert(0, key.text.decode("utf-8")) + current = current.parent + return "/".join(path) + + def get_description(full_path) -> Optional[str]: + if version == "v2": + # Hover currently only available for v2 + from sema4ai_code.agents.agent_spec import AGENT_SPEC_V2 + + info = AGENT_SPEC_V2 + entry = info.get(full_path, None) + if not entry: + return None + return entry.description + else: + show_version = version if version else "" + return f"{full_path} (more info unavailable for version: {show_version})" + + full_path = get_full_path(descendant) + description = get_description(full_path) + if not description: + return None + + hover: HoverTypedDict = { + "contents": { + "kind": "plaintext", + "value": description, + }, + "range": { + "start": { + "line": descendant.start_point.row, + "character": descendant.start_point.column, + }, + "end": { + "line": descendant.end_point.row, + "character": descendant.end_point.column, + }, + }, + } + return hover diff --git a/sema4ai/src/sema4ai_code/agents/tree_sitter_ast_utils.py b/sema4ai/src/sema4ai_code/agents/tree_sitter_ast_utils.py new file mode 100644 index 000000000..d6930f0fe --- /dev/null +++ b/sema4ai/src/sema4ai_code/agents/tree_sitter_ast_utils.py @@ -0,0 +1,74 @@ +import logging +import sys +import typing +from typing import Generic, Iterator, Optional, TypeVar + +log = logging.getLogger(__name__) + +Y = TypeVar("Y", covariant=True) + +if typing.TYPE_CHECKING: + from tree_sitter import Node as TreeSitterNode + + +class NodeInfo(Generic[Y]): + stack: tuple["TreeSitterNode", ...] + node: "TreeSitterNode" + + __slots__ = ["stack", "node"] + + def __init__(self, stack, node): + self.stack = stack + self.node = node + + def __str__(self): + return f"NodeInfo({self.node.__class__.__name__})" + + __repr__ = __str__ + + +def print_ast(node, stream=None, depth=0): + if stream is None: + stream = sys.stderr + + stream.write( + f"{' ' * depth}Node type: \"{node.type}\", start: {node.start_point}, end: {node.end_point}\n" + ) + + for child_node in node.children: + print_ast(child_node, stream, depth + 1) + + +def _iter_nodes( + node, internal_stack: Optional[list["TreeSitterNode"]] = None, recursive=True +) -> Iterator[tuple[list["TreeSitterNode"], "TreeSitterNode"]]: + """ + :note: the yielded stack is actually always the same (mutable) list, so, + clients that want to return it somewhere else should create a copy. + """ + stack: list["TreeSitterNode"] + if internal_stack is None: + stack = [] + stack.append(node) + else: + stack = internal_stack + + children = node.children + for child_node in children: + yield stack, child_node + if recursive: + stack.append(child_node) + yield from _iter_nodes(child_node, stack, True) + stack.pop(-1) + + +def iter_all_nodes(node, recursive=True) -> Iterator[NodeInfo["TreeSitterNode"]]: + """ + Note: use this *very* sparingly as no caching will take place + (as all nodes need to be iterated). + + Use one of the filtered APIs whenever possible as those are cached + by the type. + """ + for stack, node in _iter_nodes(node, recursive=recursive): + yield NodeInfo(tuple(stack), node) diff --git a/sema4ai/src/sema4ai_code/robocorp_language_server.py b/sema4ai/src/sema4ai_code/robocorp_language_server.py index a66a7dcc1..1b66847b2 100644 --- a/sema4ai/src/sema4ai_code/robocorp_language_server.py +++ b/sema4ai/src/sema4ai_code/robocorp_language_server.py @@ -1166,6 +1166,8 @@ def m_text_document__hover(self, **kwargs) -> Any: i.e.: Provide the contents in markdown format to show the actual image from the locators.json. """ + from sema4ai_code.protocols import PackageYamlName + doc_uri = kwargs["textDocument"]["uri"] # Note: 0-based line: int = kwargs["position"]["line"] @@ -1184,6 +1186,10 @@ def m_text_document__hover(self, **kwargs) -> Any: return require_monitor( partial(self._hover_on_package_yaml, doc_uri, line, col) ) + if fspath.endswith(PackageYamlName.AGENT.value): + return require_monitor( + partial(self._hover_on_agent_spec_yaml, doc_uri, line, col) + ) return None def _hover_on_conda_yaml( @@ -1222,6 +1228,23 @@ def _hover_on_package_yaml( doc, line, col, self._pypi_cloud, self._conda_cloud ) + def _hover_on_agent_spec_yaml( + self, doc_uri, line, col, monitor: IMonitor + ) -> Optional[HoverTypedDict]: + from sema4ai_ls_core.protocols import IDocument + + from sema4ai_code.agents.hover_agent_spec import hover_on_agent_spec_yaml + + ws = self._workspace + if ws is None: + return None + + doc: Optional[IDocument] = ws.get_document(doc_uri, accept_from_file=True) + if doc is None: + return None + + return hover_on_agent_spec_yaml(doc, line, col, monitor) + def _hover_on_locators_json( self, doc_uri, line, col, monitor: IMonitor ) -> Optional[dict]: @@ -1605,8 +1628,15 @@ def _pack_agent_package( ) -> ActionResultDict: directory = params["directory"] + ws = self.workspace + if ws is None: + return { + "success": False, + "message": "Workspace already closed", + "result": None, + } return require_monitor( - partial(self._agent_cli.pack_agent_package, directory, self.workspace) + partial(self._agent_cli.pack_agent_package, directory, ws) ) def forward_msg(self, msg: dict) -> None: diff --git a/sema4ai/src/sema4ai_code/tools.py b/sema4ai/src/sema4ai_code/tools.py index d313cc324..d2b3416aa 100644 --- a/sema4ai/src/sema4ai_code/tools.py +++ b/sema4ai/src/sema4ai_code/tools.py @@ -1,5 +1,5 @@ -import sys import os +import sys from enum import Enum from typing import Optional @@ -54,6 +54,9 @@ def download_tool( sys_platform: The target platform of downloaded artifact. Defaults to None. """ + from pathlib import Path + + from sema4ai_ls_core.http import download_with_resume from sema4ai_ls_core.system_mutex import timed_acquire_mutex if sys_platform is None: @@ -68,7 +71,6 @@ def download_tool( if os.path.exists(location) and not force: return - import urllib.request from sema4ai_code import get_release_artifact_relative_path executable_name = TOOL_EXECUTABLE_NAME_MAP[tool] @@ -79,34 +81,7 @@ def download_tool( url = f"{TOOL_BASE_URL_MAP[tool]}/{tool_version}/{relative_path}" - log.info(f"Downloading tool: '{executable_name}' from: {url} to: {location}.") - - # Cloudflare seems to be blocking "User-Agent: Python-urllib/3.9". - # Use a different one as that must be sorted out. - response = urllib.request.urlopen( - urllib.request.Request(url, headers={"User-Agent": "Mozilla"}) - ) - - # Put it all in memory before writing (i.e. just write it if - # we know we downloaded everything). - data = response.read() - - try: - os.makedirs(os.path.dirname(location)) - except Exception: - pass # Error expected if the parent dir already exists. - - try: - with open(location, "wb") as stream: - stream.write(data) - os.chmod(location, 0x744) - except Exception: - log.exception( - "Error writing to: %s.\nParent dir exists: %s", - location, - os.path.dirname(location), - ) - raise + download_with_resume(url, Path(location), make_executable=True) def get_default_tool_location(tool: Tool, version: str = "") -> str: diff --git a/sema4ai/tests/sema4ai_code_tests/_resources/action_packages/action_package1/package.yaml b/sema4ai/tests/sema4ai_code_tests/_resources/action_packages/action_package1/package.yaml index bc1b990ca..3a0f4f7e8 100644 --- a/sema4ai/tests/sema4ai_code_tests/_resources/action_packages/action_package1/package.yaml +++ b/sema4ai/tests/sema4ai_code_tests/_resources/action_packages/action_package1/package.yaml @@ -1,5 +1,7 @@ name: test_action +version: 0.0.1 + # Required: A description of what's in the action package. description: used for testing only @@ -7,8 +9,8 @@ description: used for testing only documentation: https://github.com/... dependencies: - conda-forge: - - python=3.10.12 - - pip=23.2.1 - pypi: - - sema4ai-actions=0.9.1 \ No newline at end of file + conda-forge: + - python=3.10.12 + - pip=23.2.1 + pypi: + - sema4ai-actions=0.9.1 diff --git a/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis.py b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis.py index 10bce7efb..be3069eb7 100644 --- a/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis.py +++ b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis.py @@ -26,6 +26,14 @@ def bad_spec_version(agent_path): agent_spec.write_text(txt.replace("spec-version: v1", "spec-version: 22")) +def v2_bad_architecture(agent_path): + agent_spec = agent_path / "agent-spec.yaml" + txt = agent_spec.read_text() + agent_spec.write_text( + txt.replace("architecture: plan_execute", "architecture: bad-architecture") + ) + + def ok(agent_path): pass @@ -90,3 +98,34 @@ def test_agent_spec_analysis(datadir, scenario, data_regression) -> None: ) data_regression.check(found) + + +@pytest.mark.parametrize( + "scenario", + [ok, v2_bad_architecture], +) +def test_agent_spec_analysis_v2(datadir, scenario, data_regression) -> None: + from sema4ai_ls_core import uris + from sema4ai_ls_core.jsonrpc.monitor import Monitor + from sema4ai_ls_core.watchdog_wrapper import create_observer + from sema4ai_ls_core.workspace import Workspace + + from sema4ai_code.agents.collect_agent_spec_diagnostics import ( + collect_agent_spec_diagnostics, + ) + + agent1 = Path(datadir) / "agent2" + + scenario(agent1) + + workspace = Workspace( + uris.from_fs_path(str(agent1)), create_observer("dummy", None) + ) + monitor = Monitor() + found = list( + collect_agent_spec_diagnostics( + workspace, uris.from_fs_path(str(agent1 / "agent-spec.yaml")), monitor + ) + ) + + data_regression.check(found) diff --git a/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/.gitignore b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/.gitignore new file mode 100644 index 000000000..33a5d6f98 --- /dev/null +++ b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/.gitignore @@ -0,0 +1,13 @@ +output/ +venv/ +.venv/ +temp/ +.use +.vscode +.DS_Store +*.pyc +*.zip +.env +.project +.pydevproject +.env \ No newline at end of file diff --git a/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/LICENSE b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/LICENSE new file mode 100644 index 000000000..8168dcb78 --- /dev/null +++ b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 Robocorp Technologies, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/README.md b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/README.md new file mode 100644 index 000000000..b74121740 --- /dev/null +++ b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/README.md @@ -0,0 +1 @@ +Control Room Test Actions \ No newline at end of file diff --git a/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/actions.py b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/actions.py new file mode 100644 index 000000000..d22e90704 --- /dev/null +++ b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/actions.py @@ -0,0 +1,14 @@ +import datetime + +from sema4ai.actions import Secret, action + + +@action(is_consequential=False) +def get_time_now() -> str: + """ + Returns the current time. + + Returns: + The current time. + """ + return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") diff --git a/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/package.png b/sema4ai/tests/sema4ai_code_tests/agents/test_agent_spec_analysis/agent2/actions/MyActions/control-room-test/0.0.1/package.png new file mode 100644 index 0000000000000000000000000000000000000000..fec20a7c0c30d7afc1c123208bed37b39510057f GIT binary patch literal 130470 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

uq#F6V1PrP<7_K|fs!rE`N&-uqP@0mJy%Jp`Fy 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�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%0A(a^X+iHg-K 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%0Al*oJr=)a=fPj<;Qi`;cl(d9& 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 M6h1q None: + from io import StringIO + + import tree_sitter_yaml + from sema4ai_ls_core.workspace import Document + from tree_sitter import Language, Parser, Point + + from sema4ai_code.agents.tree_sitter_ast_utils import print_ast + + language = tree_sitter_yaml.language() + parser = Parser(Language(language)) + contents = """agent-package: + spec-version: v1 + agents: + - name: New Agent + description: Agent description + model: GPT 4 Turbo + type: agent + reasoningLevel: 0 + runbooks: + system: system.md + retrieval: retrieval.md + action-packages: [] + resources: [] +""" + tree = parser.parse( + contents.encode("utf8"), + encoding="utf8", + ) + cursor = tree.walk() + assert cursor.node == tree.root_node + + stream = StringIO() + print_ast(tree.root_node, stream=stream) + + for node_info in iter_all_nodes(tree.root_node): + text = "" + if node_info.node.type in ("string_scalar", "integer_scalar"): + text = f" - {node_info.node.text.decode('utf-8') if node_info.node.text else 'text:None'}" + + print( + str(".".join([n.type for n in node_info.stack])), + "-", + node_info.node.type, + text, + file=stream, + ) + + d = Document(uri="", source=contents) + for line, line_text in enumerate(d.iter_lines(keep_ends=False)): + last_found = None + for column in range(len(line_text) + 3): + pos = Point(line, column) + descendant = tree.root_node.named_descendant_for_point_range(pos, pos) + if descendant: + if last_found == descendant: + continue + last_found = descendant + if descendant.type in ("string_scalar", "integer_scalar"): + print( + "found at pos", + pos, + descendant.text.decode("utf-8") + if descendant.text + else "text:None", + file=stream, + ) diff --git a/sema4ai/tests/sema4ai_code_tests/test_vscode_integration.py b/sema4ai/tests/sema4ai_code_tests/test_vscode_integration.py index b78df0176..e359d37e3 100644 --- a/sema4ai/tests/sema4ai_code_tests/test_vscode_integration.py +++ b/sema4ai/tests/sema4ai_code_tests/test_vscode_integration.py @@ -9,6 +9,17 @@ from unittest import mock import pytest +from sema4ai_code_tests.fixtures import RCC_TEMPLATE_NAMES, RccPatch +from sema4ai_code_tests.protocols import IRobocorpLanguageServerClient +from sema4ai_ls_core.basic import wait_for_condition +from sema4ai_ls_core.callbacks import Callback +from sema4ai_ls_core.ep_resolve_interpreter import ( + DefaultInterpreterInfo, + IInterpreterInfo, +) +from sema4ai_ls_core.pluginmanager import PluginManager +from sema4ai_ls_core.unittest_tools.cases_fixture import CasesFixture + from sema4ai_code.inspector.common import ( STATE_CLOSED, STATE_NOT_PICKING, @@ -21,17 +32,6 @@ LocalPackageMetadataInfoDict, WorkspaceInfoDict, ) -from sema4ai_ls_core.basic import wait_for_condition -from sema4ai_ls_core.callbacks import Callback -from sema4ai_ls_core.ep_resolve_interpreter import ( - DefaultInterpreterInfo, - IInterpreterInfo, -) -from sema4ai_ls_core.pluginmanager import PluginManager -from sema4ai_ls_core.unittest_tools.cases_fixture import CasesFixture - -from sema4ai_code_tests.fixtures import RCC_TEMPLATE_NAMES, RccPatch -from sema4ai_code_tests.protocols import IRobocorpLanguageServerClient log = logging.getLogger(__name__) @@ -1071,11 +1071,10 @@ def test_hover_image_integration( ): import base64 + from sema4ai_code_tests.fixtures import IMAGE_IN_BASE64 from sema4ai_ls_core import uris from sema4ai_ls_core.workspace import Document - from sema4ai_code_tests.fixtures import IMAGE_IN_BASE64 - locators_json = tmpdir.join("locators.json") locators_json.write_text("", "utf-8") @@ -1345,13 +1344,14 @@ def test_profile_import( datadir, disable_rcc_diagnostics, ): + from sema4ai_ls_core import uris + from sema4ai_code.commands import ( SEMA4AI_GET_PY_PI_BASE_URLS_INTERNAL, SEMA4AI_PROFILE_IMPORT_INTERNAL, SEMA4AI_PROFILE_LIST_INTERNAL, SEMA4AI_PROFILE_SWITCH_INTERNAL, ) - from sema4ai_ls_core import uris result = language_server_initialized.execute_command( SEMA4AI_GET_PY_PI_BASE_URLS_INTERNAL, @@ -1459,28 +1459,69 @@ def test_lint_agent_spec( from sema4ai_ls_core import uris from sema4ai_ls_core.unittest_tools.fixtures import TIMEOUT - conda_yaml = tmpdir.join("agent-spec.yaml") - conda_yaml_text = """ + agent_spec_yaml = tmpdir.join("agent-spec.yaml") + agent_spec_yaml_text = """ bad yaml """ - conda_yaml.write_text( - conda_yaml_text, + agent_spec_yaml.write_text( + agent_spec_yaml_text, "utf-8", ) language_server = language_server_initialized - conda_yaml_uri = uris.from_fs_path(str(conda_yaml)) + agent_spec_yaml_uri = uris.from_fs_path(str(agent_spec_yaml)) message_matcher = language_server.obtain_pattern_message_matcher( {"method": "textDocument/publishDiagnostics"} ) assert message_matcher - language_server.open_doc(conda_yaml_uri, 1, conda_yaml_text) + language_server.open_doc(agent_spec_yaml_uri, 1, agent_spec_yaml_text) assert message_matcher.event.wait(TIMEOUT) diag = message_matcher.msg["params"]["diagnostics"] data_regression.check(sort_diagnostics(diag)) +def test_hover_agent_spec( + language_server_initialized: IRobocorpLanguageServerClient, + tmpdir, + data_regression, + disable_rcc_diagnostics, +): + from sema4ai_ls_core import uris + from sema4ai_ls_core.workspace import Document + + agent_spec_yaml = tmpdir.join("agent-spec.yaml") + agent_spec_yaml_text = """ +agent-package: + spec-version: v1 + agents: + - name: New Agent + description: Agent description + model: GPT 4 Turbo + type: agent + reasoningLevel: 1 + runbooks: + system: system.md + retrieval: retrieval.md + action-packages: [] + resources: [] + """ + agent_spec_yaml.write_text( + agent_spec_yaml_text, + "utf-8", + ) + + language_server = language_server_initialized + agent_spec_yaml_uri = uris.from_fs_path(str(agent_spec_yaml)) + language_server.open_doc(agent_spec_yaml_uri, 1, agent_spec_yaml_text) + + doc = Document("", agent_spec_yaml_text) + line, col = doc.get_last_line_col_with_contents("description: Agent description") + col -= 2 + ret = language_server.hover(agent_spec_yaml_uri, line, col) + data_regression.check(ret["result"]) + + def test_lint_action_package_integration_deps( language_server_initialized: IRobocorpLanguageServerClient, tmpdir, @@ -1629,11 +1670,10 @@ def test_web_inspector_integrated( This test should be a reference spanning all the APIs that are available for the inspector webview to use. """ - from sema4ai_ls_core import uris - from sema4ai_code_tests.robocode_language_server_client import ( RobocorpLanguageServerClient, ) + from sema4ai_ls_core import uris cases.copy_to("robots", ws_root_path) ls_client: RobocorpLanguageServerClient = language_server_initialized diff --git a/sema4ai/tests/sema4ai_code_tests/test_vscode_integration/test_hover_agent_spec.yml b/sema4ai/tests/sema4ai_code_tests/test_vscode_integration/test_hover_agent_spec.yml new file mode 100644 index 000000000..fc98a6976 --- /dev/null +++ b/sema4ai/tests/sema4ai_code_tests/test_vscode_integration/test_hover_agent_spec.yml @@ -0,0 +1,10 @@ +contents: + kind: plaintext + value: 'agent-package/agents/description (more info unavailable for version: v1)' +range: + end: + character: 34 + line: 5 + start: + character: 17 + line: 5 diff --git a/sema4ai/tests/sema4ai_code_tests/test_vscode_integration/test_package_metadata.yml b/sema4ai/tests/sema4ai_code_tests/test_vscode_integration/test_package_metadata.yml index 69594e263..bf11d2030 100644 --- a/sema4ai/tests/sema4ai_code_tests/test_vscode_integration/test_package_metadata.yml +++ b/sema4ai/tests/sema4ai_code_tests/test_vscode_integration/test_package_metadata.yml @@ -1,8 +1,9 @@ metadata: + action_package_version: 0.0.1 description: used for testing only + metadata_version: 2 name: test_action secrets: {} - version: 1 openapi.json: components: schemas: diff --git a/sema4ai/vscode-client/src/rcc.ts b/sema4ai/vscode-client/src/rcc.ts index 8f3233412..91d0a9839 100644 --- a/sema4ai/vscode-client/src/rcc.ts +++ b/sema4ai/vscode-client/src/rcc.ts @@ -154,9 +154,9 @@ async function downloadRcc( // Note: python tests scan this file and get these constants, so, if the format // changes the (failing) test also needs to change. -const BASENAME_PREBUILT_WIN_AMD64 = "81f44270388737d7_windows_amd64.zip"; -const BASENAME_PREBUILT_DARWIN = "3ab02517d909fcef_darwin_amd64.zip"; -const BASENAME_PREBUILT_LINUX_AMD64 = "4a8e86f83b9ea1de_linux_amd64.zip"; +const BASENAME_PREBUILT_WIN_AMD64 = "79602548c456110e_windows_amd64.zip"; +const BASENAME_PREBUILT_DARWIN = "cb09ee7e6f3942e0_darwin_amd64.zip"; +const BASENAME_PREBUILT_LINUX_AMD64 = "46acffbff7fcc90f_linux_amd64.zip"; function getBaseAsZipBasename() { let basename: string;