From ec587bb32cd4c7e4d220f8984e94e824cc0d16ce Mon Sep 17 00:00:00 2001 From: Felix Schaumann <89205956+felix-datatonic@users.noreply.github.com> Date: Tue, 16 Jan 2024 10:58:52 +0100 Subject: [PATCH] feat: add hackathon notebooks (#1) * Change resource suffix for releases * Add hackathon instructions * Fix links in README.md * Minor changes * fix: code in health check notebook that doesn't run correctly --------- Co-authored-by: Lily Co-authored-by: efbbrown-dt <97613357+efbbrown-dt@users.noreply.github.com> --- README.md | 188 +--- cloudbuild/release.yaml | 2 +- docs/Production.md | 4 +- docs/README.md | 169 ++++ hackathon/01_health_check.ipynb | 245 +++++ hackathon/02_run_pipelines.ipynb | 222 ++++ hackathon/03_promote_model.ipynb | 221 ++++ hackathon/04_monitoring_challenge.ipynb | 116 +++ hackathon/05_realtime_challenge.ipynb | 202 ++++ hackathon/images/create_release.png | Bin 0 -> 74098 bytes hackathon/images/scheduler_1.png | Bin 0 -> 90615 bytes hackathon/images/scheduler_2.png | Bin 0 -> 49852 bytes pipelines/poetry.lock | 1231 ++++++++++++++++++++++- pipelines/pyproject.toml | 1 + pipelines/src/pipelines/prediction.py | 2 +- pipelines/src/pipelines/training.py | 2 +- 16 files changed, 2438 insertions(+), 167 deletions(-) create mode 100644 docs/README.md create mode 100644 hackathon/01_health_check.ipynb create mode 100644 hackathon/02_run_pipelines.ipynb create mode 100644 hackathon/03_promote_model.ipynb create mode 100644 hackathon/04_monitoring_challenge.ipynb create mode 100644 hackathon/05_realtime_challenge.ipynb create mode 100644 hackathon/images/create_release.png create mode 100644 hackathon/images/scheduler_1.png create mode 100644 hackathon/images/scheduler_2.png diff --git a/README.md b/README.md index 9a7fe50..a247b6b 100644 --- a/README.md +++ b/README.md @@ -1,171 +1,37 @@ - +As a hackathon attendee, simply follow this notebook series in your Vertex AI Workbench instance: -# Vertex Pipelines End-to-End Samples +1. **[Health check](./hackathon/01_health_check.ipynb) - start here** +1. [Run pipelines](./hackathon/02_run_pipelines.ipynb) +1. [Promote model](./hackathon/03_promote_model.ipynb) +1. [Challenge: Model monitoring](./hackathon/04_monitoring_challenge.ipynb) +1. [Challenge: Real-time predictions](./hackathon/05_realtime_challenge.ipynb) -_AKA "Vertex AI Turbo Templates"_ +**❗Note:** This workshop has been designed to be run in Vertex AI Workbench. +Support for running the workshop locally is provided, but we recommend Vertex AI Workbench for the best experience. + +## For instructors ![Shell](https://github.com/teamdatatonic/vertex-pipelines-end-to-end-samples/wiki/images/shell.gif) ## Introduction -This repository provides a reference implementation of [Vertex Pipelines](https://cloud.google.com/vertex-ai/docs/pipelines/) for creating a production-ready MLOps solution on Google Cloud. -You can take this repository as a starting point you own ML use cases. -The implementation includes: - -* **Infrastructure-as-Code** using Terraform for a typical dev/test/prod setup of Vertex AI and other relevant services -* **ML training and prediction pipelines** using the Kubeflow Pipelines -* **Reusable Kubeflow components** that can be used in common ML pipelines -* **CI/CD** using Google Cloud Build for linting, testing, and deploying ML pipelines -* **Developer scripts** (Makefile, Python scripts etc.) - -**Get started today by following [this step-by-step notebook tutorial](./docs/notebooks)! 🚀** -In this three-part notebook series you'll deploy a Google Cloud project and run production-ready ML pipelines using Vertex AI without writing a single line of code. - -## Cloud Architecture - -The diagram below shows the cloud architecture for this repository. - -![Cloud Architecture diagram](./docs/images/architecture.png) - -There are four different Google Cloud projects in use - -* `dev` - a shared sandbox environment for use during development -* `test` - environment for testing new changes before they are promoted to production. This environment should be treated as much as possible like a production environment. -* `prod` - production environment -* `admin` - separate Google Cloud project for setting up CI/CD in Cloud Build (since the CI/CD pipelines operate across the different environments) - -Vertex Pipelines are scheduled using Google Cloud Scheduler. -Cloud Scheduler emits a Pub/Sub message that triggers a Cloud Function, which in turn triggers the Vertex Pipeline to run. -_In future, this will be replaced with the Vertex Pipelines Scheduler (once there is a Terraform resource for it)._ - -## Setup - -**Prerequisites:** - -- [Terraform](https://www.terraform.io/) for managing cloud infrastructure -- [tfswitch](https://tfswitch.warrensbox.com/) to automatically choose and download an appropriate Terraform version (recommended) -- [Pyenv](https://github.com/pyenv/pyenv#installation) for managing Python versions -- [Poetry](https://python-poetry.org/) for managing Python dependencies -- [Google Cloud SDK (gcloud)](https://cloud.google.com/sdk/docs/quickstart) -- Make -- Cloned repo - -**Deploy infrastructure:** - -You will need four Google Cloud projects dev, test, prod, and admin. -The Cloud Build pipelines will run in the _admin_ project, and deploy resources into the dev/test/prod projects. -Before your CI/CD pipelines can deploy the infrastructure, you will need to set up a Terraform state bucket for each environment: - -```bash -export DEV_PROJECT_ID=my-dev-gcp-project -export DEV_LOCATION=europe-west2 -gsutil mb -l $DEV_LOCATION -p $DEV_PROJECT_ID --pap=enforced gs://$DEV_PROJECT_ID-tfstate && \ - gsutil ubla set on gs://$DEV_PROJECT_ID-tfstate -``` - -Enable APIs in admin project: - -```bash -export ADMIN_PROJECT_ID=my-admin-gcp-project -gcloud services enable cloudresourcemanager.googleapis.com serviceusage.googleapis.com --project=$ADMIN_PROJECT_ID -``` - -```bash -make deploy env=dev -``` - -More details about infrastructure is explained in [this guide](docs/Infrastructure.md). -It describes the scheduling of pipelines and how to tear down infrastructure. - -**Install dependencies:** - -```bash -pyenv install -skip-existing # install Python -poetry config virtualenvs.prefer-active-python true # configure Poetry -make install # install Python dependencies -cd pipelines && poetry run pre-commit install # install pre-commit hooks -cp env.sh.example env.sh -``` - -Update the environment variables for your dev environment in `env.sh`. - -**Authenticate to Google Cloud:** - -```bash -gcloud auth login -gcloud auth application-default login -``` - -## Run - -This repository contains example ML training and prediction pipelines which are explained in [this guide](docs/Pipelines.md). - -**Build containers:** The [model/](/model/) directory contains the code for custom training and prediction container images, including the model training script at [model/training/train.py](model/training/train.py). -You can modify this to suit your own use case. -Build the training and prediction container images and push them to Artifact Registry with: - -```bash -make build [ images="training prediction" ] -``` - -Optionally specify the `images` variable to only build one of the images. - -**Execute pipelines:** Vertex AI Pipelines uses KubeFlow to orchestrate your training steps, as such you'll need to: - -1. Compile the pipeline -1. Build dependent Docker containers -1. Run the pipeline in Vertex AI - -Execute the following command to run through steps 1-3: - -```bash -make run pipeline=training [ build= ] [ compile= ] [ cache= ] [ wait= ] -``` - -The command has the following true/false flags: - -- `build` - re-build containers for training & prediction code (limit by setting images=training to build only one of the containers) -- `compile` - re-compile the pipeline to YAML -- `cache` - cache pipeline steps -- `wait` - run the pipeline (a-)sync - -**Shortcuts:** Use these commands which support the same options as `run` to run the training or prediction pipeline: - -```bash -make training -make prediction -``` - -## Test - -Unit tests are performed using [pytest](https://docs.pytest.org). -The unit tests are run on each pull request. -To run them locally you can execute the following command and optionally enable or disable testing of components: - -``` -make test [ packages= ] -``` - -## Automation - -For details on setting up CI/CD, see [this guide](./docs/Automation.md). - -## Putting it all together - -For a full walkthrough of the journey from changing the ML pipeline code to having it scheduled and running in production, please see the guide [here](./docs/Production.md). - -We value your contribution, see [this guide](./docs/Contribution.md) for contributing to this project. +The notebooks are self-contained but instructors of this hackathon are asked to prepare the following for hackathon attendees. + +1. Create 3x Google Cloud projects (dev, test, prod) +1. Use `make deploy` to deploy resources in each of them. It's advised to follow the [infrastructure setup notebook](./docs/notebooks/01_infrastructure_setup.ipynb) for each environment +1. Create an E2E test trigger in the test project +1. Create a release trigger in the prod project +1. Add each user with their own Google account with the following IAM roles: + - `Vertex AI User` (roles/aiplatform.user) + - `Storage Object Viewer` (roles/storage.objectViewer) + - `Service Usage Consumer` (roles/serviceusage.serviceUsageConsumer) +1. Create one Vertex Workbench instance per user. +1. Confirm that users can access the GCP resources. +1. ❗Post workshop remember to delete all the users from the project and to clean up branches and releases in this repository \ No newline at end of file diff --git a/cloudbuild/release.yaml b/cloudbuild/release.yaml index a0e7266..4ba5ac5 100644 --- a/cloudbuild/release.yaml +++ b/cloudbuild/release.yaml @@ -57,7 +57,7 @@ steps: --tag=${TAG_NAME}; \ done env: - - RESOURCE_SUFFIX=default + - RESOURCE_SUFFIX=${TAG_NAME} options: logging: CLOUD_LOGGING_ONLY diff --git a/docs/Production.md b/docs/Production.md index 2c0b071..4cac368 100644 --- a/docs/Production.md +++ b/docs/Production.md @@ -20,11 +20,11 @@ This document describes the full process from making a change to your pipeline c ## Pre-requisites -- Suitable GCP environments set up - see the [README](../README.md) +- Suitable GCP environments set up - see the [README](README.md) - This repo forked / used as a template for a new GitHub repo - CI/CD set up - see the instructions [here](cloudbuild/README.md) - Access set up for the BigQuery datasets used in the example pipelines -- Git repo cloned locally (or in a notebook environment) and local setup complete - see [here](/README.md#local-setup) +- Git repo cloned locally (or in a notebook environment) and local setup complete - see [here](/docs/README.md#local-setup) ## Making your changes to the pipelines diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..5abdedf --- /dev/null +++ b/docs/README.md @@ -0,0 +1,169 @@ + + +# Vertex Pipelines End-to-End Samples + +_AKA "Vertex AI Turbo Templates"_ + +## Introduction + +This repository provides a reference implementation of [Vertex Pipelines](https://cloud.google.com/vertex-ai/docs/pipelines/) for creating a production-ready MLOps solution on Google Cloud. +You can take this repository as a starting point you own ML use cases. +The implementation includes: + +* **Infrastructure-as-Code** using Terraform for a typical dev/test/prod setup of Vertex AI and other relevant services +* **ML training and prediction pipelines** using the Kubeflow Pipelines +* **Reusable Kubeflow components** that can be used in common ML pipelines +* **CI/CD** using Google Cloud Build for linting, testing, and deploying ML pipelines +* **Developer scripts** (Makefile, Python scripts etc.) + +**Get started today by following [this step-by-step notebook tutorial](notebooks)! 🚀** +In this three-part notebook series you'll deploy a Google Cloud project and run production-ready ML pipelines using Vertex AI without writing a single line of code. + +## Cloud Architecture + +The diagram below shows the cloud architecture for this repository. + +![Cloud Architecture diagram](images/architecture.png) + +There are four different Google Cloud projects in use + +* `dev` - a shared sandbox environment for use during development +* `test` - environment for testing new changes before they are promoted to production. This environment should be treated as much as possible like a production environment. +* `prod` - production environment +* `admin` - separate Google Cloud project for setting up CI/CD in Cloud Build (since the CI/CD pipelines operate across the different environments) + +Vertex Pipelines are scheduled using Google Cloud Scheduler. +Cloud Scheduler emits a Pub/Sub message that triggers a Cloud Function, which in turn triggers the Vertex Pipeline to run. +_In future, this will be replaced with the Vertex Pipelines Scheduler (once there is a Terraform resource for it)._ + +## Setup + +**Prerequisites:** + +- [Terraform](https://www.terraform.io/) for managing cloud infrastructure +- [tfswitch](https://tfswitch.warrensbox.com/) to automatically choose and download an appropriate Terraform version (recommended) +- [Pyenv](https://github.com/pyenv/pyenv#installation) for managing Python versions +- [Poetry](https://python-poetry.org/) for managing Python dependencies +- [Google Cloud SDK (gcloud)](https://cloud.google.com/sdk/docs/quickstart) +- Make +- Cloned repo + +**Deploy infrastructure:** + +You will need four Google Cloud projects dev, test, prod, and admin. +The Cloud Build pipelines will run in the _admin_ project, and deploy resources into the dev/test/prod projects. +Before your CI/CD pipelines can deploy the infrastructure, you will need to set up a Terraform state bucket for each environment: + +```bash +export DEV_PROJECT_ID=my-dev-gcp-project +export DEV_LOCATION=europe-west2 +gsutil mb -l $DEV_LOCATION -p $DEV_PROJECT_ID --pap=enforced gs://$DEV_PROJECT_ID-tfstate && \ + gsutil ubla set on gs://$DEV_PROJECT_ID-tfstate +``` + +Enable APIs in admin project: + +```bash +export ADMIN_PROJECT_ID=my-admin-gcp-project +gcloud services enable cloudresourcemanager.googleapis.com serviceusage.googleapis.com --project=$ADMIN_PROJECT_ID +``` + +```bash +make deploy env=dev +``` + +More details about infrastructure is explained in [this guide](Infrastructure.md). +It describes the scheduling of pipelines and how to tear down infrastructure. + +**Install dependencies:** + +```bash +pyenv install -skip-existing # install Python +poetry config virtualenvs.prefer-active-python true # configure Poetry +make install # install Python dependencies +cd pipelines && poetry run pre-commit install # install pre-commit hooks +cp env.sh.example env.sh +``` + +Update the environment variables for your dev environment in `env.sh`. + +**Authenticate to Google Cloud:** + +```bash +gcloud auth login +gcloud auth application-default login +``` + +## Run + +This repository contains example ML training and prediction pipelines which are explained in [this guide](Pipelines.md). + +**Build containers:** The [model/](/model/) directory contains the code for custom training and prediction container images, including the model training script at [model/training/train.py](../model/training/train.py). +You can modify this to suit your own use case. +Build the training and prediction container images and push them to Artifact Registry with: + +```bash +make build [ images="training prediction" ] +``` + +Optionally specify the `images` variable to only build one of the images. + +**Execute pipelines:** Vertex AI Pipelines uses KubeFlow to orchestrate your training steps, as such you'll need to: + +1. Compile the pipeline +1. Build dependent Docker containers +1. Run the pipeline in Vertex AI + +Execute the following command to run through steps 1-3: + +```bash +make run pipeline=training [ build= ] [ compile= ] [ cache= ] [ wait= ] +``` + +The command has the following true/false flags: + +- `build` - re-build containers for training & prediction code (limit by setting images=training to build only one of the containers) +- `compile` - re-compile the pipeline to YAML +- `cache` - cache pipeline steps +- `wait` - run the pipeline (a-)sync + +**Shortcuts:** Use these commands which support the same options as `run` to run the training or prediction pipeline: + +```bash +make training +make prediction +``` + +## Test + +Unit tests are performed using [pytest](https://docs.pytest.org). +The unit tests are run on each pull request. +To run them locally you can execute the following command and optionally enable or disable testing of components: + +``` +make test [ packages= ] +``` + +## Automation + +For details on setting up CI/CD, see [this guide](Automation.md). + +## Putting it all together + +For a full walkthrough of the journey from changing the ML pipeline code to having it scheduled and running in production, please see the guide [here](Production.md). + +We value your contribution, see [this guide](Contribution.md) for contributing to this project. diff --git a/hackathon/01_health_check.ipynb b/hackathon/01_health_check.ipynb new file mode 100644 index 0000000..d85347b --- /dev/null +++ b/hackathon/01_health_check.ipynb @@ -0,0 +1,245 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cc6a2285-8d1e-45f9-8367-0957a41a1737", + "metadata": {}, + "source": [ + "# MLOps Hackathon\n", + "\n", + "This hackathon is based on the [open-source Turbo Template](https://github.com/teamdatatonic/vertex-pipelines-end-to-end-samples).\n", + "Through this notebook series you'll get hands-on with the template and Google Cloud.\n", + "The hackathon is structured into the following exercises:\n", + "\n", + "1. **[Health check](./01_health_check.ipynb) - this notebook**\n", + "1. [Run pipelines](./02_run_pipelines.ipynb)\n", + "1. [Promote model](./03_promote_model.ipynb)\n", + "1. [Challenge: Model monitoring](./04_monitoring_challenge.ipynb)\n", + "1. [Challenge: Real-time predictions](./05_realtime_challenge.ipynb)\n", + "\n", + "\n", + "## Introduction\n", + "\n", + "In this notebook you'll health check your environment in Google Cloud before carrying out the next exercises and challenges.\n", + "Get started in [Vertex AI Workbench](https://cloud.google.com/vertex-ai-notebooks) now!\n", + "\n", + "**Prerequisites:**\n", + "\n", + "- [x] Deployed `dev`, `staging`, `prod` projects in Google Cloud\n", + "- [x] [Pyenv](https://github.com/pyenv/pyenv#installation) for managing Python versions\n", + "- [x] [Google Cloud SDK (gcloud)](https://cloud.google.com/sdk/docs/quickstart)\n", + "- [x] Make\n", + "- [x] [Poetry](https://python-poetry.org)" + ] + }, + { + "cell_type": "markdown", + "id": "122952d9-fb78-4f5d-8d8b-1e46bbe973b7", + "metadata": {}, + "source": [ + "\n", + "## Install tools\n", + "\n", + "Let's go to the root of the hackathon repo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f95880c5-511e-4e4f-98de-6fbf7521ca61", + "metadata": {}, + "outputs": [], + "source": [ + "%cd .." + ] + }, + { + "cell_type": "markdown", + "id": "7faf7fe5-d425-4e70-beca-b641ae31640c", + "metadata": {}, + "source": [ + "Do you have poetry installed and available in the `PATH`?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e26f7572-24e5-4002-9181-65791d5426d4", + "metadata": {}, + "outputs": [], + "source": [ + "! poetry --version" + ] + }, + { + "cell_type": "markdown", + "id": "78e55311-0123-4f85-b5a8-390bb33638c3", + "metadata": {}, + "source": [ + "If not, install `pyenv` and `poetry`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "000357d7-bf37-4d3c-bfaa-70ed164f79b6", + "metadata": {}, + "outputs": [], + "source": [ + "! curl https://pyenv.run | bash" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6bf595eb-7194-4b89-b512-d7db2fb87f24", + "metadata": {}, + "outputs": [], + "source": [ + "! bash ./docs/notebooks/scripts/install_poetry.sh" + ] + }, + { + "cell_type": "markdown", + "id": "719b4490", + "metadata": {}, + "source": [ + "**Remember to add poetry & pyenv to your PATH**" + ] + }, + { + "cell_type": "markdown", + "id": "a188dda9-f3fb-498e-8b98-e9b2c4c2c444", + "metadata": {}, + "source": [ + "**Note:** After installation, restart your kernel or Workbench instance.\n", + "\n", + "Now configure the installed tools:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa280189", + "metadata": {}, + "outputs": [], + "source": [ + "# Automatically restart kernel after installs\n", + "import os\n", + "\n", + "if not os.getenv(\"IS_TESTING\"):\n", + " import IPython\n", + "\n", + " app = IPython.Application.instance()\n", + " app.kernel.do_shutdown(True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33d0b45b-f470-4aeb-8049-f2dad7b66827", + "metadata": {}, + "outputs": [], + "source": [ + "! pyenv install --skip-existing\n", + "! poetry config virtualenvs.prefer-active-python true" + ] + }, + { + "cell_type": "markdown", + "id": "5d838928-49c2-4f81-914f-296f4485be28", + "metadata": {}, + "source": [ + "## Install Dependencies\n", + "\n", + "The code requires a number of Python dependencies. \n", + "As such the `Makefile` offers a helpful command to create virtual Python environments with the all dependencies by using `poetry`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d97938c-f4f2-4af4-81c0-4a7ab3228550", + "metadata": {}, + "outputs": [], + "source": [ + "! make install" + ] + }, + { + "cell_type": "markdown", + "id": "9b08f720-d691-444e-bffd-40942c0a089d", + "metadata": {}, + "source": [ + "Let's check whether the installed dependencies can run tests in the code base successfully:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8f02e73-dd67-4d30-a19b-e4d7082df2a1", + "metadata": {}, + "outputs": [], + "source": [ + "! make test" + ] + }, + { + "cell_type": "markdown", + "id": "c7e2e37a-a901-45d4-b275-7f8889fef1c3", + "metadata": {}, + "source": [ + "Finally, open a shell test the commands below to understand how to interact with the Python virtual environments (e.g. outside of the Jupyter notebook).\n", + "\n", + "```bash\n", + "# go to the root of the repository and then into the pipeline python package\n", + "cd pipelines\n", + "# use poetry to activate the virtual environment\n", + "poetry shell\n", + "# open a python shell and test whether you can import dependencies\n", + "python\n", + "import google.cloud.aiplatform\n", + "exit()\n", + "````" + ] + }, + { + "cell_type": "markdown", + "id": "972e1a0c-de7a-4bf1-b375-011f36c1e5c0", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "At the end of this notebook, you have successfully tested that ...\n", + "\n", + "- poetry is installed\n", + "- all python dependencies are installed\n", + "- run local tests\n", + "- you can activate the virtual environment and execute python scripts\n", + "\n", + "🎉 Now you're ready for the next exercise!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/hackathon/02_run_pipelines.ipynb b/hackathon/02_run_pipelines.ipynb new file mode 100644 index 0000000..26f4d50 --- /dev/null +++ b/hackathon/02_run_pipelines.ipynb @@ -0,0 +1,222 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "JAPoU8Sm5E6e" + }, + "source": [ + "# MLOps Hackathon\n", + "\n", + "This hackathon is based on the [open-source Turbo Template](https://github.com/teamdatatonic/vertex-pipelines-end-to-end-samples).\n", + "Through this notebook series you'll get hands-on with the template and Google Cloud.\n", + "The hackathon is structured into the following exercises:\n", + "\n", + "1. [Health check](./01_health_check.ipynb)\n", + "1. **[Run pipelines](./02_run_pipelines.ipynb) - this notebook**\n", + "1. [Promote model](./03_promote_model.ipynb)\n", + "1. [Challenge: Model monitoring](./04_monitoring_challenge.ipynb)\n", + "1. [Challenge: Real-time predictions](./05_realtime_challenge.ipynb)\n", + "\n", + "\n", + "## Introduction\n", + "\n", + "In this notebook you'll run your first training and prediction pipelines. \n", + "You'll learn about containers, pipelines, caching, and `make` as a productivity accelerator." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Authenticate\n", + "\n", + "Set your project ID and authenticate using your Google Account:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "VERTEX_PROJECT_ID = \"my-project-id\"\n", + "GOOGLE_ACCOUNT = \"user@company.com\"\n", + "! gcloud config set project {VERTEX_PROJECT_ID}\n", + "! gcloud config set account {GOOGLE_ACCOUNT}\n", + "! gcloud auth login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%cd .." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before running any pipelines, make sure you have created a `env.sh` and replaced the variables" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run Training Pipeline\n", + "\n", + "Vertex AI Pipelines uses KubeFlow to orchestrate your training steps, as such you'll need to:\n", + "\n", + "1. Compile the pipeline\n", + "1. Build dependent Docker containers\n", + "1. Run the pipeline in Vertex AI\n", + "\n", + "The already templated training pipeline will execute a pipeline similar to the image below in Vertex AI:\n", + "\n", + "![Training Pipeline](../docs/images/training_pipeline.png)\n", + "\n", + "Don't worry about executing steps 1-3 manually (and each time you run your pipeline!), simply run the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! make training wait=true" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While the pipeline executes, here's a more detailed explanation of what's happening:\n", + "\n", + "**1. Compile the pipeline:** By using the KubeFlow SDK, you've compiled the training pipeline in `pipelines/training` to YAML.\n", + "\n", + "**2. Build dependent Docker containers:** In `model` you can maintain your training (and prediction) code which is containerised and pushed to [Artifact Registry](https://cloud.google.com/artifact-registry). \n", + "In this way, your training pipeline can execute your training code in the `Train model` pipeline step.\n", + "\n", + "**3. Run the pipeline in Vertex AI:** By using the Vertex AI Python SDK and the pipeline YAML file, you execute your training pipeline." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**➡️ Exercise:** With the help of `make help`, try to execute the steps 1-3 individually.\n", + "\n", + "**➡️ Exercise:** Have you noticed the caching option? What happens if you run the pipeline with cachine enabled vs. disabled. Why is one option preferred over the other?\n", + "\n", + "**➡️ Exercise:** Locate the model training code. Then:\n", + "1. Update the training code (e.g. add a logging command).\n", + "2. Rebuild the container using `make`\n", + "3. Run the training pipeline with caching enabled. What do you notice?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run Prediction Pipeline\n", + "\n", + "After running a successful training pipeline job, run the prediction pipeline which will look similar to:\n", + "\n", + "\"image\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! make prediction" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "**Note:** The command has the following true/false flags:\n", + "\n", + "- `build` - re-build containers for training & prediction code (limit by setting `images=training` to build only one of the containers)\n", + "- `compile` - re-compile the pipeline to YAML\n", + "- `wait` - run the pipeline (a-)sync" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**➡️ Exercise:** Can you locate the batch prediction job in Vertex AI? What are the inputs and outputs of the job?\n", + "\n", + "## Monitoring\n", + "\n", + "**➡️ Exercise:** Do you notice any monitoring as part of the batch prediction job? What is monitored? Are the any alerts?\n", + "\n", + "**➡️ Exercise:** Where in the code can you configure to receive email notifications in case of any alerts?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check your understanding\n", + "\n", + "**➡️ Exercise:** Understanding of containers:\n", + "- Why do we need 2x containers?\n", + "- When are they built?\n", + "- In which cases do you need to rebuild a container, when can you skip it?\n", + "- Can you locate the containers in the Google Cloud console?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "You've successfully run your first training and prediction pipeline in Vertex AI! 🎉 Now you're ready for the next exercise!" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "notebook_template.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + }, + "vscode": { + "interpreter": { + "hash": "bb5c7b0035bb37e2e2e56e6840dfdd8f7fa070884ae8e041fbcae450545b1006" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/hackathon/03_promote_model.ipynb b/hackathon/03_promote_model.ipynb new file mode 100644 index 0000000..26e305c --- /dev/null +++ b/hackathon/03_promote_model.ipynb @@ -0,0 +1,221 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "JAPoU8Sm5E6e" + }, + "source": [ + "# MLOps Hackathon\n", + "\n", + "This hackathon is based on the [open-source Turbo Template](https://github.com/teamdatatonic/vertex-pipelines-end-to-end-samples).\n", + "Through this notebook series you'll get hands-on with the template and Google Cloud.\n", + "The hackathon is structured into the following exercises:\n", + "\n", + "1. [Health check](./01_health_check.ipynb)\n", + "1. [Run pipelines](./02_run_pipelines.ipynb)\n", + "1. **[Promote model](./03_promote_model.ipynb) - this notebook**\n", + "1. [Challenge: Model monitoring](./04_monitoring_challenge.ipynb)\n", + "1. [Challenge: Real-time predictions](./05_realtime_challenge.ipynb)\n", + "\n", + "\n", + "## Introduction\n", + "\n", + "In this notebook you'll use a recommended a Google Cloud architecture to promote your model from development to production.\n", + "You'll learn about pull requests, releases, Cloud Build, and Cloud Scheduler." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Authenticate\n", + "\n", + "Set your project ID and authenticate using your Google Account:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "VERTEX_PROJECT_ID = \"my-project-id\"\n", + "GOOGLE_ACCOUNT = \"user@company.com\"\n", + "! gcloud config set project {VERTEX_PROJECT_ID}\n", + "! gcloud config set account {GOOGLE_ACCOUNT}\n", + "! gcloud auth login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%cd .." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Staging: Test your recent changes\n", + "\n", + "Remember the updated training container from the last notebook? Let's commit your changes!\n", + "\n", + "**➡️ Exercise:** Submit your code changes:\n", + "1. Create a new branch `feat/new-model-`\n", + "1. Commit, go to github and open a pull request from your new branch to `develop` branch of the **same** repo\n", + "1. Add a new comment with the content `/gcbrun`\n", + "1. Don't merge your pull request, however, observe what's triggered by your comment\n", + "\n", + "**➡️ Exercise:** Check your understanding:\n", + "- Do you know where the executed jobs are defined? (Hint: you're running pipelines in Cloud Build)\n", + "- In which Google Cloud project are the jobs executed? Do you know why this decision was made?" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Production: Promote your model\n", + "\n", + "Let's recall this Google Cloud architecture:\n", + "\n", + "![Architecture](../docs/images/architecture.png)\n", + "\n", + "**➡️ Exercise:** \n", + "\n", + "1. Locate your production project in Google Cloud console\n", + "1. Navigate to Cloud Build and verify that it includes a trigger upon tag\n", + "1. Go to [the hackathon repository](https://github.com/teamdatatonic/mlops-hackathon)\n", + "1. Create a release from your branch and provide the tag name `v1.0.0-`\u001b\n", + "\n", + "![Create release](./images/create_release.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**➡️ Exercise:** Go back to Cloud Build in the **production** Google Cloud project and monitor the new job. What's happening in the job? Once finished:\n", + "\n", + "1. Go to Artifact Registry in the Google Cloud console and locate the new docker images and pipelines\n", + "2. Can you find the created artifacts by your release?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Production: Schedule your pipeline\n", + "\n", + "After successfully creating a release and thereby promoting your code and containers to the **production** environment, let's schedule your training pipeline so that you can continuously retrain your model whenever new training data becomes available.\n", + "\n", + "Update the variables below before executing the next code cells." + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [], + "source": [ + "tag = \"v1.0.0-felix\"\n", + "location = \"europe-west2\"\n", + "project = \"dt-sky-mlops-hackathon-prod\"" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "template_path = f\"https://{location}-kfp.pkg.dev/{project}/vertex-pipelines/turbo-training-pipeline/{tag}\"\n", + "display_name = f\"turbo-training-pipeline-{tag}\"\n", + "enable_caching = \"false\"\n", + "\n", + "data = dict(\n", + " template_path = template_path,\n", + " display_name = display_name,\n", + " enable_caching = enable_caching,\n", + " pipeline_parameters = dict(\n", + " project = project,\n", + " location = location,\n", + " bq_location = \"US\",\n", + " bq_source_uri = \"bigquery-public-data.chicago_taxi_trips.taxi_trips\",\n", + " model_name = f\"model-{tag}\",\n", + " )\n", + ")\n", + "\n", + "print(json.dumps(data))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**➡️ Exercise:** Schedule the training pipeline using Cloud Scheduler:\n", + "\n", + "1. Locate Cloud Scheduler in the **production** Google Cloud project and create a new job

\n", + " \n", + "

\n", + "2. Paste as the message body the generated JSON from above

\n", + " \n", + "

\n", + "3. Create the job and force a manual execution\n", + "4. Go to Vertex AI pipeline and observe whether your training pipeline is running\n", + "\n", + "**➡️ Exercise:** Can you think about a better (e.g. automated) way of scheduling pipelines?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You've successfully tested, promoted, and scheduled your first pipeline in a production environment! 🎉 Now you're ready for the next exercise!" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "notebook_template.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + }, + "vscode": { + "interpreter": { + "hash": "bb5c7b0035bb37e2e2e56e6840dfdd8f7fa070884ae8e041fbcae450545b1006" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/hackathon/04_monitoring_challenge.ipynb b/hackathon/04_monitoring_challenge.ipynb new file mode 100644 index 0000000..77ae334 --- /dev/null +++ b/hackathon/04_monitoring_challenge.ipynb @@ -0,0 +1,116 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "JAPoU8Sm5E6e" + }, + "source": [ + "# MLOps Hackathon\n", + "\n", + "This hackathon is based on the [open-source Turbo Template](https://github.com/teamdatatonic/vertex-pipelines-end-to-end-samples).\n", + "Through this notebook series you'll get hands-on with the template and Google Cloud.\n", + "The hackathon is structured into the following exercises:\n", + "\n", + "1. [Health check](./01_health_check.ipynb)\n", + "1. [Run pipelines](./02_run_pipelines.ipynb)\n", + "1. [Promote model](./03_promote_model.ipynb)\n", + "1. **[Challenge: Model monitoring](./04_monitoring_challenge.ipynb) - this notebook**\n", + "1. [Challenge: Real-time predictions](./05_realtime_challenge.ipynb)\n", + "\n", + "## Introduction\n", + "\n", + "In this challenge, you (or your team) is asked to monitor your pipelines in depth.\n", + "This involves granular logging, the creation of alerts, and proper notification channels, so that you can mitigate in case your alert is fired." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Locate logs\n", + "\n", + "**➡️ Exercise:** Where are logs of pipelines running in Vertex AI persisted? This includes your training (and prediction pipeline).\n", + "\n", + "**➡️ Exercise:** Open a previous pipeline run:\n", + "1. Investigate the logs of each step. \n", + "1. Can you filter logs? If so, find a specific log (e.g. in your model training step).\n", + "1. Aim to get a good understanding of how logs are structured and read through the documentation of the respective Google Cloud service." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What are alerts?\n", + "\n", + "**➡️ Exercise:** Read through the Google Cloud documentation to get an understanding of how alerts can be configured:\n", + "\n", + "- https://cloud.google.com/logging/docs/alerting/log-based-alerts \n", + "- https://cloud.google.com/monitoring/support/notification-options\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create an alert\n", + "\n", + "**➡️ Exercise:** Locate your training container, add or update logs which you want to capture. You can be creative but really consider what kind of alerts are crucial to be notified upon in your pipeline.\n", + "\n", + "**➡️ Exercise:** Rebuild the training container, execute the training pipeline, and observe whether your expected log is printed.\n", + "\n", + "**➡️ Exercise:** Based on the documentation in the previous exercise, create an alert and notification channel for this log." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fire an alert 🔥\n", + "\n", + "**➡️ Exercise:** Rerun your training pipeline wait until you (or you team) are alerted!\n", + "\n", + "**➡️ Exercise:** You have seen different ways of receiving notifications, can you think about a different channel or even triggering an automated workflow based on an alert? Be creative!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Congratulations! 🎉 You've successfully solved the challenge. " + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "notebook_template.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + }, + "vscode": { + "interpreter": { + "hash": "bb5c7b0035bb37e2e2e56e6840dfdd8f7fa070884ae8e041fbcae450545b1006" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/hackathon/05_realtime_challenge.ipynb b/hackathon/05_realtime_challenge.ipynb new file mode 100644 index 0000000..ab5222a --- /dev/null +++ b/hackathon/05_realtime_challenge.ipynb @@ -0,0 +1,202 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "JAPoU8Sm5E6e" + }, + "source": [ + "# MLOps Hackathon\n", + "\n", + "This hackathon is based on the [open-source Turbo Template](https://github.com/teamdatatonic/vertex-pipelines-end-to-end-samples).\n", + "Through this notebook series you'll get hands-on with the template and Google Cloud.\n", + "The hackathon is structured into the following exercises:\n", + "\n", + "1. [Health check](./01_health_check.ipynb)\n", + "1. [Run pipelines](./02_run_pipelines.ipynb)\n", + "1. [Promote model](./03_promote_model.ipynb)\n", + "1. [Challenge: Model monitoring](./04_monitoring_challenge.ipynb)\n", + "1. **[Challenge: Real-time predictions](./05_realtime_challenge.ipynb) - this notebook**\n", + "\n", + "## Introduction\n", + "\n", + "In this challenge, you (or your team) is asked to create an application which can return predictions in near real-time.\n", + "This involves creating an endpoint for your model and a UI which can send requests to the endpoint and visualise prediction results." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deploy your endpoint\n", + "\n", + "**➡️ Exercise:** Read through the Google Cloud documentation to get an understanding of how to create an endpoint in Vertex AI:\n", + "\n", + "- https://cloud.google.com/vertex-ai/docs/general/deployment \n", + "\n", + "**➡️ Exercise:** Locate your trained model in the model registry and manually deploy to a new endpoint. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get predictions from your endpoint\n", + "\n", + "**➡️ Exercise:** Complete the code below to get a prediction from your deployed endpoint and print the result." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from google.cloud import aiplatform\n", + "from google.cloud.aiplatform import Endpoint\n", + "\n", + "aiplatform.init(\n", + " project=\"...\",\n", + " location=\"...\" # e.g. europe-west2\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "endpoint = Endpoint(\n", + " \"...\", # e.g. 2081322734821834752\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**➡️ Exercise:** Study the training dataset in BigQuery and the training script to understand what kind of input features are required by the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "endpoint.predict(\n", + " instances=[\n", + " {\n", + " \"dayofweek\": 1, \n", + " \"hourofday\": 1, \n", + " \"trip_distance\": 1, \n", + " \"trip_miles\": 1, \n", + " \"trip_seconds\": 1, \n", + " \"company\": \"...\",\n", + " \"payment_type\": \"...\"\n", + " }\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Connect the UI to your model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**➡️ Exercise:** Find below sample code to create a simple UI. Use the prediction from above to create an inactive way of returning predictions. Be creative!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import gradio as gr\n", + "\n", + "\n", + "def predict(dayofweek):\n", + " result = endpoint.predict(\n", + " instances=[ \n", + " # ... \n", + " ]\n", + " )\n", + " return result.predictions[0]\n", + "\n", + "\n", + "demo = gr.Interface(\n", + " title=\"Title ...\", \n", + " description=\"Lorem ipsum ...\",\n", + " article=\"How to use: ...\",\n", + " fn=predict,\n", + " inputs=[\n", + " gr.Dropdown(choices=[\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"], type=\"index\", value=\"Monday\")\n", + " ],\n", + " outputs=[\"number\"],\n", + ")\n", + "\n", + "demo.launch()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Deploy your model continuously\n", + "\n", + "**➡️ Exercise:** Read the Google Cloud documentation to get an understanding of how to create an endpoint in Vertex AI in a pipeline:\n", + "\n", + "- https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-2.0.0/api/v1/endpoint.html#v1.endpoint.ModelDeployOp\n", + "\n", + "\n", + "**➡️ Exercise:** Extend the training pipeline to deploy a model automatically to an endpoint once the training is finished and the model is uploaded to the model registry." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Congratulations! 🎉 You've successfully solved the challenge." + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "notebook_template.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + }, + "vscode": { + "interpreter": { + "hash": "bb5c7b0035bb37e2e2e56e6840dfdd8f7fa070884ae8e041fbcae450545b1006" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/hackathon/images/create_release.png b/hackathon/images/create_release.png new file mode 100644 index 0000000000000000000000000000000000000000..980ea28ee7b79fbea49c580768dd7564373fa1c9 GIT binary patch literal 74098 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 literal 0 HcmV?d00001 diff --git a/hackathon/images/scheduler_1.png b/hackathon/images/scheduler_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c496a7ac9a596208e073d5ff494ebf7d46e7c645 GIT binary patch literal 90615 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%0D( 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

5$212OH9l`VbJ;!{CN42F}&@ml-e;-qaT9K()w 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 literal 0 HcmV?d00001 diff --git a/hackathon/images/scheduler_2.png b/hackathon/images/scheduler_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fd13f575b7029be859d05b622af5b46d6a510e0f GIT binary patch literal 49852 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 Sj0(Wu^ijVQeU literal 0 HcmV?d00001 diff --git a/pipelines/poetry.lock b/pipelines/poetry.lock index e94bea2..89c8327 100644 --- a/pipelines/poetry.lock +++ b/pipelines/poetry.lock @@ -1,5 +1,51 @@ # This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. +[[package]] +name = "aiofiles" +version = "23.2.1" +description = "File support for asyncio." +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, + {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, +] + +[[package]] +name = "altair" +version = "5.2.0" +description = "Vega-Altair: A declarative statistical visualization library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "altair-5.2.0-py3-none-any.whl", hash = "sha256:8c4888ad11db7c39f3f17aa7f4ea985775da389d79ac30a6c22856ab238df399"}, + {file = "altair-5.2.0.tar.gz", hash = "sha256:2ad7f0c8010ebbc46319cc30febfb8e59ccf84969a201541c207bc3a4fa6cf81"}, +] + +[package.dependencies] +jinja2 = "*" +jsonschema = ">=3.0" +numpy = "*" +packaging = "*" +pandas = ">=0.25" +toolz = "*" +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["anywidget", "geopandas", "hatch", "ipython", "m2r", "mypy", "pandas-stubs", "pyarrow (>=11)", "pytest", "pytest-cov", "ruff (>=0.1.3)", "types-jsonschema", "types-setuptools", "vega-datasets", "vegafusion[embed] (>=1.4.0)", "vl-convert-python (>=1.1.0)"] +doc = ["docutils", "jinja2", "myst-parser", "numpydoc", "pillow (>=9,<10)", "pydata-sphinx-theme (>=0.14.1)", "scipy", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] + +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + [[package]] name = "anyio" version = "4.1.0" @@ -463,6 +509,69 @@ pyyaml = "6.0.1" type = "directory" url = "../components" +[[package]] +name = "contourpy" +version = "1.2.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, +] + +[package.dependencies] +numpy = ">=1.20,<2.0" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + [[package]] name = "coverage" version = "7.2.5" @@ -526,6 +635,21 @@ files = [ [package.extras] toml = ["tomli"] +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "debugpy" version = "1.8.0" @@ -625,6 +749,25 @@ files = [ [package.extras] tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +[[package]] +name = "fastapi" +version = "0.103.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-0.103.0-py3-none-any.whl", hash = "sha256:61ab72c6c281205dd0cbaccf503e829a37e0be108d965ac223779a8479243665"}, + {file = "fastapi-0.103.0.tar.gz", hash = "sha256:4166732f5ddf61c33e9fa4664f73780872511e0598d4d5434b1816dc1e6d9421"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + [[package]] name = "fastjsonschema" version = "2.19.0" @@ -639,6 +782,16 @@ files = [ [package.extras] devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] +[[package]] +name = "ffmpy" +version = "0.3.1" +description = "A simple Python wrapper for ffmpeg" +optional = false +python-versions = "*" +files = [ + {file = "ffmpy-0.3.1.tar.gz", hash = "sha256:a173b8f42c7c669ff722df7fb31e1e870067713697f745224fa6e621b82f0004"}, +] + [[package]] name = "filelock" version = "3.13.1" @@ -655,6 +808,71 @@ docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1 testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] +[[package]] +name = "fonttools" +version = "4.47.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d2404107626f97a221dc1a65b05396d2bb2ce38e435f64f26ed2369f68675d9"}, + {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c01f409be619a9a0f5590389e37ccb58b47264939f0e8d58bfa1f3ba07d22671"}, + {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d986b66ff722ef675b7ee22fbe5947a41f60a61a4da15579d5e276d897fbc7fa"}, + {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8acf6dd0434b211b3bd30d572d9e019831aae17a54016629fa8224783b22df8"}, + {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:495369c660e0c27233e3c572269cbe520f7f4978be675f990f4005937337d391"}, + {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c59227d7ba5b232281c26ae04fac2c73a79ad0e236bca5c44aae904a18f14faf"}, + {file = "fonttools-4.47.0-cp310-cp310-win32.whl", hash = "sha256:59a6c8b71a245800e923cb684a2dc0eac19c56493e2f896218fcf2571ed28984"}, + {file = "fonttools-4.47.0-cp310-cp310-win_amd64.whl", hash = "sha256:52c82df66201f3a90db438d9d7b337c7c98139de598d0728fb99dab9fd0495ca"}, + {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:854421e328d47d70aa5abceacbe8eef231961b162c71cbe7ff3f47e235e2e5c5"}, + {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:511482df31cfea9f697930f61520f6541185fa5eeba2fa760fe72e8eee5af88b"}, + {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0e2c88c8c985b7b9a7efcd06511fb0a1fe3ddd9a6cd2895ef1dbf9059719d7"}, + {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7a0a8848726956e9d9fb18c977a279013daadf0cbb6725d2015a6dd57527992"}, + {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e869da810ae35afb3019baa0d0306cdbab4760a54909c89ad8904fa629991812"}, + {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dd23848f877c3754f53a4903fb7a593ed100924f9b4bff7d5a4e2e8a7001ae11"}, + {file = "fonttools-4.47.0-cp311-cp311-win32.whl", hash = "sha256:bf1810635c00f7c45d93085611c995fc130009cec5abdc35b327156aa191f982"}, + {file = "fonttools-4.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:61df4dee5d38ab65b26da8efd62d859a1eef7a34dcbc331299a28e24d04c59a7"}, + {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e3f4d61f3a8195eac784f1d0c16c0a3105382c1b9a74d99ac4ba421da39a8826"}, + {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:174995f7b057e799355b393e97f4f93ef1f2197cbfa945e988d49b2a09ecbce8"}, + {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea592e6a09b71cb7a7661dd93ac0b877a6228e2d677ebacbad0a4d118494c86d"}, + {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40bdbe90b33897d9cc4a39f8e415b0fcdeae4c40a99374b8a4982f127ff5c767"}, + {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:843509ae9b93db5aaf1a6302085e30bddc1111d31e11d724584818f5b698f500"}, + {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9acfa1cdc479e0dde528b61423855913d949a7f7fe09e276228298fef4589540"}, + {file = "fonttools-4.47.0-cp312-cp312-win32.whl", hash = "sha256:66c92ec7f95fd9732550ebedefcd190a8d81beaa97e89d523a0d17198a8bda4d"}, + {file = "fonttools-4.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8fa20748de55d0021f83754b371432dca0439e02847962fc4c42a0e444c2d78"}, + {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c75e19971209fbbce891ebfd1b10c37320a5a28e8d438861c21d35305aedb81c"}, + {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e79f1a3970d25f692bbb8c8c2637e621a66c0d60c109ab48d4a160f50856deff"}, + {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:562681188c62c024fe2c611b32e08b8de2afa00c0c4e72bed47c47c318e16d5c"}, + {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a77a60315c33393b2bd29d538d1ef026060a63d3a49a9233b779261bad9c3f71"}, + {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4fabb8cc9422efae1a925160083fdcbab8fdc96a8483441eb7457235df625bd"}, + {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a78dba8c2a1e9d53a0fb5382979f024200dc86adc46a56cbb668a2249862fda"}, + {file = "fonttools-4.47.0-cp38-cp38-win32.whl", hash = "sha256:e6b968543fde4119231c12c2a953dcf83349590ca631ba8216a8edf9cd4d36a9"}, + {file = "fonttools-4.47.0-cp38-cp38-win_amd64.whl", hash = "sha256:4a9a51745c0439516d947480d4d884fa18bd1458e05b829e482b9269afa655bc"}, + {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:62d8ddb058b8e87018e5dc26f3258e2c30daad4c87262dfeb0e2617dd84750e6"}, + {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dde0eab40faaa5476133123f6a622a1cc3ac9b7af45d65690870620323308b4"}, + {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4da089f6dfdb822293bde576916492cd708c37c2501c3651adde39804630538"}, + {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:253bb46bab970e8aae254cebf2ae3db98a4ef6bd034707aa68a239027d2b198d"}, + {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1193fb090061efa2f9e2d8d743ae9850c77b66746a3b32792324cdce65784154"}, + {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:084511482dd265bce6dca24c509894062f0117e4e6869384d853f46c0e6d43be"}, + {file = "fonttools-4.47.0-cp39-cp39-win32.whl", hash = "sha256:97620c4af36e4c849e52661492e31dc36916df12571cb900d16960ab8e92a980"}, + {file = "fonttools-4.47.0-cp39-cp39-win_amd64.whl", hash = "sha256:e77bdf52185bdaf63d39f3e1ac3212e6cfa3ab07d509b94557a8902ce9c13c82"}, + {file = "fonttools-4.47.0-py3-none-any.whl", hash = "sha256:d6477ba902dd2d7adda7f0fd3bfaeb92885d45993c9e1928c9f28fc3961415f7"}, + {file = "fonttools-4.47.0.tar.gz", hash = "sha256:ec13a10715eef0e031858c1c23bfaee6cba02b97558e4a7bfa089dba4a8c2ebf"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + [[package]] name = "fqdn" version = "1.5.1" @@ -666,6 +884,41 @@ files = [ {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, ] +[[package]] +name = "fsspec" +version = "2023.12.2" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, + {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + [[package]] name = "google-api-core" version = "2.15.0" @@ -975,6 +1228,66 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4 [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] +[[package]] +name = "gradio" +version = "4.11.0" +description = "Python library for easily interacting with trained machine learning models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "gradio-4.11.0-py3-none-any.whl", hash = "sha256:2cafaae55d11b2598311c6c5b64fa972b79546fc59388ee4c9498fbf9f9e40c9"}, + {file = "gradio-4.11.0.tar.gz", hash = "sha256:dbeb161e0bda943be4864fde1be2a41baa4fcfa3d720d633fd35cc4edf3c4545"}, +] + +[package.dependencies] +aiofiles = ">=22.0,<24.0" +altair = ">=4.2.0,<6.0" +fastapi = "*" +ffmpy = "*" +gradio-client = "0.7.3" +httpx = "*" +huggingface-hub = ">=0.19.3" +importlib-resources = ">=1.3,<7.0" +jinja2 = "<4.0" +markupsafe = ">=2.0,<3.0" +matplotlib = ">=3.0,<4.0" +numpy = ">=1.0,<2.0" +orjson = ">=3.0,<4.0" +packaging = "*" +pandas = ">=1.0,<3.0" +pillow = ">=8.0,<11.0" +pydantic = ">=2.0" +pydub = "*" +python-multipart = "*" +pyyaml = ">=5.0,<7.0" +semantic-version = ">=2.0,<3.0" +tomlkit = "0.12.0" +typer = {version = ">=0.9,<1.0", extras = ["all"]} +typing-extensions = ">=4.0,<5.0" +uvicorn = ">=0.14.0" + +[package.extras] +oauth = ["authlib", "itsdangerous"] + +[[package]] +name = "gradio-client" +version = "0.7.3" +description = "Python library for easily interacting with trained machine learning models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "gradio_client-0.7.3-py3-none-any.whl", hash = "sha256:b91073770470ceb9f284977064c35bc0cffaf868eb887bf352db77aa01fe342a"}, + {file = "gradio_client-0.7.3.tar.gz", hash = "sha256:8146a1d19a125b38088dd201ddacd0008ea47ef9b0504d1c5b87ca09a43f4dcd"}, +] + +[package.dependencies] +fsspec = "*" +httpx = "*" +huggingface-hub = ">=0.19.3" +packaging = "*" +typing-extensions = ">=4.0,<5.0" +websockets = ">=10.0,<12.0" + [[package]] name = "grpc-google-iam-v1" version = "0.13.0" @@ -1073,6 +1386,94 @@ googleapis-common-protos = ">=1.5.5" grpcio = ">=1.48.2" protobuf = ">=3.12.0" +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.2" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, + {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.23.0)"] + +[[package]] +name = "httpx" +version = "0.26.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, + {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.20.1" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.20.1-py3-none-any.whl", hash = "sha256:ecfdea395a8bc68cd160106c5bd857f7e010768d95f9e1862a779010cc304831"}, + {file = "huggingface_hub-0.20.1.tar.gz", hash = "sha256:8c88c4c3c8853e22f2dfb4d84c3d493f4e1af52fb3856a90e1eeddcf191ddbb1"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + [[package]] name = "identify" version = "2.5.33" @@ -1117,6 +1518,24 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +[[package]] +name = "importlib-resources" +version = "6.1.1" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -1657,6 +2076,119 @@ python-dateutil = "*" six = ">=1.10" urllib3 = ">=1.15" +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + [[package]] name = "kubernetes" version = "26.1.0" @@ -1683,6 +2215,30 @@ websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" [package.extras] adal = ["adal (>=1.0.2)"] +[[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.3" @@ -1742,6 +2298,55 @@ files = [ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] +[[package]] +name = "matplotlib" +version = "3.8.2" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, + {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, + {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, + {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, + {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, + {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, + {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, + {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, + {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, + {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, + {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.3.1" +numpy = ">=1.21,<2" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + [[package]] name = "matplotlib-inline" version = "0.1.6" @@ -1756,6 +2361,17 @@ files = [ [package.dependencies] traitlets = "*" +[[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 = "mistune" version = "3.0.2" @@ -1974,6 +2590,65 @@ rsa = ["cryptography (>=3.0.0)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] +[[package]] +name = "orjson" +version = "3.9.10" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.9.10-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c18a4da2f50050a03d1da5317388ef84a16013302a5281d6f64e4a3f406aabc4"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5148bab4d71f58948c7c39d12b14a9005b6ab35a0bdf317a8ade9a9e4d9d0bd5"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cf7837c3b11a2dfb589f8530b3cff2bd0307ace4c301e8997e95c7468c1378e"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c62b6fa2961a1dcc51ebe88771be5319a93fd89bd247c9ddf732bc250507bc2b"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb3922a7a804755bbe6b5be9b312e746137a03600f488290318936c1a2d4dc"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1234dc92d011d3554d929b6cf058ac4a24d188d97be5e04355f1b9223e98bbe9"}, + {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:06ad5543217e0e46fd7ab7ea45d506c76f878b87b1b4e369006bdb01acc05a83"}, + {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fd72fab7bddce46c6826994ce1e7de145ae1e9e106ebb8eb9ce1393ca01444d"}, + {file = "orjson-3.9.10-cp310-none-win32.whl", hash = "sha256:b5b7d4a44cc0e6ff98da5d56cde794385bdd212a86563ac321ca64d7f80c80d1"}, + {file = "orjson-3.9.10-cp310-none-win_amd64.whl", hash = "sha256:61804231099214e2f84998316f3238c4c2c4aaec302df12b21a64d72e2a135c7"}, + {file = "orjson-3.9.10-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cff7570d492bcf4b64cc862a6e2fb77edd5e5748ad715f487628f102815165e9"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8bc367f725dfc5cabeed1ae079d00369900231fbb5a5280cf0736c30e2adf7"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c812312847867b6335cfb264772f2a7e85b3b502d3a6b0586aa35e1858528ab1"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edd2856611e5050004f4722922b7b1cd6268da34102667bd49d2a2b18bafb81"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:674eb520f02422546c40401f4efaf8207b5e29e420c17051cddf6c02783ff5ca"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0dc4310da8b5f6415949bd5ef937e60aeb0eb6b16f95041b5e43e6200821fb"}, + {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99c625b8c95d7741fe057585176b1b8783d46ed4b8932cf98ee145c4facf499"}, + {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec6f18f96b47299c11203edfbdc34e1b69085070d9a3d1f302810cc23ad36bf3"}, + {file = "orjson-3.9.10-cp311-none-win32.whl", hash = "sha256:ce0a29c28dfb8eccd0f16219360530bc3cfdf6bf70ca384dacd36e6c650ef8e8"}, + {file = "orjson-3.9.10-cp311-none-win_amd64.whl", hash = "sha256:cf80b550092cc480a0cbd0750e8189247ff45457e5a023305f7ef1bcec811616"}, + {file = "orjson-3.9.10-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:602a8001bdf60e1a7d544be29c82560a7b49319a0b31d62586548835bbe2c862"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f295efcd47b6124b01255d1491f9e46f17ef40d3d7eabf7364099e463fb45f0f"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92af0d00091e744587221e79f68d617b432425a7e59328ca4c496f774a356071"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5a02360e73e7208a872bf65a7554c9f15df5fe063dc047f79738998b0506a14"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858379cbb08d84fe7583231077d9a36a1a20eb72f8c9076a45df8b083724ad1d"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666c6fdcaac1f13eb982b649e1c311c08d7097cbda24f32612dae43648d8db8d"}, + {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3fb205ab52a2e30354640780ce4587157a9563a68c9beaf52153e1cea9aa0921"}, + {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7ec960b1b942ee3c69323b8721df2a3ce28ff40e7ca47873ae35bfafeb4555ca"}, + {file = "orjson-3.9.10-cp312-none-win_amd64.whl", hash = "sha256:3e892621434392199efb54e69edfff9f699f6cc36dd9553c5bf796058b14b20d"}, + {file = "orjson-3.9.10-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8b9ba0ccd5a7f4219e67fbbe25e6b4a46ceef783c42af7dbc1da548eb28b6531"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e2ecd1d349e62e3960695214f40939bbfdcaeaaa62ccc638f8e651cf0970e5f"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f433be3b3f4c66016d5a20e5b4444ef833a1f802ced13a2d852c637f69729c1"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4689270c35d4bb3102e103ac43c3f0b76b169760aff8bcf2d401a3e0e58cdb7f"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd176f528a8151a6efc5359b853ba3cc0e82d4cd1fab9c1300c5d957dc8f48c"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a2ce5ea4f71681623f04e2b7dadede3c7435dfb5e5e2d1d0ec25b35530e277b"}, + {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:49f8ad582da6e8d2cf663c4ba5bf9f83cc052570a3a767487fec6af839b0e777"}, + {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a11b4b1a8415f105d989876a19b173f6cdc89ca13855ccc67c18efbd7cbd1f8"}, + {file = "orjson-3.9.10-cp38-none-win32.whl", hash = "sha256:a353bf1f565ed27ba71a419b2cd3db9d6151da426b61b289b6ba1422a702e643"}, + {file = "orjson-3.9.10-cp38-none-win_amd64.whl", hash = "sha256:e28a50b5be854e18d54f75ef1bb13e1abf4bc650ab9d635e4258c58e71eb6ad5"}, + {file = "orjson-3.9.10-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ee5926746232f627a3be1cc175b2cfad24d0170d520361f4ce3fa2fd83f09e1d"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a73160e823151f33cdc05fe2cea557c5ef12fdf276ce29bb4f1c571c8368a60"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c338ed69ad0b8f8f8920c13f529889fe0771abbb46550013e3c3d01e5174deef"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5869e8e130e99687d9e4be835116c4ebd83ca92e52e55810962446d841aba8de"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2c1e559d96a7f94a4f581e2a32d6d610df5840881a8cba8f25e446f4d792df3"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a3a3a72c9811b56adf8bcc829b010163bb2fc308877e50e9910c9357e78521"}, + {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f8fb7f5ecf4f6355683ac6881fd64b5bb2b8a60e3ccde6ff799e48791d8f864"}, + {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c943b35ecdf7123b2d81d225397efddf0bce2e81db2f3ae633ead38e85cd5ade"}, + {file = "orjson-3.9.10-cp39-none-win32.whl", hash = "sha256:fb0b361d73f6b8eeceba47cd37070b5e6c9de5beaeaa63a1cb35c7e1a73ef088"}, + {file = "orjson-3.9.10-cp39-none-win_amd64.whl", hash = "sha256:b90f340cb6397ec7a854157fac03f0c82b744abdd1c0941a024c3c29d1340aff"}, + {file = "orjson-3.9.10.tar.gz", hash = "sha256:9ebbdbd6a046c304b1845e96fbcc5559cd296b4dfd3ad2509e33c4d9ce07d6a1"}, +] + [[package]] name = "overrides" version = "7.4.0" @@ -1996,6 +2671,70 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] +[[package]] +name = "pandas" +version = "2.1.4" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9"}, + {file = "pandas-2.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034"}, + {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d"}, + {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9"}, + {file = "pandas-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139"}, + {file = "pandas-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46"}, + {file = "pandas-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092"}, + {file = "pandas-2.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821"}, + {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d"}, + {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171"}, + {file = "pandas-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623"}, + {file = "pandas-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e"}, + {file = "pandas-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6"}, + {file = "pandas-2.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b"}, + {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540"}, + {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead"}, + {file = "pandas-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1"}, + {file = "pandas-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf"}, + {file = "pandas-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34"}, + {file = "pandas-2.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a"}, + {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732"}, + {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8"}, + {file = "pandas-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860"}, + {file = "pandas-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984"}, + {file = "pandas-2.1.4.tar.gz", hash = "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"}, +] + +[package.dependencies] +numpy = {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] + [[package]] name = "pandocfilters" version = "1.5.0" @@ -2036,6 +2775,73 @@ files = [ [package.dependencies] ptyprocess = ">=0.5" +[[package]] +name = "pillow" +version = "10.1.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "platformdirs" version = "4.1.0" @@ -2249,6 +3055,153 @@ files = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] +[[package]] +name = "pydantic" +version = "2.5.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-2.5.2-py3-none-any.whl", hash = "sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0"}, + {file = "pydantic-2.5.2.tar.gz", hash = "sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.14.5" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.14.5" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic_core-2.14.5-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd"}, + {file = "pydantic_core-2.14.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66"}, + {file = "pydantic_core-2.14.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997"}, + {file = "pydantic_core-2.14.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093"}, + {file = "pydantic_core-2.14.5-cp310-none-win32.whl", hash = "sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720"}, + {file = "pydantic_core-2.14.5-cp310-none-win_amd64.whl", hash = "sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b"}, + {file = "pydantic_core-2.14.5-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459"}, + {file = "pydantic_core-2.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4"}, + {file = "pydantic_core-2.14.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada"}, + {file = "pydantic_core-2.14.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda"}, + {file = "pydantic_core-2.14.5-cp311-none-win32.whl", hash = "sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651"}, + {file = "pydantic_core-2.14.5-cp311-none-win_amd64.whl", hash = "sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077"}, + {file = "pydantic_core-2.14.5-cp311-none-win_arm64.whl", hash = "sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf"}, + {file = "pydantic_core-2.14.5-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093"}, + {file = "pydantic_core-2.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e"}, + {file = "pydantic_core-2.14.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69"}, + {file = "pydantic_core-2.14.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d"}, + {file = "pydantic_core-2.14.5-cp312-none-win32.whl", hash = "sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260"}, + {file = "pydantic_core-2.14.5-cp312-none-win_amd64.whl", hash = "sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36"}, + {file = "pydantic_core-2.14.5-cp312-none-win_arm64.whl", hash = "sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325"}, + {file = "pydantic_core-2.14.5-cp37-none-win32.whl", hash = "sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405"}, + {file = "pydantic_core-2.14.5-cp37-none-win_amd64.whl", hash = "sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588"}, + {file = "pydantic_core-2.14.5-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf"}, + {file = "pydantic_core-2.14.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b"}, + {file = "pydantic_core-2.14.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec"}, + {file = "pydantic_core-2.14.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124"}, + {file = "pydantic_core-2.14.5-cp38-none-win32.whl", hash = "sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867"}, + {file = "pydantic_core-2.14.5-cp38-none-win_amd64.whl", hash = "sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d"}, + {file = "pydantic_core-2.14.5-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7"}, + {file = "pydantic_core-2.14.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955"}, + {file = "pydantic_core-2.14.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5"}, + {file = "pydantic_core-2.14.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209"}, + {file = "pydantic_core-2.14.5-cp39-none-win32.whl", hash = "sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6"}, + {file = "pydantic_core-2.14.5-cp39-none-win_amd64.whl", hash = "sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3"}, + {file = "pydantic_core-2.14.5.tar.gz", hash = "sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydub" +version = "0.25.1" +description = "Manipulate audio with an simple and easy high level interface" +optional = false +python-versions = "*" +files = [ + {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"}, + {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"}, +] + [[package]] name = "pygments" version = "2.17.2" @@ -2264,6 +3217,20 @@ files = [ plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pytest" version = "7.4.3" @@ -2311,6 +3278,31 @@ files = [ {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, ] +[[package]] +name = "python-multipart" +version = "0.0.6" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, + {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, +] + +[package.extras] +dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] + +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + [[package]] name = "pywin32" version = "306" @@ -2638,6 +3630,24 @@ files = [ {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, ] +[[package]] +name = "rich" +version = "13.7.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, + {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "rpds-py" version = "0.13.2" @@ -2760,6 +3770,21 @@ files = [ [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "semantic-version" +version = "2.10.0" +description = "A library implementing the 'SemVer' scheme." +optional = false +python-versions = ">=2.7" +files = [ + {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"}, + {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"}, +] + +[package.extras] +dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme"] + [[package]] name = "send2trash" version = "1.8.2" @@ -2849,6 +3874,17 @@ numpy = ">=1.14" docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] test = ["pytest", "pytest-cov"] +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + [[package]] name = "six" version = "1.16.0" @@ -2901,6 +3937,24 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "starlette" +version = "0.27.0" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, + {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + [[package]] name = "tabulate" version = "0.9.0" @@ -2965,6 +4019,28 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "tomlkit" +version = "0.12.0" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.0-py3-none-any.whl", hash = "sha256:926f1f37a1587c7a4f6c7484dae538f1345d96d793d9adab5d3675957b1d0766"}, + {file = "tomlkit-0.12.0.tar.gz", hash = "sha256:01f0477981119c7d8ee0f67ebe0297a7c95b14cf9f4b102b45486deb77018716"}, +] + +[[package]] +name = "toolz" +version = "0.12.0" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.5" +files = [ + {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, + {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, +] + [[package]] name = "tornado" version = "6.4" @@ -2985,6 +4061,26 @@ files = [ {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, ] +[[package]] +name = "tqdm" +version = "4.66.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "traitlets" version = "5.14.0" @@ -3000,6 +4096,30 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +[[package]] +name = "typer" +version = "0.9.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.6" +files = [ + {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, + {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} +rich = {version = ">=10.11.0,<14.0.0", optional = true, markers = "extra == \"all\""} +shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] + [[package]] name = "types-python-dateutil" version = "2.8.19.14" @@ -3022,6 +4142,17 @@ files = [ {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + [[package]] name = "uri-template" version = "1.3.0" @@ -3052,6 +4183,25 @@ brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotl secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "uvicorn" +version = "0.24.0.post1" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.24.0.post1-py3-none-any.whl", hash = "sha256:7c84fea70c619d4a710153482c0d230929af7bcf76c7bfa6de151f0a3a80121e"}, + {file = "uvicorn-0.24.0.post1.tar.gz", hash = "sha256:09c8e5a79dc466bdf28dead50093957db184de356fcdc48697bad3bde4c2588e"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + [[package]] name = "virtualenv" version = "20.25.0" @@ -3125,6 +4275,85 @@ docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] +[[package]] +name = "websockets" +version = "11.0.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, +] + [[package]] name = "widgetsnbextension" version = "4.0.9" @@ -3154,4 +4383,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "3106762f19633ae74afcf39c8410ccdf11079d1ea38a3748f3b03e2a47af198a" +content-hash = "91dd2ead4c8325d95cffc14effb093b919da009c297fe5d7948b433b7c64c944" diff --git a/pipelines/pyproject.toml b/pipelines/pyproject.toml index 619fc02..966180e 100644 --- a/pipelines/pyproject.toml +++ b/pipelines/pyproject.toml @@ -22,6 +22,7 @@ components = { path = "../components", develop = true } kfp = "^2.0.1" pyyaml = "6.0.1" jupyter = "^1.0.0" +gradio = "^4.11.0" [tool.poetry.group.dev.dependencies] pytest = ">=7.3.1,<8.0.0" diff --git a/pipelines/src/pipelines/prediction.py b/pipelines/src/pipelines/prediction.py index 62dd739..30157b9 100644 --- a/pipelines/src/pipelines/prediction.py +++ b/pipelines/src/pipelines/prediction.py @@ -68,7 +68,7 @@ def pipeline( """ queries_folder = pathlib.Path(__file__).parent / "queries" - table = f"prep_prediction_{RESOURCE_SUFFIX}" + table = f"prep_prediction_{RESOURCE_SUFFIX.replace('.', '')}" prep_query = generate_query( queries_folder / "preprocessing.sql", diff --git a/pipelines/src/pipelines/training.py b/pipelines/src/pipelines/training.py index 2041fe4..e653c10 100644 --- a/pipelines/src/pipelines/training.py +++ b/pipelines/src/pipelines/training.py @@ -110,7 +110,7 @@ def pipeline( test_data_gcs_uri (str): Optional. GCS URI of static held-out test dataset. """ - table = f"prep_training_{RESOURCE_SUFFIX}" + table = f"prep_training_{RESOURCE_SUFFIX.replace('.', '')}" queries_folder = pathlib.Path(__file__).parent / "queries" prep_query = generate_query(