From 873f2ef9de9afdb32b4baa81b542b4f7f8951129 Mon Sep 17 00:00:00 2001 From: Tianqi Xu <40522713+dandansamax@users.noreply.github.com> Date: Sun, 25 Aug 2024 16:35:24 +0300 Subject: [PATCH] doc: setup CRAB documentation (#17) --- .github/workflows/documentation.yml | 29 ++ crab-benchmark-v0/README.md | 2 +- docs/_static/CRAB_logo1.png | Bin 0 -> 31055 bytes {assets => docs/_static}/benchmark_config.png | Bin {assets => docs/_static}/crab_overview.png | Bin docs/_static/favicon.png | Bin 0 -> 13138 bytes docs/conf.py | 17 +- docs/crab.benchmarks.rst | 24 -- .../crab_benchmark_v0}/assets/android_1.png | Bin .../crab_benchmark_v0}/assets/android_2.png | Bin .../environment_gcp_setup.md | 2 + .../environment_local_setup.md | 2 + docs/crab_benchmark_v0/get_started.md | 30 ++ .../build_your_own_benchmark.md | 2 + .../quickstart.md} | 2 +- docs/index.rst | 19 +- poetry.lock | 358 ++++++++++++------ pyproject.toml | 5 +- 18 files changed, 341 insertions(+), 151 deletions(-) create mode 100644 .github/workflows/documentation.yml create mode 100644 docs/_static/CRAB_logo1.png rename {assets => docs/_static}/benchmark_config.png (100%) rename {assets => docs/_static}/crab_overview.png (100%) create mode 100644 docs/_static/favicon.png rename {crab-benchmark-v0/docs => docs/crab_benchmark_v0}/assets/android_1.png (100%) rename {crab-benchmark-v0/docs => docs/crab_benchmark_v0}/assets/android_2.png (100%) rename {crab-benchmark-v0/docs => docs/crab_benchmark_v0}/environment_gcp_setup.md (98%) rename {crab-benchmark-v0/docs => docs/crab_benchmark_v0}/environment_local_setup.md (99%) create mode 100644 docs/crab_benchmark_v0/get_started.md rename docs/{ => get_started}/build_your_own_benchmark.md (99%) rename docs/{get_start_with_benchmark.md => get_started/quickstart.md} (98%) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 0000000..3e12d34 --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,29 @@ +name: Build and deploy CRAB documents +on: + push: + branches: [ "main" ] + workflow_dispatch: +permissions: + contents: write +jobs: + docs: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Python environment and install dependencies + uses: ./.github/actions/camel_install + with: + python-version: "3.10" + - name: Sphinx build + run: | + cd docs + poetry run make html + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main'}} + with: + publish_branch: gh-pages + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: docs/_build/html/ + force_orphan: true diff --git a/crab-benchmark-v0/README.md b/crab-benchmark-v0/README.md index 804d178..29c8db8 100644 --- a/crab-benchmark-v0/README.md +++ b/crab-benchmark-v0/README.md @@ -13,7 +13,7 @@ Our benchmark contains two important parts: **Environments** and **Tasks**. Since our Ubuntu environment is built upon KVM, setting it up locally requires you an experienced Linux user to deal with many small and miscellaneous issues. Therefore, we provide two environment setup methods: * [Local setup](./docs/environment_local_setup.md) provides you a step-by-step guideline to build environments on a Linux Machine with **at least one monitor and 32G memory**, but it doesn't cover details like how to install KVM on your machine because they are various on different Linux distros. -* For those who want a quicker setup, we also provide a setup through [Google Clould Platform](./docs/environment_gcp_setup.md). Specifically, we publish a disk image contains all required softwares and configurations on google cloud, you can use your own google account to create a cloud computer through this disk image and use [google remote desktop](https://remotedesktop.google.com/access/) to connect to it. This method doesn't have any hardware limitations and when you set it up you can run the experiment immediately. As a tradeoff, the cloud computer that meets the minimum hardware requirement costs around $0.4 per hour (depend on the machine zone). +* For those who want a quicker setup, we also provide a setup through [Google Clould Platform](./docs/environment_gcp_setup.md). Specifically, we publish a disk image contains all required software and configurations on google cloud, you can use your own google account to create a cloud computer through this disk image and use [google remote desktop](https://remotedesktop.google.com/access/) to connect to it. This method doesn't have any hardware limitations and when you set it up you can run the experiment immediately. As a tradeoff, the cloud computer that meets the minimum hardware requirement costs around $0.4 per hour (depend on the machine zone). We connect to the Android environment via ADB, so any Android device, from an emulator to a physical smartphone, will work. You should ensure ADB is installed on your system and can be directly called through the command line. In our experiment, we used the built-in emulator of [Android Studio](https://developer.android.com/studio) to create a Google Pixel 8 Pro virtual device with the release name \textit{R} and installed necessary extra Apps. diff --git a/docs/_static/CRAB_logo1.png b/docs/_static/CRAB_logo1.png new file mode 100644 index 0000000000000000000000000000000000000000..0bec383b004506b61f7f720830b2b878e4d22614 GIT binary patch literal 31055 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�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 OQ}L;qT)B*C;Qs^KcvTDl literal 0 HcmV?d00001 diff --git a/assets/benchmark_config.png b/docs/_static/benchmark_config.png similarity index 100% rename from assets/benchmark_config.png rename to docs/_static/benchmark_config.png diff --git a/assets/crab_overview.png b/docs/_static/crab_overview.png similarity index 100% rename from assets/crab_overview.png rename to docs/_static/crab_overview.png diff --git a/docs/_static/favicon.png b/docs/_static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f67f51ba82102b296e968714bed1590d7a8da8 GIT binary patch literal 13138 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 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py index 5e7baa3..b240c10 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,10 +29,11 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = 'Crab' +project = 'CRAB' copyright = '2024, CAMEL-AI.org' author = 'CAMEL-AI.org' -release = '0.1.0' +version = '0.1' +release = '0.1.2' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration @@ -40,7 +41,8 @@ extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.viewcode', - 'sphinx.ext.napoleon' + 'sphinx.ext.napoleon', + 'myst_parser', ] templates_path = ['_templates'] @@ -51,5 +53,12 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'sphinx_rtd_theme' +html_theme = 'sphinx_book_theme' +html_favicon = '_static/favicon.png' html_static_path = ['_static'] +html_logo = "_static/CRAB_logo1.png" +html_title = "CRAB Documentation" +html_theme_options = { + "repository_url": "https://github.com/camel-ai/crab", + "use_repository_button": True, +} diff --git a/docs/crab.benchmarks.rst b/docs/crab.benchmarks.rst index 31e04d7..ab5b72c 100644 --- a/docs/crab.benchmarks.rst +++ b/docs/crab.benchmarks.rst @@ -4,14 +4,6 @@ crab.benchmarks package Submodules ---------- -crab.benchmarks.android module ------------------------------- - -.. automodule:: crab.benchmarks.android - :members: - :undoc-members: - :show-inheritance: - crab.benchmarks.template module ------------------------------- @@ -20,22 +12,6 @@ crab.benchmarks.template module :undoc-members: :show-inheritance: -crab.benchmarks.ubuntu module ------------------------------ - -.. automodule:: crab.benchmarks.ubuntu - :members: - :undoc-members: - :show-inheritance: - -crab.benchmarks.ubuntu\_android module --------------------------------------- - -.. automodule:: crab.benchmarks.ubuntu_android - :members: - :undoc-members: - :show-inheritance: - Module contents --------------- diff --git a/crab-benchmark-v0/docs/assets/android_1.png b/docs/crab_benchmark_v0/assets/android_1.png similarity index 100% rename from crab-benchmark-v0/docs/assets/android_1.png rename to docs/crab_benchmark_v0/assets/android_1.png diff --git a/crab-benchmark-v0/docs/assets/android_2.png b/docs/crab_benchmark_v0/assets/android_2.png similarity index 100% rename from crab-benchmark-v0/docs/assets/android_2.png rename to docs/crab_benchmark_v0/assets/android_2.png diff --git a/crab-benchmark-v0/docs/environment_gcp_setup.md b/docs/crab_benchmark_v0/environment_gcp_setup.md similarity index 98% rename from crab-benchmark-v0/docs/environment_gcp_setup.md rename to docs/crab_benchmark_v0/environment_gcp_setup.md index fa5fd9c..a17ef83 100644 --- a/crab-benchmark-v0/docs/environment_gcp_setup.md +++ b/docs/crab_benchmark_v0/environment_gcp_setup.md @@ -1,3 +1,5 @@ +# Google cloud platform setup + ## Setup and Start the VM Instance The development image is hosted in the project `capable-vista-420022` with image name `crab-benchmark-v0-1`. diff --git a/crab-benchmark-v0/docs/environment_local_setup.md b/docs/crab_benchmark_v0/environment_local_setup.md similarity index 99% rename from crab-benchmark-v0/docs/environment_local_setup.md rename to docs/crab_benchmark_v0/environment_local_setup.md index f23d73f..1200a4c 100644 --- a/crab-benchmark-v0/docs/environment_local_setup.md +++ b/docs/crab_benchmark_v0/environment_local_setup.md @@ -1,3 +1,5 @@ +# Local setup + ## Install CRAB First you should install `poetry`, a modern python dependency management tool. diff --git a/docs/crab_benchmark_v0/get_started.md b/docs/crab_benchmark_v0/get_started.md new file mode 100644 index 0000000..f54f89f --- /dev/null +++ b/docs/crab_benchmark_v0/get_started.md @@ -0,0 +1,30 @@ +# Get started + +`crab-benchmark-v0` is a benchmark released with the crab framework to provide a standard usage. It includes two virtual machine environments: an Android smartphone and an Ubuntu desktop computer, with 100 tasks and 59 different evaluator functions in the dataset. It effectively evaluates the MLM-based agents' performance on operating real-world tasks across multiple platforms. + +## Concept + +Our benchmark contains two important parts: **Environments** and **Tasks**. + +#### Environment + +Since our Ubuntu environment is built upon KVM, setting it up locally requires you an experienced Linux user to deal with many small and miscellaneous issues. Therefore, we provide two environment setup methods: + +* [Local setup](./environment_local_setup.md) provides you a step-by-step guideline to build environments on a Linux Machine with **at least one monitor and 32G memory**, but it doesn't cover details like how to install KVM on your machine because they are various on different Linux distros. +* For those who want a quicker setup, we also provide a setup through [Google Clould Platform](./environment_gcp_setup.md). Specifically, we publish a disk image contains all required software and configurations on google cloud, you can use your own google account to create a cloud computer through this disk image and use [google remote desktop](https://remotedesktop.google.com/access/) to connect to it. This method doesn't have any hardware limitations and when you set it up you can run the experiment immediately. As a tradeoff, the cloud computer that meets the minimum hardware requirement costs around $0.4 per hour (depend on the machine zone). + +We connect to the Android environment via ADB, so any Android device, from an emulator to a physical smartphone, will work. You should ensure ADB is installed on your system and can be directly called through the command line. In our experiment, we used the built-in emulator of [Android Studio](https://developer.android.com/studio) to create a Google Pixel 8 Pro virtual device with the release name \textit{R} and installed necessary extra Apps. + +#### Task + +We manage our task dataset using a CRAB-recommended method. Sub-tasks are defined through Pydantic models written in Python code, and composed tasks are defined in JSON format, typically combining several sub-tasks. The sub-tasks are defined in [android_subtasks](https://github.com/camel-ai/crab/tree/main/crab-benchmark-v0/dataset/android_subtasks.py) and [ubuntu_subtasks](https://github.com/camel-ai/crab/tree/main/crab-benchmark-v0/dataset/ubuntu_subtasks.py). The JSON files storing composed tasks are categorized into [android](https://github.com/camel-ai/crab/tree/main/crab-benchmark-v0/dataset/android/), [ubuntu](https://github.com/camel-ai/crab/tree/main/crab-benchmark-v0/dataset/ubuntu/), and [cross-platform](https://github.com/camel-ai/crab/tree/main/crab-benchmark-v0/dataset/cross/). The tasks in android and ubuntu directories are single-environment task and those in cross directory are cross-environment tasks. Additionally, we create several tasks by hand instead of composing sub-tasks to provide semantically more meaningful tasks, which are found in [handmade tasks](https://github.com/camel-ai/crab/tree/main/crab-benchmark-v0/dataset/handmade_tasks.py). + +## Experiment + +After setting up the environment, you can start the experiment. A brief overview of the experiment is as follows: + +1. Open the Ubuntu environment virtual machine and the Android environment emulator. +2. Start the CRAB server in the Ubuntu environment and get its IP address and port. Let's say they are `192.168.122.72` and `8000`. +3. Choose a task. As an example, we take the task with ID `a3476778-e512-40ca-b1c0-d7aab0c7f18b` from [handmade_tasks](https://github.com/camel-ai/crab/tree/main/crab-benchmark-v0/dataset/handmade_tasks.py). The task is: "Open the 'Tasks' app on Android, check the first incomplete task, then perform the task according to its description." +4. Run [main.py](./main.py) with the command `poetry run python -m crab-benchmark-v0.main --model gpt4o --policy single --remote-url http://192.168.122.72:8000 --task-id a3476778-e512-40ca-b1c0-d7aab0c7f18b`. In this command, `--model gpt4o` and `--policy single` determine the agent system, `--remote-url` specifies the Ubuntu environment interface, and `--task-id` indicates the task to be performed. + diff --git a/docs/build_your_own_benchmark.md b/docs/get_started/build_your_own_benchmark.md similarity index 99% rename from docs/build_your_own_benchmark.md rename to docs/get_started/build_your_own_benchmark.md index b9410ad..5bae697 100644 --- a/docs/build_your_own_benchmark.md +++ b/docs/get_started/build_your_own_benchmark.md @@ -1,3 +1,5 @@ +# Build your own benchmark + ## Overview ![](../assets/benchmark_config.png) diff --git a/docs/get_start_with_benchmark.md b/docs/get_started/quickstart.md similarity index 98% rename from docs/get_start_with_benchmark.md rename to docs/get_started/quickstart.md index ffa346f..3d30bf9 100644 --- a/docs/get_start_with_benchmark.md +++ b/docs/get_started/quickstart.md @@ -1,4 +1,4 @@ -# Getting Started with the Benchmark Class +# Quickstart The `Benchmark` class is a comprehensive framework for evaluating language model agents across various tasks and environments. It provides a flexible structure to manage multiple environments and tasks, offering single and multi-environment execution modes. diff --git a/docs/index.rst b/docs/index.rst index ee62de4..5e16a23 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,9 +6,26 @@ Welcome to Crab's documentation! ================================ +.. toctree:: + :maxdepth: 1 + :caption: Get Started with CRAB: + :name: get_started + + get_started/quickstart.md + get_started/build_your_own_benchmark.md + +.. toctree:: + :maxdepth: 1 + :caption: CRAB Benchmark-v0: + :name: crab_benchmark_v0 + + crab_benchmark_v0/get_started.md + crab_benchmark_v0/environment_gcp_setup.md + crab_benchmark_v0/environment_local_setup.md + .. toctree:: :maxdepth: 2 - :caption: Contents: + :caption: API Reference: modules diff --git a/poetry.lock b/poetry.lock index c9694fe..6f13c63 100644 --- a/poetry.lock +++ b/poetry.lock @@ -31,6 +31,24 @@ test-prod = ["parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "py test-trackers = ["comet-ml", "dvclive", "tensorboard", "wandb"] testing = ["bitsandbytes", "datasets", "diffusers", "evaluate", "parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +[[package]] +name = "accessible-pygments" +version = "0.0.5" +description = "A collection of accessible pygments styles" +optional = false +python-versions = ">=3.9" +files = [ + {file = "accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7"}, + {file = "accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872"}, +] + +[package.dependencies] +pygments = ">=1.5" + +[package.extras] +dev = ["pillow", "pkginfo (>=1.10)", "playwright", "pre-commit", "setuptools", "twine (>=5.0)"] +tests = ["hypothesis", "pytest"] + [[package]] name = "addict" version = "2.4.0" @@ -44,19 +62,18 @@ files = [ [[package]] name = "agentops" -version = "0.3.10" -description = "Observability and DevTool Platform for AI Agents" +version = "0.3.9" +description = "Python SDK for developing AI agent evals and observability" optional = true python-versions = ">=3.7" files = [ - {file = "agentops-0.3.10-py3-none-any.whl", hash = "sha256:b304d366691281e08c1f02307aabdd551ae4f68b0de82bbbb4cf6f651af2dd16"}, - {file = "agentops-0.3.10.tar.gz", hash = "sha256:40f895019f29bc5a6c023110cbec32870e5edb3e3926f8100974db8d3e299e2a"}, + {file = "agentops-0.3.9-py3-none-any.whl", hash = "sha256:582c9ddb30a9bb951b4d3ee2fd0428ba77d4a4367950b9cc6043f45b10bf12d8"}, + {file = "agentops-0.3.9.tar.gz", hash = "sha256:7c999edbc64196924acdb06da09ec664a09d9fec8e73ba4e0f89e5f3dafc79e5"}, ] [package.dependencies] packaging = "23.2" psutil = "5.9.8" -PyYAML = "6.0.1" requests = "2.31.0" termcolor = "2.4.0" @@ -1359,13 +1376,13 @@ files = [ [[package]] name = "docutils" -version = "0.20.1" +version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] [[package]] @@ -3466,6 +3483,30 @@ files = [ docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "2.1.5" @@ -3631,6 +3672,36 @@ files = [ [package.dependencies] traitlets = "*" +[[package]] +name = "mdit-py-plugins" +version = "0.4.1" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, + {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "milvus-lite" version = "2.4.9" @@ -3640,6 +3711,7 @@ python-versions = ">=3.7" files = [ {file = "milvus_lite-2.4.9-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:d3e617b3d68c09ad656d54bc3d8cc4ef6ef56c54015e1563d4fe4bcec6b7c90a"}, {file = "milvus_lite-2.4.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6e7029282d6829b277ebb92f64e2370be72b938e34770e1eb649346bda5d1d7f"}, + {file = "milvus_lite-2.4.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9b8e991e4e433596f6a399a165c1a506f823ec9133332e03d7f8a114bff4550d"}, {file = "milvus_lite-2.4.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:7f53e674602101cfbcf0a4a59d19eaa139dfd5580639f3040ad73d901f24fc0b"}, ] @@ -3863,38 +3935,38 @@ dill = ">=0.3.8" [[package]] name = "mypy" -version = "1.11.1" +version = "1.11.2" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a32fc80b63de4b5b3e65f4be82b4cfa362a46702672aa6a0f443b4689af7008c"}, - {file = "mypy-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c1952f5ea8a5a959b05ed5f16452fddadbaae48b5d39235ab4c3fc444d5fd411"}, - {file = "mypy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1e30dc3bfa4e157e53c1d17a0dad20f89dc433393e7702b813c10e200843b03"}, - {file = "mypy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c63350af88f43a66d3dfeeeb8d77af34a4f07d760b9eb3a8697f0386c7590b4"}, - {file = "mypy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:a831671bad47186603872a3abc19634f3011d7f83b083762c942442d51c58d58"}, - {file = "mypy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7b6343d338390bb946d449677726edf60102a1c96079b4f002dedff375953fc5"}, - {file = "mypy-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4fe9f4e5e521b458d8feb52547f4bade7ef8c93238dfb5bbc790d9ff2d770ca"}, - {file = "mypy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:886c9dbecc87b9516eff294541bf7f3655722bf22bb898ee06985cd7269898de"}, - {file = "mypy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca4a60e1dd9fd0193ae0067eaeeb962f2d79e0d9f0f66223a0682f26ffcc809"}, - {file = "mypy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:0bd53faf56de9643336aeea1c925012837432b5faf1701ccca7fde70166ccf72"}, - {file = "mypy-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f39918a50f74dc5969807dcfaecafa804fa7f90c9d60506835036cc1bc891dc8"}, - {file = "mypy-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bc71d1fb27a428139dd78621953effe0d208aed9857cb08d002280b0422003a"}, - {file = "mypy-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b868d3bcff720dd7217c383474008ddabaf048fad8d78ed948bb4b624870a417"}, - {file = "mypy-1.11.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a707ec1527ffcdd1c784d0924bf5cb15cd7f22683b919668a04d2b9c34549d2e"}, - {file = "mypy-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:64f4a90e3ea07f590c5bcf9029035cf0efeae5ba8be511a8caada1a4893f5525"}, - {file = "mypy-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:749fd3213916f1751fff995fccf20c6195cae941dc968f3aaadf9bb4e430e5a2"}, - {file = "mypy-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b639dce63a0b19085213ec5fdd8cffd1d81988f47a2dec7100e93564f3e8fb3b"}, - {file = "mypy-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c956b49c5d865394d62941b109728c5c596a415e9c5b2be663dd26a1ff07bc0"}, - {file = "mypy-1.11.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45df906e8b6804ef4b666af29a87ad9f5921aad091c79cc38e12198e220beabd"}, - {file = "mypy-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:d44be7551689d9d47b7abc27c71257adfdb53f03880841a5db15ddb22dc63edb"}, - {file = "mypy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2684d3f693073ab89d76da8e3921883019ea8a3ec20fa5d8ecca6a2db4c54bbe"}, - {file = "mypy-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79c07eb282cb457473add5052b63925e5cc97dfab9812ee65a7c7ab5e3cb551c"}, - {file = "mypy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11965c2f571ded6239977b14deebd3f4c3abd9a92398712d6da3a772974fad69"}, - {file = "mypy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a2b43895a0f8154df6519706d9bca8280cda52d3d9d1514b2d9c3e26792a0b74"}, - {file = "mypy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:1a81cf05975fd61aec5ae16501a091cfb9f605dc3e3c878c0da32f250b74760b"}, - {file = "mypy-1.11.1-py3-none-any.whl", hash = "sha256:0624bdb940255d2dd24e829d99a13cfeb72e4e9031f9492148f410ed30bcab54"}, - {file = "mypy-1.11.1.tar.gz", hash = "sha256:f404a0b069709f18bbdb702eb3dcfe51910602995de00bd39cea3050b5772d08"}, + {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] @@ -3919,6 +3991,32 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "myst-parser" +version = "4.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +optional = false +python-versions = ">=3.10" +files = [ + {file = "myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d"}, + {file = "myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531"}, +] + +[package.dependencies] +docutils = ">=0.19,<0.22" +jinja2 = "*" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4.1,<1.0" +pyyaml = "*" +sphinx = ">=7,<9" + +[package.extras] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"] + [[package]] name = "neo4j" version = "5.23.1" @@ -4227,6 +4325,7 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_aarch64.whl", hash = "sha256:84fb38465a5bc7c70cbc320cfd0963eb302ee25a5e939e9f512bbba55b6072fb"}, {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_x86_64.whl", hash = "sha256:562ab97ea2c23164823b2a89cb328d01d45cb99634b8c65fe7cd60d14562bd79"}, {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-win_amd64.whl", hash = "sha256:ed3c43a17f37b0c922a919203d2d36cbef24d41cc3e6b625182f8b58203644f6"}, ] @@ -5469,6 +5568,34 @@ azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0 toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] +[[package]] +name = "pydata-sphinx-theme" +version = "0.15.4" +description = "Bootstrap-based Sphinx theme from the PyData community" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pydata_sphinx_theme-0.15.4-py3-none-any.whl", hash = "sha256:2136ad0e9500d0949f96167e63f3e298620040aea8f9c74621959eda5d4cf8e6"}, + {file = "pydata_sphinx_theme-0.15.4.tar.gz", hash = "sha256:7762ec0ac59df3acecf49fd2f889e1b4565dbce8b88b2e29ee06fdd90645a06d"}, +] + +[package.dependencies] +accessible-pygments = "*" +Babel = "*" +beautifulsoup4 = "*" +docutils = "!=0.17.0" +packaging = "*" +pygments = ">=2.7" +sphinx = ">=5" +typing-extensions = "*" + +[package.extras] +a11y = ["pytest-playwright"] +dev = ["pandoc", "pre-commit", "pydata-sphinx-theme[doc,test]", "pyyaml", "sphinx-theme-builder[cli]", "tox"] +doc = ["ablog (>=0.11.8)", "colorama", "graphviz", "ipykernel", "ipyleaflet", "ipywidgets", "jupyter_sphinx", "jupyterlite-sphinx", "linkify-it-py", "matplotlib", "myst-parser", "nbsphinx", "numpy", "numpydoc", "pandas", "plotly", "rich", "sphinx-autoapi (>=3.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-favicon (>=1.0.1)", "sphinx-sitemap", "sphinx-togglebutton", "sphinxcontrib-youtube (>=1.4.1)", "sphinxext-rediraffe", "xarray"] +i18n = ["Babel", "jinja2"] +test = ["pytest", "pytest-cov", "pytest-regressions", "sphinx[test]"] + [[package]] name = "pydub" version = "0.25.1" @@ -5624,30 +5751,35 @@ python-versions = ">=3.8" files = [ {file = "PyMuPDF-1.24.9-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:da5d9699472bfd1de52975de3eb7efaf5190ac5801b9fc6bcccde603afbe6937"}, {file = "PyMuPDF-1.24.9-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:3d1133983c7ac388a35bbab8dfc4c26a874c05edc47d2038961add2efa4639a8"}, + {file = "PyMuPDF-1.24.9-cp310-none-manylinux2014_aarch64.whl", hash = "sha256:94f2796a3dd1f0735d0717eb020d7c3c7313eaae8c9c1040022408c880931616"}, {file = "PyMuPDF-1.24.9-cp310-none-manylinux2014_x86_64.whl", hash = "sha256:5199567353d1543e6c21c626148f8ac9ebb14ce553f2c434fcb9b00e195e1e52"}, {file = "PyMuPDF-1.24.9-cp310-none-musllinux_1_2_x86_64.whl", hash = "sha256:c97f0b2fb201c9d9bc0f15a901641174e8896a9ae9fbe0d5bb1a6f2315cc3ced"}, {file = "PyMuPDF-1.24.9-cp310-none-win32.whl", hash = "sha256:00499b864a56a2168254dce3d0f12048b96e9b3bdd43fecace18a1572342c8d4"}, {file = "PyMuPDF-1.24.9-cp310-none-win_amd64.whl", hash = "sha256:f074e501e883428e7d5480f732ea6a6bd17146f10ebefb9b84957fd32b79f0d4"}, {file = "PyMuPDF-1.24.9-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:caf43ce86790f95049a5849f2802b5c412b865cd368ece89a39a54fc84aa45cd"}, {file = "PyMuPDF-1.24.9-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:13d06161176e1d4e337f5b5e053b628e4531bab5effb269a83dc38d4deb8e659"}, + {file = "PyMuPDF-1.24.9-cp311-none-manylinux2014_aarch64.whl", hash = "sha256:7ab228dfb80002eb8612ffe71b50052d8b20d9364a3535e2fe43a0901ce41d40"}, {file = "PyMuPDF-1.24.9-cp311-none-manylinux2014_x86_64.whl", hash = "sha256:042ad205c7ef615d9fbab7078f6fa8d14f020ed2dfe3a79d803b6171318565b5"}, {file = "PyMuPDF-1.24.9-cp311-none-musllinux_1_2_x86_64.whl", hash = "sha256:b4495833bb0300fc885491928f2cbdf96afb569205dcc256bb4c43e3d1fde7cb"}, {file = "PyMuPDF-1.24.9-cp311-none-win32.whl", hash = "sha256:e53370f3679a7b013c2abb801bb566882dab1fb59646d4b0a717ee0d350c5ab1"}, {file = "PyMuPDF-1.24.9-cp311-none-win_amd64.whl", hash = "sha256:454932e9c7b9cd3057ee83dfe805f551a1382b9e216e87a32eb44c6d6843f966"}, {file = "PyMuPDF-1.24.9-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:93cc4908259f133c9dc88f5e77329c4b2dbc03fca83126b1efffedb67ade0fb9"}, {file = "PyMuPDF-1.24.9-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:84e1516d4b3e40711b9a6dbaedd30e0a89d6a054ca408a56114ceb5a1461f0d1"}, + {file = "PyMuPDF-1.24.9-cp312-none-manylinux2014_aarch64.whl", hash = "sha256:d7cdddce8d214e65ed483a8a403da49984815e543c3ce4b539306570c4cfc453"}, {file = "PyMuPDF-1.24.9-cp312-none-manylinux2014_x86_64.whl", hash = "sha256:de8b330900c194efeedeb97adab25520479d101fc9aed50d7323dde08698ae24"}, {file = "PyMuPDF-1.24.9-cp312-none-musllinux_1_2_x86_64.whl", hash = "sha256:41c92d69993e7614730205b75d7999b21ca0f929d31b2bb86a4b58d3b1b0451a"}, {file = "PyMuPDF-1.24.9-cp312-none-win32.whl", hash = "sha256:a04af6f3f5f35cb62bc7b3c2e9cfff510aa56c39c53355ecfff40b7cb9773fef"}, {file = "PyMuPDF-1.24.9-cp312-none-win_amd64.whl", hash = "sha256:e2828a79415ae3dd90c629697ace51db7f1e81f426fc2fc034c2151dbe58be6e"}, {file = "PyMuPDF-1.24.9-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:241913d0c76aacb05acdd8a0e82b1105883ffe6ef3bb4d9742b41d3c5e84d2db"}, {file = "PyMuPDF-1.24.9-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:ff70e26625b6cdd036e2c63b5d6c1897949c0e8b205cd756276f27baadaad340"}, + {file = "PyMuPDF-1.24.9-cp38-none-manylinux2014_aarch64.whl", hash = "sha256:8e29bc817afad511072371f24624c7c3b7485a9e656b6a65dc58fecdf5043b08"}, {file = "PyMuPDF-1.24.9-cp38-none-manylinux2014_x86_64.whl", hash = "sha256:d17ec6920f91c43b6e777a017f3aaf44b205a3216771db9e8aa46e78a703f8f6"}, {file = "PyMuPDF-1.24.9-cp38-none-musllinux_1_2_x86_64.whl", hash = "sha256:5cec9d17fdcbd83fa2c90190c22f652a0a51275cf75a29068eea025fff076829"}, {file = "PyMuPDF-1.24.9-cp38-none-win32.whl", hash = "sha256:4f7b19f5c0026db49b7be17901728ed15761c5aa2031f04b01f9eb2e54f1b50e"}, {file = "PyMuPDF-1.24.9-cp38-none-win_amd64.whl", hash = "sha256:e4c867f1cde68ff0e9c7889ea27c4c2c67df80e776f82619888bb69d1e1b27cf"}, {file = "PyMuPDF-1.24.9-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:b4f85c24050e3778be6c7c1f4d4965fd4385281264798df7b4301b78895053fd"}, {file = "PyMuPDF-1.24.9-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:4e807010ef4e63cfb70dd88fe1fcd1d7e2b4e62ffa2b1dc53b35bc18bf939d8e"}, + {file = "PyMuPDF-1.24.9-cp39-none-manylinux2014_aarch64.whl", hash = "sha256:5dac888cc16981e385c886c26de6aabf914059215e028d14cd67767ff0c1288c"}, {file = "PyMuPDF-1.24.9-cp39-none-manylinux2014_x86_64.whl", hash = "sha256:de55817c02e06ff75233ce2487cc5ebcbf585acd694bb69500825ee37789ac79"}, {file = "PyMuPDF-1.24.9-cp39-none-musllinux_1_2_x86_64.whl", hash = "sha256:49cb22196f11c2327f6345554db48cfb2e31ed4f073ca6a872f21ddc4b0619c1"}, {file = "PyMuPDF-1.24.9-cp39-none-win32.whl", hash = "sha256:46b1f84816c666e1c82f4249c1e815e92c462633255d72da20751eaad125d0f0"}, @@ -5667,6 +5799,7 @@ python-versions = ">=3.8" files = [ {file = "PyMuPDFb-1.24.9-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:3c9e694b1fb1bde37a8d3c953fbd0916e7dee8a4650142547d4f832105b17689"}, {file = "PyMuPDFb-1.24.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3fd74ee7969712ab457495465da0a61aab44d8cf9b71b9ef51910a8c6a90ad57"}, + {file = "PyMuPDFb-1.24.9-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb5b38f588963a239a8c0bca99d3d912f0c04674e3c6e7199e44cebd22840061"}, {file = "PyMuPDFb-1.24.9-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:198f6b3713b6f980fa96c1099be0d5459c7d43c593299948f0ba528577e6bf46"}, {file = "PyMuPDFb-1.24.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ae044ebc8299f5a3ba822a6dfe97285dffd6c66cba194bc39180aa189a2755c9"}, {file = "PyMuPDFb-1.24.9-py3-none-win32.whl", hash = "sha256:20ea17fd5799dcf7813ec099c0ce303f763e6e4ba8d0f54d5f84e4df90c3a340"}, @@ -5790,13 +5923,13 @@ files = [ [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.1.3" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = true python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.1.3-py3-none-any.whl", hash = "sha256:1e80fdf93e6c1aeaf4702523f1d48f66d52fa6459096a8f812591157270a5896"}, + {file = "pyparsing-3.1.3.tar.gz", hash = "sha256:5d549d2a1b5e1c3e952bb55ea247bfb5ad427ea307566a350db2b3c34d4ce181"}, ] [package.extras] @@ -6241,62 +6374,64 @@ 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" +python-versions = ">=3.8" 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-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {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-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {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-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {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-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {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]] @@ -7594,23 +7729,24 @@ lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pyte test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] -name = "sphinx-rtd-theme" -version = "2.0.0" -description = "Read the Docs theme for Sphinx" +name = "sphinx-book-theme" +version = "1.1.3" +description = "A clean book theme for scientific explanations and documentation with Sphinx" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"}, - {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"}, + {file = "sphinx_book_theme-1.1.3-py3-none-any.whl", hash = "sha256:a554a9a7ac3881979a87a2b10f633aa2a5706e72218a10f71be38b3c9e831ae9"}, + {file = "sphinx_book_theme-1.1.3.tar.gz", hash = "sha256:1f25483b1846cb3d353a6bc61b3b45b031f4acf845665d7da90e01ae0aef5b4d"}, ] [package.dependencies] -docutils = "<0.21" -sphinx = ">=5,<8" -sphinxcontrib-jquery = ">=4,<5" +pydata-sphinx-theme = ">=0.15.2" +sphinx = ">=5" [package.extras] -dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] +code-style = ["pre-commit"] +doc = ["ablog", "folium", "ipywidgets", "matplotlib", "myst-nb", "nbclient", "numpy", "numpydoc", "pandas", "plotly", "sphinx-copybutton", "sphinx-design", "sphinx-examples", "sphinx-tabs", "sphinx-thebe", "sphinx-togglebutton", "sphinxcontrib-bibtex", "sphinxcontrib-youtube", "sphinxext-opengraph"] +test = ["beautifulsoup4", "coverage", "defusedxml", "myst-nb", "pytest", "pytest-cov", "pytest-regressions", "sphinx_thebe"] [[package]] name = "sphinxcontrib-applehelp" @@ -7660,20 +7796,6 @@ lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] -[[package]] -name = "sphinxcontrib-jquery" -version = "4.1" -description = "Extension to include jQuery on newer Sphinx releases" -optional = false -python-versions = ">=2.7" -files = [ - {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, - {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, -] - -[package.dependencies] -Sphinx = ">=1.8" - [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" @@ -9382,4 +9504,4 @@ server = ["fastapi", "pydantic-settings", "uvicorn"] [metadata] lock-version = "2.0" python-versions = "^3.10, <3.12" -content-hash = "bfd607b8eeea68b26e4cffdb8c200b640019c649b3b17dcf269548bd11e8130c" +content-hash = "17ecf6ec06cc71857ef2e3dae05732335ecc3c68d125050f3ac2ab9c509e7a78" diff --git a/pyproject.toml b/pyproject.toml index a4c595a..def69b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -111,9 +111,10 @@ pytest = "^8.0.0" ruff = "^0.1.14" ipykernel = "^6.29.3" pandas = "^2.2.2" -sphinx = "^7.3.7" +sphinx = "^7" +myst-parser = "^4" +sphinx-book-theme = "*" pre-commit = "^3.7.0" -sphinx-rtd-theme = "^2.0.0" certifi = "^2024.2.2" [tool.ruff]